LCD + キーパッドシールド

LCD とプッシュボタンがコンボになっているシールドです。LCD のコントラストは左上の半固定抵抗 (RP1)で調整できます。

このシールドは 5V 専用となっており、SainSmart の UNO 互換機 (サインスマート改造バージョン) で使う場合にはスライドスイッチを 5V 側に設定しなければなりません。3.3V ではどうやっても SELECT ボタンの状態を検出できません。

ピンアウトは以下のようになっています。右上のピンヘッダはこのシールドで使われていないデジタルピン (#13~#11, #3~#0) + GND + VCC が出ており、右下のピンヘッダの S 列にはアナログピン #0 以外 (#1~#5) が出ています。

ピン 機能
Analog #0 ボタン (Right, Up, Down, Left, Select)
Digital #4 DB4
Digital #5 DB5
Digital #6 DB6
Digital #7 DB7
Digital #8 RS
Digital #9 Enable
Digital #10 バックライトコントロール

テストスケッチは以下のようになります。どのボタンが押されたかはアナログピン #0 の値を読んで閾値で判断します。分圧回路なので、理屈的にキーの同時押しには対応していません。

#include <LiquidCrystal.h>

LiquidCrystal lcd(894567);

const int NUM_KEYS = 5;
char msgs[NUM_KEYS][17] = // 16 桁だが NULL 終端のため 17
                   {"Right Key OK    ",
                    "Up Key OK       ",
                    "Down Key OK     ",
                    "Left Key OK     ",
                    "Select Key OK   " };
int adc_key_val[NUM_KEYS] ={70240420620880}; // キーの閾値 (個体によって値は異なる)
int adc_key_in;
int key = -1;
int oldkey = -1;

void setup() {
  Serial.begin(9600);
  lcd.begin(162);
  lcd.clear();
  lcd.print("KEYPAD testing... pressing");
}

void loop() {
  adc_key_in = analogRead(0);
  Serial.println(adc_key_in); // アナログ値
  key = get_key(adc_key_in);
  if (key != oldkey)
  {
    delay(50);
    adc_key_in = analogRead(0);
    key = get_key(adc_key_in);
    if (key != oldkey)
    {
      oldkey = key;
      if (key >= 0){
        lcd.setCursor(01);
        lcd.print(msgs[key]);
      }
    }
  }
}

int get_key(unsigned int input)
{
  int k;
  for (k = 0; k < NUM_KEYS; k++)
    if (input < adc_key_val[k])
      return k;
  if (k >= NUM_KEYS)
    k = -1;
  return k;
}

シリアルモニタを開いてキーを押すとそのキーのアナログ値が取得できます (RESET は除く)。このアナログ値は個体差があるため、adc_key_val[5] で設定されている閾値を調整する必要があります。押したキーと異なるキー名が表示される場合は閾値の調整不足です。

それと些細な事ですが、このシールドは LEFT ボタンの裏面の端子が Arduino の DC ジャックに干渉します。ほんのわずかですがシールドが浮いてしまうので、私は DC ジャックにピンバイスとハンドドリルで浅く穴を掘っています。

それでも電池ボックスや AC アダプタのプラグは SELECT ボタン裏の端子に干渉するのですが…(^^;A

See Also:


ここにある情報が役に立って、「調べる手間が省けたからオマイに飯でもおごってやるよ」 というハートウォーミングな方がいらっしゃいましたら、下のボタンからどうぞ。

メニュー: