自分用の備忘録です。意外と使えるようになるまで2癖3癖あったためせっかくなのでまとめました。
間違いや正しい使い方などあればご気軽にコメントしてください。
ちょっとずつ追加していきます。
AE-AQM0802 小型LCDモジュール I2C通信
使用品:I2C接続小型キャラクタLCDモジュール8×2行: 秋月電子通商
参考:「ArudunoでLCDモジュールでHello World」 @suruseasさん
目標:Hello World!の表示
Pinの接続方法は画像のようにRESETピン以外を適宜接続してください。
プルアップ抵抗はハンダをしなくても問題ありませんでした。この辺詳しくないので是非教えて下さい。
こちら「ArudunoでLCDモジュールでHello World」 @suruseasさん
を参考にプログラムを書き込むと下記画像のように表示されます。
使用するライブラリについてですが一般的にはモジュールに使用されているコントローラICの種類によって動く動かないがあるようです。今回は「AE-AQM0802」: 秋月電子通商さんのページの"コントローラICデータシート"から”ST7032”を使用していることを確認、オレ工房さんのライブラリを使用させていただきました。
# include <Wire.h>
# include <ST7032.h>
ST7032 lcd;
unsigned long sec;
void setup() {
lcd.begin(8, 2); // 初期化範囲 (0~7の8文字2列を範囲に)
lcd.clear(); // 初期化範囲を初期化
lcd.setContrast(30); // 0~63が指定可能 コントラスト範囲についてはGitHubを参考に
// https://github.com/tomozh/arduino_ST7032
lcd.setCursor(0,0); // 表示範囲と表示段目 (0番目から表示,0段目に)
lcd.print("Akizuki"); // 表示文字 (英,数字,記号のみ)
delay(1000); // 少し時間を置かないと表示されない
}
void loop() {
sec = millis() / 1000;
lcd.setCursor(0,1); // 表示範囲と表示段目 (0番目から表示,1段目に) 1.
lcd.print(String(sec)); // 表示内容 1.
lcd.setCursor(7, 1); // 表示範囲と表示段目 (7番目から表示,1段目に) 2.
lcd.print("s"); // 表示内容 2.
}
lcd.begin(8, 2); // 初期化範囲 (0~7の8文字2列を範囲に)
上記の箇所は値を少し変更すると挙動がおかしい時と正常なときがあり、どんなふうに作用するのかが明確にはよくわかっていません。分かり次第追記します。
赤外線距離センサ(GP2Y0A21YK)の値をLCDモジュールへ表示
使用品:シャープ測距モジュール GP2Y0A21YK:秋月電子通商
赤外線距離センサのプログラムは赤外線距離センサ(GP2Y0A21YK)を使ってみる@物を作る者さんを参考にしました。
# include <Wire.h>
# include <ST7032.h>
ST7032 lcd;
float Vcc = 5.0; // Vcc 5.0V
float dist1; // 計算1
float dist2; // 計算2
void setup(){
Serial.begin(9600);
lcd.begin(8, 2); // 初期化範囲 (0~7の8文字2列を範囲に)
lcd.clear(); // 初期化範囲を初期化
lcd.setContrast(30); // 0~63が指定可能 コントラスト範囲についてはGitHubを参考に
// https://github.com/tomozh/arduino_ST7032
lcd.setCursor(0,0); // 表示範囲と表示段目 (0番目から表示,0段目に)
lcd.print("Akizuki"); // 表示文字 (英,数字,記号のみ)
delay(1000); // 少し時間を置かないと表示されない
}
void loop(){
dist1 = Vcc*analogRead(A0)/1023; // 計算1
dist2 = 26.549*pow(dist1,-1.2091); // 計算2
lcd.setCursor(0,1); // 表示範囲と表示段目 (0番目から表示,1段目に) 1.
lcd.print(String(dist2)); // 計算2の結果表示 1.
delay(300); // wait
lcd.setCursor(6, 1); // 表示範囲と表示段目 (7番目から表示,1段目に) 2.
lcd.print("cm"); // 表示内容 2.
}
データシートにはこの様な記載がありますが、いまいち測定時の計算式(近似曲線の数式)が理解できていません。
近似曲線の数式についてはこちらの赤外線測距センサーの使い方(GP2Y0A21YK)@NOBのArduino日記で詳しく解説されています。
それぞれのサイトでそれぞれの値が使用されているのでどれが正解なのかわからないです...
AE-AQM1248A 小型LCDモジュール SPI通信
使用品:超小型グラフィックLCD AQM1248A: 秋月電子通商
参考:「MGLCDライブラリユーザーマニュアル」 @しなぷすのハード製作記さん
目標:Hello World!の表示
まずは「MGLCDライブラリユーザーマニュアル」 @しなぷすのハード製作記さん
を参考にしMGLCDライブラリのインストールを済ませてください。
ArduinoUNOとAE-AQM1248Aの配線ですがMGLCDライブラリを使ってAQM1248Aを制御する方法:(5-2-1-2.)3.3VのArduinoの場合を参考にし下記画像のように配線します。
今回ですがI2Cでのモジュール使用ではなくSPI通信でのモジュール使用になります。
I2C通信とSPI通信の大きな差は通信速度と信号線の本数違いが分かりやすいです。
I2C通信は2本(SCL,SDA),SPI通信は4本(D13-SCLK, D12-MISO, D11-MOSI, D10-SS)の信号線を使用します。
詳しくは「Arduino 入門 番外編 07 【SPI通信 とは】」@おもろ家さんのページを参考にしてください。
3.3V <------- 1.VDD
D10(SS) <------- 2.CS
ナシ <------- 3.RESET
D9 <------- 4.RS
D13(SCK) <------- 5.SCLK
D11(MOSI)<------- 6.SDI
GND <------- 7.GND
ArduinoでグラフィックLCDを動かす(AQM1248A編)(14)の「ソフトウェアSPI接続の場合」を参考にしながらプログラムを書き込みます。
# include <MGLCD.h>
# define SCK_PIN 13
# define MOSI_PIN 11
# define CS_PIN 10
# define DI_PIN 9
# define WAIT 0
MGLCD_AQM1248A_SoftwareSPI MGLCD(MGLCD_SpiPin4(SCK_PIN, MOSI_PIN, CS_PIN, DI_PIN),WAIT);
void setup() {
MGLCD.Reset();
MGLCD.print("Hello, World!");
}
void loop() {
}
文字を左右に動かす
こちら5-8.MGLCDライブラリの主な関数(テキスト表示編)を参考にし文字を左右に動かしていきます。今回は'Akizuki'の文字を左右に動かしてみます。
使い方はデータシートに色々載っているので確認してみてください。
// ヘッダファイルのインクルード
# include <MGLCD.h>
# include <MGLCD_SPI.h>
# include <SPI.h>
// ピン割り当てとSPIクロック周波数の宣言
# define CS_PIN 10
# define DI_PIN 9
# define MAX_FREQ (1000*1000L)
// オブジェクト変数の宣言
MGLCD_AQM1248A_SPI MGLCD(MGLCD_SpiPin2(CS_PIN, DI_PIN), MAX_FREQ);
void setup()
{
// LCDの初期化
while(MGLCD.Reset());
// スタートメッセージ
MGLCD.print("DEMO START");
delay(2000);
MGLCD.ClearScreen();
}
void loop()
{
// 'Akizuki'という文字を右方向に移動させる
for(int i=0; i<14; i++) { // 横幅48なので7文字((1文字=5)*7文字分=35)引いた13+1=14以内で折り返すようにする
MGLCD.Locate(i,0); // 表示する場所(x=i,y=0)
MGLCD.print("Akizuki"); // 表示文字(7文字)
delay(300); // 0.3s毎に
MGLCD.Locate(i,0); // 表示する場所(x=i,y=0)
MGLCD.print(" "); // 移動後に何も残らないように空白で塗りつぶす
} // for i
// 'Akizuki'という文字を左方向に移動させる
for(int i=14; i>0; i--) { // 横幅48なので7文字((1文字=5)*7文字分=35)引いた13+1=14分 戻ってきたら折り返すようにする
MGLCD.Locate(i,0);
MGLCD.print("Akizuki");
delay(300);
MGLCD.Locate(i+6,0); // Akizuki(7文字後)の移動跡を消す
MGLCD.print(" "); // 移動後に何も残らないように空白で塗りつぶす
} // for i
}
色々できそうですね〜次は秋月電子通商の画像のようにちょっとしたロゴを表示してみたいです。