라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

한 아두이노나 라즈베리파이에 여러 개의 서보모터를 동작하고 싶을 때가 있다.

혹은 서보모터 사용 시 덜덜 떨리고 소리가 나거나 제대로 작동하지 않는 경우도 있다.

이럴 경우 전류를 효율적으로 공급하기 위해 servo.detach()를 사용한다.

servo.attach()만 계속 사용하게 된다면 서보모터를 사용하지 않을 경우에도 전류가 흘러 전류가 부족한 경우가 생겨 서보모터가 덜덜 떨리거나 소리가 나거나 작동하지 않는다.

서보모터를 사용할 때, servo.attach()를 사용하고 사용하지 않을 경우엔 servo.detach()를 통해 전류 공급을 중단하면 효율적으로 전류 공급이 가능하다.

servo.detach()를 사용할 경우, servo.attach()와 짝을 맞춘다.

servo.attach();
servo.detach();

ex)

#include <Servo.h>

#define servoPin1 D0
#define servoPin2 D1
#define servoPin3 D2

Servo servo1;
Servo servo2;
Servo servo3;

void servo1_OFF(){
  servo1.attach(servoPin1); // 사용할 때 attach()
    for(int angle = 0; angle < 100; angle++) 
  { 
    servo1.write(angle); 
    delay(10); 
  } 
   servo1.detach(); // 사용이 끝날 때 detach()
}

void servo1_ON(){
  servo1.attach(servoPin1);
    for(int angle = 100; angle > 0; angle--) 
  { 
    servo1.write(angle); 
    delay(10); 
  } 
  servo1.detach();
}

void servo2_OFF(){
  
  servo2.attach(servoPin2);
      for(int angle = 0; angle < 100; angle++) 
  { 
    servo2.write(angle); 
    delay(10); 
  } 
  servo2.detach();
}

void servo2_ON(){
    servo2.attach(servoPin2);

      for(int angle = 100; angle > 0; angle--) 
  { 
    servo2.write(angle); 
    delay(10); 
  } 
  servo2.detach();
}

void servo3_OFF(){
  servo3.attach(servoPin3);  // attaches the servo on pin 9 to the servo object
        for(int angle = 0; angle < 100; angle++) 
  { 
    servo3.write(angle); 
    delay(10); 
  } 
    servo3.detach();

}

void servo3_ON(){
  servo3.attach(servoPin3);
        for(int angle = 100; angle > 0; angle--) 
  { 
    servo3.write(angle); 
    delay(10); 
  } 
  servo3.detach();
}

void setup(){
  Serial.begin(115200); // PC와 통신
  servo1.detach();
  servo2.detach();
  servo3.detach();
}

void loop(){
  delay(1000);
  servo1_OFF();
  delay(1000);
  servo1_ON();
  delay(1000);

  servo2_OFF();
  delay(1000);
  servo2_ON();
  delay(1000);

  servo3_OFF();
  delay(1000);
  servo3_ON();
}

스파크펀 라즈베리파이 서보햇 사용가이드(SparkFun Pi Servo pHAT)

황제곰2020. 7. 15. 16:15

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

스파크펀사의 Pi Servo pHAT은 라즈베리파이에 결합되어서 I2C 통신을 통해 16개의 PWM 출력을 낼 수 있게 해주는 확장 보드 입니다.

아시다시피 순정 라즈베리파이는 하드웨어적으로 동시에 2개 까지만 PWM 출력을 낼 수 있는데요.(참고) 이 제품은 이 16개의 PWM출력 채널을 서보모터 연결용 헤더핀과 연결해 두어서 서보모터를 바로 꽂아서 사용할 수 있는 보드입니다. 라즈베리파이로 여러개의 서보모터를 제어하는 프로젝트에 최적화된 보드겠네요.(아래 영상에서와 같이 여러개의 서보를 동시에 제어 가능합니다.)

또한 Qwiic 커넥터가 포함되어 있어서 스파크펀 사의 다양한 Qwiic센서나 확장 쉴드와도 연동이 가능합니다.

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

SparkFun Pi Servo pHAT 하드웨어

주의: 라즈베리파이의 5V핀과 3.3V핀이 쇼트되면 보드가 망가질 수 있으므로 느슨한 전선등이 실수로 5V와 3.3V핀에 동시에 접촉되지 않도록 주의하세요.

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

PCS 9785 16채널 pwm 컨트롤러 IC

PCA9685는 라즈베리파이와 i2c통신을 통해 12비트의 PWM을 16개의 채널로 출력할 수 있게 해주는 IC칩입니다. 이 칩은 원래 PWM을 사용한 LED제어를 위해 설계되었지만 서보모터처럼 PWM을 통해 제어가능한 다른 장치들에도 사용이 가능합니다. 이 IC칩의 주요스펙은 아래 표와 같은데요.

스펙

설명

동작전압(VDD)

2.3 V to 5.5 V (Hardwired: 5V)

동작온도

-40°C to 85°C

PWM 출력

16 출력채널(기본: Open-Drain)

Sink전류 25 mA or Source 전류 10 mA (at 5V)

PWM주파수 공유

PWM 주파수

24Hz to 1526 Hz 까지 조절 가능

PWM 해상도

12-bit (4096 단계로 조절)

듀티사이클

0% to 100% (조절가능)

발진주파수(Oscillator)

내장: 25 MHz

외장: 50 MHz

I2C ㅈ주주소

62 개의 하드웨어적으로 변경가능한 주소(기본: 0x40)

모든 채널의 PWM 주파수는 공유하지만 각 채널의 듀티사이클은 개별로 조절가능하기 때문에 서보모터를 개별로 각각 제어가 가능합니다. (led에 연결했다면 밝기를 제어할 수 있겠죠?)

[서보모터용 헤더핀]

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

16개의 PWM채널과 연결된 헤더핀

Servo pHAT은 PWM출력을 통해 제어할 수 있는 다양한 장치를 연결할 수 있습니다. 그 중에서도 서보모터와 LED가 대표적으로 많이 사용될텐데요. 16개의 3핀으로 이루어진 서보모터용 헤더핀은 서보모터를 아주 손쉽게 연결할 수 있게 구성되어 있어서 대부분의 서보모터는 연결극성만 잘 확인해서 바로 꽂으시면 됩니다.

[시리얼 통신용 장치]

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

Pi Servo pHAT의 시리얼 통신방식을 결정할 수 있는 스위치

이 제품은 라즈베리파이와 시리얼통신기능을 제공하기 위한 시리얼 통신(UART) 장치가 내장되어 있습니다. 라즈베리파이와 시리얼 통신을 하기 위한 방법은 두가지가 있는데요. 하나는 USB-C 연결을 사용하는 것이고 다른 하나는 RVR이라고 표시된 헤더핀을 통한 것입니다. 둘 중 어떤 방식을 사용할지는 위 사진의 스위치핀을 올리거나 내려서 바꿔줄 수 있습니다.

- USB C 커넥터 -

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

시리얼 통신용 USB C 인터페이스

USB C 타입 커넥터는 라즈베리파이에 전원공급용으로 사용할 수도 있고 라즈베리파이에 시리얼 접속용으로도 사용이 가능합니다.(시리얼 통신 방식 전환스위치는 USB 모드로 바꿔진 상태여야 합니다.)

Pi Servo pHAT에는 USB-C 커넥터로 5A이상의 전류가 흐르면 전원을 차단시키는 퓨즈가 내장되어 있으므로 USB-C 커넥터로는 5A 이내의 전류까지만 제공해야 합니다.

주의: USB C 커넥터에 플러그를 꽂거나 뺄때 수직으로 과도하게 힘을 많이 주게되면 커넥터가 뽑힐 수 있으므로 주의해야 합니다. 커넥터와 평행하게 플러그를 꽂거나 빼야 합니다.

- CH340 -

USB-C 커넥터는 Pi Servo pHAT의 CH340 IC와 연결되어 있습니다. 이 칩은 USB-Serial 변환칩으로 아두이노에서도 많이 사용되는 칩입니다. 따라서 USB케이블을 통해 Servo pHAT을 컴퓨터와 연결하면 시리얼포트로 인식이 됩니다.

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

CH340

윈도우 10은 기본적으로 CH340의 드라이버가 내장되어 있어서 별다른 드라이버 설정 없이 바로 시리얼 포트로 인식이 됩니다. 윈도우 7이나 일부 맥 버전에서는 자동으로 인식이 안되는 경우가 있으므로 별도로 설치해야 할 수도 있습니다. 링크에 접속해서 드라이버를 다운받아 설치하면 됩니다.

USB-C 연결을 통해 시리얼 데이터를 주고 받을 때는 보드의 RX(노랑), TX(초록) LED가 깜박이는 것을 볼 수 있습니다.

- RVR 헤더-

RVR모드로 설정시 이 RVR 4핀헤더핀을 통해 시리얼 통신이 가능합니다.

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

라즈베리파이의 seria 터미널과 통신할 수 있는 4핀 헤더

[Qwiic 커넥터]

이 Qwiic 커넥터는 I2C 체인방식을 사용해서 여러개의 부품들을 사슬처럼 연결해서 사용할 수 있습니다. Servo PHAT과 동시에 다양한 센서를 사용하고자 할 때 편리하게 사용할 수 있습니다.

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

Qwiic 커넥터

[점퍼]

servo pHAT에는 몇개의 점퍼 접합부가 있는데요. 이 접합부는 하드웨어 설정값을 바꿀 때 사용이 가능합니다. 아래는 각각의 점퍼에 대한 내용입니다.

-전원분리 점퍼 -

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

전원 분리용 점퍼

이 점퍼는 기본적으로 연결이 되어 있는상태인데요. 커터칼등을 이용해서 점퍼선을 분리시키면 라즈베리파이의 5V파워선으로부터 servo pHAT보드로 전원이 공급되는 것을 차단하게 됩니다.

- 퓨즈 우회 점퍼 -

참고: 이 점퍼선은 고급사용자를 위한 기능입니다. 기본적으로는 이 기능을 변경하지 않고 사용하는 것을 추천드립니다.

우회 점퍼는 USB-C 연결시 사용되는 전류 제한 퓨즈를 비활성화할 때 사용됩니다.(내장된 퓨즈는 hold 전류 2.5A trip전류 5A의 스펙을 가짐) 이 기능을 비 활성화하면 내부 회로를 보호할 수 없기 때문에 회로에 대해 잘 아는 경우가 아니라면 변경하지 않는 것이 좋습니다.

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

- I2C 풀업용 점퍼 -

이 점퍼를 자르면 우회 점퍼는 I2C에 연결된 10K옴 풀업저항으로부터의 연결이 끊어지게 됩니다.

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

여러개의 Qwiic(i2c) 장치를 사용할 때 각각의 장치가 풀업저항을 가지고 있는경우 등가저항이 너무 커져서 버스가 제대로 동작하지 않을 수 있는데요. 이 때 이 점퍼선을 자르면 제대로 동작하게 되는 경우가 있습니다.

[Pi Servo pHAT의 전원부]

- 5V 라인 -

먼저 5V 라인을 살펴보겠습니다.

Pi Servo pHAT은 총 3군데의 5V전원라인이 있는데요. 하나는 라즈베리파이의 40핀 GPIO의 5V, 또다른 하나는 RVR시리얼 헤더핀의 5V핀, 마지막으로 USB-C 커넥터 입니다.

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

40핀 GPIO

이 40GPIO헤더핀은 아래의 라즈베리파이 핀맵을 그대로 따르기 때문에 라즈베리파이의 GPIO핀 맵상 5V인 핀은 Pi Servo pHAT에서도 5V가 됩니다.

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

USB-C 커넥터와 RVR 4핀 헤더는 라즈베리파이 뿐 아니라 서보모터에 전원을 공급할 때도 사용될 수 있습니다. 그리고 위에서 언급했다시피 시리얼 포트연결을 통해 라즈베리파이와 통신할 때도 사용될 수 있습니다.

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

USBC 케이블(좌), RVR헤더(우)

- 3.3V 라인 -

다음은 3.3V 라인입니다. 아래 사진처럼 라즈베리파이의 GPIO3.3V 핀과 Qwiic커넥터의 전원부는 3.3V와 연결되어 있습니다. 이 핀은 Qwiic의 센서 전원 공급용으로 서보모터등 비교적 많은 전류를 필요로 하는 곳에 연결하면 라즈베리파이가 고정날 수 있으므로 주의하셔야 합니다.

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

3.3V 라인

- 전원공급 -

이 보드의 전압공급 회로도는 아래와 같은데요. Ideal Diode Circuit가 있어서 라즈베리파이에 전원을 직접 공급할 때 5V전원은 서보모터 구동으로만 사용되고 RVR과 USB-C 커넥터로는 전류가 공급되지 않아서 과도한 전류 공급으로 보드가 사망하지 않도록 보호하고 있습니다. 반대로 Pi Servo PHAT의 RVR헤더핀이나 USB-C커텍터를 통해 전원공급시에는 라즈베리파이까지 전원공급이 이루어 지지만 모스펫제어를 통해 서보모터에 대한 전원은 라즈베리파이의 5V핀이 아닌 RVR이나 USB-C커넥터를 통해 이루어지게 됩니다

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

전원공급 회로도

- 회로 보호 -

이 보드의 회로보호를 위해 USB-C 커넥터에는 전류제한용 퓨즈가 포함되어 있습니다. 최대 5A이상의 전류가 흐르면 자동으로 전원을 분리시키게 됩니다. 위에서 언급했다시피 우회 점퍼를 연결하면 전원이 퓨즈를 우회하게 됩니다.

또한 전원분리 점퍼를 분리시키면 Pi Servo pHAT의 5V라인과 라즈베리파이의 5V핀의 연결이 끊어 집니다. 이 방법은 주로 아주 많은 전류를 사용하거나 라즈베리파이로 노이즈가 전달되는 것을 막기를 원할 때 사용됩니다.(이 방법을 쓰면 라즈베리파이는 별도의 전원을 연결해 주어야 합니다.)

[Servo PHAT 라즈베리파이에 연결하기]

라즈베리파이에 연결할 때는 전원플러그가 분리된 상태에서 라즈베리파이의 헤더핀에 수직으로 꽂아주면 됩니다. 밖으로 튀어나오게 꽂으시면 반대로 꽂은 상태입니다. 반대로 연결한 상태에서 전원을 공급하면 회로가 고장날 수 있으므로 주의해야 합니다.(서보모터를 연결할 때에도 전원플러그가 분리된 상태에서 연결하고 그 뒤에 전원을 인가해 주어야 합니다. 갑작스런 과다 전류가 흐르면 라즈베리파이에 무리를 줄 수 있습니다.)

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

라즈베리파이에 연결한 사진

[전원인가]

라즈베리파이의 전원커넥터에 전원을 인가해도 되고 Servo pHAT의 USB C커넥터에 전원을 인가해도 됩니다.

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

[서보모터 연결]

대부분의 취미용 서보모터는 5V(빨강), GND(검정), 신호선(갈색, 노랑, 흰색 등)을 사용하게 되는데요. 해당 신호에 맞게 3핀 헤더핀에 꽂아주기만 하면 됩니다.(만약 일반적인 신호선의 형태를 사용하지 않는 서보모터인 경우 사용하는 서보모터의 데이터시터를 확인해서 핀 순서를 바꿔주어야 할 수도 있습니다.)

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

서모모터 연결

[Qwiic 연결]

Qwiic 장치들은 Qwiic 커넥터에 연속으로 꽂아주기만 하면 됩니다.

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

Servo pHAT에 연결된 Qwiic 디바이스

Pi Servo pHAT 제어용 파이썬 패키지

Pi Servo pHAT제어 라이브러리는 2개의 파이썬용 패키지가 사용되게 됩니다. 첫번째 패키지인 Qwiic_PCA9685_Py는 PCA9685 PWM 컨트롤러 IC 칩의 동작제어용 패키지이고 PiServoHat_Py 패키지는 직접적인 서보모터제어용 함수가 포함되어 있는 패키지 입니다. 두 패키지를 모두 설치해야 Servo pHAT을 제어할 수 있습니다.

[설치하기]

- Qwiic_PCA9685_Py 패키지 설치 -

이 패키지를 설치하기 위해 라즈베리파이의 터미널 창에서 아래와 같이 입력합니다.(파이썬2버전일 경우 pip3 대신 pip)

pip3 install sparkfun-qwiic-pca9685

수동으로 다운받아서 설치를 원할 경우 gitbub 페이지에서 clone하거나 다운받아서 설치하셔도 됩니다.

- PiServoHat_Py 패키지 설치 -

이 패키지를 설치하기 위해 라즈베리파이의 터미널 창에서 아래와 같이 입력합니다.(파이썬2버전일 경우 pip3 대신 pip)

pip3 install sparkfun-pi-servo-hat

[I2C 인터페이스 설정]

Pi Servo PHAT은 라즈베리파이와 I2C로 통신이 이루어지기 때문에 라즈베리파이의 I2C 통신 인터페이스가 사용가능한 상태여야 합니다. 아래와 같이 raspi-config 명령어를 입력하고 5. Interfacing Options에서 I2Cenable하도록 설정해야 합니다.

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

[예제파일 실행해 보기]

이제 서보모터 하나를 0도에서 90도로 반복해서 움직이게 하는 예제를 하나 실행해 보도록 하겠습니다.

우선 서보모터를 servo pHAT의 0번채널에 연결해 줍니다.

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae

그다음 아래 좋아하는 에디터로 파일을 하나 만들고 아래 내용을 복사해 넣습니다.

import pi_servo_hat import time # 객체 생성 test = pi_servo_hat.PiServoHat() # Servo Hat이 멈춰 있을경우 재가동 test.restart() # Test Run ######################################### # 0번 채널의 서보모터를 0도로 이동시키기 test.move_servo_position(0, 0) # 1초간 대기 time.sleep(1) # 0번 채널의 서보모터를 90도로 이동시키기 test.move_servo_position(0, 90) # 1초간 대기 time.sleep(1) # 반복해서 Sweep(왕복운동)시키기 ######################################### while True: for i in range(0, 90): print(i) test.move_servo_position(0, i) time.sleep(.001) for i in range(90, 0, -1): print(i) test.move_servo_position(0, i) time.sleep(.001)

sweep.py와 같이 원하는 형태의 이름으로 저장을 하고 아래 명령어로 프로그램을 구동해 봅니다.

[서보모터 제어용 주요 함수]

PiServoHat_Py 패키지의 서보모터 제어용 주요 함수는 아래 표와 같습니다. 함수에 대한 더 자세한 설명은 공식문서를 참고해 주십시오.

함수

설명

.restart()

이 함수는 PCA9685칩을 소프트웨어적으로 리셋시켜서 PWM기능을 재시작하는 MODE1 레지스터를 초기화 시킵니다. 이 함수 실행시 기본 PWM의 기본주파수는 50HZ로 설정됩니다.(서보모터 제어에는 50HZ의 주파수가 요구됩니다.)

.get_pwm_frequency()

출력에 사용된 PWM 주파수 값을 얻어 옵니다. 반환값의 자료형은 정수(INTERGER)입니다.

.set_pwm_frequency(frequency)

PWM 주파수를 frequency에 지정한 주파수값으로 설정합니다. 지정가능한 주파수값의 범위는 24Hz에서 1526Hz까지 가능합니다.

.get_servo_position(channel)

.get_servo_position(channel, swing)

channel에 지정한 서보모터의 현재 각도를 반환합니다. swing은 90도서보인지 180도 서보인지를 직접 지정해 줄 때 사용합니다.

.move_servo_position(channel, position)

.move_servo_position(channel, position, swing)

channel에 지정한 서보모터를 postion에 지정한 각도로 회전시킵니다. swing은 90도서보인지 180도 서보인지를 지정할 때 사용합니다.

.set_duty_cycle(channle, duty_cycle)

서보모터를 지정한 듀티사이클에 기반해서 이동시킵니다. duty_cycle에 넣을 수 있는 값의 범위는 0-100까지 입니다. 0인경우 0% 100인경우 100%입니다. 해당도는 12비트, 4096단계입니다.

라즈베리파이 서보모터 여러개 - lajeubelipai seobomoteo yeoleogae