自力でLチカ6〜いよいよサイコロプログラム〜
2024年7月12日(金)は、6割ほどの出席率でした。今回はいよいよサイコロプログラム作成に挑戦します。
- 18時00分~18時20分 タイピング練習
- 18時20分~18時35分 マウス練習
- 18時35分~19時50分 サイコロプログラム
- 19時50分~20時00分 あとかたづけ
Contents
タイピング練習とマウス練習
タイピングの練習は、「寿司打」、マウスの練習は「ソリティア」です。
- 寿司打
https://sushida.net - ソリティア(クロンダイク)
https://playingcards.jp/solitaire/klondike/
今回はメンバーの調子が良くなかったようで、記録は伸びず。
こんな日もあります。練習の成果は直線上に現れるのではなくて、上下しながら長期的に上昇していくものです。あせらず、正しい練習方法を続けることが力になるのです。
LED7つを使ったサイコロプログラム制作する
前回までで、サイコロを表示するプログラムの輪郭が見えてきました。今回は、サイコロプログラム制作に挑戦です。
前回、7つのLEDを光らせるプログラムを書きました。最終的に、冗長性を解消して読みやすく再利用しやすく書いたコードが下記です。
from machine import Pin
import utime
pin_no = [12, 13, 14, 15, 16, 17, 18]
leds = [Pin(pin_no[i], Pin.OUT) for i in range(7)]
blink_pattern =[[1, 0, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0]]
def blinkLED(pattern):
for i in range(len(pattern)):
for j in range(7):
leds[j].value(pattern[i][j])
utime.sleep(1)
while True :
blinkLED(blink_pattern)
このコードのハイライト部分で、つまづくメンバーがたくさんいました。utime.sleep(1)は、for i in range(len(pattern)):のループの中に入れる必要があります。インデント(字下げ)が一段なく、以下のように書いたらうまく動きません
def blinkLED(pattern):
for i in range(len(pattern)):
for j in range(7):
leds[j].value(pattern[i][j])
utime.sleep(1)
失敗したメンバーのLEDの光り方を見ると、ほんの一瞬だけLEDが光ります。Python(MicroPython)は、インデント(字下げ)が重要な意味を持ちます。軽んじることなく、インデントを入れてください。
プログラムだけでなく、電気回路も十分見直そう
そして、失敗例が多かったのは、配線ミスです。回路図で描くと以下のように極めてシンプルな回路です。
しかし、実体配線は下の写真のようになることもあります。
そこで多かったのが、LEDの極性を反対に接続していたミスです。LEDは点灯する極性(プラスマイナスの方向)が決められています。LEDをよく見ると足の長さが違います。LEDを正しく点灯させるには、足の長いほうをプラスにつなぎ、足の短い方をマイナス(GND)につなぎます。
この工作だけでなく、LEDの基本なのでおさえておきましょう。
サイコロプログラムに使える形に書き換える
サイコロプログラムは、以前スペシャルな先生用意してくれたサイコロプログラムを応用します。
コードは以下の通りです。
import random
from machine import Pin
import time
pin_no = [12, 13, 14, 15, 19 ,17, 18]
leds = [Pin(pin_no[i], Pin.OUT) for i in range(7)]
#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]]
#プログラムで使う関数を定義(はじまり)///////////////////////////////////////////////////////
def blinkLED(num, pattern):
for i in range(7):
leds[i].value(0)
for i in range(7):
leds[i].value(pattern[num-1][i])
# ボタンが押された時の処理をする関数
def dice():
# ランダムな整数を生成して、表示する
num = random.randint(1,6)
print('num:',num)
blinkLED(num, POINT_NUM)
#プログラムで使う関数を定義(おわり)/////////////////////////////////////////////////////////
while True :
dice()
time.sleep(2)
ここまでマジメに取り組んでいれば、難しいことはないコードです。ほぼすべてが2回目の登場です。
このサイコロプログラムを動かすと、2秒ごとにサイコロの目が変わるようにLEDが点灯します。
……おもしろくありませんよね。
次回、もっと射幸心をあおるプログラム・電子工作にしたいと思います。