파이썬 서보모터 떨림 - paisseon seobomoteo tteollim

안녕하세요 . 

파이썬 서보모터 떨림 - paisseon seobomoteo tteollim

현재 라즈베리파이4를 이용하여 얼굴추적 프로그램을 개발중에 있습니다.

만들던중 매우 큰문제로 고민을 썩게 만들었던 주요원인. 바로 

SG-90 의 고질적문제 또는 서보모터들의 고질적문제 떨림현상입니다. 

파이썬 서보모터 떨림 - paisseon seobomoteo tteollim
제일 많이 쓰이는 마이크로서보모터 SG-90
서보모터 고질적인 떨림현상 해결 -> 아두이노는?

우리는 아두이노의 IDE로 만드는것이아니라 

Python언어로 라즈베리파이에서 기동하기때문에 

이부분에 관한 내용을 찾기 힘들었습니다. 

대부분 서보모터를 움직이기전에 키고 -> 움직이고 -> 다시 끄고 를 

attach () -> write() -> detach() 로 소스코드적에서 해결을 할 수 있었죠.

물론 해결법도 유튜브 동영상에서는 토크힘을 잃어서 무게가있는 물건을 조작하는경우 모터힘이 풀어져서 돌아갈수 있다고 경고했죠. 

특히나 GPIO 라이브러리나 GPIO.zero 를 사용할때 발생한 문제들입니다.

하지만 라즈베리파이는 위와같은 detach도 없고. 심지어 rpi.GPIO 라이브 러리를 보시면 


Using PWM in RPi.GPIO

To create a PWM instance:

p = GPIO.PWM(channel, frequency) -> 채널과 주파수에 PWM 펄스변조를 입력합니다.

To start PWM:

p.start(dc) # where dc is the duty cycle (0.0 <= dc <= 100.0) -> 초반에 듀티사이클을 정할수있습니다. 각각 90도를 바라보게하려면 p.start(7.5)를 하면 되겠죠.

To change the frequency:

p.ChangeFrequency(freq) # where freq is the new frequency in Hz -> 50hz를 조절. SG-90은 디자인적으로 50hz를 쓰게 권장되어있으니 바꿀부분은 아닙니다.

To change the duty cycle:

p.ChangeDutyCycle(dc) # where 0.0 <= dc <= 100.0 -> 우리가 각도를 조절한부분 

To stop PWM: -> PWM를 멈춥니다.

p.stop()


우리는 p=GPIO.PWM(12,50) 과같이 12번채널에 50hz로 할당한후,

p.start()로 깨워주고 p.ChangeDutyCycle로 조정을 했엇죠?

이때 듀티사이클을 일정하게 유지해주는데도 덜덜덜 떨리는게 문제였습니다.

이를 해결하기위해 한 for 문 문장안에 


p.start()

p.changedutycycle(degree_X) -> degree_X는 바꾸고싶은 각도값입니다.

p.stop()


을 동시에 넣어주면 단 1번만 실행되고 프로그램이 멈추게 됩니다.. 이후  

다시 할당하려고 for문안에 p=GPIO.PWM(12,50)을 다시해줘도.. 어림도없죠. p.stop하면은 그냥 멈춰버립니다. 

그래서 저는 GPIO라이브러리로는 해결할수있는 방법이 없다고 생각했습니다.

그후 끈질긴 구글링 결과 

파이썬 서보모터 떨림 - paisseon seobomoteo tteollim

사이트 : http://abyz.me.uk/rpi/pigpio/index.html

pigpio library 라는 라이브러리를 발견합니다.

이는 영국의 공대멋진오빠들이 만든 로우레벨 라이브러리로 

서보모터를 지터링없이 구동시킬수있는 라이브러리입니다. 

위 라이브러리를 사용하면 지터,떨림,흔들림없이 서보모터를 깔끔하게 제어할 수 있습니다.

제어 할 수 있는 이유는 기존 서보모터 구동에 전원이 불안정한것도 있지만

제가 실험 해본 결과

복잡한 연산이 들어간 서보모터 제어 ( 얼굴인식과 제어 )  그냥 서보모터만 제어 (제어)

를 비교하면 복잡한 연산이 들어간 서보모터 제어에

지터가 매우 심하게 일어났습니다.

그이유는 역시 라즈베리파이의 연산이 서보모터 지터에 영향을 미치는것이라고 생각했고, 

GPIO에서 떨리는 이유는 라즈베리파이가 서보모터를 구동하기위해 만들어진것이아닌 , 

컴퓨팅적인 연산이 들어가기에 여러 충돌이 일어난다고 이야기 하고있습니다.

pigpio는 이를 로우레벨언어를 사용해 하드웨어 제어와 연산처리를 나누어줘서 

서로 간섭을 하지않게 한다고 합니다.

그로인해 깔끔하게 서보모터를 움직이게 할 수 있습니다. 

자이제 설명을 마쳤으니 pigpio의 설치법, 구동법 , 명령어를 간단하게 소개해 드리겠습니다.

[ 능숙하신분은 사이트에서 설치법을 참고하시고, 초보자인분은 제 설명을 보시면 되겠습니다.]

http://abyz.me.uk/rpi/pigpio/index.html

pigpio library

pigpio pigpio C I/F pigpiod pigpiod C I/F Python pigs piscope Misc Examples Download FAQ Site Map The pigpio library pigpio is a library for the Raspberry which allows control of the General Purpose Input Outputs (GPIO).  pigpio works on all versions of th

abyz.me.uk

사이트에 들어가시면 Download탭에 나와있습니다.

설치 하시기 전에 

sudo apt-get update

sudo apt-get upgrade

을 해주시고, 

cd로 home/pi로 이동해줍니다. 

(참고로 그냥 cd만 치면 저위치로 이동합니다.)

저상태에서 

최신버젼 설치법


$wget https://github.com/joan2937/pigpio/archive/master.zip
$unzip master.zip
$cd pigpio-master
$make
$sudo make install


한줄한줄 차례대로 입력해줍니다.

만약 설치에 실패한다면


sudo apt install python-setuptools python3-setuptools


위명령어를 통해 파이썬 setuptools를 깔아 주라고 이야기합니다.

아니면

라즈비안 sudo install명령어를 이용해서 다운로드 할 수 있습니다만,

이방법은 최신버젼이 아니기때문에 되도록이면 최신버젼을 설치합시다.


$sudo apt-get update
$sudo apt-get install pigpio python-pigpio python3-pigpio


설치가 끝나셨으면 사용법은 pigpio의 데몬을 실행해 주어야합니다.

데몬이 뭐냐.. 저도 자세하게는 모르겠지만 데몬을 실행하지 않고 pigpio의 라이브러리를 불러오면

데몬을 실행하라고 경고가 나옵니다. 아마 위에서 말했다시피 

pigpio의 데몬이 로우레벨언어로 하드웨어 동작과 연산을 나눠주는 역할을 하는놈이지 않을까 싶네요.

먼저 python을 실행하기 전에 반드시 이 명령어로 데몬을 실행해줘야합니다.

$sudo pigpiod

위 명령어를 치면 아무것도 안올겁니다. 

반대로 데몬을 끄는법은

$sudo killall pigpiod

를 입력하면됩니다.

다음은 소스코드명령어입니다.


import pigpio

from time import sleep

pi = pigpio.pi() 먼저 사용할 pigpio.pi를 매칭해줍니다.

while True:

pi.set_servo_pulsewidth(18, 0) 18번 채널에연결된 서보모터를 꺼줍니다. 

sleep(1) 

pi.set_servo_pulsewidth(18, 500) 18번채널에 연결된 서보모터를 0도로 이동

sleep(1)

pi.set_servo_pulsewidth(18, 1500) # 가운데로 이동 90도

sleep(1)

pi.set_servo_pulsewidth(18, 2500) # 180도 끝으로 이동. 

sleep(1)


set_servo_pulsewidth 명령어의 사용법

set_servo_pulsewidth(user_gpio, pulsewidth)
Parameters

 user_gpio:= 0-31. -> 매칭채널
pulsewidth:= 0 (off),
             500 (0도) - 2500 (180도).

위 함수는 서보모터의 펄스폭을 제어합니다. 

1500은 가운데 (90도) 입니다. 

참고로 500이나 2500과같이 끝과끝으로 이동시키면 서보모터가 데미지를 입을수 있으니 참고하세요.


위 명령어로 제어해 보시면 지터링 하나없이 깔끔하게 움직이는 서보모터를 보실수 있습니다.

참고로 제가 계산한 각도식도 공유해 드리겠습니다.

위에 나왔다시피 500과 2500은 데미지를 줄 수 있기에, 

저는 끝을 600~2400정도 아래 100정도를 남겨두겠습니다. 

파이썬 서보모터 떨림 - paisseon seobomoteo tteollim

손상입어도 다쓰시겠다 하시는 분들은 f(x)= 500+ 11.11x 로

600~2400쓰시는 분들은 f`(x) = 600+ 10x 로 쓰시면 되겠네요 개인적으로 후자가 식이더 깔끔하네요.

참고로 x는 각도입니다. 

제어외 다양한 명령어 라이브러리는 아래 홈페이지에서 확인하실 수 있습니다.

http://abyz.me.uk/rpi/pigpio/python.html#set_servo_pulsewidth

pigpio library

pigpio pigpio C I/F pigpiod pigpiod C I/F Python pigs piscope Misc Examples Download FAQ Site Map Python Interfacepigpio is a Python module for the Raspberry which talks to the pigpio daemon to allow control of the general purpose input outputs (GPIO). Fea

abyz.me.uk

이제 마음껏 졸업작품이던.. 개인작품이던.. 만드시면됩니다.

어쩌다 이블로그를 찾으신지는 모르겠지만 위 해결법으로 해결하셧다면

코멘트 한개만 부탁드리겠습니다 ! 감사합니다.

참고처: https://steemit.com/python/@makerhacks/jitter-free-servo-control-on-the-raspberry-pi