
マイクロビットでLCDキャラクターディスプレイモジュールを使ってみます。
LCDキャラクターディスプレイモジュールとは、文字を表示するための、板のような小さな画面(液晶画面)になります。
※キャラクターというのが文字を意味しています。
文字列は主に半角英数字と記号の一部になりまして、種類によってはカタカナも出力できるものがあるそうです。

今回の説明で使用するLCDキャラクターディスプレイモジュールはLCD1602になりまして、1行あたり16文字で行が2行の計32文字の文字を表示できるものになります。
Freenove I2C IIC LCD 1602 モジュール - Amazon
LCD1602ですが、マイクロビットで使用する時に注意点がありまして、5Vの電圧を供給する必要がありますが、マイクロビットで供給できる電圧は3.3Vになり足りません。
この問題を解決するために、

ブレッドボード用5V電源ボードを利用します。
ブレッドボード用5V電源ボード Micro-B版 ヒューズ付き — スイッチサイエンス
回路を組んでみます。

始めに、ジャンパー線で5V電源ボードの + とマイクロビットの3Vを繋ぎ、ボードの - とマイクロビットのGNDを繋ぎます。
| 5V電源ボード | microbit |
|---|---|
| + | 3V |
| - | GND |
上の写真ではマイクロビットとブレットボードを繋ぐ時のコネクタとして、


micro:bitブレッドボード変換基板を使用しています。
micro:bitブレッドボード変換基板 — スイッチサイエンス
マイクロビットとLCD1602の接続は下記になります。
| LCD1602 | microbit |
|---|---|
| SDA | GPIO 20 |
| SCK(SCL) | GPIO 19 |
※購入したLCD1602によってはカッコ内の表記になっていることがあります。
※SDAはSerial Dataの略で、SCK(SCL)はSerial Clockの略になります。
LCD1602と5V電源ボードの接続は下記になります。
| LCD1602 | 5V電源ボード |
|---|---|
| VSS(GND) | - |
| VDD(VCC) | + |
※購入したLCD1602によってはカッコ内の表記になっていることがあります。
Fritzingで書くと、
※画像をクリックすると拡大表示にします
※コネクタ(ブレッドボード左)と5V電源ボード(ブレッドボード右)は今回使用したものと異なります
のようになります。
MakeCodeでコードを作成してみます。
コードの作成とフラッシングの前の注意点ですが、フラッシングする前に5V電源ボードにUSBケーブルを繋ぐ(もしくはUSBケーブル経由での送電)ことは行わないようにしてください。
MakeCodeの標準機能でLCD1602に文字列を表示する事は難しいので、拡張機能を利用します。
※ I2C


拡張機能をクリックし、

拡張機能の検索フォームでlcd1602を入力して検索します。

検索結果にいくつか表示されますが、今回は一番シンプルなi2cLCD1602を選択します。

※クリックすると拡大表示します。
LCD initialize with Addressで 39 を指定し、ずっとブロックないでshow stringブロックで16文字以内の半角英数字と記号を入力します。
※ 今回使用しているLCD1602ではアドレスが39(16進数では0x27)の決め打ちになります。
ディスプレイ上に文字列を表示する場合は、先にyの方の値になりますが表示したい行になりまして、行数は0から始まるので、1行目に表示したい場合はxは0になり、2行目に表示したい場合はxは1になります。
xはyで決めた行に対して、何文字目から表示するかを決めます。
y同様、xも0から始まりまして、左端から文字列を表示したければxを0にします。
MicroPythonへの書き換え
from microbit import *
class LCD1602:
def __init__(self, addr=0x27):
self.addr = addr
# バックライトONフラグ (0x00にするとオフ)
self.bl = 0x08
sleep(50)
# 4bitモードへの初期化シーケンス
for val in [0x30, 0x30, 0x30, 0x20]:
self._write_half(val)
sleep(5)
# 基本設定命令
self.send_command(0x28) # 2行表示, 5x8ドット
self.send_command(0x0C) # 画面ON, カーソルOFF
self.send_command(0x06) # 文字入力後カーソルを右へ
self.clear()
def _write_half(self, data):
# I2Cアダプタ経由で上位4bitを送信し、Enable信号を振る
i2c.write(self.addr, bytes([data | self.bl | 0x04])) # Enable High
sleep(1)
i2c.write(self.addr, bytes([(data & ~0x04) | self.bl])) # Enable Low
sleep(1)
def send_command(self, cmd):
# 命令送信(上位4bit -> 下位4bitの順)
self._write_half(cmd & 0xF0)
self._write_half((cmd << 4) & 0xF0)
def send_data(self, data):
# データ送信(RSビットを立てる: 0x01)
self._write_half((data & 0xF0) | 0x01)
self._write_half(((data << 4) & 0xF0) | 0x01)
def clear(self):
self.send_command(0x01)
sleep(2)
def puts(self, s, x=0, y=0):
# 指定した座標(x, y)に文字列を表示
addr = 0x80 + x + (0x40 if y else 0)
self.send_command(addr)
for char in s:
self.send_data(ord(char))
lcd = LCD1602(addr=0x27)
while True:
lcd.puts("LCD1602", 0, 0)
lcd.puts("sound level:"+str(microphone.sound_level())+" ", 0, 1)
sleep(100)