Arduinoで小型LCDモジュールを使ってみる(入門)

自分用の備忘録です。意外と使えるようになるまで2癖3癖あったためせっかくなのでまとめました。
間違いや正しい使い方などあればご気軽にコメントしてください。
ちょっとずつ追加していきます。

# AE-AQM0802 小型LCDモジュール I2C通信
使用品:[Ｉ２Ｃ接続小型キャラクタＬＣＤモジュール８×２行: 秋月電子通商](https://akizukidenshi.com/catalog/g/gP-06669/)
参考:[「ArudunoでLCDモジュールでHello World」 @suruseasさん
](https://qiita.com/suruseas/items/21243d3fd654a65f2e2a)
## 目標:Hello World!の表示

Pinの接続方法は画像のようにRESETピン以外を適宜接続してください。
プルアップ抵抗はハンダをしなくても問題ありませんでした。この辺詳しくないので是非教えて下さい。
![IMG_1426-min.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/10a50c01-981c-3f3d-c17c-d4ce17159a68.jpeg)
![IMG_1421-min.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/a4b81237-0281-d9a7-092d-da9f6f628a40.jpeg)

こちら[「ArudunoでLCDモジュールでHello World」 @suruseasさん
](https://qiita.com/suruseas/items/21243d3fd654a65f2e2a)を参考にプログラムを書き込むと下記画像のように表示されます。
使用するライブラリについてですが一般的にはモジュールに使用されているコントローラICの種類によって動く動かないがあるようです。今回は[「AE-AQM0802」: 秋月電子通商](https://akizukidenshi.com/catalog/g/gP-06669/)さんのページの"コントローラICデータシート"から”ST7032”を使用していることを確認、[オレ工房さんのライブラリ](https://github.com/tomozh/arduino_ST7032)を使用させていただきました。
![IMG_1425-min.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/797f49f3-c9e8-98cf-b58f-821758ecfab4.jpeg)
![スクリーンショット 2021-04-04 18.46.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/a08a36cf-8c09-05d6-026a-1b24bcca1136.png)


```c:20210404-AEAQM0802
#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モジュールへ表示
使用品:[シャープ測距モジュール　ＧＰ２Ｙ０Ａ２１ＹＫ:秋月電子通商](https://akizukidenshi.com/catalog/g/gI-02551/)
赤外線距離センサのプログラムは[赤外線距離センサ(GP2Y0A21YK)を使ってみる@物を作る者さん](https://novicengineering.com/%E8%B5%A4%E5%A4%96%E7%B7%9A%E8%B7%9D%E9%9B%A2%E3%82%BB%E3%83%B3%E3%82%B5gp2y0a21yk%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/)を参考にしました。

![スクリーンショット 2021-04-05 19.51.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/fd3fbea8-274f-81aa-1efb-4c72ff4b4fd7.png)

```c:210405-2Y0A21
#include <Wire.h>
#include <ST7032.h>

ST7032 lcd;

float Vcc = 5.0;          // Vcc 5.0V
float dist1;              // 計算１
float dist2;              // 計算２
 
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;    // 計算１
  dist2 = 26.549*pow(dist1,-1.2091);  // 計算２
  lcd.setCursor(0,1);                 // 表示範囲と表示段目 (0番目から表示,1段目に) 1.
  lcd.print(String(dist2));           // 計算２の結果表示 1.
  delay(300);                         // wait
  lcd.setCursor(6, 1);                // 表示範囲と表示段目 (7番目から表示,1段目に) 2.
  lcd.print("cm");                    // 表示内容 2.
}
```
[データシート](https://www.sparkfun.com/datasheets/Components/GP2Y0A21YK.pdf)にはこの様な記載がありますが、いまいち測定時の計算式(近似曲線の数式)が理解できていません。
近似曲線の数式についてはこちらの[赤外線測距センサーの使い方(GP2Y0A21YK)@NOBのArduino日記](https://nobita-rx7.hatenablog.com/entry/27459807)で詳しく解説されています。
それぞれのサイトでそれぞれの値が使用されているのでどれが正解なのかわからないです...
![スクリーンショット 2021-04-05 20.01.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/846e9231-e5ee-b511-d0a1-a352060fec07.png)




# AE-AQM1248A 小型LCDモジュール SPI通信
使用品:[超小型グラフィックＬＣＤ　ＡＱＭ１２４８Ａ: 秋月電子通商](https://akizukidenshi.com/catalog/g/gP-07005/)
参考:[「MGLCDライブラリユーザーマニュアル」 @しなぷすのハード製作記さん
](https://synapse.kyoto/lib/MGLCD/UserManual/page001.html)
## 目標:Hello World!の表示

まずは[「MGLCDライブラリユーザーマニュアル」 @しなぷすのハード製作記さん
](https://synapse.kyoto/lib/MGLCD/UserManual/page001.html)を参考にしMGLCDライブラリのインストールを済ませてください。


ArduinoUNOとAE-AQM1248Aの配線ですが[MGLCDライブラリを使ってAQM1248Aを制御する方法:(5-2-1-2.)3.3VのArduinoの場合](https://synapse.kyoto/hard/MGLCD_AQM1248A/page013.html)を参考にし下記画像のように配線します。
今回ですがI2Cでのモジュール使用ではなくSPI通信でのモジュール使用になります。
I2C通信とSPI通信の大きな差は通信速度と信号線の本数違いが分かりやすいです。
I2C通信は2本(SCL,SDA),SPI通信は4本(D13-SCLK, D12-MISO, D11-MOSI, D10-SS)の信号線を使用します。
詳しくは[「Arduino 入門 番外編 07 【SPI通信 とは】」@おもろ家](https://omoroya.com/arduino-extra-edition-07/)さんのページを参考にしてください。

```配線:配線
3.3V     <------- 1.VDD
D10(SS)  <------- 2.CS
ナシ      <------- 3.RESET
D9       <------- 4.RS
D13(SCK) <------- 5.SCLK
D11(MOSI)<------- 6.SDI
GND      <------- 7.GND
```
![IMG_1432-min.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/0cf57a44-f06b-1706-9d26-0d3fe906b7e6.jpeg)


[ArduinoでグラフィックLCDを動かす(AQM1248A編)(14)](https://synapse.kyoto/hard/MGLCD_AQM1248A/page014.html)の「ソフトウェアSPI接続の場合」を参考にしながらプログラムを書き込みます。

![スクリーンショット 2021-04-04 23.35.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/efde88ee-1c62-783b-55d9-27ef25de6711.png)

```c:20210404-AEAQM1248A
#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() {
}
````
![IMG_1430-min.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/ff070b82-b9ef-8e7c-3ef6-05e4ac70a200.jpeg)

## 文字を左右に動かす
こちら[5-8.MGLCDライブラリの主な関数(テキスト表示編)](https://synapse.kyoto/hard/MGLCD_AQM1248A/page015.html)を参考にし文字を左右に動かしていきます。今回は'Akizuki'の文字を左右に動かしてみます。
使い方は[データシート](https://akizukidenshi.com/download/ds/xiamen/AQM1248.pdf)に色々載っているので確認してみてください。

```c:Demo
// ヘッダファイルのインクルード
#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
}
```
![IMG_1433-min.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/030f3d55-1a3b-345f-eeae-c2e40e1606cb.jpeg)

色々できそうですね〜次は秋月電子通商の画像のようにちょっとしたロゴを表示してみたいです。