Raspberry Pi PicoWでキーパッド使ってみた!

Raspberry Pi PicoWでキーパッド使ってみた!

はじめに

こんにちは!香月です。

電子工作について勉強したことをアウトプットとしてブログで情報発信しています!

勉強中なので、間違っていること等あります。
気づいた方は、公式ラインで教えていただけると幸いです。

今回は、ラズパイPICOで自作キーパッドを使っていきます!
今回使用したのは、4×4のキーパッドで入力値は各自カスタマイズできるようになっています!
改良後キット販売していきたいなと考えています!

それでは!今回使用するものの紹介です。

つかうもの

この記事で使っているものを紹介します。*このリンクは、アフィリエイトリンクです。こちらのリンクから購入されると、投稿主にインセンティブが発生します。より良い記事のために、ぜひ購入する際は以下のリンクよりお願いします…

自作キーボード!
まもなく発売予定です!

モジュールの解説

今回しようするのは、香月オリジナルキーパッドになります!
ジャンパー線8本で使用します。

ボタンの入力値はプログラムのほうで各自いじれるようになっています!

改良後販売予定です!
乞うご期待!!

回路

以下の画像、回路図を参考に回路を組んでみてください!
*市販のキーパッドの場合は、4,5,6,7に抵抗を挟んでつないでください。

回路ができたら、プログラムを書き込んでいきます!

プログラム

以下のプログラムをThonnyにコピペして書き込んでください。

import machine
import time

# キーパッドのキャラクター配置
characters = [['1', '2', '3', 'A'],
              ['4', '5', '6', 'B'],
              ['7', '8', '9', 'C'],
              ['*', '0', '#', 'D']]

# 行と列のピン設定
row0 = machine.Pin(6, machine.Pin.OUT)
row1 = machine.Pin(7, machine.Pin.OUT)
row2 = machine.Pin(8, machine.Pin.OUT)
row3 = machine.Pin(9, machine.Pin.OUT)

col0 = machine.Pin(2, machine.Pin.IN, machine.Pin.PULL_DOWN)
col1 = machine.Pin(3, machine.Pin.IN, machine.Pin.PULL_DOWN)
col2 = machine.Pin(4, machine.Pin.IN, machine.Pin.PULL_DOWN)
col3 = machine.Pin(5, machine.Pin.IN, machine.Pin.PULL_DOWN)

def readkey():
    key = []
    for i in range(4):
        # 各行をHIGHに設定
        locals()['row'+str(i)].high()
        for j in range(4):
            # キーが押されているかをチェック
            if (locals()['col'+str(j)].value() == 1):
                key.append(characters[i][j])
        # 行をLOWに戻す
        locals()['row'+str(i)].low()
    if key == []:
        return None
    else:
        return key

last_key = None

while True:
    # 現在のキーを取得
    current_key = readkey()
    
    # 前回と同じキーならば無視
    if current_key == last_key:
        continue
    
    # 最後に押されたキーを更新
    last_key = current_key
    
    # もしキーが押されていれば表示
    if current_key is not None:
        print(current_key)
    
    # 少し待つ
    time.sleep(0.1)

以下はプログラムの解説になります!

プログラムの解説

キーパッドの配列定義

characters = [['1', '2', '3', 'A'],
              ['4', '5', '6', 'B'],
              ['7', '8', '9', 'C'],
              ['*', '0', '#', 'D']]

charactersリストは、4×4のキーパッドの各ボタンに対応する文字を保持します。

ピンの設定

row0 = machine.Pin(6, machine.Pin.OUT)
row1 = machine.Pin(7, machine.Pin.OUT)
row2 = machine.Pin(8, machine.Pin.OUT)
row3 = machine.Pin(9, machine.Pin.OUT)

col0 = machine.Pin(2, machine.Pin.IN, machine.Pin.PULL_DOWN)
col1 = machine.Pin(3, machine.Pin.IN, machine.Pin.PULL_DOWN)
col2 = machine.Pin(4, machine.Pin.IN, machine.Pin.PULL_DOWN)
col3 = machine.Pin(5, machine.Pin.IN, machine.Pin.PULL_DOWN)

machine.Pinを使用して、各行と列のGPIOピンを設定します。行は出力モード (machine.Pin.OUT) で、列は入力モード (machine.Pin.IN) でプルダウン設定 (machine.Pin.PULL_DOWN) をしています。

readkey関数

def readkey():
    key = []
    for i in range(4):
        # 各行をHIGHに設定
        locals()['row'+str(i)].high()
        for j in range(4):
            # キーが押されているかをチェック
            if (locals()['col'+str(j)].value() == 1):
                key.append(characters[i][j])
        # 行をLOWに戻す
        locals()['row'+str(i)].low()
    if key == []:
        return None
    else:
        return key

last_key = None

この関数は、キーパッドからの入力を読み取ります。各行を順番にHIGHに設定し、その行に対応する列をチェックして、押されているキーを検出します。押されたキーがあれば、それに対応する文字を key リストに追加します。

メインループ

while True:
    # 現在のキーを取得
    current_key = readkey()
    
    # 前回と同じキーならば無視
    if current_key == last_key:
        continue
    
    # 最後に押されたキーを更新
    last_key = current_key
    
    # もしキーが押されていれば表示
    if current_key is not None:
        print(current_key)
    
    # 少し待つ

無限ループでキーの読み取りと処理を行います。readkey関数で現在のキーを取得し、直前のキーと比較して変更があれば、そのキーを表示します。また、一定時間 (time.sleep(0.1)) 待ってから再度キーを読み取ります。

それでは!実行していきます!

実行

書き込みを行うと、Thonnyにこのような画面になります!

それでは、1番左上を押してみると、、、

1が表示されました!
1行目を1つづつ押してみると、、

すべて表示されました!
1と2を同時に押してみると、、、

きちんと反応しました!
もう少しプログラムの改良の余地がありそうですね( ´∀` )

これで今回の内容は終わりです!

動かないとき

動かない場合は以下の項目を確認してみてください!
もし解決しない場合はお気軽に公式ラインに連絡ください!

回路の確認

ジャンパー線のつなぐ位置があっているか。
また、ジャンパー線の断線、ディスプレイが断線していないかを確認してください。

プログラム

プログラムがきちんと書き込みされているかを確認してください。
書き込みエラーが発生している場合は、エラーメッセージを参考に修正してください。

マイコンボードの設定やポートがあっているかを確認してください。

公式ラインに連絡

以上のことを確認しいても解決しない場合は、公式ラインに連絡ください。
自分も電子工作を勉強している身なので、すべてに対応できるわけではありません。
可能な範囲で対応させていただきます!

友だち追加

さいごに

今回は、ラズパイPICOでキーパッドを使ってみました!
どうだったでしょうか??

今回使用したキーパッドはキット販売予定です!
少々お待ちください!
今回のキーパッドは従来の製品のように抵抗を挟む必要もなく、扱いやすいものとなっています。

キーパッドを使って、ほかにもいろいろ作っていきたいなと思っています!

それでは!次回の記事でお会いしましょう!

Raspberry Pi Pico Wカテゴリの最新記事