이번시간에는 소리를 낼 수 있는 부저라는 부품과 자동차의 바퀴를 직접적으로 움직이게 해주는
모터를 직접 움직이면서 테스트를 해보겠습니다.
아무래도 자동차가 실제로 움직이는 모습을 보면서 슬슬 내가 하는 것들이 눈에 보이기 시작하니
재미있는 부분이기도 하죠.
부저
부저는 소리를 내는 부품으로, 능동부저와 수동부저가 존재합니다.
능동 부저의 경우 부저 자체에 소리를 낼 수 있는 기능이 있어서, 5v전원만 연결해주면 삐-----소리와 함께
시끄러운(?)소리가 계속 나게됩니다. 간단하게 소리가 나지만, 주파수가 고정되어 있지요.
수동 부저의 경우 전원이 연결되어있어서 소리가 안납니다! 자체적으로 신호가 발생하지 않기때문에, 수동으로 명령을
넣어주어야 하지요. 장점으로는 주파수를 PWM을 통해서 변하게 할 수 있다는 뜻이지요.
이제 테스트를 해보겠습니다.
import RPi.GPIO as GPIO
import time
BUZZER = 12
S1 = 5
S2 = 13
S3 = 19
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(BUZZER, GPIO.OUT)
GPIO.setup(S1,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(S2,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(S3,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
p = GPIO.PWM(BUZZER, 261)
p.stop()
old_1 = 0
new_1 = 0
old_2 = 0
new_2 = 0
old_3 = 0
new_3 = 0
try:
while True:
new_1 = GPIO.input(S1)
new_2 = GPIO.input(S2)
new_3 = GPIO.input(S3)
if new_1 != old_1:
old_1 = new_1
if new_1 == 1:
p.start(50)
p.ChangeFrequency(261)
time.sleep(0.1)
p.stop()
time.sleep(0.1)
time.sleep(0.1)
elif new_2 != old_2:
old_2 = new_2
if new_2 == 1:
p.start(50)
p.ChangeFrequency(293)
time.sleep(0.1)
p.stop()
time.sleep(0.1)
time.sleep(0.1)
elif new_3 != old_3:
old_3 = new_3
if new_3 == 1:
p.start(50)
p.ChangeFrequency(329)
time.sleep(0.1)
p.stop()
time.sleep(0.1)
time.sleep(0.1)
except KeyboardInterrupt:
pass
p.stop()
GPIO.cleanup()
앞서 진행했던, 스위치 테스트의 내용을 비슷하게 끌어왔습니다.
정리하면,
>부저와 스위치 3개의 핀번호를 입력함으로 선언해줍니다.
>부저도 부품이니까 setup으로 GPIO출력 설정을 해줍니다.
>스위치테스트와 동일하게 new, old를 설정해 주어서 if문으로 스위치를 누르면 원하는 동작이 나오도록 해줍니다.
>p.ChangeFrequency(261)은 261로 주파수를 변경해준다는 뜻입니다.
주파수 값에 따라서 우리가 들리는 음계가 달라지게 되는데요, 아래의 표를 참고해주세요.
>그렇게 1번스위치에 도(261Hz) 2번스위치에 레(293Hz) 3번스위치에 미(329Hz)를 넣어주었습니다.
결과를 보겠습니다.
원래는 동영상으로 올리고 싶었지만, 용량이 너무 커서 gif로 올리는데 이것마저 용량이 커서 압축해서..
화질이 구려져 버렸습니다..
대충 내용은 스위치 세개의 도,레,미를 이용해서 '떳다떳다 비행기'를 연주하는 모습입니다.
정상적으로 잘 작동하네요!!
모터
이제 모터를 움직여보겠습니다.
import RPi.GPIO as GPIO
import time
PWMA = 18
AIN2 = 27
AIN1 = 22
PWMB = 23
BIN2 = 24
BIN1 = 25
SW_F = 5
SW_B = 19
SW_R = 6
SW_L = 13
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(PWMA, GPIO.OUT)
GPIO.setup(AIN1, GPIO.OUT)
GPIO.setup(AIN2, GPIO.OUT)
GPIO.setup(PWMB, GPIO.OUT)
GPIO.setup(BIN1, GPIO.OUT)
GPIO.setup(BIN2, GPIO.OUT)
GPIO.setup(SW_R,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(SW_F,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(SW_B,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(SW_L,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
L_Motor = GPIO.PWM(PWMA, 500)
L_Motor.start(0)
R_Motor = GPIO.PWM(PWMB, 500)
R_Motor.start(0)
def moving_Front(speed):
GPIO.output(AIN1,0)
GPIO.output(AIN2,1)
L_Motor.ChangeDutyCycle(speed)
GPIO.output(BIN1,0)
GPIO.output(BIN2,1)
R_Motor.ChangeDutyCycle(speed)
def moving_Back(speed):
GPIO.output(AIN1,1)
GPIO.output(AIN2,0)
L_Motor.ChangeDutyCycle(speed)
GPIO.output(BIN1,1)
GPIO.output(BIN2,0)
R_Motor.ChangeDutyCycle(speed)
def moving_Left(speed):
GPIO.output(AIN1,1)
GPIO.output(AIN2,0)
L_Motor.ChangeDutyCycle(speed)
GPIO.output(BIN1,0)
GPIO.output(BIN2,1)
R_Motor.ChangeDutyCycle(speed)
def moving_Right(speed):
GPIO.output(AIN1,0)
GPIO.output(AIN2,1)
L_Motor.ChangeDutyCycle(speed)
GPIO.output(BIN1,1)
GPIO.output(BIN2,0)
R_Motor.ChangeDutyCycle(speed)
def moving_Stop():
GPIO.output(AIN1,0)
GPIO.output(AIN2,1)
L_Motor.ChangeDutyCycle(0)
GPIO.output(BIN1,0)
GPIO.output(BIN2,1)
R_Motor.ChangeDutyCycle(0)
try:
while True:
if GPIO.input(SW_F) == 1:
print("go")
moving_Front(50)
elif GPIO.input(SW_B) == 1:
print("back")
moving_Back(50)
elif GPIO.input(SW_R) == 1:
print("right")
moving_Right(50)
elif GPIO.input(SW_L) == 1:
print("left")
moving_Left(50)
else:
print("stop")
moving_Stop()
time.sleep(0.1)
except KeyboardInterrupt:
pass
GPIO.cleanup()
PWM신호를 이용해야 하므로 PWM핀도 선언해 줍니다.
그리고 AIN은 왼쪽모터 BIN은 오른쪽 모터라고 생각해주심 됩니다.
AIN1이 0이고 AIN2가 1이면 왼쪽바퀴가 전진합니다. BIN역시 BIN1이 0이고 BIN2가 1이면 오른쪽바퀴가 전진합니다.
후진은 이에 반대로 해주면 됩니다.
왼쪽으로가려면? 왼쪽바퀴가 후진하고 오른쪽바퀴가 전진하면 왼쪽으로 휩니다.
AIN1 = 1 AIN2 =0, BIN1 = 0 BIN = 1 와 같이 설정하면 되겠습니다.
이것들을 함수로 설정해주고 speed인자를 넣어줍니다. Stop의 경우 0을 넣어주면 멈춘 것으로 판단합니다.
그렇게 만든 함수들을 스위치가 누르면 해당함수가 작동하도록 만들어줍니다.
moving_Front(50)의 경우 50%속도로 앞으로 이동한다는 뜻입니다.
10%, 25%로 했을때는 차체무게때문인지 앞으로 잘 이동을 안했습니다. 그래서 50으로 주었습니다.
결과를 보겠습니다.
정상적으로 잘 작동하네요!
하지만 자동차를 움직일때마다 스위치를 누르는 것은 매우 비효율적이겠습니다.
그러니 다음에는 스마트폰으로 원격조종을 블루투스 모듈을 통해서 해보겠습니다.
다음 포스팅에서 만납시다!
#해당 프로젝트는 앤써북의 'AI 인공지능 자율주행 자동차' 를 참고하고 있습니다!
#자동차의 구매나 정보를 원하시면 찾아보시기를 추천합니다!
'AutoDriving > AutoDriving RC_Car' 카테고리의 다른 글
라즈베리파이 자율주행 자동차 - (6) OpenCV를 이용한 카메라 사용 1 (0) | 2022.04.30 |
---|---|
라즈베리파이 자율주행 자동차 - (5) 블루투스를 사용해보자! (0) | 2022.04.22 |
라즈베리파이 자율주행 자동차 - (3) LED, 버튼 테스트 (0) | 2022.03.06 |
라즈베리파이 자율주행 자동차 - (2) 필요 소프트웨어 설치! (1) | 2022.03.06 |
라즈베리파이 자율주행 자동차 - (1) 자율주행 자동차를 만들어보자! (3) | 2022.03.06 |