自力でLチカ7〜サイコロプログラム完成へ〜

2024年7月19日(金)は、7割ほどの出席率でした。サイコロプログラム完成が見えてきました。

  • 18時00分~18時20分 タイピング練習
  • 18時20分~18時35分 マウス練習
  • 18時35分~19時50分 サイコロプログラム
  • 19時50分~20時00分 あとかたづけ

タイピング練習とマウス練習

タイピングの練習は、「寿司打」、マウスの練習は「ソリティア」です。

つい一番記録の良いメンバーに目が行きがちですが、それ以外のメンバーの記録も徐々に伸びています。タイピングは、自転車に乗るのと同じで身体感覚です。身体で覚えてしまえば、なんの苦労もなく自然とタッチタイピングができるようになります。

話をそらしたのは、今回もわたしがメンバーにスコアで負けたからではないのです。

LED7つを使ったサイコロプログラムを改良する

前回までで、サイコロを表示するプログラムは完成しました。今回は、もっと実際のサイコロを転がすようなドキドキ・ワクワクをプログラムします。

自力でLチカ3〜7つのLED〜

2024年6月21日(金)は、7割ほどの出席率でした。前回に引き続き、RaspberryPi Pを使ってLチカをプログラミングします。 タイピング練習とマウス練習 タイピングの練習は…

自力でLチカ4〜7つのLED2〜

2024年6月28日(金)は、5割ほどの出席率でした。中学校のテストが近いようで、お休みが多い日でした。ということは、出席したメンバーはいつもより手厚いサポートが受け…

自力でLチカ5〜コードは短く読みやすく〜

2024年7月5日(金)は、5割ほどの出席率でした。今回も、お休みが多い日でした。先週につづき、手厚いサポートが受けられるサービスデーです。前回に引き続き、RaspberryP…

自力でLチカ6〜いよいよサイコロプログラム〜

2024年7月12日(金)は、6割ほどの出席率でした。今回はいよいよサイコロプログラム作成に挑戦します。 Contents1 タイピング練習とマウス練習2 LED7つを使ったサイコロプ…

完成したようすは、百聞は一見にしかずで下の動画をごらんください。タクトスイッチを押したら7つのLEDがランダムに点灯し、時間が経過するとサイコロの目に合わせてLEDが点灯します。

下の動画のように、白い紙を上にのせるとよりそれっぽくなります。

小さいブレッドボードの中に、LED7つと抵抗7つとタクトスイッチ1つをうまく配線しなければおさまりません。そこでわたしが配線したのをサンプルとして示しました。資料は下のとおりです。

実体配線図の効果は抜群でした。今回は配線で終わるかなと考えていたのですが、配線はおろかプログラムまで完成させたメンバーが半数でした。

コードはこちらです。タクトスイッチを押したあとにLEDがチラチラと光る処理を追加しました。

import random
from machine import Pin
import utime

#サイコロの目LED
pin_no = [13, 18, 14, 19, 17 ,15, 16]
leds = [Pin(pin_no[i], Pin.OUT) for i in range(7)]

#サイコロスタートスイッチ
start_btn = Pin(12, Pin.IN, Pin.PULL_UP)

#1~6の数字に対応した目を配列で指定する
POINT_NUM =[[0, 0, 0, 1, 0, 0, 0],
            [1, 0, 0, 0, 0, 0, 1],
            [1, 0, 0, 1, 0, 0, 1],
            [1, 1, 0, 0, 0, 1, 1],
            [1, 1, 0, 1, 0, 1, 1],
            [1, 1, 1, 0, 1, 1, 1]]

#プログラムで使う関数を定義(はじまり)///////////////////////////////////////////////////////
#サイコロの目をLEDで表示する関数
def blinkDice(num, pattern):
    for i in range(7):
        leds[i].value(0)
    for i in range(7):
        leds[i].value(pattern[num-1][i])

#ランダムにサイコロの目を表示する関数
def randomDice():
    random_list = [random.choice([0, 1]) for _ in range(7)]
    for i in range(7):
        leds[i].value(random_list[i])
    utime.sleep(0.1)
    
# ボタンが押された時の処理をする関数
def dice():
    # ランダムな整数を生成して、表示する
    num = random.randint(1,6)
    print('num:',num)
    blinkDice(num, POINT_NUM)
    
def startDice(p):
    for _ in range(20):
        randomDice()
    dice()
    
#プログラムで使う関数を定義(おわり)/////////////////////////////////////////////////////////

start_btn.irq(trigger = Pin.IRQ_FALLING, handler=startDice)

新しい要素として、「割り込み」を追加しています。ピン割り込みはマイコン独特のコーディングです。

そしてコードを見て気づいた方はいらっしゃるでしょうか。サイコロの目が確定するまでにLEDがチラチラするのは20回(約2秒)と規定しています。ところが動画をよく見ると、20回(約2秒)以上光っているところがあります。

おそらくタクトスイッチがチャタリングしているか、ノイズが載っているかだと考えています。マイコンプログラミングの面白いところは、現実にモノを動かしている点にあります。プログラムが正しくても、現物が正しく動くとは限りません。ここを追って改良していくのが面白いのです。

次回、コードの解説をしつつ、改良をしていきます。