akira.keiのアイコン画像
akira.kei 2026年06月06日作成 (2026年06月07日更新) © MIT
製作品 製作品 閲覧数 52
akira.kei 2026年06月06日作成 (2026年06月07日更新) © MIT 製作品 製作品 閲覧数 52

Arduino IDEでI2C接続キャラクターLCDモジュールを使う(その1)

<前の記事 : 次の記事>

Arduino IDEに回帰する

前の記事ではVS Codeを使う気満々だったんだけど、結局のところArduino IDEでも十分な気がしている。ESP32やらPicoなどの他社製のボードを使っても同じように開発できるし、Web上の情報もたくさんある。そもそもVS Codeはちょっと複雑すぎないか?
Arduino

I2C接続小型キャラクターLCDモジュール

秋月電子通商で買えるI2C接続小型キャラクターLCDモジュールAQM1602は随分前に買ってあるのだが、意外に幅をとるのでちょっと使うにも大きいし、機器に組み込んでしまうのも高価過ぎる、そして何より使いにくい。キャラクターディスプレイの標準ライブラリとしてLiquidCrystalというのがあるが、I2C接続には使えない。一方で検索できるライブラリでは、たくさんの種類が出てきて、どれがデファクトスタンダードか判別できない。
AQM1602XA-RN-GBW
そうだ、自分でLiquidCrystal互換のライブラリっぽく仕上げてみよう!(まぁ車輪の再発見とも言う)

まずは接続

そのうちRP2040で使う予定だが、テスト開発にはUNOを使う。ディスプレイは5Vでも使えるらしいので5V、GND、SDA、SCLをそれぞれ接続し、スケッチ例→Wire→i2c_scannerのスケッチを使ってアドレスを確認すると「0x3E」であることが確認できた。なお、どうやらディスプレイ側のプルアップはUNOなら必要ないようだ。RP2040でどうなるかは接続してみないとわからない。

使い方

スケッチ冒頭はWireの使用宣言、アドレス指定、テスト表示用文字列定義だ。

#include <Wire.h> #define LCD_ADRS 0x3E byte moji[]={"AQM1602XA-RN-GBW"};

次のセットアップはI2CとLCD初期化、文字列表示、2列目(カタカナ)表示、ちょっと待ってから画面クリアする。実際に動作確認だけならここまででも十分だ。

setup

void setup() { Wire.begin(); init_LCD(); for(byte i;i<sizeof(moji);i++) { write(moji[i]); } command(0x40+0x80); for(byte i=0;i<16;i++) write(i+0xb1); delay(3000); command(0x01); }

ディスプレイ側は初期化に失敗しても電源が切れないと表示は更新されない。従って、偶然うまく行ったのだが、次にスケッチを書き換えたら初期化できてなくても、ディスプレイ上の表示は成功した時のままになる。こういうケースだとうまく行っていないのがいつの更新からなのか気がつけないので、ループでは次々と画面を書き換えるようにした。初期化に失敗していると、このループでも画面は更新されなくなる。

loop

byte cnt0=0x1; byte cnt=cnt0; void loop() { write(cnt++); if(cnt==0xff) cnt=cnt0; delay(50); }

実際の書き込み関数はwrite、command、sendを定義した。

send

void send(byte rs, byte value) { Wire.beginTransmission(LCD_ADRS); Wire.write(rs); Wire.write(value); Wire.endTransmission(); if(value) delay(10); else delay(1); } void write(byte value) { send(0x40, value); } void command(byte value) { send(0x00, value); }

そして初期化は秋月のモジュールデータシートに載っているバイナリ列を順に書き込んだだけだ。

Init

void init_LCD() { delay(100); byte inits[]={0x38, 0x39, 0x14, 0x73, 0x52, 0x6c, 0x38, 0x01, 0x0c,}; for(byte i=0;i<sizeof(inits);i++) { command(inits[i]); delay(20); } }

動作確認

電源電圧が5Vならこれで普通に動く。3.3Vでは表示されないので、オリジナルのLiquidCrystalには存在しないコントラスト調整の関数は必須かもしれない。
AQM1602
使い方はわかったので、次からライブラリ化をしていこう。

<前の記事 : 次の記事>

1
akira.keiのアイコン画像
機械系エンジニアだが電子工作を趣味としている。週末はひとりバーベキュー。
ログインしてコメントを投稿する