PIC24FJで4足ロボットの製作(その2) [PIC]
4足ロボット製作の続編です。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
- タイマー初期化
前回の記事で書いたようにサーボの制御は PWM 方式で周期が 20 ms でパルス幅が 1.5 ms ± 0.8 にするための初期化に関するパラメータとしては次のようになります。
PR_MIN と PR_MAX は Timer2 と Timer3 に設定する PWM のパルス幅用カウント値の最小値と最大値でそれぞれ 0.7 ms と 2.3 ms に相当します。
PR_MIN と PR_MAX の差が約 3万程度あるので解像度としては十分なはずです。
★2016/06/11 追記 {
サーボを動かしてみると3万の解像度は過剰なため、2バイト変数で大小比較が可能なように time2 と timer3 のプリスケーラーを1/1から1/8に変更。
}
#define F_CPU 32000000UL #define FCY (F_CPU / 2) #define TIM_INTERVAL 2.5 // timer1 interrupt interval [ms] #define PR1_VAL ( (FCY / 64) / (1000 / TIM_INTERVAL ) ) #define TIM_MIN 0.7 // minimum timer [ms] #define TIM_MAX 2.3 // maxmum timer [ms] #define PR_MIN ( (FCY / 8) / (1000 / TIM_MIN ) ) // 0x03e8 #define PR_MAX ( (FCY / 8) / (1000 / TIM_MAX ) ) // 0x1388 void init( void ) { ・ ・ ・ PR1 = PR1_VAL; T1CON = 0xa020; // TON:ON TSIDL 1/64 IEC0bits.T1IE = 1; // enable time1 interrupt T2CON = 0x2010; // TON:OFF TSIDL 1/8 IEC0bits.T2IE = 1; // enable time2 interrupt T3CON = 0x2010; // TON:OFF TSIDL 1/8 IEC0bits.T3IE = 1; // enable time3 interrupt ・ ・ ・ }
- picle言語とのI/F
下記の構造体の配列(12要素)を 用意し、picle言語から組込変数としてアクセス可能にします。
タイマー割込み処理では setval の値で PWMパルス幅の設定をするようにしています。
picle 言語で setval の値を変更して各サーボの動作範囲を見ながら、angle の角度に動くように調整し、調整した値を width に設定します。
また、Timer1 割込み処理内で 4 回に 1 回、picle の Timer_ 変数がゼロ以外の場合ディクリメントしています。
★2016/06/11 変更 角度情報を追加typedef struct { int16_t angle; // servo angle int16_t width; // servo PWM width } TYPE_SERVO_CTRL; // servo control typedef struct { TYPE_SERVO_CTRL min; TYPE_SERVO_CTRL center; TYPE_SERVO_CTRL max; int16_t setval; } TYPE_SERVO;
今回使用するサーボ(SG90)は1年以上前に10個入り(2350円)を二つ別々に購入したもので、両者のロットが違う(どちらかまたは両方がパチモン?)ためか、シャフトの径が微妙に違うのと同様なパルス幅の範囲で動かしても動作範囲が結構違います w
また、パルス幅を等速度で変更した際、両端での軸の回転速度が微妙に違うようなのでソフトキャリブレーションが必要かもしれません w
もっと高級なサーボを使えばこの辺の苦労は少ないのでしょうが、悪条件下でもソフトで何とかするのも楽しみの一つです(本当かなぁw)
- 制御ボードの製作
サーボの数は多いですが回路は単純なのでブレッドボードではなく、汎用基板でサクッと作ってみました。
サーボは5V駆動とし、ボード上で3端子レギュレータでPIC用の3.3Vを作っているのでサーボ駆動による電源電圧の変動にも強いはずです。サーボの制御はレベル変換無しに PIC24FJ64GA002 から直に行っています。
また、外部接続用としてシリアル通信(3Pのピンソケット)と フラッシュ書込み用(OneBitLoader)に2Pのピンソケットを付けました。
更に将来的にセンサー等を接続できるように I2C 通信用としてPICの6,7番ピンを確保しています。
Name Pin No usage RA0 2 LED(1:ON) RA1 3 IrInput RA2 9 CoverLED(1:ON) RA3 10 not use RA4 12 not use RB0 4 Servo0 RB1 5 Servo1 RB2 6 I2C SDA2 RB3 7 I2C SCL2 RB4 11 Servo2 RB5 14 Servo3 RB6 15 Servo4
(OneBitLoader)RB7 16 Servo5 RB8 17 UART(Rx) RB9 18 UART(Tx) RB10 21 Servo6 RB11 22 Servo7 RB12 23 Servo8 RB13 24 Servo9 RB14 25 Servo10 RB15 26 Servo11
★2016/09/11 RA2にCoverLED(1:ON)追記
作成した制御ボードの概観は次の写真の通りです。サーボ用のピンヘッダが13ch分あるのはサーボ駆動用の5V電源供給のために1つ使うからです。
サーボ制御基板(部品面) サーボ制御基板(半田面)
[TOP] [ 前へ ] 連載記事 [ 次へ ]
コメント 0