Raspberry pi RubyでAQM0802Aにメッセージを表示する
秋月電子で購入したLCD(AQM0802A)をI2Cで接続し sudo i2cdetect 1 を行っても
認識してくれんせんでした。
ネットを検索するとプルアップ抵抗が原因であることが分かりました。
http://kaizou55.blog84.fc2.com/blog-entry-5.html
同じように Raspberry piの SDAとSCLのプルアップ抵抗 R1、R2を外したところ
スレーブアドレス「3E」を検出できました。
RubyのC言語拡張ライブラリーを使ってメッセージを表示すると1文字目に空白が
入り2文字目からメッセージが表示されてしまいました。。
ブロック出力関数を使うと発生し
i2c_smbus_write_block_data(i2c_fd, rs, length, buff);
1文字出力関数を使うと発生しないとこが分かりました
i2c_smbus_write_byte_data(i2c_fd, t_reg, data);
想像ですが ブルック出力関数の時1文字目に文字数が出力されているように思われます。
require './rasp_i2c' class AQM0802A < RaspI2c # <S><CHIP address + r/w><ack><C0+RS+ 0x000000><ack><Data byte><ack><P> CMD= 0x00 # i2c RS=0 Command write DATA=0x40 # i2c RS=1 Data write def initialize(lcd_addr) super(lcd_addr) # class RaspI2c の initialize を実行 lcd_init() end def lcd_init() # LCDの初期化 # 0x38: 機能設定コマンド 8bitモード、2行表示、通常フォント、命令テーブル0 # 0x39: 機能設定コマンド 8bitモード、2行表示、通常フォント、命令テーブル1 # 0x14: 内部OSC周波数セット # 0x70: コントラストセット # 0x56: コントラストセット # 0x6C: フォロアコントロール init_cmd = [0x38,0x39,0x14,0x70,0x56,0x6C].pack("C*") write_brock_b(CMD, 6, init_cmd) sleep(1) # 0x0c: ディスプレイ表示ON # 0x01: ディスプレイ表示内容をクリア DDRAMメモリに0を設定 init_cmd = [0x38,0x0C,0x01].pack("C*") write_brock_b(CMD, 3, init_cmd) sleep(1) end # row:表示行 1 or 2 # offset:表示位置 def set_cursor(row, offset) pos = ((row == 1) ? 0x80 : 0xC0 ) + offset write_reg_b(CMD, pos) # sleep(1) end def puts(text) text.each_byte do |ch| write_reg_b(DATA, ch) end end # line 1:1行目 2:2行目 def line_write(row, text) # 文字を出力(1行目) 0x80: Write Data to RAM (2行目) 0xC0: Write Data to RAM write_reg_b(CMD, (row == 1) ? 0x80 : 0xC0 ) # sleep(1) text.each_byte do |ch| write_reg_b(DATA, ch) # write_brock_b にてブロック出力を行うと先頭に制御コードが出力される? 文字数?? end end end lcd = AQM0802A.new(0x3E) lcd.line_write(1, "hello") lcd.set_cursor(2, 3) lcd.puts("raspi")