現時点の情報です。最新情報はM5StickC非公式日本語リファレンスを確認してみてください。
概要
前回は赤外線受信でした。今回は「Lesson 14 LCDDisplay」です。LCD1602というディスプレイになります。
LCD1602とは?
秋月さんでは上記が近いと思います。キットとまったく同じものは販売していませんでした。
英数が横16文字で2行表示できるディスプレイです。液晶画面が青と緑の2種類あります。比較的安価なため、簡易的な表示にはよく使われます。ただしM5StickCにはすでに液晶があるので、あまり使う機会はなさそうです。
上のAmazonの商品はキットに付いている液晶の他に、小さな部品が付いています。左側がセットで、右側は最初から一体化しています。
上記が単品販売のものです。プライムでない商品は中国から送られてくるので一ヶ月以上到着までかかるので注意してください。
接続方式について
パラレル接続
このLCDの標準的な接続方法で、4本(もしくは8本)の信号線を使ってデータを送信します。一度に複数のデータを送信できる利点があるのですが、データ以外にも制御用の信号が必要になり、最低6本の信号線が必要になります。
しかしM5StickCは利用できる端子が5本しかないので、このLCDを制御することができません。一般的なESP32であればなんとか制御可能ですが、このLCDを直接制御することはあまりないようです。
I2C接続
Iが二乗の、アイスクエアシーと呼ぶのが正式みたいですが、IICやI2Cと単純に表記されていることが多いです。
データ転送用のクロックと、データ用の信号線2本で通信をするプロトコルです。比較的低速通信になりますが、複数の機材を平行に接続することができます。温度センサーなど低速通信でも問題ないものを複数接続できる利点があるので、よく使われています。
このLCDは基本的にI2C変換を使って制御することの方が多いようです。今回はキットには含まれていませんが、I2C接続で試してみたいと思います。
接続方法

いろいろためしたのですが、上記みたいな感じになりました。ジャンパーケーブルのオス・メスを使ってM5StickCと接続しています。
電源は写真では3V3に接続していますが、5Vに接続したほうがきれいに表示されました。LCDと変換ボードは見えにくいですがブレッドボードに接続しています。
I2Cは通信をする側のESP32が電圧を出力するので、相手が5VでもGPIOには3.3Vが出力されます。アナログ入力などの場合にはGPIOに5Vが入力される可能性があるのですが、I2Cではその点は問題ありません。
ただし、5Vを供給した場合には相手側がI2Cの信号も5Vを想定して動くので、3.3Vの信号だと受け取ってくれない可能性がありますので注意してください。

この角度だとわかるかな?
M5StickC | LCD |
GND | GND |
5V Out | VCC |
GPIO0 | SDA |
GPIO26 | SCL |
上記の組み合わせです。0と26は逆でも動きます。32と33の組み合わせでも動きます。ただしI2Cは出力が必要ですので入力専用のGPIO36は利用することができません。
I2Cアドレス検索
#include <Wire.h> void setup() { Serial.begin(115200); Wire.begin(0, 26); } void loop() { Serial.println("I2C Scan"); for (int address = 1; address < 127; address++ ) { Wire.beginTransmission(address); int error = Wire.endTransmission(); if (error == 0) { Serial.printf("%02X", address); } else { Serial.print(" ."); } if (address % 16 == 0) { Serial.print("\n"); } delay(10); } Serial.print("\n\n"); delay(1000); }
I2Cのデバイスを使う場合には、デバイスのアドレスを調べる必要があります。複数のデバイスを接続できるので、アドレスによってデバイスを選択する必要があります。
そのため同じアドレスのデバイスは同時に利用することができません。たいていのデバイスはI2Cアドレスを変更する機能をもっているので、アドレスがかぶった場合にはどちらかのアドレスを変更する必要があります。
Wire.begin(0, 26);
WireクラスがI2Cのクラスになります。引数が利用するGPIOでこの場合0と26を利用すると宣言しています。
Wire.beginTransmission(address); int error = Wire.endTransmission();
Wire.beginTransmission(address)でアドレスを指定して通信をスタートさせ、Wire.endTransmission()で通信を終了させます。このときのそのアドレスのデバイスがいなかった場合にはエラーになるので、エラーにならないアドレスにはデバイスがいることになります。
I2C Scan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
このスケッチを実行すると上記のように0x27のアドレスにデバイスがいるのがわかります。このときデバイスが発見できなかった場合には接続を見直してみてください。
I2Cなどの2本信号線を使う通信の場合には、逆にケーブルを接続していることが非常に多いです。迷ったら信号線を入れ替えるか、全部はずしてから接続しなおしてみてください。
ライブラリのインストール

非常に似たような名前のライブラリが大量にあるのですが、「LiquidCrystal I2C」というライブラリで「LiquidCrystal I2C allow」で検索すると発見しやすかったです。
シンプルスケッチ
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C i2clcd(0x27, 16, 2); // アドレス, 文字数, 行数 void setup() { Wire.begin(0, 26); i2clcd.init(); i2clcd.backlight(); i2clcd.setCursor(0, 0); i2clcd.print("Hello, world!"); } void loop() { i2clcd.setCursor(0, 1); i2clcd.print(millis()); delay(111); }
シンプルなスケッチ例です。
LiquidCrystal_I2C i2clcd(0x27, 16, 2); // アドレス, 文字数, 行数
上記で画面の設定を行っています。アドレスは0x27で、1行に16文字、2行あるLCDであることを設定しています。
Wire.begin(0, 26);
上記でGPIO0とGPIO26を使ってI2C通信をする初期化。
i2clcd.init(); i2clcd.backlight();
こちらでLCDの初期化を行っています。
i2clcd.setCursor(0, 0); i2clcd.print("Hello, world!");
出力は上記のようにカーソルを設定してから、print()で出力します。カーソルは0から始まって、(0, 0)が1行目の先頭、(0, 1)が2行目の先頭になります。
さて、このスケッチで画面に表示されましたでしょうか?
私は表示されませんでした、、、個体差があると思いますが液晶の明るさ調整をしないと文字が見えないと思います。
液晶の明るさ調整

上記の赤で囲った場所に、青い可変抵抗があると思います。この抵抗をドライバーを使って左右に回すことで液晶の明るさ調整が可能になっています。3.3Vに接続した場合には一番端っこまで回すとなんとか文字が見えましたが、全体的に薄い文字になりました。
もともと5Vで動作する液晶なので、なるべく5Vで動かしたほうがいいとは思います。
他の選択肢
一般的にM5StickCは液晶画面があるので、外部の液晶はあまり必要としないと思います。必要とすればケーブルではなれた場所に表示を付けたいときだと思いますが、文字だけ表示する今回の液晶ではなく、画像が表示できる液晶が同じような値段であるので、こちらを使った方がおすすめです。
I2C接続であれば、同じような手順で接続して、液晶に対応したライブラリを使えば画像や文字を表示することができると思います。
M5StickCの画面のようなもう少し大きな液晶画面を使いたい場合には、信号線を4本以上使いますが、より高速なSPI接続をする必要があります。
上記ではM5StickC本体の液晶と同じ液晶基板を接続しています。
まとめ
文字だけのキャラクタ表示液晶は最近はなかなか使わないと思います。大量に中国から購入すると安くなりますが、個人で使うのであれば普通の液晶でも十分安いと思います。
今回はI2Cで接続しましたが、I2C変換ボードを使わなくても信号線を6本接続できるボードを使えばLiquidCrystalという標準ライブラリで利用することが可能です。ただし、液晶の調整ように可変抵抗が必要になったりと、かなり回路は面倒になります。
コメント