서보모터
https://m.blog.naver.com/PostView.nhn?blogId=yuyyulee&logNo=220345769854&proxyReferer=https:%2F%2Fwww.google.com%2F
서보모터를 제어하기 위해서는 50Hz의 주파수를 가지는 신호가 입력되어야 한다.
한주기당 20ms의 시간을 가진다는것
20ms의 주기안에서 High신호의 폭(=시간)이 얼마인가에 따라 서보모터의 회전각도가 결정된다.
보통은 1.0ms에서 0도 1.5ms에서 90도 2ms에서 180도
각 서보모터마다 달라 실험을 dutyCycle 값을 바꿔주며 원하는 각도를 찾아내었다.
-------------------------------------------------------------------------------------------------------
펄스
pwm이란?
Pulse Width Modulation 펄스 폭 변조
디지털 출력으로 아날로그 회로를 제어하는 기법
(GPIO핀은 디지털이기 때문에 PWM을 이용하여 아날로그 신호를 제어한다.)
duty: 한주기 동안 HIGH가 차지하는 비율
duty cycle=50%이면 2.5v의 효과를 낼수있다
----------------------------------------------------------------------------------------------------------
0~180 왔다갔다 해보기
회로도
회로도의 노란선은 주황색선으로 보면된다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # -*- coding:utf-8 -*- #한글입력 import RPi.GPIO as GPIO import time pin=18 GPIO.setmode(GPIO.BCM) #gpio 모드 세팅 GPIO.setup(pin,GPIO.OUT) #모터출력 p=GPIO.PWM(pin,50) #펄스폭변조 세팅 핀,주파수 p.start(0) try: while True: p.ChangeDutyCycle(2.5) #0도 print "0도" time.sleep(0.5) p.ChangeDutyCycle(6) #90도 print "90도" time.sleep(0.5) p.ChangeDutyCycle(9.5) #180도 print "180도" time.sleep(0.5) except KeyboardInterrupt: #ctrl+c 종료 p.stop() finally: GPIO.cleanup() #필수! 정삭적인 종료를 위해 필요 | cs |
마지막에
GPIO.cleanup() 해주지 않으면 아래 오류를 보게된다.
RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
-------------------------------------------------------------------------------------------------------------------
버튼을 이용해 눌릴때마다 반대방향으로 돌아가도록 만들어보자.
버튼 pull-up pull-down
https://kocoafab.cc/tutorial/view/526
회로도
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | # -*- coding:utf-8 -*- #한글입력 import RPi.GPIO as GPIO import time pin=18 GPIO.setmode(GPIO.BCM) #gpio 모드 셋팅 GPIO.setup(pin,GPIO.OUT) #모터동작 GPIO.setup(12,GPIO.IN,pull_up_down=GPIO.PUD_UP) #버튼 입력 p=GPIO.PWM(pin,50) #펄스폭 변조 핀,주파수 p.start(0) try: a=True #초기화 while True: button_state=GPIO.input(12) if button_state==False: a=False if a else True print "반대로이동" if a: p.ChangeDutyCycle(9.5) else: p.ChangeDutyCycle(2.5) time.sleep(0.15) except KeyboardInterrupt: p.stop() finally: GPIO.cleanup() | cs |
'라즈베리파이' 카테고리의 다른 글
라즈베리파이로 아두이노 블루투스 제어 (0) | 2020.06.13 |
---|---|
라즈베리파이 카메라모듈 cctv (2) | 2020.05.06 |
라즈베리파이 led 버튼 (0) | 2020.05.02 |
리눅스 라즈비안 파일 생성삭제 (0) | 2020.04.30 |
라즈비안 유저생성 비밀번호 바꾸기 (0) | 2020.04.30 |
최근댓글