2023年4月
            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            

カテゴリー

ブログパーツ

無料ブログはココログ

« turtlesim_nodeを自作ノードで動かしてみる | トップページ | 【昔語り3】信越電機商会の頃 »

2013年3月 3日 (日)

PIC24FでI2C接続サーボドライバを試してみる

花岡ちゃんのウィークエンド

今回はI2C接続のサーボドライバーを試して見ます。モノはこれでPCA9685というLED用PWMドライバのブレイクアウトボードです。これも簡単にいくはずがハテナということがあったので投稿しておきます。

このデバイスは16chのPWMジェネレータ内蔵、それぞれ分解能は12bitです。これを周波数61Hz、ステップ4usでサーボ信号を作るように設定するだけです。前出の基板はサーボやI2C接続用のピンヘッダとサーボ電源のターミナルをハンダ付けするだけで完成します。もともとPCA9685は外付け部品がほとんど必要ありません。以前このような機能をもったI2Cのインターフェイスを試作しましたが、それよりも多チャンネルで手軽です。

7bitのI2Cアドレスの下位6ビットは、基板の半田ジャンパでセットできます。最上位ビットは1固定なので、設定できるアドレスは0x40(ヘッダバイトでは1000000X)から0x7F(同じく1111111X)までです。電光掲示板のドライバなどに多数使われることを想定して、かなり広い設定範囲を持っています。さらに、拡張アドレスを持っているようで、大規模なシステムにも対応しているようです。
ただし、0x03(設定範囲外ですがマニュアルはこうなってます)はソフトリセットに、0x70はAll Call(ブロードキャスト)アドレスに予約済みなので使用できません。この実験では全てのジャンパをオープンのままにしました。I2Cアドレスは0x40になります。

この基板を、以前から実験に使っているPIC24FのブレットボードのSDA,SCL,GND,VCCに接続します。
Dscn2538

ソフトは以前の投稿と同じようにシリアルでコマンドをやり取りするようにしました。回路も同様です。EEPROMは使っていないので実装の必要はありません。このプロジェクトには今までのデバイスのドライバ+PCA9685のドライバが入ってます。また、UART1のハンドラを修正してバックスペースでコマンドの修正が出来るようになっています。
「pic24f_test_5.zip」をダウンロード

ターミナルを接続して起動、プロンプトが表示されたら下記のコマンドを打ち込みます。
move サーボID(0~15) パルス幅(us)
例えば、"move 0 1200"とするとサーボ0の制御パルスの幅を1200usにします。

サーボをつなぐ前にオシロで波形を確認します。ここで問題発生です。データシートの計算式で設定した周波数やパルス幅がその通りになりません。一割くらいずれています。

調べたところこのような事情でした。内蔵クロック発振器の周波数がデバイスごとにかなりばらつくようです。最近のマイコンの内蔵クロックの誤差はせいぜい数パーセントですが、このデバイスではずっと大きいようです。もともとLEDの輝度調整用ですから、PWMのデューティさえ正確なら、周波数はそれほど重要ではありません。データシートには内蔵クロックの確度の記載すらありません。
リンク先の三番目の投稿のように、初期化時にPWMの周波数を測定し自動で合わせ込むことも出来そうですが、計測用に入力ポートが一つ必要ですし、本質的な対処法ではないのでスッキリしません。このデバイスはクロックの外部入力も出来るので、一番いいのは水晶モジュールを外付けすることですが、この基板にはその機能がありません。外部クロック入力はGNDに接続され、切り離しジャンパも引き出し用の半田パッドもありません。パターンをカットして0.65ピッチの足に引き出し線をハンダ付けするのはちょっとした神業です。外部クロックを使うならDigKeyでデバイスだけ買って自作したほうがいいでしょう。

そういうわけで、オシロで測定しながらプリスケーラのパラメータを調整、61Hzに合わせました。ソフトを起動するとパルス幅を1500usに初期化するので、オシロの無い方は、サーボをつないでニュートラルになるようmain.c、486行の"108"を調整すればよいでしょう。
測定しながらドライヤーで加熱してみましたが、温度に対しては安定でした。つまり、一度合わせ込めば実用上は問題なさそうです。

この設定では4us刻みでパルス幅を設定(moveコマンドで指定したパルス幅はこの単位に丸められる)できます。ヒューマノイドロボットのように微妙な制御が必要なものには少々苦しいかもしれませんが、カムやクランク代わりにサーボを使う分には十分です。

サーボ用の電源ターミナルにはエネループ4本を入れた電池ボックスを接続しました。サーボが暴走したときの為に、スイッチ付きの電池ボックスのほうがいいでしょう。

Dscn2537


« turtlesim_nodeを自作ノードで動かしてみる | トップページ | 【昔語り3】信越電機商会の頃 »

花岡ちゃんのウィークエンド」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: PIC24FでI2C接続サーボドライバを試してみる:

« turtlesim_nodeを自作ノードで動かしてみる | トップページ | 【昔語り3】信越電機商会の頃 »