본문 바로가기

Embedded/Raspberry Pi

자율주행 자동차 구현하기

-전체 회로구성(라즈베리파이 + L293D + 모터) 

- L293D 회로 구성 (둥근 홈이 오른쪽에 위치해 있음 / 홈의 방향을 반드시 확인)

- 라즈베리파이 + L293D

- 초음파 센서 추가

초음파 센서로 거리측정 구현하기

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

TRIG = 23
ECHO = 24

GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)

def getDistance():
    GPIO.output(TRIG, False)
    time.sleep(1)

    GPIO.output(TRIG, True)
    time.sleep(0.00001)
    GPIO.output(TRIG,False)

    while GPIO.input(ECHO)==0:
        pulse_start = time.time()
    while GPIO.input(ECHO)==1:
        pulse_end = time.time()

    pulse_duration = pulse_end - pulse_start

    distance = pulse_duration * 17150
    distance = round(distance,2)

    return distance  

if __name__ == '__main__':
    try: 
        while True:
            distance_value = getDistance()
            if distance_value > 2 and distance_value < 400:
                print("Distance is {:.2f} cm".format(distance_value))
            else:
                print("Out of range")
    except KeyboardInterrupt:
        print("Terminated by Keborad Interrupt")
        GPIO.cleanup()

 

모터를 5초 동안 전진/우회전/좌회전/정지 동작 시키는 코드 구현

#import GPIO library / time library
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

RIGHT_FORWARD = 26
RIGHT_BACKWARD = 19
RIGHT_PWM = 13
LEFT_FORWARD = 16
LEFT_BACKWARD = 20
LEFT_PWM = 21

GPIO.setup(RIGHT_FORWARD,GPIO.OUT)
GPIO.setup(RIGHT_BACKWARD,GPIO.OUT)
GPIO.setup(RIGHT_PWM,GPIO.OUT)
GPIO.output(RIGHT_PWM,0)
RIGHT_MOTOR = GPIO.PWM(RIGHT_PWM,100)
RIGHT_MOTOR.start(0)
RIGHT_MOTOR.ChangeDutyCycle(0)

GPIO.setup(LEFT_FORWARD,GPIO.OUT)
GPIO.setup(LEFT_BACKWARD,GPIO.OUT)
GPIO.setup(LEFT_PWM,GPIO.OUT)
GPIO.output(LEFT_PWM,0)
LEFT_MOTOR = GPIO.PWM(LEFT_PWM,100)
LEFT_MOTOR.start(0)
LEFT_MOTOR.ChangeDutyCycle(0)

#RIGHT Motor control
def rightMotor(forward, backward, pwm):
    GPIO.output(RIGHT_FORWARD,forward)
    GPIO.output(RIGHT_BACKWARD,backward)
    RIGHT_MOTOR.ChangeDutyCycle(pwm)

#Left Motor control
def leftMotor(forward, backward, pwm):
    GPIO.output(LEFT_FORWARD,forward)
    GPIO.output(LEFT_BACKWARD,backward)
    LEFT_MOTOR.ChangeDutyCycle(pwm)

if __name__ == '__main__':
    try: 
        while True:
            #5초 전진 
            rightMotor(1 ,0, 70)
            leftMotor(1 ,0, 70)
            time.sleep(5)
            #5초 우회전 
            rightMotor(1 ,0, 70)
            leftMotor(0 ,0, 0)
            time.sleep(5)
            #5초 좌회전 
            rightMotor(0 ,0, 0)
            leftMotor(1 ,0, 70)
            time.sleep(5)
            #5초 정지 
            rightMotor(0 ,0, 0)
            leftMotor(0 ,0, 0)
            time.sleep(5)            
    except KeyboardInterrupt:
        print("Terminated by Keborad Interrupt")
        GPIO.cleanup()

자율 주행 코드 구현하기 

- 50cm 보다 가까운 거리에 물체가 있으면 1초간  좌회전 

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

TRIG = 23
ECHO = 24

GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)

RIGHT_FORWARD = 26
RIGHT_BACKWARD = 19
RIGHT_PWM = 13
LEFT_FORWARD = 16
LEFT_BACKWARD = 20
LEFT_PWM = 21

GPIO.setup(RIGHT_FORWARD,GPIO.OUT)
GPIO.setup(RIGHT_BACKWARD,GPIO.OUT)
GPIO.setup(RIGHT_PWM,GPIO.OUT)
GPIO.output(RIGHT_PWM,0)
RIGHT_MOTOR = GPIO.PWM(RIGHT_PWM,100)
RIGHT_MOTOR.start(0)
RIGHT_MOTOR.ChangeDutyCycle(0)

GPIO.setup(LEFT_FORWARD,GPIO.OUT)
GPIO.setup(LEFT_BACKWARD,GPIO.OUT)
GPIO.setup(LEFT_PWM,GPIO.OUT)
GPIO.output(LEFT_PWM,0)
LEFT_MOTOR = GPIO.PWM(LEFT_PWM,100)
LEFT_MOTOR.start(0)
LEFT_MOTOR.ChangeDutyCycle(0)

def getDistance():
    GPIO.output(TRIG,GPIO.LOW)
    time.sleep(1)

    GPIO.output(TRIG,GPIO.HIGH)
    time.sleep(0.00001)
    GPIO.output(TRIG,GPIO.LOW)

    while GPIO.input(ECHO)==0:
        pulse_start = time.time()
    
    while GPIO.input(ECHO)==1:
        pulse_end = time.time()

    pulse_duration = pulse_end - pulse_start
    distance = pulse_duration * 17150
    distance = round(distance,2)
    return distance  

#RIGHT Motor control
def rightMotor(forward, backward, pwm):
    GPIO.output(RIGHT_FORWARD,forward)
    GPIO.output(RIGHT_BACKWARD,backward)
    RIGHT_MOTOR.ChangeDutyCycle(pwm)

#Left Motor control
def leftMotor(forward, backward, pwm):
    GPIO.output(LEFT_FORWARD,forward)
    GPIO.output(LEFT_BACKWARD,backward)
    LEFT_MOTOR.ChangeDutyCycle(pwm)

if __name__ == '__main__':
    try: 
        while True:
            distance_value = getDistance()
            # 50cm 이상 거리인지 모니터링
            if distance_value > 50:
                #1초간 전진    
                print("Forward " + str(distance_value))
                rightMotor(1 ,0, 70)
                leftMotor(1 ,0, 70)            
                time.sleep(1)
            else:
                # 1초간 왼쪽으로 회전 
                print("Left " + str(distance_value))
                rightMotor(0 ,0, 0)            
                leftMotor(1 ,0, 70)            
                time.sleep(1)
    except KeyboardInterrupt:
        print("Terminated by Keborad Interrupt")
        GPIO.cleanup()

'Embedded > Raspberry Pi' 카테고리의 다른 글

Argon m.2 ssd 메뉴얼  (0) 2021.12.09
tmp  (0) 2021.03.18
1-1. 한글폰트  (0) 2020.10.14
라즈베리파이에 파이썬 설치  (0) 2020.10.10
3. VNC를 사용하여 원격접속  (0) 2020.10.09