編集履歴一覧に戻る
akira.keiのアイコン画像

akira.kei が 2026年06月07日14時14分35秒 に編集

コメント無し

本文の変更

-

[<前の記事](https://elchika.com/article/cc635d85-90ec-488b-a9cd-cf6f2c65f2f5/) : 次の記事>

+

[<前の記事](https://elchika.com/article/cc635d85-90ec-488b-a9cd-cf6f2c65f2f5/) : [次の記事>](https://elchika.com/article/e82c2871-c24c-4905-bed0-f859ada7fb2f/)

## Arduino IDEに回帰する [前の記事](https://elchika.com/article/cc635d85-90ec-488b-a9cd-cf6f2c65f2f5/)ではVS Codeを使う気満々だったんだけど、結局のところArduino IDEでも十分な気がしている。ESP32やらPicoなどの他社製のボードを使っても同じように開発できるし、Web上の情報もたくさんある。そもそもVS Codeはちょっと複雑すぎないか? ![Arduino](https://camo.elchika.com/7f8186e83162250718f8c9c9171a42465375b17e/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33363031626666382d633530632d343762382d613765362d3531663731393163323336642f39656466396432342d623863352d346164622d383733362d353264653636656565353962/) ## I2C接続小型キャラクターLCDモジュール 秋月電子通商で買える[I2C接続小型キャラクターLCDモジュール](https://akizukidenshi.com/catalog/g/g108896/)AQM1602は随分前に買ってあるのだが、意外に幅をとるのでちょっと使うにも大きいし、機器に組み込んでしまうのも高価過ぎる、そして何より使いにくい。キャラクターディスプレイの標準ライブラリとしてLiquidCrystalというのがあるが、I2C接続には使えない。一方で検索できるライブラリでは、たくさんの種類が出てきて、どれがデファクトスタンダードか判別できない。 ![AQM1602XA-RN-GBW](https://camo.elchika.com/c0879056e70e149fbfbbcf8106eedff7f07fc5aa/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33363031626666382d633530632d343762382d613765362d3531663731393163323336642f65633632663732392d366531302d346432632d623131382d656635323936333037373931/) そうだ、自分でLiquidCrystal互換のライブラリっぽく仕上げてみよう!(まぁ車輪の再発見とも言う) ## まずは接続 そのうちRP2040で使う予定だが、テスト開発にはUNOを使う。ディスプレイは5Vでも使えるらしいので5V、GND、SDA、SCLをそれぞれ接続し、スケッチ例→Wire→i2c_scannerのスケッチを使ってアドレスを確認すると「0x3E」であることが確認できた。なお、どうやらディスプレイ側のプルアップはUNOなら必要ないようだ。RP2040でどうなるかは接続してみないとわからない。 ## 使い方 スケッチ冒頭はWireの使用宣言、アドレス指定、テスト表示用文字列定義だ。 ```Arduino: #include <Wire.h> #define LCD_ADRS 0x3E byte moji[]={"AQM1602XA-RN-GBW"}; ``` 次のセットアップはI2CとLCD初期化、文字列表示、2列目(カタカナ)表示、ちょっと待ってから画面クリアする。実際に動作確認だけならここまででも十分だ。 ```Arduino: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); } ``` ディスプレイ側は初期化に失敗しても電源が切れないと表示は更新されない。従って、偶然うまく行ったのだが、次にスケッチを書き換えたら初期化できてなくても、ディスプレイ上の表示は成功した時のままになる。こういうケースだとうまく行っていないのがいつの更新からなのか気がつけないので、ループでは次々と画面を書き換えるようにした。初期化に失敗していると、このループでも画面は更新されなくなる。 ```Arduino:loop byte cnt0=0x1; byte cnt=cnt0; void loop() { write(cnt++); if(cnt==0xff) cnt=cnt0; delay(50); } ``` 実際の書き込み関数はwrite、command、sendを定義した。 ```Arduino: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); } ``` そして初期化は秋月のモジュールデータシートに載っているバイナリ列を順に書き込んだだけだ。 ```Arduino: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](https://camo.elchika.com/1cd3f09d30dd1498c525338c8668606ec0920a01/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33363031626666382d633530632d343762382d613765362d3531663731393163323336642f32306135323036352d333432662d343638322d623635642d386339373337663663313537/) 使い方はわかったので、次からライブラリ化をしていこう。

+

[<前の記事](https://elchika.com/article/cc635d85-90ec-488b-a9cd-cf6f2c65f2f5/) : [次の記事>](https://elchika.com/article/e82c2871-c24c-4905-bed0-f859ada7fb2f/)