LCD + キーパッドシールド

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

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

若干形状が異なりますが、ほぼコンパチで安価なシールドもあります。

ピンアウトは以下のようになっています。

J8

上中央のピンソケット (J8) は APC220 という無線モジュールを取り付けるためのものです (技適通ってないと思います)。

番号 ピン
1 GND
2 VCC
3 (N/C)
4 D1 (RXD)
5 D0 (TXD)
6 (N/C)
7 (N/C)

USB<->シリアルモジュールを接続したりできます。

J5

右上のピンヘッダ (J5) はこのシールドで使われていないデジタルピン (#13~#11, #3~#0) + GND + VCC が出ています。

番号 ピン
1 D13
2 D12
3 D11
4 D3
5 D2
6 D1 (RXD)
7 D0 (TXD)
8 GND
9 VCC

J7

下中央のスルーホール (J7) は電源系のピンが出ています。

番号 ピン
1 RST
2 3.3V
3 5V
4 GND
5 GND
6 VIN

J6

右下のピンヘッダ (J6) の S 列にはこのシールドで使われていないアナログピン (#1~#5) が出ています。

番号 ピン
1 A1
2 A2
3 A3
4 A4
5 A5

G 列は GND、V 列は VCC です。

シールドで使われているピン

ピン 機能
A0 ボタン (Right, Up, Down, Left, Select)
D4 DB4
D5 DB5
D6 DB6
D7 DB7
D8 RS
D9 Enable
D10 バックライトコントロール

テストスケッチは以下のようになります。どのボタンが押されたかはアナログピン #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:


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

メニュー: