반응형

서보모터

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





반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기