mruby/cでI2C


mrubyc_arduinoにI2Cを組み込んだので、ESP8266を使ってテストしてみた。 少し困ったのが、ピン番号が分かり難いことだった。 Arduinoのファイルの中を見て、 I2Cでどのピンが使われているのかを調べたら、以下のように定義されていた。

#define PIN_WIRE_SDA (4)
#define PIN_WIRE_SCL (5)

しかし、今度はその番号がどのピンか分からないので、これも調べたら、以下のようになっていた。

static const uint8_t D1   = 5;
static const uint8_t D2   = 4;

つまり、D1がSCLでSDAがSDAのようだ。 不思議なナンバリングな気がする。

I2Cで通信する相手としては、AHT10という温湿度計を用いた。 mruby/c用のプログラムは以下のようにした。

g=GPIO.new 2,GPIO::OUT
i=I2C.new
loop{
  print "reading\n"
  g.write 1
  i.write 0x38,0xba
  sleep_ms 20
  i.write 0x38,0xe1,0x08,0x00
  sleep_ms(10) while ( i.read(0x38,1).ord & 0x80 > 0)
  i.write 0x38,0xac,0x33,0x00
  sleep_ms(10) while ( i.read(0x38,1).ord & 0x80 > 0)
  d=i.read(0x38,6).bytes
  h=(d[1]<<12)+(d[2]<<4)+(d[3]>>4)
  printf( "humidity %.2f\n",h*100.0/0x100000 )
  t=((d[3] & 0x0f)<<16)+(d[4]<<8)+d[5]
  printf( "temperature %.2f\n",t*200.0/0x100000-50 )
  g.write 0
  sleep 1
}

普通のrubyとは使えるコマンドに多少の違いがあるので、その辺りを気にしながら書いた。 私はrubyだとputs “%d”%3.14などと書くのだが、これは使えないので、printfを使った。 stringから数値への変換も、rubyではunpackを使うことが多いが、これも使えないので、bit演算で書いた。 今回の違いはこのくらいかな。

一応、動くことは確認できたので、I2Cには大きなバグは無いようだ。 次はSPIだが、SPIで動くICを探さないと、動作チェックができない。 何か持っていたと思うけど。