라즈베리파이에서 하드웨어를 제어해 본 경험은 단 한번도 없어서 좀 어버버 했지만 인턴넷에 찾아보니 자료가 워낙 많아서 크게 어렵진 않았다. 회로를 연결하는 방법을 찾는게 오래 결렸을 뿐이다. 사용하려는 모터 드라이버(DRV8880)와 가장 유사한 회로를 찾았다. 참고한 사이트는 ROTOTRON이라는 사이트다.

▲ Rototron에서 참고한 회로

필자가 사용하려는 모터 드라이브는 위 모터와 조금 달랐던 점이 MODE 포트가 하나 더 적었는데, 그냥 없는대로 연결하니 크게 문제없이 구동이 되었다.


작업환경

운영체제는 라즈비안을 이용했으며 언어는 내장된 Python3를 사용하였다.


회로연결

▲ 직접 연결한 회로의 모습



데몬실행

라즈베리파이에서 하드웨어를 제어하기 위해서는 라즈베리파이의 측면에 있는 GPIO라는 포트를 사용하게 된다. 이 포트와 통신을 하기 위해서는 터미널에서 다음과 같이 명령어를 쳐주어야 한다.

1
pi@raspberry:~$ sudo pigpiod


코드작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from time import sleep
import pigpio

DIR_PIN = 20
STEP_PIN = 21
pi = pigpio.pi()
pi.set_mode(DIR_PIN, pigpio.OUTPUT)
pi.set_mode(STEP_PIN, pigpio.OUTPUT)
MODE = (14, 15) 
STEP = {'Full': (0, 0),
        '1/2' : (1, 0),
        '1/4' : (0, 1),
        '1/8' : (1, 1)}

for i in range(2):
    pi.write(MODE[i], STEP[Full][i])

pi.write(DIR_PIN, 0)
pi.set_PWM_dutycycle(STEP_PIN, 128)
pi.set_PWM_frequency(STEP_PIN, 449)

15행에 적혀진 Full1/2, 1/4 등의 스탭으로 변경하면 속도가 느려지며 17행의 DIR에 1을 주면 역방향으로 회전한다. 저게 딕셔너리 자료형이라고 그랬던가 그랬던것 같다.


실행결과


내용추가

모터를 바이폴라 방식으로 제어하려고 했는데, 저번에는 사이트에 나와있는 내용을 단지 따라했던 것 뿐이라 그런지 응용하는데 큰 어려움이 있었다. 아두이노와 비교하여 어떻게 사용되는지 조금 내용을 추가하고자 한다. 먼저 라즈베리파이에는 다음과 같이 미리 선언이 되어있다고 가정하자.

1
2
import pigpio
pi = pigpio.pi()

먼저 아두이노에서 사용되는 pinMode는 라즈베리파이에서는 다음과 같이 표현된다.

1
pinMode(DIR_PIN, OUTPUT);
1
pi.set_mode(DIR_PIN, pigpio.OUTPUT)

다음으로 아두이노에서 사용되는 digitalWrite는 다음과 같이 표현한다.

1
digitalWrite(STEP_PIN, HIGH);
1
pi.write(STEP_PIN, pigpio.HIGH)

만일 3600 스텝을 준 다음 DIR의 방향을 바꿔서 다시 3600 스텝을 준다고 가정하면 아두이노는 위처럼 라즈베리파이는 아래처럼 표현할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
digitalWrite(dirPin,HIGH);
for(int x = 0; x < 3600; x++) {
    digitalWrite(STEP_PIN,HIGH); 
    delayMicroseconds(400); 
    digitalWrite(STEP_PIN,LOW); 
    delayMicroseconds(400); 
}

digitalWrite(dirPin,LOW);
for(int x = 0; x < 3600; x++) {
    digitalWrite(STEP_PIN,HIGH);
    delayMicroseconds(400);
    digitalWrite(STEP_PIN,LOW);
    delayMicroseconds(400);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
delay = .000004
pi.write(DIR_PIN, pigpio.HIGH)

for x in range(3600):
    pi.write(STEP_PIN, pigpio.HIGH)
    sleep(delay)
    pi.write(STEP_PIN, pigpio.LOW)
    sleep(delay)

pi.write(DIR_PIN, pigpio.LOW)

for x in range(3600):
    pi.write(STEP_PIN, pigpio.HIGH)
    sleep(delay)
    pi.write(STEP_PIN, pigpio.LOW)
    sleep(delay)

궁극적으로 3축으로 움직이는 모델을 만드려고 한다. 소스코드는 필자의 깃허브 저장소에서 확인할 수 있다.

WRITTEN BY

배진오

하고싶은 건 다 하면서 사는게 목표
im@baejino.com

comments powered by Disqus