Arduino—再び(3)–LCD Keypad Shield

ほぼ目的のプログラム(スケッチ--arduinoではこう呼ぶみたいですね。)ができました。難しいものではな
く、入門編によくあるようなLチカ(LEDを点灯させる)のプログラムと大差ありません。ただ、キーの読み取
りをアナログの変化で読み取っているので、安定しない部分があるのか、長押しの判別がどうしても、できま
せんでした。

               押されたキーの判別
                    │
          ┌───────────────────────┐
    UPキーが押された⇒⇒ +1の処理    UPキーが長押しされた⇒⇒+10の処理

のようにしたかったのですが、あきらめて、+10の処理は、RIGHTキーに割り当てました。 スケッチでは、

   キー判別の関数の呼び出し
      
   呼び出されたそれぞれキーの回数をカウントする
      
   カウントが一定以上になったら、キーに応じた処理をする。

という単純なことを、メインのLOOPのなかで、繰り返してるだけです。「回数をカウント」の部分はなくても
いいのですが、一応チャタリングの対策です。
入力した数字をLCDに表示するのに数字の桁数が違ってしまうと、正しい表示がされないので、左詰めで表示
できるように簡単な関数を作りました。文字数を取得する関数が準備されてますが、その書式がどちらかとい
うとエクセルのVBAのような感じで、ちょっと戸惑いました。PICのC言語だと目的の文字を括弧の中にいれる
のですが、ピリオドで連結するようでした。このへんの細かい文法は、その都度調べないとだめですね。

   arduinoの記述  s.length( )  (sが長さを求める文字)
   PICのC言語記述 sterlen(s)   (sが長さを求める文字) 

“Arduino—再び(3)–LCD Keypad Shield” の続きを読む

Arduino—再び(2)–LCD Keypad Shield

LCD Keypad Shield が届いたので、あれこれはじめました。

諸兄のプログラムをお借りして、動かしてみました。すんなりと動きましたが、LCDの表示で、明るさの調整がボリュームで必要でした。
 ただ、KEYの読み取りで、判別条件の調整が必要でした。諸兄の物と届いた物では、抵抗値が違うのだと思いますが、下記赤字部分のように、アナログの読み込みの値の修正をしました。

     int read_LCD_buttons(int adc_key_in){
          if (adc_key_in > 1000) return btnNONE;
          if (adc_key_in < 50) return btnRIGHT;
          if (adc_key_in < 150) return btnUP;
          if (adc_key_in < 300) return btnDOWN;
          if (adc_key_in < 600) return btnLEFT;
          if (adc_key_in < 750) return btnSELECT;
          return ERRORR;
     }

この辺は、メーカーの違い、個体値の違い、等によって調整が必要なようです。このアナログ値の調整をする
にあたっては、諸兄の作成されたプログラムが都合がよかったです。キーごとの電圧が表示されますので、そ
れをみながら、調整ができます。私はそのまま使いましたが、表示が電圧ではなくて、アナログの読み取り値
だともっと楽だと思います。また、標準のライブラリーとは、LCDのピンの配置が多少違うので、下記のよう
に、ピンの表示の部分の変更も必要でした。これは、別の諸兄のHPに記載がありました。

     #include LiquidCrystal
      lcd(8, 9, 4, 5, 6, 7);

LCDの表示用にデジタルの、8,9,4,5,6、7、キーの判別ようにアナログのA0のピンを使用していますので、ユーザーはそれ以外のピンしかつかえません。基盤の裏のパターンをたどってみると、

写真の緑黄色矢印から、

 13,12,11,3,2,1,0

の並びで、デジタルのピンを取り出せるようです。また、アナログは、本体右下のピンヘッダーから、

のように、

 1,2,3,4,5

のアナログのピンを取り出せるようです。

大捜索をするようですが、部品を収納した、ケースにピンヘッダーがあったように記憶してますので、探しだして、取り付けたいと思ってます。