LoginSignup
9
10

More than 5 years have passed since last update.

ESP8266でLuaプログラミング(I2C編)

Last updated at Posted at 2015-05-07

ESP8266はファームウェアを入れ換えてeLuaを動作させることが出来ます。

入手したチップはGPIOポートが2つだけ使えます。ポートが2つだけだと面白みに欠けますが、2つあればI2Cが出来そうということで試してみました。

I2Cデバイスは手元にあったL3GD20という3軸ジャイロセンサーです。

USBシリアル変換<>ESP8266<>L3GD20という接続にしてみます。

esp8266i2c.jpg

回路は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を使いました。lualoader.png

どうやら問題無く使えるようです。I2Cデバイスが使えればGPIOを拡張したり出来るのでいろいろ遊べそうです。

9
10
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
9
10