超簡単!I2C キーパッドの作り方

ここしばらくは電子工作ネタから離れていたので、ひさびさに電子工作の記事を書いてみます。
今回は、Arduino UNO や ESP32、Raspberry Pi Pico などで便利に使える I2C で動作するキーパッド(テンキー)の紹介です。

キーパッドをマイコンにつなぐには

キーパッド(テンキー)は、通常 4 X 3 の12個か 4 X 4 の16個のキーをマトリックス状につないで構成されています。
つまりそれぞれのキーを認識するには7本または8本の線を接続できる入力端子が必要になります。

別々の端子を使う以外に、抵抗の分圧を使ってアナログ的にキー入力を検出する方法もありますが、精密な抵抗と基準電圧を使う必要があります。

入力端子がたくさん付いているマイコンなら大丈夫ですが、組込み用途で良く使う Arduino Nano や Pi Pico の小型版の RP2040、ESP32 などには最低限の端子しか用意されていません。
SPI 接続の TFT などをつなぐと、残りの端子ではスイッチ2個程度が限界です。
(左から Arduino UNO R4、Raspberry Pi Pico、Arduino Nano、ESP32-CAM、RP2040、ESP32C3 です。)

そこで、2本の信号線だけで通信できる I2C を使ったキーパッドが、簡単に実現出来ないか検討してみます。

I2C とは

I2C(Inter-Integrated Circuit)とは、Philips(現NXP)社が開発したシリアル通信の規格です。
2本の信号線(SDA:データ、SCL:クロック)と電源2本の合計4本の線だけでマイコン(MCU)と周辺機器間で通信できるので大変便利です。
規格上では最大112個までの周辺機器(スレーブ)を接続できます。

I2C キーパッド

とりあえず、ネットで「I2C Keypad」で検索してみました。
すると、市販品が見つかりました。販売していたのですね。
スイッチサイエンスマルツaitendo、AliExpress などで販売していました。(売り切れもあります。)
前2つは2,500円程度、後ろ2つは1,000円以下で手に入ります。

その後も調べてみると GitHub で「arduino_keypads」を見つけました。
同じようなことで困っている方は世界中に沢山いるのですね。
早速、この「joeyoung」さんが製作されたデータを見てみます。

arduino_keypads

中身はタイトルどおりに Arduino IDE で簡単に自作できる I2C のキーパッドについて丁寧に書かれていました。
その中のフォルダに「Keypad_I2C」があり、製作に必要な部品は「PCF8574, PCF8574A 又は PCF8575」と書かれています。

「・・・ PCF8574 って型番の IC は記憶があるなぁ。」
部品箱をあさってみますが、見つかりません。
時間をかけて部品探しを続けます。作業部屋の片付けもできるので良い機会なのですが、全ての部品箱を見ても「PCF8574」という IC が見つかりません。

しかたがないので、自分のブログを検索してみました。
すると、5件の記事が見つかりました。

その中でも「LCD(PX1602)- I2C アダプタの製作」は、最近の記事なので記憶がよみがえりました。
16文字 X 2行のパラレル式の LCD を I2C に変換する基板に、EL ドライバ基板を統合したものを自作した時に使いました。

「これって I2C 信号をパラレル LCD へ出力して表示する IC じゃなくて、入力側でも使えるんだ。」
PCF8574 のデータシートを見てみます。

詳しく調べるまでもなく、データシートの1頁目の右上に「この 2 線式双方向バス (I2C) 用 8 ビット入出力 (I/O) エク
スパンダは、」と書いてありました。

もう一度探してみると、I2C 変換 IC は良く使う部品入れの中で見つかりました。
キーパッドも数種類が見つかったので、接続試験が出来ます。

市販キーパッドの端子

部品箱に入っているキーパッドを使うために、1つづつキーを押して各端子の配線をテスターで調べようと思ったのですが、考えてみればネットに市販のキーパッドのデータぐらいあるだろうと思いつきました。

探してみると電子工作用の気の利いた小部品を扱っている「Adafruit 社」に各種データを見つけました。

この後の図は、Adafruit 社の HP からの引用です。

完成品のキーパッドの中身はこんな感じです。
横の列が「R(row)」で、上から1~4の並びです。
縦の列が「C(column)」で、左から1~4の並びです。

具体的には、「1」のキーを押すと R1 と C1 が導通することで、どのキーが押されたのかを判別しています。

内部の機能が分かったので、ピンの並びが分かれば接続してすぐに使えますね。
各種キーパッドのピンの並び順も、この HP に出ています。

メンブレンタイプ

薄いシート状のキーパッドです。
左から順に R1 ~ R4、C1 ~ C3 で分かりやすいです。
このタイプの4X4は、左から順に R1 ~ R4、C1 ~ C4 の8本になります。

電話機用キーパッド

Adafruit 社の HP では、「Phone-style (PID 1824)」と書かれているものです。
こちらは左から C1 ~ C3、R1 ~ R4 です。

4X4 キーパッド

「Matrix Keypad (PID 3844)」と書かれているものです。
上のものと違い、基板がはみ出ています。
そして、配列はメンブレンと同じ左からですが、C1 ~ C3、R1 ~ R4 の順です。

3X4 キーパッド

「Matrix Keypad (PID 3845)」ですが、これだけ端子の順番がバラバラです。
左から C2,R1,C1,R4,C3,R3,R2 という順ですが、外側は未使用という配列です。
これは資料がないとテスターで総当たりしても調べるのが大変そうです。

部品箱にあったのはメンブレンタイプと電話機用でした。どちらも順番が分かりやすくて良かったです。

I2C パラレル変換器

部品箱に沢山在庫のある I2C の信号を双方向で変換する基板です。
(この記事を書くまでは、LCD 専用だと思っていました。)

基板上に書かれている型番は「HW-61」です。
この型番で配線図を調べてみます。(そのままではヒットしないので「HW-61 I2C」で調べました。)

HandsOn Tech 社の HP に資料が見つかりましたので配線図を引用します。
これを見ると「PCF8574」の Pin 7(P3)信号名は「BT」だけが、直接端子につながらずに抵抗とトランジスタを通して LED につながっています。つまり、このままではこの端子(P3)だけは使えないですね。

そして、A0、A1、A2 の3つの基板上のジャンパの設定で8種類のアドレスを選べます。(標準アドレスは 0x27 です。)

ちなみに、基板上に「PCF8574」と記載されている黄色い端子の変換基板も販売されています。
こちらも調べてみたら、IC の全ての端子が外に出ています。
(この基板は横に複数個、つなげて使えるようです。)

販売店の HP より引用

また、赤い基板の変換基板も同じように全ての IC の端子がつながっています。
この記事の内容を追試するために変換基板を新しく購入される方は、黄色か赤の変換基板を使う方が便利です。(ただし現物を入手していないので動作するかは分かりません。)

販売店の HP より引用

arduino_keypads の試験

GitHub から圧縮ファイルをダウンロードします。

解凍したファイル内の「Keypad_I2C」フォルダにあるドキュメントを参照します。
I2C キーパッドを作るための回路が描かれています。
これによると、キーパッドC列の各端子を 10 kΩ でプルアップするだけで出来上がりです。(必要に応じて I2C 信号もプルアップしてください。)

接続方法

Arduino UNO、変換基板とキーパッドの接続は下の図のとおりにつなぎました。

配線表です。

Arduino UNOキーパッドI2C 変換基板備考
1,2,3 未使用
14
25
36
7(未接続)
8(未接続)
9(未接続)
10(未接続)
41110kΩで5V
512
613
714
15,16 未使用
GNDGND
5VVCC
A4SDA
A5SCL

接続した実物は、ブレッドボードを使ったのでこんな感じです。
(写真ではキーパッドの上下が逆ですね。)

プログラム

「examples」フォルダにある「CustomKeypad_I2C.ino」を使ってみます。
なお、Arduino IDE で使用するには、「Keypad_I2C」フォルダ内のファイルを Arduino IDE のライブラリ・フォルダに入れる必要があります。(解凍した「arduino_keypads-master」フォルダを、ユーザーフォルダの \Arduino\libraries へ入れてください。)

用意したキーパッドを接続して、スケッチ例を少し書き換えるだけで出来ました。
一部編集するだけで、気が抜けるほど簡単に I2C キーパッドが出来上がりました。

スケッチの変更箇所

部品箱で見つけた電話機用?のキーパッドに表示に合わせて変更した、Arduino IDE 用のスケッチです。
(他のキーパッドでは設定の変更が必要です。)

#include <Keypad_I2C.h>
#include <Keypad.h>
#include <Wire.h>

#define I2CADDR 0x27  //変換基板の通常のアドレス

const byte ROWS = 4; //rowの数
const byte COLS = 3; //columnの数

//キーパッドに表示されている文字に書き換える
char hexaKeys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {4, 5, 6, 7}; //キーパッドのROWの変換基板への接続先
byte colPins[COLS] = {0, 1, 2}; //キーパッドのCOLの変換基板への接続先

//initialize an instance of class NewKeypad
Keypad_I2C customKeypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS, I2CADDR); 

void setup(){
//  Wire.setPins(0, 1);// ESP32でPin番号を設定する場合(SDAピン番号, SCLピン番号);
  Wire.begin(); 
  customKeypad.begin( );

  Serial.begin(9600);
//  Serial.begin(115200);  // ESP32用
  Serial.println("Initialized");  //追加
}
  
void loop(){
  char customKey = customKeypad.getKey();
  
  if (customKey != NO_KEY){
    Serial.println(customKey);
  }
}

Arduino IDE のシリアルモニタを表示させると、こんな感じに押したキーが表示されます。
プログラム(スケッチ)側で、スイッチ同時押しの対応もされているので使いやすいです。

1個200円ぐらいの I2C 変換基板と抵抗を4個追加するだけで、超簡単にピン数の少ないマイコン(MCU)の端子を増やすことに成功しました。
1個の変換基板で最大(一部改造が必要な基板あり)8本の端子が増設でき角出16個のキーを使えるようになります。
検証はしていませんが、この IC(PCF8574)は8つのアドレス設定が出来るので、16 X 8 = 128 個のキーボードが作れます!

ちなみに、この後、Arduino UNO で簡単に動いたので ESP32-C3 で試したら動かなくて数日間悩みました。
解決してみると本当に簡単な方法だったのですが、記事が長くなったので次回の記事にします。

コメント