1. 조립 

 

2.  -전체 회로구성(라즈베리파이 + 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()

 

- 자율 주행 코드 구현하기 

 

-초음파센서 3개 달았음 

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)

TRIG_R = 27
ECHO_R = 17

GPIO.setup(TRIG_R, GPIO.OUT)
GPIO.setup(ECHO_R, GPIO.IN)

TRIG_L = 18
ECHO_L = 25

GPIO.setup(TRIG_L, GPIO.OUT)
GPIO.setup(ECHO_L, GPIO.IN)

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

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

def getDistanceRight():
    GPIO.output(TRIG_R,GPIO.LOW)
    time.sleep(1)

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

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

    pulse_duration = pulse_end - pulse_start
    distance = pulse_duration * 17150
    distance = round(distance,2)
    return distance
# 
def getDistanceLeft():
    GPIO.output(TRIG_L,GPIO.LOW)
    time.sleep(1)

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

    while GPIO.input(ECHO_L)==0:
        pulse_start = time.time()
    
    while GPIO.input(ECHO_L)==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()
            distance_value2 = getDistanceRight()
            distance_value3 = getDistanceLeft()
            # 50cm 이상 거리인지 모니터링
            if distance_value > 60 and distance_value2 > 60 and distance_value > 60:
                #1초간 전진    
                print("Forward " + str(distance_value))
                print("Right " + str(distance_value2))
                print("Left " + str(distance_value3))
                rightMotor(1 ,0, 60)
                leftMotor(1 ,0, 60)            
                time.sleep(0.2)
            else:
                #후진 먼저 0.5초 하고나서 밑에 if or else 실행됨 
                rightMotor(0 ,1, 60)
                leftMotor(0 ,1, 60)            
                time.sleep(0.5)
                if distance_value3 > distance_value2:
                    # 1초간 왼쪽으로 회전 -
                    print("Turn Left " + str(distance_value))
                    rightMotor(0 ,0, 0)            
                    leftMotor(1 ,0, 60)            
                    time.sleep(0.2)
                else:
                    print("Turn Right " + str(distance_value))
                    rightMotor(1 ,0, 0)            
                    leftMotor(0 ,0, 60)            
                    time.sleep(0.2)
    except KeyboardInterrupt:
        print("Terminated by Keborad Interrupt")
        GPIO.cleanup()

+ Recent posts