5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-06-23

#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スクリプトを起動するための設定です。

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データシート

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?