ATtiny402でAQM1602にHello World表示

ATtiny402でAQM1602にHello World表示

今回は秋月電子で購入した(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バイトを使っていることがわかります。

表示画面です

こちらのプログラムは基本的な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);   整数タイプ
表示

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

タイトルとURLをコピーしました