FlashAirで遊ぶ — SPIでIOボードを制御

前回はFlashAirに直接LEDをつないでLEDを制御したが、今度は秋月のFlashAir DIP IOボードキットを介してLEDを制御してみよう。

用意するもの

FlashAirとFlashAir DIP IOボードキット

FlashAirとFlashAir DIP IOボードキット

FlashAir DIP IOボードキットにはSC18IS600IBSというGPIO+I2Cインターフェースブリッジが載っていて、FlashAirからこのブリッジにSPIでコマンドを送ってやるとSC18IS600IBSのGPIO等を制御できる。

FlashAir DevelopersにあるサンプルプログラムではLuaでSPIを実装しているが、最近出た最新のファームウェア(3.00.01)では fa.spi 関数 が使えるようになったみたいなのでこれを使えば良さそうだ。

プログラム(spitest.lua)は以下のように適当に書いてやる。前回のHTTPのやつと違って、一旦起動すると無限ループで延々とLEDを点滅させる。SPIの設定は、クロック周期は fa.spi("init", 1) だとうまくいかなかった。また、SPIモードは 0 か 2 を指定するとうまくいった。

-- spitest.lua

-- Internal registers of SC18IS600.
-- See the data sheet of SC18IS600.
local REG = {
  IOConfig = 0x00,
  IOState = 0x01,
  I2CClock = 0x02,
  I2CTO = 0x03,
  I2CStat = 0x04,
  I2CAdr = 0x05
}

-- Write to SC18IS600 internal registers
local function writereg(register, data)
  fa.spi("cs", 0)
  fa.spi("write", 0x20)
  fa.spi("write", register)
  fa.spi("write", data)
  fa.spi("cs", 1)
end

fa.spi("init", 2) -- 2以上
fa.spi("mode", 2) -- 0 or 2

writereg(REG.IOConfig, 0xAA) -- IO0~IO3: push-pull output

while true do
  writereg(REG.IOState, 0x05) -- IO0: 1, IO1: 0, IO2: 1, IO3: 0
  sleep(1000) -- 1.000s
  writereg(REG.IOState, 0x0a) -- IO0: 0, IO1: 1, IO2: 0, IO3: 1
  sleep(1000) -- 1.000s
end

設定ファイル(/SD_WLAN/CONFIG)に以下のように書いて、さっき書いた spitest.lua を電源投入時(の5秒後)に実行するようにしてやる。

IFMODE=1
LUA_RUN_SCRIPT=/spitest.lua

うまくLEDが点滅しない時は、IOボードのリセットスイッチを長押ししてやるとよさそう。

FlashAir + FlashAir DIP IOボードキットでLチカ

FlashAir + FlashAir DIP IOボードキットでLチカ

資料

参考になるかもしれないページ


FlashAirで遊ぶ — SPIでIOボードを制御」への1件のフィードバック

  1. SegFaul

    mode3で動かない問題の原因らしきものがわかりましたので、こちらにも報告させていただきます。
    おそらく、fa.spiのCS操作あたりにバグ(か仕様)が有るようです。
    CS操作後に適当な読み込みもしくは書き込みをしてやると、安定して動作するようになると思います。
    http://gpsnmeajp.blogspot.com/2015/12/faspi.html

    返信

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です