前回はFlashAirに直接LEDをつないでLEDを制御したが、今度は秋月のFlashAir DIP IOボードキットを介してLEDを制御してみよう。
用意するもの
- FlashAir
- FlashAir DIP IOボードキット(秋月電子)
- ピンヘッダは要半田付け
- ブレッドボードとかLEDとか抵抗とか電源
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 DIP IOボード (FlashAir Developers)
- サンプルコードがある(
fa.spi
ではなく、fa.pio
を使って自前でSPIしている)
- サンプルコードがある(
fa.spi
関数 (FlashAir Developers)- SC18IS600IBS (NXP)
- 秋月のDIP IOボードキットに使われているチップ
参考になるかもしれないページ
mode3で動かない問題の原因らしきものがわかりましたので、こちらにも報告させていただきます。
おそらく、fa.spiのCS操作あたりにバグ(か仕様)が有るようです。
CS操作後に適当な読み込みもしくは書き込みをしてやると、安定して動作するようになると思います。
http://gpsnmeajp.blogspot.com/2015/12/faspi.html