趣味のマイコンいじり

安価なマイコンを利用して作成したアプリの紹介です。

LCD Keypad Shield を衝動買いしました

ネットでマイコンの表示用の部品を探している時、「LCD Keypad Shield」 が
目に留まり、詳しく判らなかったけど値段が安かったので衝動買いしました。
商品到着後に調べた結果とても便利な事が判り、またコードの作成もとても
簡単で、Arduinoではコードが絵の様に書けるのでスケッチと呼んでいる事も
実感できました。
このデバイスに関しても、沢山の方々がWeb上に記事を書かれていますが、
今回購入したに関して、私なりに初心者の目から調べた事を記事にして
みました。

LCD Keypad Shield の概要>
  購入した「LCD Keypad Shield」は「Arduino UNO」対応のもので、
  次の様なものでした。
  イメージ 1

    イメージ 2

  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.表示内容は超音波センサーの出力でキー入力で
      処理の中断と再開をさせる

  結果としては、表示およびキー入力の動作はカタログ通りで期待した結果が
  得られました。ただし、キー入力の処理が距離計測と同じメインルーチンで
  あったため、キー入力の反応が遅かったのは想定内なので今回は不問と
  しました。

 [テストでの機器の接続]
    イメージ 3

    イメージ 4

 [テストの状況]
    イメージ 5

    イメージ 6

 [テストコード(スケッチ)]
     //
     // 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のリンク
 



*1:runflg && (lcd_key == btnLEFT