Rubyと一緒(10) GR-CITRUS、I2C経由、AQM1602に文字表示

Joseph Halfmoon

特価品(見切り品?)のGR-CITRUSボード(ルネサスRX631搭載)で組み込みRuby(mruby)してます。前回はソフトでタイミング制御で危なかったですが、今回はハードウエアI/F使用でI2Cしてみます。ハードはOKなんだけれども、こんどはツマラナイところ?で引っかかります。Ruby素人はこれだから困る。

当方、何かマイコンボードで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 を動かしているところです。rubyAQM1602_PROBLEM

最初の行でsLinに文字列を入れており、その次の行で、文字列からインデックスで一文字を取り出して .ord メソッドで文字コードに変換してみてます。上記では大文字のHなので文字コード72が取り出せてます。

ところがねえ、GR-CITRUS上のmruby処理系であると、.ord など知らんとエラーになります。どうゆうことなんだろ。後日、要追及。

とりあえず今回は、文字コードをつめた配列で文字表示させてみました。とりあえずハードは動いておる、と。rubyAQM1602_DUT

しまらんなあ。

Rubyと一緒(9) GR-CITRUS、DHT11、温湿度読み取りOK?、危ういタイミング へ戻る

Rubyと一緒(11) Chrome版Rubic、ついに起動できなくなりました。滅亡? へ進む