熊おふし五郎が行く

主にマイコンボードを動かした記録を書いています

Micro:bit、Micropython、キーパッドでキー入力して、LDEディスプレイに数値、記号を表示する

キーパッド

キーパッドは、数値(0~9)または記号(#、、.、,など)を入力する入力機器です。このキーパッドは、複数のキースイッチの端子を格子状に配線しています(キーマトリックス方式)。キースキャンでボタンの状態を読み取ります。キースキャンとは、Row1~Row4の行ごとにHighまたはLowを出力して、Col1~Col4の入力でキーの状態を検出する方法です。例えば、Row1~Row4を出力、Col1~Col4を入力として、Row1がLow、Row2~Row4がHighの場合、Col1~Col4の入力で、1、4、7、キーが押された状態がわかります。

f:id:bear_9973:20201111205244p:plain:w300
キーパッドの仕組み

用意するキーパッド

ここでは、とても薄いキーパッドを使用します。

f:id:bear_9973:20201111205406j:plain:w300
キーパッド

他メーカーのキーパッドを購入するときは、 周辺回路にご留意してください。

インターフェース

キーパッドMicro:bitは、デジタル信号で入力/出力します。ここでは、Micro:bitの入力端子にプルアップ設定をしています。

MicropythonとMicro:bit

サンプルソフトを以下に説明します。

フロー

サンプルプログラムのフローを以下に示します。

  1. キーパットのボタン配置の定義
  2. 検出したキーデータを格納するバッファを設定
  3. キーパッドの接続ピンの初期化
  4. キースキャンの実行
  5. キースキャン結果の検証(チャタリング防止)
  6. キースキャン結果をLEDディスプレイに表示

接続

接続表と接続図(写真)を示します。

Micro:bit キーパッド
P0 Row1
P1 Row2
P2 Row3
P8 Row4
P12 Col1
P13 Col2
P14 Col3
P15 Col4

f:id:bear_9973:20201111210047p:plain:w400
構成図

コード

from microbit import *

# LEDディスプレイを初期化
display.clear()

rowNum = 4
colNum = 4

# キーパッドのボタン配置
keymap = [["1", "2", "3", "A"], ["4", "5", "6", "B"],
          ["7", "8", "9", "C"], ["*", "0", "#", "D"]]

# 検出したキーデータを格納するバッファ、2つ用意しチャタリングを防止
beforeKey = [[True for col_loop in range(4)] for row_loop in range(4)]
currentKey = [[True for col_loop in range(4)] for row_loop in range(4)]

# キーパッドに接続するピン
rowPin = (pin0, pin1, pin2, pin8)
colPin = (pin12, pin13, pin14, pin15)

# キーパッドの接続ピンの初期化
for pin_loop in range(0, 4, 1):
    rowPin[pin_loop].write_digital(1)
    colPin[pin_loop].set_pull(colPin[pin_loop].PULL_UP)

key_active = False

while True:
    for row_loop in range(0, 4, 1):
        rowPin[row_loop].write_digital(0)
        for col_loop in range(0, 4, 1):
            beforeKey[row_loop][col_loop] = currentKey[row_loop][col_loop]
            currentKey[row_loop][col_loop] = colPin[col_loop].read_digital()
        rowPin[row_loop].write_digital(1)

    for row_loop in range(0, 4, 1):
        for col_loop in range(0, 4, 1):
            if currentKey[row_loop][col_loop] != beforeKey[row_loop][col_loop]:
                if currentKey[row_loop][col_loop] == 0:
                    key_data = keymap[row_loop][col_loop]
                    key_active = True
                    break
        if key_active:
            break

    if key_active:
        print("get_key:%s" % key_data)
        display.show(key_data)
        key_active = False

    sleep(100)

結果

押したキーの数値または記号がLEDディスプレイに表示できました。以下は、5キーを押したときLEDディスプレイは5を表示しています。

f:id:bear_9973:20201111210123j:plain:w500
動作状況

他メーカーのキーパッドを購入するときは、 周辺回路にご留意してください。