読者です 読者をやめる 読者になる 読者になる

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」を検出できました。 

RubyC言語拡張ライブラリーを使ってメッセージを表示すると1文字目に空白が
入り2文字目からメッセージが表示されてしまいました。。

 ブロック出力関数を使うと発生し
 i2c_smbus_write_block_data(i2c_fd, rs, length, buff);

 1文字出力関数を使うと発生しないとこが分かりました
 i2c_smbus_write_byte_data(i2c_fd, t_reg, data); 

 想像ですが ブルック出力関数の時1文字目に文字数が出力されているように思われます。

 f:id:ik8823:20160318210653p:plain

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")