つれづれなる備忘録

日々の発見をあるがままに綴る

TinkercadによるArduinoシミュレーション12 ~ LCDモジュール

1. LCDモジュールによる表示

 今回はLCDモジュールへの表示方法について取り上げる。今まではシリアルモニタ上に表示していたが、シリアルモニタ上へ表示するためにはPCへの接続が必要になる。(Tinkercad上のシミュレーションでは関係ないが) Arduinoから直接LCDモジュールに表示することで、PCなしで出力を確認することができる。

2. LCDモジュールへの接続

 TinkercadLCDモジュールはLCD 16x2 (コンポーネント-すべて)を選択する。LCDモジュールは端子が多いので、まずそれぞれの機能とArduinoへの接続ピンを下の表にまとめた。より詳しくは Arduino 入門 Lesson 16 【LCD モジュール編】 | おもろ家などを参考にするとよい。

LCD端子名 機能 Arduino上のピン
GND 電源(負) GND
VCC 電源(正) 5V
VO LCDコントラスト調整 5V(4.2~5V)
RS レジスタ選択 7
R/W Read/Write GND
E 起動制御 8
DB0~DB3 データビット (4bit modeでは不使用)
DB4~DB7 データビット 9~12
LED(陽極) LED電源(正) 5V
LED(負極) LED電源(負) GND

ArduinoからLCDモジュールへは、パラレル通信となっているため今回の4bit modeではデータ通信だけで4つのピンを使用する。8bit modeも可能だが、8つのピンを使用する必要があり、Arduinoのほとんどのピンをふさいでしまうため4bit modeがよく使われる。VOはLCDコントラストを調整するために4.2V~5Vの間の電圧を入力する。電圧を調整するため、可変抵抗器(Tinkercadでは電位差計)をここでは利用する。端子1に5V、端子2をGND、真ん中の摺動子をVO端子に接続し、シミュレーション実行中にダイアルを回すことで電圧を変動させることができる。なお電位差計の抵抗値は10kΩに設定している。(クリックすることで数値を設定できる)LEDは5Vを接続するが、保護抵抗200Ωを入れる。以上全体の接続を下に示す。

LCDモジュールへの接続
LCDモジュールへの接続

3. スケッチ

 LCDモジュールに文字を出力させるためのスケッチを下に示す。LCDモジュールを使うためには、まずLCDモジュール用のライブラリを#include<LiquidCrystal.h>でロードする。次に上の接続に基づいて、RS,E,DB4-7までのピンの設定をLiquidCrystal lcd(7, 8, 9, 10, 11, 12);として設定する。なおR/WはGNDの接続されているときは引数を省略できるので、今回の設定では省略している。setup関数内にlcd.begin(16,2);とすることで表示領域が16桁で2行であることを設定する。さらにlcd.print(" LCD test");とするとLCDモジュール上に" LCD test"と表示される。LCDの2行目に文字を出力するためには、lcd.setCursor(0,1);とすると出力する文字の先頭となるカーソルが2行目の先頭に移動させ、さらにlcd.print();とすると2行目の先頭から文字を表示することができる。loop関数内については、今は何も記述しない。

#include <LiquidCrystal.h>

// PINの割り当て
// rs:7 en:8 d4:9 d5:10 d6:11 d7:12 に対応
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

void setup() {

lcd.begin(16, 2);// LCDの行と列を設定
lcd.print(" LCD test");// LCDに1行目に表示
lcd.setCursor(0, 1);//表示を2行目にするためのカーソル移動
lcd.print(" This is LCD scrolling test.");//2行目の表示
}

void loop() {}

これを実行すると2行目の文章が途中で切れてしまう。なお、表示が見えない場合は電位差計のダイアルを一番右まで回すと文字が表示されるはずである。そこでLCDに表示されている文字を左に送る操作を加える。loop関数内に

void loop() {
lcd.scrollDisplayLeft(); //左に1文字送る
delay(500);
}

と記述して実行すると、文字が左に送られ全文をスクロールで表示できるようになる。

4. 温度センサの表示

 LCDモジュールと温度センサを組み合わせて、温度をLCDに表示するデバイスを考える。なおTinkrecadで利用できる温度センサはアナログデバイセズのTMP36*1である。 センサの接続例は温度を測る ~ TMP36 - 電子工作入門 - 基礎からの IoT 入門が参考になる。上のLCDモジュールへの接続の図から温度センサTMP36を追加する。TMP36の電力端子には5VおよびGNDを接続し、コンデンサ0.1uFを5VとGNDに接続する。電圧出力端子はArduinoのアナログ入力端子A0に接続する。(下図参照)

温度センサのLCD表示
温度センサのLCD表示

スケッチは以下のようにする。

#include <LiquidCrystal.h>

float temp; //温度
int Vc; //電圧のアナログ読み取り(0-1023)
float Vin; // アナログ電圧値

// rs:7 en:8 d4:9 d5:10 d6:11 d7:12 に対応
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

void setup() {
}

void loop() {

Vc=analogRead(A0); //温度センサ出力電圧のアナログ読み取り
Vin=(float)Vc/1023.0*5.0; //アナログ電圧値への変換
temp=100*(Vin-0.5); //アナログ電圧から温度へ変換

lcd.begin(16, 2); // LCD表示開始
lcd.setCursor(0, 0); // LCD1行目の表示
lcd.print("Temp:"); 
lcd.print(temp);
lcd.print(char(178)); // 度記号の特殊文字表示
lcd.print("C");

lcd.setCursor(0,1); // LCD2行目の表示
  if (temp>=35){   // 温度によるメッセージ選択
    lcd.print("Alert! TOO HOT");
  }
  else if(temp>=25 & temp<35){
    lcd.print("HOT!");
  }
  else if(temp>=10 & temp<25){
    lcd.print("Mild");
  }
  else if(temp>=-5 & temp<10){
    lcd.print("Cold!");
   }
  else{
    lcd.print("Alert! TOO COLD");
  } 
   
delay(1000); // 1秒間LCD表示(1秒更新)
lcd.clear(); // LCD表示をクリア

}

温度センサの出力電圧をアナログ入力端子A0で読み出し、電圧値を温度に変換した結果をLCDの1行目に、温度によるメッセージを2行目に表示する。アナログ入力から電圧値に変換するところは、 atatat.hatenablog.com で紹介している。LCDの表示は温度を測定するごとに更新する必要があるので、今回はloop関数内にLCD表示のコードを書き、loopの最後にlcd.clear()として表示をクリアする。温度の記号である°は、lcd.print(char(178));として文字コードを指定することで表示している。(Tinkercadでは178だったが、他サイトでは223になっているので、Tinkercad以外では確認が必要) なお温度センサの出力電圧と温度の関係は

V_{out}(V)=0.01T+0.5

となっているので、

T=100(V_{out}-0.5)

とすれば温度センサの出力電圧から温度を計算できる。シミュレーションを実行すると下のようになる。温度センサTMP36をシミュレーション中にクリックして、温度をスライドするとセンサの出力が変化しLCDの表示が同時に変化することが確認できる。

温度センサ表示実行例
温度センサ表示実行例

5. まとめ

 今回はシリアルモニタ以外の外部出力表示としてLCDモジュールへの出力方法を紹介した。また、温度センサと組み合わせることで、独立した温度センサデバイスとして機能させる例もあわせて紹介した。