まずは動いている動画を。
黄色のスイッチで中立。緑で時計回りに回転。青で反時計回りに回転。
それぞれ、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ビットタイマーを使って独自にカウントして制御していました。
確かにいろいろなセンサーからのデータを処理した結果でサーボモーターを動かすということが多いはずなので、あまり低いクロックで動かすのはもったいない。
次はセンサーを付けて、それの反応としてサーボモーターを動かしてみようと思う。