ESP8266はファームウェアを入れ換えてeLuaを動作させることが出来ます。
入手したチップはGPIOポートが2つだけ使えます。ポートが2つだけだと面白みに欠けますが、2つあればI2Cが出来そうということで試してみました。
I2Cデバイスは手元にあったL3GD20という3軸ジャイロセンサーです。
USBシリアル変換<>ESP8266<>L3GD20という接続にしてみます。
回路はCiphersinkあたりを参考にするとよいでしょう。消費電流が大きいので注意しましょう。
i2c.lua
id = 0
sda = 4
scl = 3
i2c.setup(id, sda, scl, i2c.SLOW)
function read_reg(dev_addr, reg_addr)
i2c.start(id)
i2c.address(id, dev_addr ,i2c.TRANSMITTER)
i2c.write(id,reg_addr)
i2c.stop(id)
i2c.start(id)
i2c.address(id, dev_addr,i2c.RECEIVER)
local c=i2c.read(id,1)
i2c.stop(id)
return c
end
function write_reg(dev_addr, reg_addr, dev_data)
i2c.start(id)
i2c.address(id, dev_addr ,i2c.TRANSMITTER)
i2c.write(id,reg_addr)
local c=i2c.write(id,dev_data)
i2c.stop(id)
return c
end
function get_accel_val(low, high)
local val = string.byte(high) * 256 + string.byte(low)
if (val > 32767) then
val = -(bit.band(bit.bnot(val), 0x7fff) + 1)
end
return val
end
tmr.alarm(1, 3000, 1, function()
local reg = read_reg(0x6a, 0x0f)
print(string.byte(reg))
write_reg(0x6a, 0x20, 0x0f)
local vl = read_reg(0x6a, 0x28)
local vh = read_reg(0x6a, 0x29)
print("X:" .. get_accel_val(vl, vh))
vl = read_reg(0x6a, 0x2a)
vh = read_reg(0x6a, 0x2b)
print("Y:" .. get_accel_val(vl, vh))
vl = read_reg(0x6a, 0x2c)
vh = read_reg(0x6a, 0x2d)
print("Z:" .. get_accel_val(vl, vh))
end)
コードのアップロードと実行には、LuaLoader for ESP8266を使いました。
どうやら問題無く使えるようです。I2Cデバイスが使えればGPIOを拡張したり出来るのでいろいろ遊べそうです。