Dependencies: FastPWM GMD_template_lib mbed
GMD
「GMD」は2016年のロボコンにおいて新しくなったMD(モータドライバ)用のライブラリであり、「NewMD2」は「GMD」を利用したLPC1114用のプログラムです。この「NewMD2」が動作しているMD(以下「GMD」とする)の使用方法を説明します。
インターフェース¶
GMDはインターフェースとしてI2Cを備えていて、スレーブとして動作します。I2Cで使うスレーブアドレスを決定するために4PのDIPスイッチがあり、起動時にこのスイッチの値を読み取ることでスレーブアドレスを決定します。
また、GMDはリセットスイッチも備えているため、リセットスイッチを押すことで、DIPスイッチの状態の変更を反映させることができます。
GMDにプログラムを書き込むにはプログラム書き込み用端子に専用の書き込み器を差し込みPCから書き込みます。この書き込み器はUSBシリアル変換モジュールを使って簡単に作ることができます。
スレーブアドレス¶
I2Cのスレーブアドレスには10ビットアドレス指定と7ビットアドレス指定がありますがGMDは7ビットアドレス指定です。
実際にスレーブアドレスを設定する際はDIPスイッチの入力が2進数4桁の値として扱われ、この値にオフセット値として8を足した値を使用します。スレーブアドレスには予約済みアドレスが存在しており、その値を使わないようにするためにオフセット値を足して最終的なスレーブアドレスを決定しています。以下にアドレスの範囲の表と予約済みアドレスの表を載せておくので確認しておいてください。なおDIPスイッチの値は二進数であり、スイッチの位置とは対応していないです。下に1と書いてあるのスイッチがLSB(最下位ビット)で4と書いてあるスイッチがMSB(最上位ビット)となります。
またスレーブアドレスはR/Wビットを含める考え方と含めない考え方の二通りあり、今この表に乗っているデータはR/Wビットを含めて表記しています。mbedSDKのI2Cはこの方法を採用しているためmbedで使用する限りはこの表の通りで問題ないと考えられますが、もしこの表の通りにして出来なかったときは右に1つシフトしてみてください。
DIPスイッチ | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 |
---|---|---|---|---|---|---|---|---|
I2Cスレーブアドレス | 0x10 | 0x12 | 0x14 | 0x16 | 0x18 | 0x1A | 0x1C | 0x1E |
DIPスイッチ | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
---|---|---|---|---|---|---|---|---|
I2Cスレーブアドレス | 0x20 | 0x22 | 0x24 | 0x26 | 0x28 | 0x2A | 0x1C | 0x2E |
*出典:UM10204 I2C バス仕様およびユーザーマニュアル Rev. 5.0J — 2012 年 10 月 9 日 (日本語翻訳 11 月 2 日)
http://www.nxp.com/documents/user_manual/UM10204_JA.pdf
制御データ¶
I2Cで渡される モータの回転状態を指定したデータ(以下「制御データ」とする)のデータ長は1Byteです。この制御データが8bitの符号付き整数型として評価され、-128~127の範囲の値となります。この値がモータの回転の状態を表していて、127の時に最大の力で正転し、-127, -128の時に最大の力で逆転します。そして、0の時にブレーキをします。
タイムアウト¶
GMDにはI2Cでの通信が一定時間以上途切れたら開放するという機能があります。そのため、GMDを使ったプロジェクトでは値が変わっていなくてもメインの処理でGMDとI2Cで通信をするようにしてください。現在は300[msec]がタイムアウトの時間になっています。
スイッチング周波数¶
GMDのスイッチング周波数はデフォルトで20[kHz]とライブラリ側で設定されています。使用する状況によってはスイッチング周波数を変更する必要が生じる場合があります。変更する場合は以下の例のように変えます。
スイッチング周波数を10[kHz]に変更
GMD<5, 95> md(dp1, dp2, dp9); md.set_frequency_kHz(10.0f);
Duty比の範囲¶
Duty比の範囲は「NewMD2」においてはデフォルトで5%~95%と設定されています。何らかの要因からこの値を変更したいことがあるかもしれません。その時は下の例のように設定します。
Duty比の範囲を10%~90%に設定
GMD<10, 90> md(dp1, dp2, dp9);