akira.keiのアイコン画像
akira.kei 2026年06月07日作成 (2026年06月07日更新) © MIT
セットアップや使用方法 セットアップや使用方法 閲覧数 22
akira.kei 2026年06月07日作成 (2026年06月07日更新) © MIT セットアップや使用方法 セットアップや使用方法 閲覧数 22

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

<前の記事 : 

標準ライブイラリのLiquiCrystal

普通のパラレル接続のキャラクタ液晶ディスプレイ(LCD)には標準ライブラリであるLiquidCrystalが用意されており、ソースも公開されている。それほど長くないのでその内容を見てみよう。

ヘッダファイルLiquidCrystal.h

冒頭には多重呼び出し時にエラーにならないための#ifndefが定義されている他に、#include "Print.h"が呼ばれている。以降で作法に基づいて記述できていればlcd.print("ABC")のような使い方もできる。ヘッダファイルの最初の方はパラレル接続でもI2C接続でも共通のHD44780(日立)関連#defineで定数やら定義やらが列挙されている。
コンストラクタ部分は以下のようになっている。ここでPrintを継承?しているのでprint文が使えるようになっているわけだ。

class LiquidCrystal : public Print { public: LiquidCrystal(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7); LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7); LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3); LiquidCrystal(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3); void init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);

4パターンのコンストラクタがあるが、要はRS, RW, ENAの三本の制御線と8ビットのデータバスをどう繋ぐのか決めていて、コンストラクタが呼ばれたあとは共通の初期化ルーチンが呼ばれている。但し、I2C接続の場合はコンストラクタが呼ばれるタイミングでI2C通信Wireの初期化がされてないので、コンストラクタで初期化するのではなく、beginで初期化すべきだ。

beginを見てみると桁数と行数の指定がある他にcharsize指定がある。2行表示ではLCD_5x8DOTS一択だし、1行表示ではLCD_5x10DOTSが妥当なので、第三パラメータは不要かもしれない。

void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS);

この下は制御用の共通関数の宣言が並んでおりI2C接続でも有効だ。
さらにその下のローレベル関数についてはI2C接続用に書き換える必要があるだろう。using Print::write;があるおかげでlcd.print("ABC");のような書き方ができる。

virtual size_t write(uint8_t); void command(uint8_t); using Print::write;

スケッチから呼ばれないようなHWに極めて近いprivateの関数や変数が下の方に並んでいる。これらはパラレル接続特有の関数群なのでI2C接続では削除していい。sendは変数_adrsのスコープが合わないらしいのでwritecommandにI2C通信を書いた。

private: void send(uint8_t, uint8_t); void write4bits(uint8_t); void write8bits(uint8_t); void pulseEnable();

以下の変数もパラレル接続特有のものなのでI2C接続では削除していい。

uint8_t _rs_pin; // LOW: command. HIGH: character. uint8_t _rw_pin; // LOW: write to LCD. HIGH: read from LCD. uint8_t _enable_pin; // activated by a HIGH pulse. uint8_t _data_pins[8];

残りの変数はパラレルでもI2Cでも共通だが、initializedのように使われていないものもある。

uint8_t _displayfunction; uint8_t _displaycontrol; uint8_t _displaymode; uint8_t _initialized; uint8_t _numlines; uint8_t _row_offsets[4];

オリジナルのライブラリ名は

手持ちのAQM1602XA-RN-GBWだけ動けばいいのでAQM1602というライブラリ名でいいかと思ったら、部品箱の中にAQM0802を見つけてしまった。また秋月にはAQMの名がついたグラフィックディスプレイもある。
AQM0802
AQM1248A
オリジナルライブラリの名前はAQMCHARにしておこう。次の記事では具体的なライブラリ化を行う。


<前の記事 : 

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