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を探さないと、動作チェックができない。 何か持っていたと思うけど。