Day10

計測システムを構築_ディスプレイ_

Topへ

Day9へ

Day11へ

はじめに

センサ類はこれまで構築してきた分までとし、今回はそれを表示するディスプレイを追加しようと思います。
ただし、今回使用するディスプレイは「LCD1602」という安価なものを使用する為現在のおいさんの実力では すべての計測値は表示できないと思います。
とりあえず、何かしらの値を表示出来るようになりたいと思います。
今回参考にした関連のサイトは、 ココ になります。

Step1

使用するディスプレイ等

image

先程触れましたが今回使用するディスプレイは「LCD1602」(写真の一番上)というものになります。
この他に、「シリアルインタフェースボードモジュール」と「ブレッドボード」を使用します。

image

一応、LCDディスプレイの仕様も載せておきます。

Step2

LCDディスプレイを接続

image

配線は画像の図のとおりとなります。(複雑になり大変申し訳ありません。)
一応説明しますと、
GND→GND
VCC→5v
SDA→GPIO2
SCA→GPIO3
になります。GPIO2、3は照度センサーで使用しているので同時に使用できるか心配です。

image

画像は配線した写真になります。
実際には、ブレッドボードの上にLCDディスプレイ等を接続しています。

Step3

raspberrypi側の設定

image

raspberry piを起動します。
本来ではあれば、ここで、「I2C通信を有効」にすることと、Python言語でI2Cバスを操作するためのライブラリ「python3-smbus」を インストールする必要がありますが、すでに「照度センサー構築時に設定が完了しているので説明は割愛します。 (まだ、設定をしていない方は、Day6 計測システムを構築_照度センサー_を参照してください。)
ということで、「Tera Term」を起動し、まずpython_appsフォルダに移動します。
cd python_apps」と入力しenterキーを押します。

image

I2Cデバイスのアドレスを確認します。 「sudo i2cdetect -y 1」と入力しenterキーを押します。
そうすると、新たに27とうい数字が表示されています。これがLCDディスプレイのアドレスの番号だと思います。(ちなみ23は照度センサーのアドレスになります。)

image

「Visual Studio Code」を開き、「新しいテキストファイル」を選択します。(メモ帳等でも問題ありません。)

image

まずは、必要なライブラリをインポートします。
import smbus
import time

image

続きのコードになります。正直何をしているのかわかりません。唯一わかるのは、画像のコードの赤線の数字がアドレスであることぐらいです。
LCD_ADDR = 0x27
LCD_WIDTH = 16
LCD_BACKLIGHT = 0x08

LCD_CLEAR_DISPLAY = 0x01
LCD_RETURN_HOME = 0x02
LCD_ENTRY_MODE = 0x06
LCD_DISPLAY_ON = 0x0C
LCD_DISPLAY_OFF = 0x08
LCD_CURSOR_ON = 0x0E
LCD_BLINK_ON = 0x0F
LCD_SET_DDRAM = 0x80

RS = 0x01
RW = 0x02
EN = 0x04

image

LCDを初期化しているとのことです。
ここで「def」文がでてきていますが、これは関数定義の構文になります。
以降の行にインデントがあるのがわかると思いますが、これが関数の範囲になりブロック化されている意味になります。
def lcd_init(bus):
(Tab)lcd_send(bus, 0x33, 0)
(Tab)time.sleep(0.005)
(Tab)lcd_send(bus, 0x32, 0)
(Tab)time.sleep(0.005)

(Tab)lcd_send(bus, 0x28, 0)
(Tab)time.sleep(0.00015)
(Tab)lcd_send(bus, LCD_DISPLAY_OFF, 0)
(Tab)time.sleep(0.00015)
(Tab)lcd_send(bus, LCD_CLEAR_DISPLAY, 0)
(Tab)time.sleep(0.002)
(Tab)lcd_send(bus, LCD_ENTRY_MODE, 0)
(Tab)time.sleep(0.00015)
(Tab)lcd_send(bus, LCD_DISPLAY_ON, 0)
(Tab)time.sleep(0.00015)

image

まったくわからないロードに突入しています。
def lcd_send(bus, data, mode):
(Tab)high = mode | (data & 0xF0) | LCD_BACKLIGHT
(Tab)low = mode | ((data << 4) & 0xF0) | LCD_BACKLIGHT
(Tab)bus.write_byte(LCD_ADDR, high)
(Tab)lcd_toggle_enable(bus, high)
(Tab)bus.write_byte(LCD_ADDR, low)
(Tab)lcd_toggle_enable(bus, low)

def lcd_toggle_enable(bus, value):
(Tab)bus.write_byte(LCD_ADDR, value | EN)
(Tab)time.sleep(0.0005)
(Tab)bus.write_byte(LCD_ADDR, value & ~EN)
(Tab)time.sleep(0.0005)

def lcd_set_cursor(bus, col, row):
(Tab)addr = LCD_SET_DDRAM | (col + 0x40 * row)
(Tab)lcd_send(bus, addr, 0)

def lcd_print(bus, text):
(Tab)for char in text:
(Tab)(Tab)lcd_send(bus, ord(char), 1)

image

メインの関数のようです。画像の赤枠で囲んだ箇所が結局のところ表示されるようです。
その他に、「if __name__ == "__main__":」というコードがありますが、これはあまり理解できていません。
おいさんは、最初に実行される呪文のようなものだと理解しています。
def main():
(Tab)bus = smbus.SMBus(1)
(Tab)lcd_init(bus)
(Tab)text_line1 = "Hello, world!"
(Tab)text_line2 = "Raspberry Pi"
(Tab)lcd_set_cursor(bus, 0, 0)
(Tab)lcd_print(bus, text_line1)
(Tab)lcd_set_cursor(bus, 0, 1)
(Tab)lcd_print(bus, text_line2)
(Tab)time.sleep(10)
(Tab)lcd_send(bus, LCD_CLEAR_DISPLAY, 1)

if __name__ == "__main__":
(Tab)main()

image

どこでもいいのでこのコードを書いたファイルを「lcd.py」として保存します。

image

「WinSCP」を開き、保存した「lcd.py」をraspberrypiの「python_apps」フォルダ直下にコピーします。

image

それでは、実行してます。
「Tera Term」に戻り、
python3 lcd.pyと入力し、enterを押します。

image

画像が実行状況になります。
まったく何をしているのか理解できないまま、うまくできてしまいました。