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

#FlashAir W-04が発売に！
 2017年6月についに第４世代目のFlashAir W-04が発売となりました。新しく追加されたり強化された機能は、以下のサイトを参考にしてください。
　[第4世代FlashAir W-04](https://flashair-developers.com/ja/discover/overview/w04/)
　[FlashAir開発者向け非公式wiki - W-04特設ページ](http://seesaawiki.jp/flashair-dev/d/W%2d04%C6%C3%C0%DF%A5%DA%A1%BC%A5%B8)

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

　[Lua関数リファレンス](https://flashair-developers.com/ja/documents/api/lua/#reference)

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

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

- FlashAir W-04
- DRV8830 （[秋月電子通商](http://akizukidenshi.com/catalog/g/gK-06273/)）
- SDカードスロットDIP化モジュール([秋月電子通商](http://akizukidenshi.com/catalog/g/gK-05818/))
- ブレッドボード
- ACアダプター（5V/1A）

![IMG_6003.JPG](https://qiita-image-store.s3.amazonaws.com/0/89137/7638cb8f-d536-a5ef-c866-ba7a9440fb68.jpeg)

　今回、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](https://qiita-image-store.s3.amazonaws.com/0/89137/dbcfbcfe-3197-9752-1840-1273b286f634.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のデータシート](http://akizukidenshi.com/download/ds/ti/drv8830.pdf)に記載されているアドレスは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](https://flashair-developers.com/ja/discover/overview/w04/)
　[FlashAir開発者向け非公式wiki - W-04特設ページ](http://seesaawiki.jp/flashair-dev/d/W%2d04%C6%C3%C0%DF%A5%DA%A1%BC%A5%B8)
　[Lua関数リファレンス](https://flashair-developers.com/ja/documents/api/lua/#reference)
　[Lua関数リファレンス - I2C](https://flashair-developers.com/ja/documents/api/lua/#I2C)

　モータードライバDRV8830について
　[DRV8830データシート](http://akizukidenshi.com/download/ds/ti/drv8830.pdf)