今回は秋月電子で購入した(70円)Attiny402でAQM1602にHello Worldを表示させてみました。
プログラムメモリーが4Kとままあまあですが、結構いろいろなことができるかもしれません。
使用したアルディーノIDEは最新ヴァージョン2.3.3で、 UPDIでの書き込みが可能になったようです。
揃えるもの
- 今回USB変換モジュールFTR234RL(アマゾンで購入)
- ATTiny402(秋月電子)
- LED
- ミニブレスレットボード
- AQM1602A
- ルディーノIDE最新ヴァージョン2.3.3
- その他ジャンパーワイヤー、抵抗など
回路図
回路は下記のようになります。
USBシリアル変換モジュールを使い、UPDIで書き込む方法です。
詳しい説明は私のATtiny202にArduino IDE 1.8.19で書き込むでご確認ください。
aqm1602 16×2

AQM1602 8x2
秋月電子で発売されている小型のLCD AQM1602 8x2 で表示の回路図です。
こちらの仕様は3.3ボルトですので下記のようにレギュレーターを使いVCC 3.3ボルトにして、内部プルアップ抵抗を使いました。

IDE2.3.3で書き込む
アルディーノIDE旧バージョンでの書き込む方法は前回こちの記事で紹介いたしましたが、今回新しいバージョンのIDE2.3.3を使いますので改めて説明致します。
基本的には旧バージョンを使うのと同じです。
UPDI書き込みに対応したATtinyボードパッケージのmegaTinyCoreがインストールされている前提で進めます。
下図です。

まずツールをクリック、すると上のような画面になります。
次に1,2,3と進みATtiny402を選択します。
4、シリアルデバイスが接続されているポートを選びます、今回COM16です。
次にチップ402を選択して、6書き込み装置を選択しておしまいです。
Lチカ
回路が正しく動くかをLチカして試してみます。
下記のプログラムを実行してLチカができれば完成です。
void setup()
{
pinMode(4, OUTPUT);
}
void loop()
{
digitalWrite(4, HIGH);
delay(1000);
digitalWrite(4, LOW);
delay(1000);
}
Holle World 表示
AQM1602にHolle Worldを表示します。
AQM1602のライブラリーのインストール
まず、ライブラリーを使って表示してみたいと思いますので、ライブラリーをインストールします。

上の画面のようにまずツールをクリックしてライブラリーの管理をクリックします。
すると下図のようになります。

ライブラリーマネージャーの下にAQM1602と入れて、 ST7032_asukiaaaをインストールします。
また詳細情報をクリックすると、詳しい使いかたが書かれていますので確認してみましょう。
Hello world表示サンプルプログラム
ライブラリーのサイトに載っていたサンプルプログラムを実行します。
#include <ST7032_asukiaaa.h>
ST7032_asukiaaa lcd(0x3E); // ここにアドレス入れなくても動きました
void setup() {
lcd.begin(16, 2); // LCD columns and rows.
lcd.setContrast(8); //今回5vですコントラスト8にしました
// If lcd become black, reduced value for contrast
// lcd.setContrast(10);
lcd.print("hello, world!");
}
void loop() {
lcd.setCursor(0, 1);
lcd.print(millis()/1000);
}
メモリーの消費量も少なく、非常にシンプルで使いやすいライブラリーのようです。
コンパイルした時の画面です。

実際に表示された画面です。

ライブラリー使用しない方法
今回秋月電子の説明書で紹介されている、サンプルプログラムで表示したいと思います。
#include <Wire.h>
#define LCD_ADRS 0x3E
char moji[] ="AQM1602XA-RN-GBW";
//SCL=A5=LCDNo2 SDA=A4=LCDNo3
void setup() {
Wire.begin();
init_LCD();
}
void loop() {
for(int i = 0; i < 16; i++) {
writeData(moji[i]);
}
writeCommand(0x40+0x80); // 2LINE TOP
for(int i = 0; i < 16; i++) {
writeData(i+0xb1);
}
while(1){}//stop
}
void writeData(byte t_data)
{
Wire.beginTransmission(LCD_ADRS);
Wire.write(0x40);
Wire.write(t_data);
Wire.endTransmission();
delay(1);
}
void writeCommand(byte t_command)
{
Wire.beginTransmission(LCD_ADRS);
Wire.write(0x00);
Wire.write(t_command);
Wire.endTransmission();
delay(10);
}
//液晶初期化
void init_LCD() {
delay(100);
writeCommand(0x38);
delay(20);
writeCommand(0x39);
delay(20);
writeCommand(0x14);
delay(20);
writeCommand(0x73);
delay(20);
writeCommand(0x52);
delay(20);
writeCommand(0x6C);
delay(20);
writeCommand(0x38);
delay(20);
writeCommand(0x01);
delay(20);
writeCommand(0x0C);
delay(20);
}
上記のプログラムをコンパイルすると下記の情報が出力され1487バイトを使っていることがわかります。
最大4096バイトのフラッシュメモリのうち、スケッチが1487バイト(36%)を使っています。
最大256バイトのRAMのうち、グローバル変数が96バイト(37%)を使っていて、ローカル変数で160バイト使うことができます。
表示画面です

こちらのプログラムは基本的なAQM1602の使いかたは説明されています。
メモリの使用量は少ないですが、これだけでは使い物になりません、使い勝手を良くするにはもう一工夫が必要のようです。
ライブラリー使用しない改良プログラム
今回整数、フロート変数、文字列を簡単に表示できるように改良しました。
#include <Wire.h>
#define LCD_ADRS 0x3E
char kk[] = "abc ";
void setup() {
Wire.begin();
init_LCD();
write_char(kk);
write_flotnum(231.4);
set_cursor(0, 1);
write_char("abcdefg ");
write_num(23456);
}
//データ書き込み
void writeData(byte t_data) {
Wire.beginTransmission(LCD_ADRS);
Wire.write(0x40);
Wire.write(t_data);
Wire.endTransmission();
delay(10);
}
//コマンド書き込み
void writeCommand(byte t_command) {
Wire.beginTransmission(LCD_ADRS);
Wire.write(0x00);
Wire.write(t_command);
Wire.endTransmission();
delay(10);
}
void init_LCD() {
delay(100);
writeCommand(0x38);
delay(20);
writeCommand(0x39);
delay(20);
writeCommand(0x14);
delay(20);
writeCommand(0x73);
delay(20);
writeCommand(0x52);
delay(20);
writeCommand(0x6C);
delay(20);
writeCommand(0x38);
delay(20);
writeCommand(0x01);
delay(20);
writeCommand(0x0C);
delay(20);
}
void write_char(char yy[]) {
int as = strlen(yy);
for (int i = 0; i < as; i++) {
writeData(yy[i]);
}
}
void write_num(int x) {
char buffer[10];
char* x1 = itoa(x, buffer, 10);
int as1 = strlen(x1);
for (int i = 0; i < as1; i++) {
writeData(x1[i]);
}
}
void write_flotnum(float x) {
char dot[] = ".";
int zz = int(x);
write_num(zz);
write_char(dot);
zz = (x * 100) - (zz * 100);
write_num(zz);
}
void set_cursor(int x, int y) {
if (y == 0) {
writeCommand((x + 0x40) + 0x40);
}
if (y == 1) {
writeCommand((x + 0x40) + 0x80);
}
}
void lcd_clear() {
writeCommand(0x01);
}
void loop() {
}
関数
write_char(kk);
write_flotnum(231.4); フロートタイプ
write_char(“abcdefg “); megaTinyでは直接文字列を指定すると警告が出ますが動きます
write_num(23456); 整数タイプ
表示

これでなんとか使えるようになったようです。