秋月で買ったサーボ・モーター GWS PICO(今現在は売り切れ中)を動かしてみた。
FUTABA互換というのがミソらしいのだが、そもそもFUTABAを知らない。
その方面の知識は皆無だ。
なので、とりあえずはメーカーのサイトで仕様とアプリケーションを確認しておく。
下の写真は別の製品のものだが、中身はこんなに複雑なんだな。
上のサイトから抜き出したのが以下のもの。
上の仕様から、5V程度で駆動可能なことを確認して、PICと同じ電源でいくことにする。
上のD.とE.からは、パルスの送り方の規則が何となく分かるので、以下のようなひどく簡単なプログラムでとりあえず動かしてみる。
たまたま、ブレッドボード上にPIC12F1822が刺さってたので使っただけで、プログラムから分かるとおり、たぶんどのPICでも動くと思う。
特殊な機能は一切使ってないから。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
#define _XTAL_FREQ 8000000 #define SERVO_PIN RA2 #include <xc.h> // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. // CONFIG1 #pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = ON // Power-up Timer Enable (PWRT enabled) #pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled) #pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled) // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config PLLEN = OFF // PLL Enable (4x PLL disabled) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming) void main(){ OSCCONbits.IRCF = 0b1110;//8MHz TRISAbits.TRISA2 = 0;//RA2 is Output ANSELAbits.ANSA2 = 0;//RA2 is Digital I/O APFCONbits.CCP1SEL = 1;//CCP1/P1A function is on RA5 unsigned char i; __delay_ms(1000); while(1){ unsigned int i; for(i=0; i<50; i++){//+60 Deg SERVO_PIN = 1; __delay_us(800); SERVO_PIN = 0; __delay_us(19200); } __delay_ms(100); for(i=0; i<50; i++){//0 Deg SERVO_PIN = 1; __delay_us(1400); SERVO_PIN = 0; __delay_us(18600); } __delay_ms(100); for(i=0; i<50; i++) {//-60 Deg SERVO_PIN = 1; __delay_us(2200); SERVO_PIN = 0; __delay_us(17800); } __delay_ms(100); for(i=0; i<50; i++){//0 Deg SERVO_PIN = 1; __delay_us(1400); SERVO_PIN = 0; __delay_us(18600); } __delay_ms(100); } } |
Frame time を2.0ms、Pulse width は、0.8ms、1.5ms、2.2msとした。
このPulse widthの値は、アプリケーションの上では許容範囲ぎりぎりだ。
これを逸脱するとジッターが発生したり遅くなったり故障したりらしいので、通常は0.9~2.1msで使う。
配線も特に難しいことは無い。
左右60°に振れる設定で、まあ分度器のセッティングがいい加減だから何とも言えないが、そこそこ予定通りの動作にはなっていると思う。
普通のモーターでこのように決められた角度まで回転してそこで静止というような動作をさせるには、考えただけでも大変な仕組みが必要で、そもそもどこまで回転したのかを検知するだけでもこのサイズでは素人には不可能だ。
更新(2015/05/05)
久しぶりに眺めて、コードをコピペしてサーボを作動させてみた。
Configuration Bitsの部分をすっかり忘れていて、すぐにはちゃんと動かせなかったので、全部含めたコードに入れ替えた。
1年経つと自分のコードさえ分からなくなる。