FlashAir W-04のI2C機能で、DRV8830を駆動させてみた

  • 1
    いいね
  • 0
    コメント

FlashAir W-04が発売に!

2017年6月についに第4世代目のFlashAir W-04が発売となりました。新しく追加されたり強化された機能は、以下のサイトを参考にしてください。
 第4世代FlashAir W-04
 FlashAir開発者向け非公式wiki - W-04特設ページ

LuaスクリプトにI2C機能が追加!

 W-04では、Luaスクリプトの機能強化、機能追加が行われています。そのなかで、今回はI2C機能に注目してみました。

 Lua関数リファレンス

 今回は、新しい関数の一つであるfa.i2c関数を使って、FlashAirからI2C接続したモータードライバDRV8830を制御してみます。

構成

 必要なものは以下のとおりです。

IMG_6003.JPG

 今回、DRV8830はアドレス設定ピンA0、A1をともに何も接続しないopen状態として、0xC8に設定しています。
 FlashAirとDRV8830は、以下の表の通りに接続します。
 FlashAirでは、2番ピン(CMD)がSCL、7番ピン(DAT0)がSDAとなっていますので、DRV8830のそれぞれ10番ピンと9番ピンに接続します。
 今回、「SDカードスロットDIP化モジュール」を使用しているので、SCLとSDAはともに10KΩ抵抗でプルアップされています。

FlashAir_drv8830_pinasign.png

CONFIGファイルの設定

 FlashAirのSD_WLANフォルダ内のCONFIGファイルに、以下のオプションを追加します。IFMODEはFlashAirのGPIOモードをONにしています。LUA_RUN_SCRIPTはFlashAirの電源投入後すぐに指定のLuaスクリプトを起動するための設定です。
IFMODE=1
LUA_RUN_SCRIPT=/drv8830sample.lua

 ※SD_WLANフォルダとCONFIGファイルは不可視属性ファイルなので注意してください。

Luaスクリプトファイル

 FlashAirのルートフォルダに以下のコードを記述したテキストファイル(drv8830sample.lua)をコピーします。
 このコードでは、最高速度(0x3F)で5秒間正転(0x01)させて、その後、最高速度(0x3F)で5秒間逆転(0x02)させて、停止します。
 FlashAirのI2CはMasterとして作動し、接続しているDRV8830はSlaveとして作動します。I2C機能で、Slaveのアドレスを指定する場合は、7bit表記で指定します。DRV8830のデータシートに記載されているアドレスは8bit表記なので、1bit右にシフトさせた数値になります。
 今回、DRV8830のエラー処理は省略しています。

drv8830sample.lua
-- FlashAir + DRV8830
local md_addr = 0x64 --アドレス0xC8を7bit表現で指定
function write_i2c_command(addr, data1, data2)
    res = fa.i2c{ mode="start", address=addr, direction="write" }
    res = fa.i2c{ mode="write", data=data1 }
    res = fa.i2c{ mode="write", data=data2 }
    res = fa.i2c{ mode="stop" }
end

function sendMotorDrive(addr, reg, vset, data)
    local vdata = bit32.bor(bit32.lshift(vset, 2), data)
    write_i2c_command(addr, reg, vdata)
end

res = fa.i2c{ mode="init", freq="100" }
sendMotorDrive(md_addr, 0x00, 0x00, 0x00)
sleep(1000)
sendMotorDrive(md_addr, 0x00, 0x3F, 0x01)
sleep(5000)
sendMotorDrive(md_addr, 0x00, 0x3F, 0x02)
sleep(5000)
sendMotorDrive(md_addr, 0x00, 0x00, 0x00)

動作確認

 上記Luaスクリプトが動作し、モータードライバDRV8830のOUT1、OUT2に約-5V〜5Vの出力が行われます。線路に接続すれば鉄道模型の車両が前後に動きます。
 今回使ったDRV8830は、動作電源電圧範囲が2.75V~6.8Vであり、今回は5Vを入力としているため、一般的に最大12V対応のNゲージ車両では低速運転となります。車両のモーターの状態によっては電圧不足で動かない場合もあります。

まとめ

 以上で、FlashAirのI2C機能を使って、モータードライバDRV8830を制御することができました。これまでSPI-I2C変換ICのお世話になっていたところを、ダイレクトに接続できるようになったのは素晴らしいですね。さらに手軽にI2Cデバイスが利用できるようになりました。

参考資料

 FlashAir W-04について
 第4世代FlashAir W-04
 FlashAir開発者向け非公式wiki - W-04特設ページ
 Lua関数リファレンス
 Lua関数リファレンス - I2C

 モータードライバDRV8830について
 DRV8830データシート