제13회 Raspberry Pi로 감시 카메라를 만들자! ~서보 모터 제어편~

Raspberry Pi와 전용 카메라 모듈을 사용하여 ONVIF 지원 감시 카메라를 만듭니다 시리즈 기사
이 기사는 링크 정보 시스템 주식회사의 유지가 작성하고 있습니다.

카메라의 목 흔들기 기능용으로 서보 모터를 붙였으므로, 서보 모터를 제어하여 전후 좌우로 카메라를 움직입니다.

서보 모터 제어 (I2C)



서보 모터 제어



이번에 사용하는 PWM 컨트롤러를 탑재하는 보드는 Adafruit사가 발매하고 있으며, 이 회사에서 Adafruit_PWMServoDriver.cpp라는 드라이버의 소스가 공개되어 있습니다.
참고자료 : Adafruit-PWM-Servo-Driver-Library/Adafruit_PWMServoDriver.cpp at master · adafruit/Adafruit-PWM-Servo-Driver-Library · GitHub

이 소스는, arduino를 대상으로 작성되고 있습니다만, 심플한 C언어이므로, 대부분의 처리는 유용하는 것이 가능합니다.

서보 모터 제어 처리의 흐름은 다음과 같습니다.
1. 초기화
2. 서보 이동

포인트가 되는 실제의 처리를 발췌해 해설합니다.

1. 초기화

RaspberryPi에서 I2C 통신을 수행하는 경우 "/dev/i2c-1"을 열고 슬레이브 주소를 설정합니다.
i2c = open("/dev/i2c-1", O_RDWR);
ioctl(i2c, I2C_SLAVE, 0x40);

이제 PCA9685와 통신할 수 있게 되었으므로 리셋하고 서보를 동작시킵니다.
// PCA9685をリセット
write8(PCA9685_MODE1, 0x0);

// サーボ制御パルス周波数設定
setPWMFreq(60);

// 中心に移動する
setPWM(1, 0, CalcPulseWidth(90));
setPWM(0, 0, CalcPulseWidth(90));

2. 서보 이동

각도를 지정하여 서보를 이동합니다.
// 1 = 左右用のサーボを移動
setPWM(1, 0, CalcPulseWidth([角度]));

// 0 = 上下用のサーボを移動
setPWM(0, 0, CalcPulseWidth([角度]));

각도는 90도가 중앙, 45도 ~ 135도를 지정하여 좌우, 상하로 이동할 수 있다고 생각하십시오.
첫 번째 인수의 1/0은 X 방향 서보인지 Y 방향 서보인지를 나타냅니다.
이번 접속 방법의 경우 1채널은 X방향(좌우), 0채널은 Y방향(상하)에 해당합니다.

드라이버 이식 정보



이번에 사용한 PCA9685의 하드웨어와 같이, 일반적으로는 메이커로부터 드라이버의 소스가 공개되어 유저가 사용할 수가 있게 되어 있습니다.

하지만 I2C나 GPIO에서의 통신 제어는 각각의 환경에서 제공되는 라이브러리가 다르기 때문에 반드시 모든 환경에서 그대로 사용할 수 있는 형태로 드라이버가 제공되는 일은 없습니다.
그래서 대부분의 드라이버의 소스는 HAL(HardwareAbstrationLayer)라고 하는 형식으로 통신 부분을 추상화하고 함수를 따로 나누고 그 부분만 개조함으로써 드라이버를 이식할 수 있는 형식으로 되어 있습니다. .



이번 Adafruit-PWM의 드라이버의 경우는 TwoWire라는 클래스를 정의하고 있어 그 클래스에 I2C 통신의 처리를 구현시키고 있는 것 같았습니다.
그러므로, 이 드라이버를 그대로 사용하고 싶은 경우는, TwoWire 클래스를 구현할 필요가 있습니다.

주의사항



이번 사용하고 있는 서보는 기동할 때마다 어긋남이 발생하기 때문에 90도가 반드시 중앙이 되는 것은 아니다. 그 때문에, 어떠한 기계적인 구조나 센서를 이용해, 전원 ON 때마다, 트림 조정을 실시해, 매번, 어긋나 있는 분을 각도에 반영하는 등의 궁리가 필요하다고 생각합니다. (이번 시작에서는 거기까지의 기능은 준비되어 있지 않습니다.)

색인 기사로
제12회 기사에
제14회 기사에

링크 정보 시스템 주식회사 그럼 함께 일하는 동료를 수시 모집 하고 있습니다!
또, 일의 의뢰, 비즈니스 파트너님도 모집하고 있습니다. 부담없이 연락 제발.

좋은 웹페이지 즐겨찾기