まずは動いている動画を。
黄色のスイッチで中立。緑で時計回りに回転。青で反時計回りに回転。
それぞれ、1.0ms、2.0msを超えないように制限しています。
※使っているサーボモーターはGWServo S03T 2BBMGです。
配線はこの通り。
PICの電源はPICKit2から供給して、電池ボックスはサーボモーターのための電源になっています。
ソースコードは次のようになっています。
#include <htc.h>
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 500000
#endif
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & BORDIS);
void main(void)
{
OSCCON = 0x03 << 4; // 500kHz
CMCON0 = 0x07;
GPIO = 0x00;
TRISIO = 0x38; // input:3, 4, 5, output:0, 1, 2
ANSEL = 0;
// PWMの設定
unsigned char pulse = 0x2F;
unsigned char pulse2 = (pulse & 0x03) << 4;
PR2 = 155;
CCPR1L = pulse >> 2;
CCP1CON = 0x0C | pulse2;
T2CON = 0x07;
TMR2 = 0;
// 無限ループ
while (1) {
if (GPIO5 == 0) {
if (pulse > 0x20) {
pulse--;
pulse2 = (pulse & 0x03) << 4;
CCPR1L = pulse >> 2;
CCP1CON = 0x0C | pulse2;
}
} else if (GPIO4 == 0) {
pulse = 0x2F;
pulse2 = (pulse & 0x03) << 4;
CCPR1L = pulse >> 2;
CCP1CON = 0x0C | pulse2;
} else if (GPIO3 == 0) {
if (pulse < 0x3E) {
pulse++;
pulse2 = (pulse & 0x03) << 4;
CCPR1L = pulse >> 2;
CCP1CON = 0x0C | pulse2;
}
}
__delay_ms(100);
}
}
PWMでのサーボモーターの制御を調べていてPWM周期20msとかだとかなりクロックを低く(500kHz)抑えないといけないので、多くのサイトでは16ビットタイマーを使って独自にカウントして制御していました。
確かにいろいろなセンサーからのデータを処理した結果でサーボモーターを動かすということが多いはずなので、あまり低いクロックで動かすのはもったいない。
次はセンサーを付けて、それの反応としてサーボモーターを動かしてみようと思う。
