概要
液晶モジュールをESP-WROOM-32で動かし、文字の表示ができることを確認した。
背景と目的
最近、電子工作をあまりやっていなかったのだが、久々に何かを作ろうと思っている。その中で、文字が表示できる小さな液晶モジュールが使いたい。これまで、いろいろ電子工作をやってきたのだが、液晶画面を使用する機会がなく、触ることがなかった。そこで、ひとまず使い方を確認するため、ESP-WROOM-32と繋いで動かす。
詳細
1. デバイスの購入
Amazonで見つけた液晶モジュール1602A。約700円。このモジュールには、I2C接続が可能なように、変換モジュール基板が基板裏についている。なので、接続すべきラインが少なくて済む。I2Cアドレスは、0x3fと書いてある。
https://www.amazon.co.jp/gp/product/B07BJ5PW3R/ref=ppx_yo_dt_b_asin_title_o01_s03?ie=UTF8&psc=1
2. 配線する
以下のように配線。SCL、SDAにはプルアップ抵抗1kΩをつけている。
ESP32 DevModule | 液晶モジュール |
---|---|
3V3 | VCC |
IO22 | SCL |
IO21 | SDA |
GND | GND |
3. 液晶モジュールとI2Cで通信できるArduinoライブラリを探す
1602液晶モジュール用のライブラリは、さまざまなものがある。今回注意が必要なのは、I2C接続用のライブラリを使わないといけないこと。
選定したのは、
LiquidCrystal_I2C
というもの。ESP32用というわけではないが、ひとまずこれを試すことにする。
https://burariweb.info/electronic-work/arduino-learning/arduino-i2c-communication-basics.html#i-3
4. 通信がうまくいかない??? -> I2CアドレスがAmazonサイトの説明と違う!!!
上記ライブラリで試したのだが、どうもAmazonのサイト記載のI2Cアドレス 0x3f では反応がない。ESP-WROOM-32用というわけではないのでそのせいか?と思ったが、オシロスコープで波形を確かめると、正しく波形が出ている。にもかかわらず、ACKが来ないのでおかしいなと思い、以下のI2Cスキャナ
でデバイスをスキャンしてみたところ、なんと
0x27
だった。たぶん、アドレス設定用の抵抗の実装忘れとか、そんなところだろうと思うが、とにかくAmazonで売っている格安電子部品の場合、この手のトラブルが付き物なので、いちいち怒ってはいけない。
5. 実装
気を取り直して、アドレスを0x27に設定したソースコードは以下。
#include "LiquidCrystal_I2C.h" LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() { // 初期化 lcd.init(); // バックライト点灯 lcd.backlight(); // カーソル点滅 lcd.blink(); // 文字出力 lcd.print("Hello, world!"); } void loop() { }
表示結果は以下。Hello, World!が無事表示された。
しかし、コントラストが弱くて見づらい。基板裏のVRを目いっぱい回してやっと読める程度。あまり気にしていなかったが、本来5V駆動なのだろうか?
6. コントラストを上げる
ESP32のIOは3.3V系なので、レベルシフト回路をかませてみる。 手持ちのレベルシフトIC
がどこかに行ってしまい見つからないので、ずいぶん昔に使った簡易レベルシフト回路
をユニバーサル基板に組み、SDA、SCLにかませる。
すると、以下のように非常にくっきりと映った。というわけで、コントラスト不足は、駆動電圧の問題であった。
7. いろいろ試す
この後、必要そうなコマンドを試してみたが、問題ないようなので、ひとまず今回はこれで十分。
まとめと今後の課題
液晶モジュールをESP-WROOM-32で動かし、文字の表示ができることを確認できた。機器に組み込んで使っていく。