シールド
Arduinoには IO のPINコネクタがありその上にいろいろな入出力ディバイスを取り付けることができます。はんだ付けやブレッドボードの配線をすることなく様々な実験をすることができます。完成された製品をのせることもできます。
LCD Keypad シールド
液晶表示のシールドには幾つかの種類があります。
LCD1602

16文字X2行の表示ができる手軽に使える液晶表示器です。たくさんの線をはんだ付けするのが難点です。今回は実験ですのでブレッドボードで配線しています。

LCD Shieldです。液晶16文字2行表示のLCD1602を使い,Arguinoのポートのpinに結線したシールドです。スケッチを描けば表示がすぐに使えるので便利です。
2074円2022/10/20売り切れ
表示実験
PS 2017/1/14
LCD Keypad Shieldがとどきました。
PIN接続はlcd(8,9,4,5,6,7);で成功しました。見にくいとは思いますが,写真を載せました。

バックライトのLEDがD10pinにつながっていますので点灯消灯ができます。コントラストは左上に見える多回転式の半固定抵抗で調節します。データロガシールドとともに使用する場合はちょっと工夫が必要です。2017/6/15現在300円
590円2021/6/2
700円位2022/10/20
PIN配列




基板には拡張のホールが有りデジタルPINやアナログPINにつながっているので便利に使えます。下向きにコネクタなどを付けるとボタンや液晶に影響が少ないと思います。
値段による違いでしょうか?値段の高い方が配送が遅く雑のように見えます。少し違ったところが有りました。液晶のPINが長くてArduinoのICSPのPINと接触しそうです。d3,d2の2本を曲げておきました。(液晶のpinを切断すればいいことなのですが,何かに使えるかもしれないのでこのようにしました)
VO用の半固定のバリオームが調整されていなく,表示されないので焦りました。
それほど気になりませんでしたが,どちらも油汚れのようなものが有りました。ハンダ用のペーストかもしれません。
Arduinoとの接続

Arduinoとの接続に配線はいりません。電源も信号線も全てつながっています。表面が液晶になっているので他の部品は拡張ホールに付けるか,Arduinoとの間にユニバーサルボード等を挟むようにします。
lcd(8,9,4,5,6,7);でインスタンスを動作させます。
A1~A5とデジタルpinの0,1,2,3,11,12,13が使えます。
スケッチ例
LCD01
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/*
説明部分
*/
//宣言部分
#include <LiquidCrystal.h>//インクルード ファイルはArduino内臓
//LCD具現化
//RS,EnableとD4,6,D10~D13をArduinoとつなぎます。
LiquidCrystal lcd(8,9,4,5,6,7);//LCD Keypad シールドのpin
void setup() {//初期設定部分
//16文字2行のLCDを使う設定です。
lcd.begin(16, 2);
//LCDへの文字出力です。
lcd.print("hello, world!");
}
void loop() {//繰り返し部分
//カーソルの移動です。
lcd.setCursor(0, 1);//(x,y)です。
//0文字目,1行目(0から数えます)です。
//変数の表示です。
lcd.print(millis() / 1000);
//millis()はmsを求める関数です。
//1000で割っているので1秒です。
}
画面をクリアして"hello, world!"と表示した後2行目に1秒ごとの数字を表示するスケッチ例です。
バックライトLEDの点滅
LCD Keypad ShieldはLEDのコントロールにデジタル10PINを使っているのでここで点滅させることができます。
pinMode(10,OUTPUT);
digitalWrite(10,LOW);
digitalWrite(10,HIGH);
でコントロールします。
LCDライブラリのコマンド一覧
LiquidCristal()
begin()
clear()
home()
setCursor()
write()
print()
cursor()
blink()
noBlink()
display()
noDisplay()
scrollDisplayLeft()
scrollDisplayRight()
autoscroll()
noAutscroll()
leftToRight()
rightToLeft()
createChar()
生成
初期化
すべて消去
カーソルホーム
カーソル移動
表示BYTE
表示キャラクタ
点滅
点滅なし
表示する
表示しない
Keypadのボタンを活用
LCD Keypad Shieldに付いているKeypad=ボタンを使って時刻合わせやアラームセットをしようとしています。
Keypad

セレクトボタンがありますので,これで処理を選択して矢印キーで設定できるようにします。
LCD シールド ボタン
LCD Keypad ShieldのボタンによるA0の電圧をn/1023で表します。
ボタンは抵抗のつながりの中のそれぞれの接点につながっています。
抵抗による分圧






















RIGHTキーが
押された時
A0はVCC0V
数値は 0
UPキーが
押された時
330
5V×-------
2000+330
A0は 0.7V
数値は 144
DOWNキーが
押された時
950
5V×-------
2000+950
A0は 1.6V
数値は 326
LEFTキーが
押された時
1950
5V×-------
2000+1950
A0は 2.5V
数値は 505
SELECTキーが
押された時
5.25
5V×-------
2+5.25
A0は 3.6V
数値は 740
SELECTキーが
押された時
5.25
5V×-------
2+5.25
A0は 3.6V
数値は 740
各ボタンが押されるとGNDに短絡するようになっています。
Key無押下
キーが何も押されていない時には2KΩでプルアップされているだけなのでA0はVcc
5Vで入力値は1023となります。
RIGHT
RIGHTが押されるとA0はGNDに直結しますので0V入力値は0になります。
UP
UPが押されると2000Ωと330Ωで分圧されて5Vよりも0Vの方が近いので1V以下になります。入力値は200以下でしょう。
DOWN
DOWNが押されると2000Ωと950Ωで分圧されて約2:1の割合で5Vを分けることになるので1.6V位になります。入力値は300位でしょう。
LEFT
LEFTが押されると2000Ωと1950Ωで分圧されて1:1に近いので2.5V位になります。入力値は500位でしょう。
SELECT
SELECTが押されると2000Ωと5250Ωで分圧されて0Vよりも5Vの方が近いので4V近くになります。入力値は700前後でしょう。
Keypad-A0の電圧表示
Sketch_jan13a
#include <LiquidCrystal.h>//液晶表示使用
LiquidCrystal lcd(8,9,4,5,6,7);//表示器設定
int pin;//pinという整数の変数を使用
void setup() {
pinMode(10,OUTPUT);//液晶LED点灯用
digitalWrite(10,HIGH);//液晶点灯
lcd.begin(16, 2);//液晶行数指示
lcd.setCursor(0, 0);//液晶0行0桁
lcd.print("Hello");//液晶テスト
}
void loop() {
pin=analogRead(0);//A0入力pin変数へ
lcd.setCursor(0,1);//表示下段へ
lcd.print(" ");//以前の表示消去
lcd.setCursor(0,1);//表示下段へ
lcd.print(pin);//入力数値表示
delay(1000);//1秒待つ
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
A0の値がどれほどになるか測定するためにスケッチを書いてみました。
上のスケッチで測定したLCD Keypad Shieldの実測値です。
ボタンによるA0の電圧
Shield1 Shield2
NOKEY 1023 1023
SELECT 639 732
LEFT 408 512
UP 99 143 UPは200以下でした
DOWN 254 342
RIGHT 0 0
2つのLCD Keypad Shieldを持っていますが,電圧はかなり違います。キャリブレーションなどの何か手立てを行わなければ正確にKey入力を行うことができません。
int KeyIn()関数
KeyIn
1
2
3
4
5
6
7
8
9
10
int KeyIn(){//キー入力
int pin;
pin=analogRead(0);//pinにアナログ入力
if(pin<50){return 0;}//電圧により値を返す
else if(pin<200){return 1;}
else if(pin<400){return 2;}
else if(pin<600){return 3;}
else if(pin<900){return 4;}
else return 5;//入力がなければ5を返す
}
KeyIn( ) スケッチをファンクションにしています。行番号は仮のものでスケッチに組み込むごとに変化します。
KeyIN( )を呼んだところにキーの番号を返すようにしています。値がShield個体により変わってしまうので注意が必要です。(同じメーカの同じ型版なら誤差は少ないと思います)
キー入力のスケッチ例
KeyIn
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void setup(){//初期設定部
Serial.begin(9600);//serial初期化
}
void loop() {//繰り返し部
int key;
key=KeyIn();//ボタンの状態を読み込む
Serial.println(key);//シリアル出力
}
//関数・補助部
int KeyIn(){//キー入力
int pin;
pin=analogRead(0);//pinにアナログ入力
if(pin<50){return 0;}//電圧により値を返す
else if(pin<200){return 1;}
else if(pin<400){return 2;}
else if(pin<600){return 3;}
else if(pin<900){return 4;}
else return 5;//入力がなければ5を返す
}
関数の使い方の例になりました。
このようにして関数やサブルーチンを作り使っていきます。同様にしてkeInWateを使うとキー入力まで待つプログラムができます。試してみてください。
キー入力待ち関数
KeyInWaite
1
2
3
4
5
6
7
8
9
10
11
12
13
int KeyInWate(){//キー入力待ち
int pin;
while(1){
pin=analogRead(0);//pinにアナログ入力
if(pin<50){return 0;}//電圧により値を返す
else if(pin<200){return 1;}
else if(pin<400){return 2;}
else if(pin<600){return 3;}
else if(pin<900){return 4;}
else pin=pin;//入力がなければ入力へ戻る
}
return;
}
KeyInWaite( ) スケッチをファンクションにしています。行番号は仮のものでスケッチに組み込むごとに変化します。
キーが押されるまで待ってKeyInWaite( )を呼んだところにキーの番号を返すようにしています。
キー入力処理サブルーチン
処理1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Shori1(){//処理1
int key;
lcd.clear();
lcd.print("Date");
delay(500); while(1){
key=KeyIn();
if(key==0)Shori13();
if(key==1)return;
if(key==2)return;
if(key==3)Shori11();
if(key==4)Shori2();
}
}
処理3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Shori3(){//処理3
int key;
lcd.clear();
lcd.print("Date");
delay(500); while(1){
key=KeyIn();
if(key==0)Shori33();
if(key==1)return;
if(key==2)return;
if(key==3)Shori31();
if(key==4)Shori1();
}
}
処理1から処理3まで基本的な処理は同じです。処理1と処理3では8行目と9行目が反対になっていますが,サブルーチンから戻ってもkeyの内容は戻っていますから,処理は下端まで進み11行目はArduinoですので見えませんがreturn;で親ルーチンに戻ります。
気になるようでしたら,処理1のように他の処理を先に行っておくと胸のつかえがとれます。return;も書いておいてもエラーになりません。
キー入力スケッチ例
Sketch_jan13a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
//宣言部
#include <LiquidCrystal.h>
#define LcdLed 10//LCDのLED pin設定
LiquidCrystal lcd(8,9,4,5,6,7);//LCD接続pin
void setup(){//初期設定部
pinMode(LcdLed,OUTPUT);//LcdLedのpinを出力
digitalWrite(LcdLed,HIGH);//LcdLedをON
lcd.begin(16, 2);//16文字2行のLCD使用
lcd.setCursor(0, 0);//カーソル移動
lcd.print("Hello");//挨拶
delay(1000);//1秒待機
}
void loop() {//繰り返し部
int key;
key=KeyIn();//キー入力
lcd.clear();//液晶クリア
switch(key){//ボタンによって処理の選択
case 0:lcd.print("Hello 0");break;
case 1:lcd.print("Hello 1");break;
case 2:lcd.print("Hello 2");break;
case 3:lcd.print("Hello 3");break;
case 4:Shori1();break;
default:Hyouji();
}
delay(1000);
}
//関数・補助部
void Shori1(){//処理1
int key;
lcd.clear();
lcd.print("year");
delay(500);
while(1){
key=KeyIn();
if(key==0)Shori13();
if(key==1)return;
if(key==2)return;
if(key==3)Shori11();
if(key==4)Shori2();
}
}
void Shori2(){//処理2
int key;
lcd.clear();
lcd.print("Month");
delay(500); while(1){
key=KeyIn();
if(key==0)Shori24();
if(key==1)return;
if(key==2)return;
if(key==3)Shori21();
if(key==4)Shori3();
}
}
void Shori3(){//処理3
int key;
lcd.clear();
lcd.print("Date");
delay(500);
while(1){
key=KeyIn();
if(key==0)Shori33();
if(key==1)return;
if(key==2)return;
if(key==3)Shori31();
if(key==4)Shori1();
}
}
int KeyIn(){//キー入力
int pin;
pin=analogRead(0);//pinにアナログ入力
if(pin<50){return 0;}//電圧により値を返す
else if(pin<200){return 1;}
else if(pin<400){return 2;}
else if(pin<600){return 3;}
else if(pin<900){return 4;}
else return 5;//入力がなければ5を返す
}
int KeyInWate(){//キー入力待ち
int pin;
while(1){
pin=analogRead(0);//pinにアナログ入力
if(pin<50){return 0;}//電圧により値を返す
else if(pin<200){return 1;}
else if(pin<400){return 2;}
else if(pin<600){return 3;}
else if(pin<900){return 4;}
else pin=pin;//入力がなければ入力へ戻る
}
return;
}
void Hyouji(){//表示
lcd.print("Display");//表示内容
}
このスケッチでボタン入力によって処理を変えていくことができます。
もう一度Selectキーを押したときに処理2や処理3にも移動します。処理3でSelectキーを押すと処理1に移動しますがサブルーチンを呼ぶ形になっているのでネスティング(入れ子)が重なってしまいますが,他のキーで処理をした後returnで戻るため,瞬時にネスティングが解けます。
処理1と処理2の間に時刻合わせのサブルーチンを作ります。処理2の後には日付合わせ,処理3の後にはアラームセットの処理を書きます。
キー処理関数2段目
処理12
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Shori12(){//処理1-2
int key;
lcd.clear();lcd.print("Minute");//分合わせ
delay(500);//前の処理のキー入力が残らない
while(1){//永遠に繰り返す
key=KeyIn();//キー入力
minute=RTC.getMinute();//分読み込み
lcd.setCursor(0,1);lcd.print(minute);
if(key==0){Shori11();return;}
if(key==1){//一分進める
minute=minute+1;RTC.setMinute(minute);}
if(key==2){//一分戻る
minute=minute-1;RTC.setMinute(minute);}
if(key==3){Shori13();return;}//次の処理へ移動
if(key==4)return;//selectならば帰る
delay(500);
}
}
処理12 分合わせのサブルーチンです。分を時刻・秒、年月日に替えるとそれぞれの処理ができます。
なぜ「分」かというと,時刻の単独取得ができなかったからです。
プロトタイプシールド
プロトタイプシールド