ラズPicoでキーパッドを動かそう〜その3〜

2023年11月17日(金)は、5割ほどの出席率でした。

  • 18時00分~18時25分 タイピング練習
  • 18時25分~19時50分 キーパッドの製作とプログラミング
  • 19時50分~20時00分 あとかたづけ

タイピング練習

今回のタイピングの練習は、英語入力です。使う教材は、下のサイトのWebアプリです。

https://manabi.benesse.ne.jp/gakushu/typing/

メンバーがタイピングの様子を動画撮影させてくれました。その様子が下の動画です。

彼のタイピングスピードは、良い時で130字/分くらいです。今のクラブメンバーの中ではトップクラスです。

ただ、よく見ると改善点があります。さらに上を目指すには、その点を修正してしなければなりません。そうすれば、200字/分でタイピングすることも可能です。今後の努力とスピードアップに期待しています。

キーパッド製作〜その3〜

タイピング練習が終わったら、先週に引き続きキーパッドの製作です。予想していたとおり、今週は教科書通りに動かすことができたメンバーが現れました。

ちなみに、動作させることができたのは、最年少のメンバーです。彼の素晴らしいところを書く前に、今回キーパッドを動かすためのプログラムを載せます。出典はいつものとおり、『ラズパイPico完全ガイド』(日経BP社 福田和宏著)です。

from machine import Pin
import time

IN_PIN = [19, 20, 21, 22]
SEL_PIN = [16, 17, 18]

KEY_MAP =[[ '.','7','4','1'],
          [ '0','8','5','2'],
          [ '\n','9','6','3']]

sel_sw = []
in_sw = []

i = 0
while i < len(SEL_PIN):
    sel_sw.append(Pin(SEL_PIN[i], Pin.OUT))
    sel_sw[i].value(1)
    i += 1

i = 0
while i < len(IN_PIN):
    in_sw.append(Pin(IN_PIN[i], Pin.IN))
    i += 1

keybuf = []

def keypad():
    global keybuf
    fg_in = 0
    i = 0
    while i < len(SEL_PIN):
        sel_sw[i].value(0)
        j = 0
        while j < len(IN_PIN):
            if in_sw[j].value() == 0:
                keybuf.append(KEY_MAP[i][j])
                fg_in = 1
                while in_sw[j].value()==0:
                    time.sleep(0.05)
            j += 1
        sel_sw[i].value(1)
        i += 1
    return fg_in

def bufread():
    global keybuf
    buf = ''
    i = 0
    point = 0
    while i < len(keybuf):
        if keybuf[i] == '\n':
            break
        elif keybuf[i] == '.':
            point += 1
            if point >1:
                break
            else:
                buf += keybuf[i]
        else:
            buf += keybuf[i]
        i += 1
    
    keybuf = []
    return float(buf)

while True:
    f = keypad()
    if f==1:
        if keybuf.count('\n') >= 0:
            value = bufread()
            print(value)

途中冗長な表現や、インクリメントはわたし流の書き方に変えています。わたし流と言っても、特に変な書き方をしているわけではありません。一般的な書き方です。

70行ほどのプログラムですが、ていねいに入力すれば動作します。このサンプルプログラムを、福田氏は公式サイトでオープンにしているものの、わたしは必ず一度は書籍を見ながら手入力しています。

商業的な開発だとすでに動作確認しているプログラムの手入力は無意味かもしれません。しかし、学習途上であれば手入力は明らかにプログラミング言語習得の時間短縮につながります。わたしも、メンバーに「させる」以上、おなじ目線でプログラムに接するように取り組んでいます

さて、完成させたメンバーは、ただ黙々とコードを入力し続けただけです。何度かここでも書いているとおり、「写経」をしていました。すべての情報は書籍に書いてあるとおりで、そのとおりに淡々と写しただけです。

完成させたメンバーは、タイピング速度が特別に速いわけではありません。むしろ、始める時期が遅かった分、後ろから数えたほうが速いタイピングスピードです。ていねいに「写経」したら、一番になっていました

ラズPico(MicroPython)のデバッグは地道

コーディングが終わって、一度で正しく動くことはまれです。だいたい動作がおかしいか、そもそも動きません。この日も何人かはこの状況でした。

写経のときにしてしまうミスの主なものは、下記のとおりです。

  • 大文字小文字の間違い
  • スペルミス
  • インデントミス
  • 「:」(コロン)忘れ
  • 行を飛ばして入力していた などなど

入力時に気づけば良いものの、なかなか自分ではミスに気づかないものです。動かなければ、動くまでコードを見直すのがデバッグ作業です。

実は、プログラミングで一番時間がかかり、肉体的にも精神的にもつらいのがデバッグです。ただ、デバッグを避けるようではプログラミングは上達しません

プロであってもデバッグは嫌なもので、なんとか楽にデバッグを行うツールがいくつかあります。しかし、ラズPicoのMicroPythonをThonnyでコーディングする環境では、デバッグツールが存在しません。

わたしもデバッグはつらいので、デバッグツールがないか探してみました。しかし、一般向けにWebで情報公開されているものはないようです。残念です。しかたがないので、デバッグは昔ながらの手法に頼ることになります。

詳細のデバッグ手法の公開は、別の機会に譲ることにします。デバッグの考え方はかんたんです。

  • バグが含まれそうな部分を絞り込む
  • 一行ずつ見直していく

以上を、プログラムが期待通りに動くまで続けるだけです。

ね、つらいでしょ。でも、バグが解消し、期待通りにプログラムが動いたときの爽快感、達成感は何ものにもかえがたいものです。

そう考えると、プログラミングは「うさぎとかめ」の「かめ」さんにこそ、向いているのかもしれません。かくいうわたしも、学生時代にコピペを知らず、はからずも「写経」してしまったのが今に続くことを思えば、かめさんなのです。

次の目標は?

キーパッドが正しく動いたら、数字以外の文字が表示されるようにプログラムを改変してみます。

これができたら、この間までの小さなディスプレイ「SSD1306」に、キーパッドから文字や数字が入力できないか取り組みます。

そこまでできたら、SSD1306とキーパッドを使って、「モグラたたきゲーム」が作れそうです。