LCD Keypad Shield を衝動買いしました
ネットでマイコンの表示用の部品を探している時、「LCD Keypad Shield」 が
目に留まり、詳しく判らなかったけど値段が安かったので衝動買いしました。
商品到着後に調べた結果とても便利な事が判り、またコードの作成もとても
簡単で、Arduinoではコードが絵の様に書けるのでスケッチと呼んでいる事も
実感できました。
このデバイスに関しても、沢山の方々がWeb上に記事を書かれていますが、
今回購入したに関して、私なりに初心者の目から調べた事を記事にして
みました。
<LCD Keypad Shield の概要>
購入した「LCD Keypad Shield」は「Arduino UNO」対応のもので、
次の様なものでした。
1.16桁x2行のLCDと5個のキー入力を持っている
2.Arduino UNO との接続は双方のピンとコネクタで対応
(配線は不要、Arduino UNO の上に装着)
3.LCD用にD4~D10を使用、キー入力用にA0を使用
4.残りのポートと他の基板接続時に必要な電源等は
この基板上を中継して利用できる様にしてある
5.ブランド名、メーカー名はなく、DFROOT社のSKU:DFR0009の
コピー版と想定される (バージョンは1.0)
<関連資料>
データシートは、外見上から次のURLからのものがオリジナルと想定されます。
URL : https://www.dfrobot.com/wiki/index.php/Arduino_LCD_KeyPad_Shield_(SKU:_DFR0009)
サンプルコードは上記のページから入手できますが、V1.0 用の部分が
コメントアウトして有りますので、現状の V1.1 をコメントにして、V1.0 の
部分を有効にする必要が有ります。(変更後のものでの動作はOKでした。)
<テスト内容>
LCD Keypad Shield のテストは次の様な内容で、超音波センサーの
検出結果を表示する処理を実行させる事にしました。
[目的と結果]
テストの確認目標は次のものでした。
1.購入したものの動作方法の確認
2.および、それが動作する事を確認
3.表示内容は超音波センサーの出力でキー入力で
処理の中断と再開をさせる
結果としては、表示およびキー入力の動作はカタログ通りで期待した結果が
得られました。ただし、キー入力の処理が距離計測と同じメインルーチンで
あったため、キー入力の反応が遅かったのは想定内なので今回は不問と
しました。
[テストでの機器の接続]
[テストの状況]
[テストコード(スケッチ)]
//
// LCD Keypad Shield check program
//
// ポート定義
#define ECOH 11 // エコー信号入力ピン
#define TRIG 12 // エコー出力トリガーピン
#define btnRIGHT 0 // RIGHT ボタン
#define btnUP 1 // UP ボタン
#define btnDOWN 2 // DOWN ボタン
#define btnLEFT 3 // LEFT ボタン
#define btnSELECT 4 // SELECT ボタン
#define btnNONE 5 // 該当なし
// グローバル変数
int Duration ; // 超音波センサーの応答周期
float Distance ; // 計測した距離
int lcd_key = 0; // キー入力
int adc_key_in = 0; // キー入力用アナログ入力値
bool runflg = true ; // 実行状態
// LCDライブラリの追加
#include <LiquidCrystal.h>
// LCD駆動ポートの設定
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// Keypad 入力処理
int read_LCD_buttons(){
adc_key_in = analogRead(0); // キー入力アナログ値の取得
if (adc_key_in > 1000) return btnNONE; // 入力値の範囲をチェック
// V1.0 の時のレベルチェック
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 195) return btnUP;
if (adc_key_in < 380) return btnDOWN;
if (adc_key_in < 555) return btnLEFT;
if (adc_key_in < 790) return btnSELECT;
return btnNONE; // 範囲外の時
}
// 初期設定
void setup() {
// 入出力ピンの割り付け
pinMode(TRIG, OUTPUT) ; // 検出開始トリガー出力
pinMode(ECOH, INPUT) ; // エコー応答信号入力
// LCDの初設定
lcd.begin(16, 2); // LCDライブラリの開始
lcd.setCursor(0,0);
lcd.print("Check distance"); // チェック開始を表示
}
// the loop function runs over and over again forever
void loop() {
// 実行中の時
if(runflg){
// 超音波センサーへ計測開始トリガを出力
digitalWrite(TRIG,LOW);
delayMicroseconds(1);
digitalWrite(TRIG,HIGH);
delayMicroseconds(11);
digitalWrite(TRIG,LOW);
// 超音波センサーよりの応答をチェック
Duration = pulseIn(ECOH, HIGH);
if (Duration > 0) { // 応答が有った時
Distance = Duration / 2;
Distance = Distance * 340 * 100 / 1000000; // エコー周期より距離の計算
// LCD表示の初期クリア
lcd.setCursor(0,1);
lcd.print(" ") ;
// LCDに結果の表示
lcd.setCursor(0,1); // 計測時間の表示
lcd.print(Duration) ;
lcd.print("us") ;
lcd.setCursor(8,1) ; // 計算距離の表示
lcd.print(Distance) ;
lcd.print("cm") ;
}
}
// キーボード入力をチェック
lcd_key = read_LCD_buttons();
// 開始/停止のチェック
if*1 || (!runflg && (lcd_key == btnRIGHT))){
// 表示の変更の為の初期クリア
lcd.setCursor(0,0);
lcd.print(" ") ;
runflg = !runflg ;
// 状態表示の変更
lcd.setCursor(0,0);
if(runflg) lcd.print("Check distance"); // チェック開始
else lcd.print("Stop checking"); // チェック停止
}
//
delay(500);
}
テストコードのダウンロード(Dropboxのリンク)
目に留まり、詳しく判らなかったけど値段が安かったので衝動買いしました。
商品到着後に調べた結果とても便利な事が判り、またコードの作成もとても
簡単で、Arduinoではコードが絵の様に書けるのでスケッチと呼んでいる事も
実感できました。
このデバイスに関しても、沢山の方々がWeb上に記事を書かれていますが、
今回購入したに関して、私なりに初心者の目から調べた事を記事にして
みました。
<LCD Keypad Shield の概要>
購入した「LCD Keypad Shield」は「Arduino UNO」対応のもので、
次の様なものでした。
1.16桁x2行のLCDと5個のキー入力を持っている
2.Arduino UNO との接続は双方のピンとコネクタで対応
(配線は不要、Arduino UNO の上に装着)
3.LCD用にD4~D10を使用、キー入力用にA0を使用
4.残りのポートと他の基板接続時に必要な電源等は
この基板上を中継して利用できる様にしてある
5.ブランド名、メーカー名はなく、DFROOT社のSKU:DFR0009の
コピー版と想定される (バージョンは1.0)
<関連資料>
データシートは、外見上から次のURLからのものがオリジナルと想定されます。
URL : https://www.dfrobot.com/wiki/index.php/Arduino_LCD_KeyPad_Shield_(SKU:_DFR0009)
サンプルコードは上記のページから入手できますが、V1.0 用の部分が
コメントアウトして有りますので、現状の V1.1 をコメントにして、V1.0 の
部分を有効にする必要が有ります。(変更後のものでの動作はOKでした。)
<テスト内容>
LCD Keypad Shield のテストは次の様な内容で、超音波センサーの
検出結果を表示する処理を実行させる事にしました。
[目的と結果]
テストの確認目標は次のものでした。
1.購入したものの動作方法の確認
2.および、それが動作する事を確認
3.表示内容は超音波センサーの出力でキー入力で
処理の中断と再開をさせる
結果としては、表示およびキー入力の動作はカタログ通りで期待した結果が
得られました。ただし、キー入力の処理が距離計測と同じメインルーチンで
あったため、キー入力の反応が遅かったのは想定内なので今回は不問と
しました。
[テストでの機器の接続]
[テストの状況]
[テストコード(スケッチ)]
//
// LCD Keypad Shield check program
//
// ポート定義
#define ECOH 11 // エコー信号入力ピン
#define TRIG 12 // エコー出力トリガーピン
#define btnRIGHT 0 // RIGHT ボタン
#define btnUP 1 // UP ボタン
#define btnDOWN 2 // DOWN ボタン
#define btnLEFT 3 // LEFT ボタン
#define btnSELECT 4 // SELECT ボタン
#define btnNONE 5 // 該当なし
// グローバル変数
int Duration ; // 超音波センサーの応答周期
float Distance ; // 計測した距離
int lcd_key = 0; // キー入力
int adc_key_in = 0; // キー入力用アナログ入力値
bool runflg = true ; // 実行状態
// LCDライブラリの追加
#include <LiquidCrystal.h>
// LCD駆動ポートの設定
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// Keypad 入力処理
int read_LCD_buttons(){
adc_key_in = analogRead(0); // キー入力アナログ値の取得
if (adc_key_in > 1000) return btnNONE; // 入力値の範囲をチェック
// V1.0 の時のレベルチェック
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 195) return btnUP;
if (adc_key_in < 380) return btnDOWN;
if (adc_key_in < 555) return btnLEFT;
if (adc_key_in < 790) return btnSELECT;
return btnNONE; // 範囲外の時
}
// 初期設定
void setup() {
// 入出力ピンの割り付け
pinMode(TRIG, OUTPUT) ; // 検出開始トリガー出力
pinMode(ECOH, INPUT) ; // エコー応答信号入力
// LCDの初設定
lcd.begin(16, 2); // LCDライブラリの開始
lcd.setCursor(0,0);
lcd.print("Check distance"); // チェック開始を表示
}
// the loop function runs over and over again forever
void loop() {
// 実行中の時
if(runflg){
// 超音波センサーへ計測開始トリガを出力
digitalWrite(TRIG,LOW);
delayMicroseconds(1);
digitalWrite(TRIG,HIGH);
delayMicroseconds(11);
digitalWrite(TRIG,LOW);
// 超音波センサーよりの応答をチェック
Duration = pulseIn(ECOH, HIGH);
if (Duration > 0) { // 応答が有った時
Distance = Duration / 2;
Distance = Distance * 340 * 100 / 1000000; // エコー周期より距離の計算
// LCD表示の初期クリア
lcd.setCursor(0,1);
lcd.print(" ") ;
// LCDに結果の表示
lcd.setCursor(0,1); // 計測時間の表示
lcd.print(Duration) ;
lcd.print("us") ;
lcd.setCursor(8,1) ; // 計算距離の表示
lcd.print(Distance) ;
lcd.print("cm") ;
}
}
// キーボード入力をチェック
lcd_key = read_LCD_buttons();
// 開始/停止のチェック
if*1 || (!runflg && (lcd_key == btnRIGHT))){
// 表示の変更の為の初期クリア
lcd.setCursor(0,0);
lcd.print(" ") ;
runflg = !runflg ;
// 状態表示の変更
lcd.setCursor(0,0);
if(runflg) lcd.print("Check distance"); // チェック開始
else lcd.print("Stop checking"); // チェック停止
}
//
delay(500);
}
テストコードのダウンロード(Dropboxのリンク)