キャラクタLCDは、文字と数字を行単位で表示する表示装置です。このガイドでは、PCF8574 I²C変換モジュールを接続したHD44780互換のキャラクタLCDを、ILOGICS産業用Arduinoの内蔵Iclcd…()関数で使用する方法を説明します。ILIB.h、CLCD.h、Wire.hやLCDオブジェクトをスケッチに追加する必要はありません。
下の順序で接続を確認し、実際のLCDのI²Cアドレスと列数・行数を入力してから例を書き込んでください。アドレス0x27とサイズ20 × 4はこのページの例の値であり、すべてのLCDに共通の値ではありません。16 × 4のLCDは、3行目と4行目が内蔵関数の位置計算と合わないため、このガイドの対象外です。
| LCD変換モジュールに表示された信号 | 製品のI²C端子 | 確認事項 |
|---|---|---|
SDA | SDA | データ信号どうしを接続してください。 |
SCL | SCL | クロック信号どうしを接続してください。 |
VCCまたは+5V | +5V | LCD変換モジュールが5 V電源の場合にのみ接続してください。先に、使用する製品の+5V端子とモジュールの電源仕様を確認してください。 |
GND | GND | 両方のGNDを接続してください。 |
MPINO-16A8Rでは、+5VとGNDをPOWER端子から取ってください。この+5V出力は最大100 mAのため、バックライトを含むLCDの消費電流を先に確認してください。
下の図は、MPAINO CPUモジュールのI²C配線図からLCDの接続に必要な部分を示したものです。図と端子情報の出典はMPAINO-16A16Rの製品ページです。
MPAINO CPUモジュールのSDAはD20、SCLはD21です。MPINOの数字のピン番号はモデルによって異なるため、この値をMPINOに適用しないでください。実際の製品のSDA・SCL端子と製品ページに従ってください。I²Cの使用中は、同じSDA・SCLを外部割り込みやエンコーダ入力として同時に使用しないでください。
IclcdBegin(address, columns, rows)でLCDを初期化してから出力関数を使用します。addressはLCD変換モジュールの7ビットI²Cアドレス、columnsは1行の文字数、rowsは行数です。引数の許容範囲は列1~40、行1~4です。この範囲は、すべてのLCDサイズの行アドレスに対応するという意味ではありません。現在のコアでは3行目と4行目の開始アドレスが0x14・0x54に固定されているため、16 × 4のLCDの3行目と4行目には合いません。 アドレス、サイズ、装置番号が不正な場合や、必要なI²C転送に応答がない場合、IclcdBegin()はfalseを返します。
すべての関数は成否をbool値で返します。最大4台のLCDを区別するには、装置番号deviceに0~3を使用します。省略すると0になります。各装置は、先に異なるアドレスでIclcdBegin(address, columns, rows, backlight, device)を呼び出す必要があります。backlightの既定値はtrueです。
| 関数 | 機能 |
|---|---|
| IclcdBegin(address, columns, rows, backlight, device) | LCDのアドレス、サイズ、初期バックライト状態を設定し、接続の応答を確認します。 |
| IclcdSetCursor(column, row, device) | 次の文字を書く位置を指定します。列と行は0から始まり、設定した画面の範囲を超えるとfalseを返します。 |
| IclcdPrint(value, ...) | 文字列、文字、整数、実数を出力します。例:IclcdPrint(F(“RUN”))、IclcdPrint(12.34, 2)。 |
| IclcdClear(device) · IclcdHome(device) | IclcdClear()は画面を消去してカーソルを先頭に移動し、IclcdHome()は文字を保持したままカーソルだけを先頭に移動します。 |
| IclcdBacklight(on, device) · IclcdDisplay(on, device) | バックライトまたは画面表示をオン・オフします。 |
| IclcdCursor(on, device) · IclcdBlink(on, device) | 下線カーソルと点滅カーソルを制御します。 |
| IclcdScrollLeft(device) · IclcdScrollRight(device) | 表示を1文字分、左または右に移動します。 |
| IclcdTextDirection(leftToRight, device) · IclcdAutoscroll(on, device) | 文字の入力方向と、入力時の自動スクロールを設定します。 |
| IclcdCreateChar(location, charmap, device) · IclcdWrite(value, device) | 0~7の位置に8バイトのユーザー文字を登録し、文字コード1バイトを出力します。 |
| IclcdCommand(command, device) | HD44780のコマンドバイトを直接送信する上級者向けの機能です。 |
IclcdPrint()では、文字列の第2引数は装置番号です。整数の第2引数は基数(BIN、OCT、DEC、HEXまたは2~36)、実数の第2引数は小数点以下の桁数(0~10)で、この二つの形式では装置番号が第3引数になります。たとえばIclcdPrint(“SUB”, 1)は装置1に文字列を書き、IclcdPrint(255, HEX, 1)は装置1にFFを書きます。
I²Cアドレスが0x27で20列 × 4行のLCDの例です。実際のLCDのアドレスが異なる場合は、0x27を確認したアドレスに変更してください。他の画面サイズでは、上の行アドレスの制限とLCDの資料を先に確認してから列と行の値を変更してください。16 × 4のLCDにはこの例を使用しないでください。 Arduino IDEのファイル → 新しいスケッチにコード全体を貼り付けて保存し、検証(✓)と書き込み(→)を順に実行してください。
void setup() { Serial.begin(115200); // 実際のLCD変換モジュールのI²Cアドレス、列数、行数に変更してください。 if (!IclcdBegin(0x27, 20, 4)) { // LCDを初期化し、I²Cの応答を確認します。 Serial.println(F("LCD connection failed")); return; } IclcdSetCursor(0, 0); // 1行目の先頭に移動します。 IclcdPrint(F("ILOGICS")); // 1行目に文字を書きます。 IclcdSetCursor(0, 1); // 2行目の先頭に移動します。 IclcdPrint(F("LCD READY")); // 2行目に文字を書きます。 } void loop() { }
書き込み後、1行目にILOGICS、2行目にLCD READYが表示されることを確認してください。表示されない場合は、Arduino IDEのシリアルモニタを115200 bpsで開き、LCD connection failedが出力されるか確認してください。このメッセージは、アドレス、配線、電源、I²Cの応答を確認する必要があるという意味です。IclcdBegin()のtrueはI²C転送に応答があったという意味で、文字が実際に画面に見えることまでは確認しません。
このスケッチは、PCF8574モジュールのアドレス範囲をIclcdBegin()で試し、応答したアドレスを出力します。LCDを接続した状態で書き込み、シリアルモニタを115200 bpsで開いてください。出力されたアドレスを上の例に入力してください。Doneだけが出力された場合は応答したモジュールがないため、配線と電源を確認してください。Doneも表示されない場合は、シリアルモニタを開いたまま製品を再起動してください。
void setup() { Serial.begin(115200); delay(1000); for (uint8_t address = 0x20; address <= 0x3F; address++) { if (address == 0x28) address = 0x38; // PCF8574モジュールが使わない範囲を飛ばします。 if (IclcdBegin(address, 20, 4)) { Serial.print(F("Response at 0x")); Serial.println(address, HEX); } } Serial.println(F("Done")); } void loop() { }
| 症状 | 確認の順序 |
|---|---|
検証時にIclcdBeginが見つからない | ILOGICS Arduino SDKのインストールと、Arduino IDEで実際の製品に合ったILOGICSボードを選択しているかを確認してください。この例に別途LCDライブラリは必要ありません。 |
シリアルモニタにLCD connection failedと表示される | 電源を切り、SDA・SCL・+5V・GNDの接続とLCDモジュールの電源仕様をもう一度確認してください。0x27は例のアドレスなので、実際のモジュールのアドレスを確認して修正してください。 |
| 初期化エラーは出ないが文字が見えない | LCDのコントラスト調整、バックライトの状態、実際の列数と行数を確認してください。PCF8574変換モジュールのLCD側の接続が、この関数の対応と同じかどうかも確認してください。 |
IclcdSetCursor()などがfalseを返す | その装置のIclcdBegin()が成功しているか、deviceが0~3か、カーソルの列と行が設定した画面の範囲内かを確認してください。 |
| 他のI²C機器と併用するとエラーになる | アドレスの重複を確認してください。また、Iclcd…()の実行中に他のWire転送やI²Cスレーブのコールバックを同時に実行しないでください。 |
この関数は、PCF8574のP0=RS、P1=R/W、P2=Enable、P3=バックライト、P4~P7=LCD D4~D7の接続を使用します。変換モジュールの対応が異なると、I²Cアドレスが合っていても正しく表示されないことがあります。IclcdCommand()は画面の状態を直接変更するため、HD44780のコマンドを理解している場合にのみ使用してください。
関数ごとの引数と例は、上の表の関数名を選択すると確認できます。製品の端子と電源仕様は、使用するMPINOまたはMPAINOの製品ページを優先してください。