DSPラジオを製作して実際に使ってみると、放送局をプリセットボタンに定義しておいて選局するのが使い勝手が良い。実際に4x4のKeypadを使用した物を製作したが、I2Cインターフェースの調子が悪く、電源を入れてから時間が立つと応答が無くなる現象に悩まされて、いまいちであった。
今回は、別のパーツを組み合わせて4x4のKeypadを実現した。使用したのは、MCP23017(基板付)と4x4のKeypad基板(前回よりコンパクト)である。
MCP23017はMCU(マイクロ・コントローラ)のポートの数が足りない時に、ポート数を拡張するためのICである。Arduinoでは、デフォルトでKeypad.hライブラリが用意されていて、4X4のKeypadが使える。ただし、この場合、接続する線が8本、つまりMCU側のポートが8個必要になる。MCUにはXIAOを使う予定なので、そのままでは、ポートが不足する。このMCP23017は、MCUとI2Cインターフェース経由で接続するため、線は2本(電源、グランド線を含めると4本)で済む。MCP23017をサポートするKeypad_MC17.hライブラリは、Keypad.hライブラリを拡張している。
評価のためのコードを以下に示す。コードの冒頭でincludeしたライブラリは、Keypad_MC17.h、Wire.h、Keypad.hである。Arduino IDEのシリアルモニタに、押したキー(customKey)が表示される。
#include
#include
#include
#define I2CADDR 0x20 // keypad IC
#define MIN_ELAPSED_TIME 100
const byte ROWS = 4;
const byte COLS = 4;
char hexaKeys[ROWS][COLS] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'}};
byte rowPins[ROWS] = {3, 2, 1, 0}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {7, 6, 5, 4}; //connect to the column pinouts of the keypad
//Keypad
customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
Keypad_MC17 keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS, I2CADDR );
long elapsedButton = millis();
long elapsedPull = millis();
void setup() {
Serial.begin(9600);
Wire.begin();
keypad.begin( );
delay(500);
}
void loop() {
char customKey = keypad.getKey(); // Check button commands
if ((millis() - elapsedButton) > MIN_ELAPSED_TIME) {
// check if some button is pressed
if (customKey){
Serial.println(customKey);
if (customKey == 'D') {
// todo
} else if (customKey == '#') {
//todo
} else if (customKey == '0') {
//todo
} else; // and so on
elapsedButton = millis();
}
delay(10);
}
MCP23017(基板)とKeypadの間は、適当なコネクタがなかったのでメスのピンヘッダ(4x2)を挿した上、8本のリード線で接続している。Keypadのピン番号{1,2,3,4}(COL)をMCP23017のポート{A7、A6、A5、A4}に接続、Keypadのピン番号{5,6,7,8}(ROW)をMCP23017のポート{A0、A1、A2、A3}に接続する。
I2Cのアドレスは、MCP23017の半田ジャンパーをすべてGND側に接続して、X”20”とした。MCP23017側のI2Cの接続はSDA,SCLの表示がある。なお、場合によっては数KΩのプルアップ抵抗が必要なケースがあるかもしれない。