각각의 코드를 동시에 실행시키는 방법이 궁금합니다.

조회수 865회

안녕하세요. 취미로 자율주행자동차를 간단하게 만들어 보기 위해 프로젝트를 시작한 대학생입니다. 우선 파이썬에 대한 개념도 아직 부족한 상황이고 겨우 dc모터만을 이용해 자동차가 직진할 수 있는 코드와 서보모터를 이용해 방향을 바꿀 수 있는 코드를 짜 놓은 상황입니다. 하지만 그 두 코드를 동시에 돌리기 위한 코딩을 짜기 어려워 도움을 구하고자 합니다. 인터넷에 있는 많은 예제들과 강의들을 봤지만 생각보다 간단했고 그 코드로 응용하기가 어려웠습니다.. 상세한 도움 부탁드립니다. 아래 코드는 dc모터와 서보모터의 코드입니다. 그리고 멀티프로세싱과 멀티쓰레드의 차이점이나 어떤 것이 왜 쓰여야 하는지도 이해하기 쉽게 알려주시면 정말 감사하겠습니다.

  1. dc모터

import wiringpi

STOP = 0 FORWARD = 1

CH1 = 0 CH2 = 1

OUTPUT = 1 INPUT = 0

HIGH = 1 LOW = 0

ENA = 25 ENB = 30

IN1 = 24 IN2 = 23 IN3 = 22 IN4 = 21

def setPinConfig(EN, INA, INB): wiringpi.pinMode(EN, OUTPUT) wiringpi.pinMode(INA, OUTPUT) wiringpi.pinMode(INB, OUTPUT) wiringpi.softPwmCreate(EN, 0, 255)

def setMotorContorl(PWM, INA, INB, speed, stat):

wiringpi.softPwmWrite(PWM, speed)


if stat == FORWARD:
    wiringpi.digitalWrite(INA, HIGH)
    wiringpi.digitalWrite(INB, LOW)

elif stat == STOP:
    wiringpi.digitalWrite(INA, LOW)
    wiringpi.digitalWrite(INB, LOW)

def setMotor(ch, speed, stat): if ch == CH1: setMotorContorl(ENA, IN1, IN2, speed, stat) else: setMotorContorl(ENB, IN3, IN4, speed, stat)

wiringpi.wiringPiSetup()

setPinConfig(ENA, IN1, IN2) setPinConfig(ENB, IN3, IN4)

setMotor(CH1, 150, FORWARD) setMotor(CH2, 150, FORWARD)

wiringpi.delay(5000)

setMotor(CH1, 150, STOP) setMotor(CH2, 150, STOP)

  1. 서보

import RPi.GPIO as GPIO import time

pin_pwm = 18 # pwm pin number frequency = 50 # frequency 50 Hz

GPIO.setmode(GPIO.BCM) GPIO.setup(pin_pwm, GPIO.OUT)

p = GPIO.PWM(pin_pwm, frequency) p.start(0)

try:

dc = 0           # duty cycle
min_dc = 2.2     # minimum value of duty cycle
max_dc = 11.5    # maximum value of duty cycle
change_step = 10 # duty cycle change step
change = float((max_dc-min_dc)/change_step) # change rate
toggle = 1       # come and go toggle
delay = 0.4      # time delay b/w duty cycle change
dc = min_dc      # initial duty cycle value is min_dc

# show setting values
print("min duty cycle = %.2f" % min_dc)
print("max duty cycle = %.2f" % max_dc)
print("duty cycle change = %.2f" % change)
print("change delay = %.2f" % delay)

while True:

    p.ChangeDutyCycle(dc)

    # show current angle
    print('angle: %d  ' % ((dc-min_dc)*180/(max_dc-min_dc)-90), end='\r')

    time.sleep(delay)

    # to make servo moves like windscreen wiper
    if dc + change <= max_dc and toggle:
        dc += change

    elif dc - change >= min_dc:
        dc -= change
        toggle = 0

    else:
        dc += change
        toggle = 1

"ctrl + c" to stop

except KeyboardInterrupt: p.stop() GPIO.cleanup()

  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)