やっつけな日常(65) Arduino Uno R3 AE-AQM0802 LCDシールド

Joseph Halfmoon

相当以前に購入のスイッチサイエンス製「バニラシールド」基板を発掘。これに秋月電子製のAE-AQM0802 LCDモジュールを搭載してみました。とりあえず今回はUno R3にて動作確認。問題なさそうなら「Arduino互換ピンソケット」搭載のマイコンボード各種で順次動作確認の予定であります。例によってやっつけ仕事。

※「やっつけな日常」投稿順 Index はこちら

※2024年4月22日追記:以下のシールドボードには電気的な問題点あり「やっつけな日常(66) Arduino Uno R4 前回のLCDシールドは動くけどマズイ!」をご参照くだされや。

Neo Vanilla Shield

スイッチサイエンス製「ネオバニラシールド」基板はArduino Unoのボードの両側にならんでいるピンソケットに適合するピンヘッダをはんだ付け可能な「ユニバーサル」ボードです。通常の「ユニバーサルボード」と決定的に異なるのは、Arduinoのピンソケット位置が微妙にズレている(汎用品では刺さらない)部分に対応していることです。

最近、老眼も酷くなり、毎回ブレッドボードに回路を組み立て行くのもメンドイです。よく使う回路をシールドボードに載せておいて、差し込むだけで使えればよろしと。。。

まあ最初の1回は半田付けしないとならないけど。

なお今回は伝統のArduino Uno 「R3」上で動作確認してます。なお、ピンソケットのArduinoピンソケット穴の位置は各種ボードで互換性とれていると思いますが、ボード上の部品高さはいろいろありです。「R3」の場合、USBのBコネクタなどの高さがピンソケットよりずっと高いので、ソケットとピッタリの長さのピンヘッダをシールド基板にとりつけるとボードが部品にツカエマス。当方ではピン長さの長いピンヘッダを取り付けて高さを稼いでみました。

また、シールド載せると基板上のLEDなどは隠れてしまうのでとても見にくくなります。

AE-AQM0802 LCDモジュール

上記の「ユニバーサル」シールド基板にまず搭載してみたのは秋月電子通商殿製「8文字x2行LCD」のDIP化基板です。例によって狭ピッチのLCDモジュールの端子を2.54mmピッチに変換してくれるもの。変換のついでにLCDモジュールが必要とするコンデンサや抵抗、そしてI2Cのプルアップ抵抗(これはオプショナル。要ハンダ)までボード上に乗っているのでお楽な品です。なお電源電圧は3.3V。

Arduino Uno系の場合、R3、R4ともにIOは5Vです。でもま、I2Cはオープンドレイン出力なので、入力の時にハイが読めてくれれば動くんでないの、といういい加減さです。まあ、動いたけど。なお、LCDモジュール上のI2Cのプルアップ抵抗は半田を盛ってイネーブルにしてあります。

制御用のソフト

AE-AQM0802の制御ICはST7032iです。ポピュラーなデバイスなのであちこちにソースがころがっているような気がします。画面のサイズに気をつければ簡単に制御可能でしょう。当方では、以下の別シリーズ過去回にてArm社のMbedOS向けにAE-AQM1602という「16文字x2行」の兄弟機種用のソースがあったので、それをベースにArduino用に改造しました。

モダンOSのお砂場(50) Mbed OS2->OS6お引越し、I2CでAQM1602編

上記はMbedOS用なので、コマケーところがいろいろ違い、ちょっとメンドかったです。ま、動いたのでOKね。

まずは動作確認本体の .ino 形式のソース。これだけ。

#include "Arduino.h"
#include "AQM0802.h"

AQM0802 lcd;

void setup() {
  Wire.begin();
  lcd.init();
}

void loop() {
  lcd.displaySTR(LCD_HLINE, "Hello");
  lcd.displaySTR(LCD_LLINE, "World.");
}こ

今回は .ino 形式は上記だけで、LCDを制御する部分は .cpp にして別ファイルに分けました。後でMbed OSとか他の環境にもって行くことも考えた?からです。知らんけど。

つづいてヘッダファイル、 AQM0802.h。猪口才にも配慮の足らないclassを定義しとります。

#ifndef AQM0802_H
#define AQM0802_H

#include <Arduino.h>
#include <Wire.h>

// Arduino
#define LCD_ADDR    (0x3E)

#define LCD_HLINE   (0x80)
#define LCD_LLINE   (0xC0)
#define LCD_MAXLEN  (8)

class AQM0802 {
private:
    byte wdata[2];
    int status;

public:
    AQM0802();
    int writeCommand(byte cmd);
    int writeData(byte dat);
    int clear();
    void displaySTR(byte Lin, const char* message);
    void init();
};

#endif //AQM0802_H

なお、ArduinoとMbedOSではI2Cのアドレスのソース上の表現形式が異なるので、Arduino式では0x3Eですが、MbedOSでは1ビット左シフトして0x7Cです。

さて以下が AQM0802.cpp 内の関数類です。

#include "AQM0802.h"

AQM0802::AQM0802()
{
    wdata[0]=0;
    wdata[1]=0;
}

int AQM0802::writeCommand(byte cmd)
{
    status =0;
    wdata[0] = 0x0;
    wdata[1] = cmd;
    Wire.beginTransmission(LCD_ADDR);
    status = Wire.write(wdata[0]);
    status += Wire.write(wdata[1]);
    Wire.endTransmission();
    return status;
}

int AQM0802::writeData(byte dat)
{
    status =0;
    wdata[0] = 0x40;
    wdata[1] = dat;
    Wire.beginTransmission(LCD_ADDR);
    status = Wire.write(wdata[0]);
    status += Wire.write(wdata[1]);
    Wire.endTransmission();
    return status;
}

int AQM0802::clear()
{
    status =0;
    wdata[0] = 0x0;
    wdata[1] = 0x01;
    Wire.beginTransmission(LCD_ADDR);
    status = Wire.write(wdata[0]);
    status += Wire.write(wdata[1]);
    Wire.endTransmission();
    return status;
}

void AQM0802::displaySTR(byte Lin, const char* message)
{
    int idx = 0;
    writeCommand(Lin);
    while ((idx < LCD_MAXLEN) && (*message != 0)) {
        writeData(*message++);
        idx++;
    }
}

void AQM0802::init()
{
    delay(40);
    writeCommand(0x38);
    delayMicroseconds(30);
    writeCommand(0x39);
    delayMicroseconds(30);
    writeCommand(0x14);
    delayMicroseconds(30);
    writeCommand(0x70);    // Contrast set
    delayMicroseconds(30);
    writeCommand(0x56);    // Power/ICON/Contrast control
    delayMicroseconds(30);
    writeCommand(0x6C);
    delayMicroseconds(30);
    writeCommand(0x38);
    delayMicroseconds(30);
    writeCommand(0x0C);    // Display ON
    delayMicroseconds(30);
    writeCommand(0x01);    // Clear Display
    delay(2);
}
動作確認

上記のプログラムを「LCDシールドボード」を装着したArduino Uno R3に書き込んだところが以下に。AQM0802_ArduinoUnoR3

まあ、表示できちょるみたいね。

やっつけな日常(64) Arduino Uno R4 MINIMAのコンパレータを使ってみる へ戻る

やっつけな日常(66) Arduino Uno R4 前回のLCDシールドは動くけどマズイ! へ進む