SSブログ
English Version

PIC24FJで4足ロボットの製作(その2) [PIC]

 4足ロボット製作の続編です。

  1. タイマー初期化
     前回の記事で書いたようにサーボの制御は 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
        ・
        ・
        ・
    }
    


  2. picle言語とのI/F
     下記の構造体の配列(12要素)を 用意し、picle言語から組込変数としてアクセス可能にします。
     タイマー割込み処理では setval の値で PWMパルス幅の設定をするようにしています。
     picle 言語で setval の値を変更して各サーボの動作範囲を見ながら、angle の角度に動くように調整し、調整した値を width に設定します。
     また、Timer1 割込み処理内で 4 回に 1 回、picle の Timer_ 変数がゼロ以外の場合ディクリメントしています。

    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;
    
    ★2016/06/11 変更 角度情報を追加

     今回使用するサーボ(SG90)は1年以上前に10個入り(2350円)を二つ別々に購入したもので、両者のロットが違う(どちらかまたは両方がパチモン?)ためか、シャフトの径が微妙に違うのと同様なパルス幅の範囲で動かしても動作範囲が結構違います w
     また、パルス幅を等速度で変更した際、両端での軸の回転速度が微妙に違うようなのでソフトキャリブレーションが必要かもしれません w
     もっと高級なサーボを使えばこの辺の苦労は少ないのでしょうが、悪条件下でもソフトで何とかするのも楽しみの一つです(本当かなぁw)


  3. 制御ボードの製作
     サーボの数は多いですが回路は単純なのでブレッドボードではなく、汎用基板でサクッと作ってみました。
     サーボは5V駆動とし、ボード上で3端子レギュレータでPIC用の3.3Vを作っているのでサーボ駆動による電源電圧の変動にも強いはずです。サーボの制御はレベル変換無しに PIC24FJ64GA002 から直に行っています。
     また、外部接続用としてシリアル通信(3Pのピンソケット)と フラッシュ書込み用(OneBitLoader)に2Pのピンソケットを付けました。
     更に将来的にセンサー等を接続できるように I2C 通信用としてPICの6,7番ピンを確保しています。

    NamePin Nousage
    RA02LED(1:ON)
    RA13IrInput
    RA29CoverLED(1:ON)
    RA310not use
    RA412not use
    RB04Servo0
    RB15Servo1
    RB26I2C SDA2
    RB37I2C SCL2
    RB411Servo2
    RB514Servo3
    RB615Servo4
    (OneBitLoader)
    RB716Servo5
    RB817UART(Rx)
    RB918UART(Tx)
    RB1021Servo6
    RB1122Servo7
    RB1223Servo8
    RB1324Servo9
    RB1425Servo10
    RB1526Servo11
    ★2016/08/21 RA1にIrInput(赤外線入力)追記
    ★2016/09/11 RA2にCoverLED(1:ON)追記

     作成した制御ボードの概観は次の写真の通りです。サーボ用のピンヘッダが13ch分あるのはサーボ駆動用の5V電源供給のために1つ使うからです。

    サーボ制御基板(部品面) サーボ制御基板(半田面)

[TOP] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(0)  トラックバック(3) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 3