特価品(見切り品?)のGR-CITRUSボード(ルネサスRX631搭載)で組み込みRuby(mruby)してます。前回はソフトでタイミング制御で危なかったですが、今回はハードウエアI/F使用でI2Cしてみます。ハードはOKなんだけれども、こんどはツマラナイところ?で引っかかります。Ruby素人はこれだから困る。
※Rubyと一緒 投稿順indexはこちら
当方、何かマイコンボードでI2C接続を試す場合、初回はいつも秋月製の16文字x2行の小型キャラクタ表示LCDであるAQM1602をDIP化したボードを使っております。WriteオンリのI2C出力のみ(Readはなし)で英数字のキャラクタ表示ができるものです。今回使用のモジュールではオンボードのプルアップ抵抗もイネーブルにしてあるので、VCC、GND、SDA、SCLの4ピンを接続すればOKです。電源電圧3.3Vでも5VでもOK(表示コントラストが異なるケド)なのでハード的にはほぼほぼ何も考えなくてもOKであります。
秋月殿のペラ紙にはArduino用のスケッチのソース(C++)が掲載されとりますが、既にMicroPythonで動作させているので、今回はそのコードを流用しRuby用としてみました。MicroPythonで動作させた記事が以下に。
MicroPython的午睡(22) ラズパイPico、AQM1602 LCDパネル接続
MicroPythonのコードは字ズラは Ruby と似ているので「流用」しやすい一方、ついつい変更すべきところを通り過ぎてしまうこともありです。
今回作成のmrubyコードが以下に
#!mruby class AQM1602 def initialize(devnum) @AQM1602ADR = 0x3E @AQM1602DAT = 0x40 @AQM1602COM = 0x00 @i2c = I2c.new(devnum) end def writeDatAQM1602(dat) #i2c.write(@AQM1602ADR, @AQM1602DAT, dat) @i2c.begin(@AQM1602ADR) @i2c.lwrite(@AQM1602DAT) @i2c.lwrite(dat) @i2c.end(1) delay(1) end def writeComAQM1602(com) #i2c.write(@AQM1602ADR, @AQM1602COM, com) @i2c.begin(@AQM1602ADR) @i2c.lwrite(@AQM1602COM) @i2c.lwrite(com) @i2c.end(1) delay(1) end def initAQM1602 delay(100) writeComAQM1602(0x38) delay(20) writeComAQM1602(0x39) delay(20) writeComAQM1602(0x14) delay(20) writeComAQM1602(0x73) delay(20) writeComAQM1602(0x56) delay(20) writeComAQM1602(0x6C) delay(20) writeComAQM1602(0x38) delay(20) writeComAQM1602(0x01) delay(20) writeComAQM1602(0x0C) delay(20) end def writeLineAQM1602(nL, slin) sLen = slin.length if sLen <= 0 then return false end if sLen > 16 then sLen = 16 end if nL == 0 then writeComAQM1602(0x80) else writeComAQM1602(0xC0) end for idx in 0...sLen do # writeDatAQM1602(slin[idx].ord) writeDatAQM1602(slin[idx]) end return true end end usb = Serial.new(0, 9600) usb.println("AQM1602 on I2C2") i2c2 = AQM1602.new(2) i2c2.initAQM1602 loop_interval = 2000 cnt = 1 while true do i2c2.writeComAQM1602(0x80) i2c2.writeDatAQM1602(98) i2c2.writeLineAQM1602(0, [72, 101, 108, 108, 111]) # i2c2.writeLineAQM1602(0, "Hello, World!") usb.println("COUNTER:" + cnt.to_s) cnt +=1 delay(loop_interval) end
元になったMicroPythonのコードを見ていただけると、ほぼほぼ1対1対応、クリソツかと思います(個人の感想です。)
今回唯一の不満点は、元になったコードのように文字列を与えてLCD出力するのではなく、文字コード配列を与えて出力する部分です。これはコメントアウトしてある2行のところに該当します。
以下は パソコン上の irb 使って対話的に Ruby を動かしているところです。
最初の行でsLinに文字列を入れており、その次の行で、文字列からインデックスで一文字を取り出して .ord メソッドで文字コードに変換してみてます。上記では大文字のHなので文字コード72が取り出せてます。
ところがねえ、GR-CITRUS上のmruby処理系であると、.ord など知らんとエラーになります。どうゆうことなんだろ。後日、要追及。
とりあえず今回は、文字コードをつめた配列で文字表示させてみました。とりあえずハードは動いておる、と。
しまらんなあ。