こんにちは!なかぢです。
さぁ、平成最後の年となる2018年も残すところ4日となりました。いかがお過ごしでしょうか?
この間、コンビニのくじ引きで、ディズニーくじがあってラストワン賞が欲しかったので、大人買いしてしまいました。。。
さてさて、今日のお題はI2C通信によるLCD表示ですが、そもそもI2Cとは?
I2Cとは?
クロックに同期させてデータの通信を行う同期式シリアル通信のひとつです。
R(RS-232Cとかありますが、その部類と同じような感じです。)
I2CはSPIと並んで,E2PROMやセンサとのデータ通信によく使われています。
I2Cでは,クロック(SCL),データ入出力(SDA)の2本の信号線を用いて通信します。
では、このI2Cを使って、LCD(ディスプレイ)に文字を表示させてみましょう!
使用するLCDは、こちらです。
これ自体は、1602 I2C Serial LCD Moduleというものになります。(たぶん商品名)
組み込み系などでは基本となりますが、部材やセンサーなどには、必ずデータシートと呼ばれる説明書みたいなものがあります。 購入した部材やセンサーなどに大体ついていますが、ない場合もあるのでなかった場合はググったり、お店の人に聞いてもらってください。(※これがないと、使い方がわかりません。。)
LCDのデータシートがググったら出てきたので貼っておきます。
https://opencircuit.nl/ProductInfo/1000061/I2C-LCD-interface.pdf
データシートを読みながら、参考になる配線をやってみるとこんな感じ
RaspberryPi側の設定は、I2C通信を有効にする必要があります。
インタフェースタブに、「I2C」があるので、それを有効にして一度再起動します。
再起動後に、配線が正しいかを確認するため
ターミナルを起動して次のように入力してEnterを押します。
「sudo i2cdetect 1」
なにかを聞かれるのでYと入力すると、正しくI2Cが結線されていれば
I2Cのベースアドレスが表示されます。
(写真上だと、「27」がI2Cのベースアドレスになります。)
次にLCDに表示するためのプログラムを作成します。
参考とさせていただいたサイトを貼っておきます。
https://terutakke.com/diary/1602-i2c-serial-lcd-modul/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
from time import sleep from time import gmtime,strftime import smbus LCD_LINE_1 = 0x80 LCD_CHR = 1 LCD_CMD = 0 #ビットを有効にする ENABLE = 0B00000100 E_DELAY = 0.0005 E_PULSE = 0.0005 #I2Cベースアドレス I2C_ADDR = 0x27 LCD_WH = 16 LCD_LIGHT_ON = 0x08 LCD_LIGHT_OFF = 0x00 bus = smbus.SMBus(1) #I2C初期化 def lcd_init(): lcd_byte(0x33,LCD_CMD) lcd_byte(0x32,LCD_CMD) lcd_byte(0x06,LCD_CMD) lcd_byte(0x0c,LCD_CMD) lcd_byte(0x28,LCD_CMD) lcd_byte(0x01,LCD_CMD) def lcd_byte(bits,mode): bits_high = mode | (bits & 0xF0) | LCD_LIGHT_ON bits_low = mode | (bits << 4) & 0xF0) | LCD_LIGHT_ON #ビットを立てる bus.write_byte(I2C_ADDR,bits_high) lcd_toggle_enable(bits_low) #ビットを下げる bus.write_byte(I2C_ADDR,bits_low) lcd_toggle_enable(bits_low) def lcd_toggle_enable(bits): sleep(E_DELAY) bus.write_byte(I2C_ADDR, (bits | ENABLE)) sleep(E_PULSE) bus.write_byte(I2C_ADDR, (bits &~ ENABLE)) sleep(E_DELAY) #LCDに文字列を出力 def lcd_string(message,Line): message = message.ljust(LCD_WH," ") lcd_byte(line,LCD_CMD) for i in range(LCD_WH): lcd_byte(ord(message[i]),LCD_CHR) def main(): lcd_init() while True: lcd_string("Hello World!",LCD_LINE_1) try: main() except KeyboardInterrupt: pass finally: LCD_LIGHT_ON = 0x00 lcd_byte(0x01,LCD_CMD) |
このプログラムを実行すると・・・・
おぉ~!毎度おなじみの「Hello World!」ではありませんかw
一行出すのにこんなにプログラムを打つとは思ってもいませんでした。。。 奥が深い・・・
如何でしたでしょうか? だんだんと難しくなってはいますが、できないとは思わないですw
なぜかって? ほかの人も実現してるのだから自分でもできるって思ってるからですw (すげーポジティブwww)
ではでは、よい年を~。 なかぢでした。