
特価品(見切り品?)の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 など知らんとエラーになります。どうゆうことなんだろ。後日、要追及。
とりあえず今回は、文字コードをつめた配列で文字表示させてみました。とりあえずハードは動いておる、と。
しまらんなあ。