2019.8.31

micro:bit で学ぶプログラミング～MicroPython プログラム集～
目次
１． プログラミングの基礎 ...................................................................................... 1
1.1 micro:bit の基本操作 ...............................................................................................1
1.2 プログラムの基礎（順次，繰り返し） ....................................................................1
1.3 プログラムの基礎（分岐） .......................................................................................1
演習問題 .............................................................................................................................2
２．プログラミングの応用（関数，配列） ......................................................................2
2.1 じゃんけんゲーム .....................................................................................................2
2.2 数あてゲーム ............................................................................................................3
2.3 グラフの作成 ............................................................................................................4
2.4 10 進数から 2 進数への変換 ......................................................................................4
演習問題 .............................................................................................................................5
３．センサによる計測・制御プログラム ..........................................................................5
3.1 micro:bit の各種センサと制御 ................................................................................5
3.2 音の制御 ....................................................................................................................5
3.3 傾きセンサを使った計測・制御 ...............................................................................6
3.4 地磁気センサを使った計測・制御 ............................................................................6
3.5 光センサを使った計測・制御 ...................................................................................7
演習問題 .............................................................................................................................7
４．無線通信を利用したプログラム .................................................................................7
4.1 無線通信の利用 .........................................................................................................7
4.2 無線通信を利用したじゃんけんゲーム ....................................................................7
4.3 信号機の制御 ............................................................................................................8
4.4 無線通信による信号機の制御 ...................................................................................8
演習問題 ........................................................................................................................... 10
５．アルゴリズムとプログラム ...................................................................................... 10
5.1 探索 ......................................................................................................................... 10
5.2 整列 ......................................................................................................................... 11
5.3 ハノイの塔 .............................................................................................................. 12
5.4 自動販売機の状態遷移図 ........................................................................................ 12
演習問題 ........................................................................................................................... 13６．通信とプログラム ..................................................................................................... 14
6.1 通信の基本 .............................................................................................................. 14
6.2 ネットワークにおけるアドレッシング .................................................................. 14
6.3 暗号通信 .................................................................................................................. 14
6.4 エラー検出 .............................................................................................................. 15演習問題 ........................................................................................................................... 16
７．総合問題 ................................................................................................................... 17
7.1 信号機（スクランブル交差点） ............................................................................. 17
7.2 じゃんけんゲーム（3 人対戦） .............................................................................. 18
7.3 ハノイの塔(複数台による表示) ............................................................................. 18
7.4 通信プログラム（不具合問題） ............................................................................. 192019.8.31【注意事項】
micor:bit 1),2) では，ブロックから JavaScript へ自動変換されますが，JavaScript の変数や関数の名称・順序は，自動変換されたプログラムと異なる場合があります。また，「micro:bit で学ぶプログラミング－ブロック型，JavaScript そして Python へ－」の教科書で記載しているファイル名，例えば，rei○○は，JavaScript のプログラム集では，実際に保存されているファイル名，microbit-rei○○.hex になっています。
一方，MicroPython のファイル名については，rei○○を hex ファイルにしたときに，
MicroPython のファイルであることを識別するために，少し長いですが，microbit-py-rei○○としています。したがって，hex ファイルは，microbit-py-rei○○.hex になります。
MicroPython への変換については，できるだけ，JavaScript のプログラムと互換性を持たせるようにしていますが，文法が異なることもあり，プログラムが異なっている個所があります。また，ボタン入力や無線通信の箇所では，実行環境により動作が不安定になることがあります。micro:bit や Python の特徴を生かしたプログラム記述 3)-5) もあると思いますが，読者の方々が，検討していただければ幸いです。
エディタについては，micro:bit にはブラウザ上でプログラムの開発が可能な Python の開発環境 6) も用意されていますが，参考 Web サイトで紹介されている「mu エディタ」 7) をダウンロードして，「BBC micro:bit」（MicroPython）編集用を利用すると便利です。
なお，プログラムのインデント(字下げ)は，自動インデントではスペース 4 つですが，紙面の都合でスペース 2 つにしています。長い 1 行のプログラムは，タブでスペースを空けていますので，注意してください。
参考文献，参考 Web サイト
1)

micro:bit の公式 Web サイト（日本語）：https://microbit.org/ja/
micro:bit の冒険を始めよう

2)

https://microbit.org/ja/guide/

ガレス・ハルファクリー著，金井哲夫訳：BBC マイクロビット公式ガイドブック，日経 BP社(2018.10)．

3)

BBC micro:bit MicroPython ドキュメンテーション
https://microbit-micropython.readthedocs.io/ja/latest/index.html

4)

チュートリアルhttps://microbitmicropython.readthedocs.io/ja/latest/tutorials/introduction.html

5)Simon Monk:Programming the BBC micro:bit: Getting Started with MicroPython，
McGraw-Hill Education(2017.11).

6)

Micro:bit-Python editor

7)

https://python.microbit.org/
mu エディタ（Code with Mu: a simple Python editor for beginner programmers.）
https://codewith.mu/

１． プログラミングの基礎(保存ファイル名：microbit-py-ren1-2)
from microbit import *1.1 micro:bit の基本操作
for x in range(0, 5):display.set_pixel(x, x, 9)【例題 1-1】(保存ファイル名：microbit-py-rei1-1-1)
from microbit import *【練習 1-3】(保存ファイル名：microbit-py-ren1-3-1)
from microbit import *Heart =
Image("09090:99999:99999:09990:00900")
display.show(Heart)for x in range(0, 5):display.set_pixel(x, x, 9)
for x in range(0, 5):display.set_pixel(x, 4-x, 9)(保存ファイル名：microbit-py-rei1-1-2)
ｆrom microbit import *Heart
Image("09090:99999:99999:09990:00900")
while True:
display.show(Heart)sleep(500)display.clear()sleep(500)(保存ファイル名：microbit-py-ren1-3-2)
from microbit import *=for x in range(0, 5):display.set_pixel(x, x, 9)
display.set_pixel(x, 4-x, 9)【例題 1-5】(保存ファイル名：microbit-py-rei1-5)
from microbit import *1.2 プログラムの基礎（順次，繰り返し）【例題 1-2】(保存ファイル名：microbit-py-rei1-2)
from microbit import *for x in range(0, 5):for y in range(0, 5):display.set_pixel(x, y, 9)
sleep(100)display.set_pixel(2, 0, 9)
display.set_pixel(2, 1, 9)
display.set_pixel(2, 2, 9)
display.set_pixel(2, 3, 9)
display.set_pixel(2, 4, 9)【例題 1-6】(保存ファイル名：microbit-py-rei1-6)
from microbit import *x=0
while x <= 4:display.set_pixel(x, 4-x, 9)
x += 1【例題 1-3】(保存ファイル名：microbit-py-rei1-3)
from microbit import *for y in range(0, 5):display.set_pixel(2, y, 9)

1.3 プログラムの基礎（分岐）【例題 1-7】(保存ファイル名：microbit-py-rei1-7)
from microbit import *import random【練習 1-1】(保存ファイル名：microbit-py-ren1-1)
from microbit import *while True:c = random.randint(0, 1)
display.scroll(str(c))
if c == 0:
display.show(Image.DIAMOND_SMALL)
else:
display.show(Image.SQUARE)
sleep(500)for x in range(0, 5):display.set_pixel(x, 2, 9)【例題 1-4】(保存ファイル名：microbit-py-rei1-4)
from microbit import *for x in range(0, 5):display.set_pixel(x, 4-x, 9)【例題 1-8】(保存ファイル名：microbit-py-rei1-8)【練習 1-2】
1

sleep(500)from microbit import *import random(3)(保存ファイル名：microbit-py-ens1-3)
from microbit import *import random

Scissors =Image("99009:99090:00900:99090:99009")
while True:c = random.randint(0, 2)
display.scroll(str(c))
if c == 0:
display.show(Image.DIAMOND_SMALL)
elif c == 1:
display.show(Scissors)else:
display.show(Image.SQUARE)
sleep(500)

Scissors =Image("99009:99090:00900:99090:99009")
while True:
if accelerometer.was_gesture("shake"):c = random.randint(0, 2)
display.scroll(str(c))
if c == 0:
display.show(Image.DIAMOND_SMALL)
elif c == 1:
display.show(Scissors)else:
display.show(Image.SQUARE)【練習 1-4】
プログラムなし

２．プログラミングの応用（関数，配列）

演習問題
(1)
(保存ファイル名：microbit-py-ens1-1)
from microbit import *2.1 じゃんけんゲーム【例題 2-1】(保存ファイル名：microbit-py-rei2-1)
from microbit import *import random

for x in range(0, 5):for y in range(0, 5):
if x == y:display.set_pixel(x, y, 9)
sleep(100)Scissors =Image("99009:99090:00900:99090:99009")(2)(a)(保存ファイル名：microbit-py-ens1-2-1)
from microbit import *def hyouji():
if c == 0:
display.show(Image.DIAMOND_SMALL)
elif c == 1:
display.show(Scissors)else:
display.show(Image.SQUARE)

for x in range(0, 5):for y in range(0, 5):
if 4-x <= y:display.set_pixel(x, y, 9)
sleep(500)

while True:
if button_a.is_pressed():a = random.randint(0, 2)
display.scroll(str(a))
c=ahyouji()
if button_b.is_pressed():b = random.randint(0, 2)
display.scroll(str(b))
c=bhyouji()(2)(b)(保存ファイル名：microbit-py-ens1-2-2)
from microbit import *for x in range(0, 5):for y in range(0, 5):
if x == y or 4 - x == y:display.set_pixel(x, y, 9)
sleep(500)(2)(c) (保存ファイル名：microbit-py-ens1-2-3)
from microbit import *【例題 2-2】(保存ファイル名：microbit-py-rei2-2)
from microbit import *import random

for x in range(0, 5):for y in range(0, 5):
if x == 2 or y == 2:
display.set_pixel(x, y, 9)

Scissors =2

if button_b.is_pressed():display.scroll(str(b))
c=bhyouji()sleep(1000)
if button_a.is_pressed() andbutton_b.is_pressed():d = (a - b + 3) % 3
if d == 2:
display.scroll('A'+'Kachi')elif d == 1:
display.scroll('B'+'Kachi')else:
display.scroll('Hikiwake')

Image("99009:99090:00900:99090:99009")
def hyouji():
if c == 0:
display.show(Image.DIAMOND_SMALL)
elif c == 1:
display.show(Scissors)else:
display.show(Image.SQUARE)
sleep(500)display.clear()while True:
if button_a.is_pressed():a = random.randint(0, 2)
display.scroll(str(a))
c=ahyouji(a)if button_b.is_pressed():b = random.randint(0, 2)
display.scroll(str(b))
c=bhyouji()sleep(1000)
if button_a.is_pressed() andbutton_b.is_pressed():d = (a - b + 3) % 3
if d == 2:
display.scroll('A')
elif d == 1:
display.scroll('B')
else:
display.scroll('AB')

2.2 数あてゲーム【例題 2-3】(保存ファイル名：microbit-py-rei2-3)
from microbit import *import randomkotae = random.randint(0, 2)
display.scroll(str(kotae))
while True:
if button_a.is_pressed():kouho = random.randint(0, 2)
display.scroll(str(kouho))
if button_b.is_pressed():if kotae == kouho:
display.show(Image.HEART)
else:
display.show(Image.NO)【練習 2-1】(保存ファイル名：microbit-py-ren2-1)
from microbit import *import random【例題 2-4】(保存ファイル名：microbit-py-rei2-4)
from microbit import *import random

Scissors =Image("99009:99090:00900:99090:99009")

def hantei():
if kouho > kotae:
display.show(Image.ARROW_S)
sleep(1000)
display.clear()
elif kouho < kotae:
display.show(Image.ARROW_N)
sleep(1000)
display.clear()else:
display.scroll(str(kouho))
display.clear()display.scroll('Hit')

def hyouji():
if c == 0:
display.show(Image.DIAMOND_SMALL)
elif c == 1:
display.show(Scissors)else:
display.show(Image.SQUARE)
sleep(500)display.clear()while True:
if button_a.is_pressed():a = random.randint(0, 2)
display.scroll(str(a))
c=ahyouji()kotae = random.randint(0, 4)
display.scroll(str(kotae))kouho = random.randint(0, 4)
display.scroll(str(kouho))3【関数の引数と戻り値（コラム）】(保存ファイル名：microbit-py-c23-kansu)
from microbit import *hantei()while True:
if button_a.is_pressed():kouho += 1
hantei()
if button_b.is_pressed():kouho -= 1
hantei()def sum(a, b):s = a+b
return s
c = sum(3, 5)
display.scroll("3+5=")
display.scroll(str(c))

【練習 2-2】(保存ファイル名：microbit-py-ren2-2)from microbit import *import random【練習 2-3】(保存ファイル名：microbit-py-ren2-3)
from microbit import *def hantei():
if kouho > kotae:
display.show(Image.ARROW_S)
sleep(1000)
display.clear()
elif kouho < kotae:
display.show(Image.ARROW_N)
sleep(1000)
display.clear()else:
display.scroll(str(kouho))
display.clear()display.scroll("Hit")a = [0] * 5a[0] = 3a[1] = 2a[2] = 1a[3] = 5a[4] = 4

kotae = random.randint(0, 4)
display.scroll(str(kotae))kouho = random.randint(0, 4)
if (kouho == kotae):kouho = random.randint(0, 4)
display.scroll(str(kouho))hantei()【練習 2-4】(保存ファイル名：microbit-py-ren2-4)
from microbit import *for i in range(0, 5):display.scroll(str(a[i]))display.clear()for y in range(0, 5):
for x in range(a[y]):display.set_pixel(x, y, 9)a = [1, 2]
b = ["AB", "CD"]for i in range(0, 2):display.scroll(str(a[i]))for j in range(0, 2):display.scroll(str(b[j]))while True:
if button_a.is_pressed():kouho += 1
hantei()
if button_b.is_pressed():kouho -= 1
hantei()【例題 2-6】(保存ファイル名：microbit-py-rei2-6)
from microbit import *a = [3, 2, 1, 5, 4]
for i in range(0, 5):display.scroll(str(a[i]))display.clear()

2.3 グラフの作成【例題 2-5】(保存ファイル名：microbit-py-rei2-5)
from microbit import *for x in range(0, 5):
for z in range(a[x]):y=4-zdisplay.set_pixel(x, y, 9)
sleep(500)a = [3, 2, 1, 5, 4]
for i in range(0, 5):display.scroll(str（a[i]）)for y in range(0, 5):
for x in range(a[y]):display.set_pixel(x, y, 9)

2.4 10 進数から 2 進数への変換【例題 2-7】4

a = [3, 2, 1, 5, 4](保存ファイル名：microbit-py-rei2-7)
from microbit import *import mathdef plot(g):if g == 0:
for y in range(0, 5):
for x in range(a[y]):display.set_pixel(x, y, 9)
sleep(500)else:
for x in range(0, 5):
for z in range(a[x])y=4-zdisplay.set_pixel(x, y, 9)
sleep(500)xp = [0, 0, 0, 0, 0]
def DtoB(k):for j in range(5, 0, -1):
xp[j-1] = k % 2
k = math.floor(k / 2)
Plot()
def Plot():
for i in range(5, 0, -1):
if(xp[i-1] == 1):
x = i-1
for y in range(0, 5):display.set_pixel(x, y, 9)
sleep(1000)
display.clear()for i in range(0, 5):display.scroll(str(a[i]))plot(0)display.clear()plot(1)for k in range(32):
DtoB(k)３．センサによる計測・制御プログラム

演習問題
(1)
(保存ファイル名：microbit-py-ens2-1)
from microbit import *3.1

micro:bit の各種センサと制御【例題 3-1】(保存ファイル名：microbit-py-rei3-1)
from microbit import *a = [3, 2, 1, 5, 4]
def Graph_H():
for y in range(0, 5):
for x in range(a[y]):display.set_pixel(x, y, 9)
sleep(500)

while True:
display.scroll(display.read_light_level())
display.clear()sleep(1000)【練習 3-1】(保存ファイル名：microbit-py-ren3-1)
from microbit import *def Graph_V():for x in range(0, 5):
for z in range(a[x]):y=4-zdisplay.set_pixel(x, y, 9)
sleep(500)

while True:
display.scroll(temperature())# display.scroll(accelerometer.get_x())# display.scroll(compass.heading())
display.clear()sleep(1000)

def plot():
Graph_H()
display.clear()
Graph_V()

3.2

for i in range(0, 5):display.scroll(str(a[i]))display.clear()plot()

音の制御【例題 3-2】(保存ファイル名：microbit-py-rei3-2)
from microbit import *import music(2)(保存ファイル名：microbit-py-ens2-2)
from microbit import *while True:music.play("C4")music.play("D4")
5

music.pitch(262, 500)
elif reading > 10:music.pitch(294, 500)
else:music.pitch(0, 10)music.play("E4")music.play("R")
【練習 3-2】(保存ファイル名：microbit-py-ren3-2)
from microbit import *import music【練習 3-5】(保存ファイル名：microbit-py-ren3-5)
from microbit import *import musicfreq = 262
while True:music.pitch(freq, 1000)
music.pitch(freq*2, 1000)
music.pitch(freq*4, 1000)

while True:
x = accelerometer.get_x()x = x/5x = x+262
x = int(x)music.pitch(x, 500)

【練習 3-3】(保存ファイル名：microbit-py-ren3-3)from microbit import *import music

3.4

freq = 262

地磁気センサを使った計測・制御【例題 3-5】(保存ファイル名：microbit-py-rei3-5)
from microbit import *while True:music.pitch(freq, 1000)
music.pitch(freq*2, 1000)
music.pitch(freq*3, 1000)

compass.calibrate()
while True:
value = compass.heading()
if value < 45:display.show("N")
elif value > 315:
display.show("N")
else:display.show(" ")【例題 3-3】(保存ファイル名：microbit-py-rei3-3)
from microbit import *import music
while True:
if button_a.is_pressed():music.play(music.POWER_UP)【例題 3-6】(保存ファイル名：microbit-py-rei3-6)
from microbit import *【練習 3-4】(保存ファイル名：microbit-py-ren3-4)
from microbit import *import musiccompass.calibrate()

while True:
if button_a.was_pressed():music.play(music.DADADADUM)
elif button_b.was_pressed():music.play(music.ENTERTAINER)【例題 3-4】(保存ファイル名：microbit-py-rei3-4)
from microbit import *import music

while True:
value = compass.heading()
if value < 45:display.show(Image.ARROW_N)
elif value < 135:
display.show(Image.ARROW_W)
elif value < 225:
display.show(Image.ARROW_S)
elif value < 315:
display.show(Image.ARROW_E)
else:
display.show(Image.ARROW_N)

while True:
reading = accelerometer.get_x()/20
if reading < -10:

【練習 3-6】(保存ファイル名：microbit-py-ren3-6)
from microbit import *3.3

傾きセンサを使った計測・制御

6

display.show(" ")display.set_pixel(x, y, 9)
sleep(300)compass.calibrate()
while True:
value = compass.heading()
if value < 23:
display.show(Image.ARROW_N)
elif value < 68:
display.show(Image.ARROW_NW)
elif value < 113:
display.show(Image.ARROW_W)
elif value < 158:
display.show(Image.ARROW_SW)
elif value < 203:
display.show(Image.ARROW_S)
elif value < 248:
display.show(Image.ARROW_SE)
elif value < 293:
display.show(Image.ARROW_E)
elif value < 338:
display.show(Image.ARROW_NE)
else:
display.show(Image.ARROW_N)（2）(保存ファイル名：microbit-py-ens3-2)
from microbit import *s=0while True:
if button_a.was_pressed():
if s == 0:
s=1
else:
s=0
if s == 0:
display.show(" ")else:display.show(Image("99999:99999:99999:99999:99999"))

４．無線通信を利用したプログラム
3.5

光センサを使った計測・制御
4.1 無線通信の利用【例題 3-7】(保存ファイル名：microbit-py-rei3-7)
from microbit import *【例題 4-1】(保存ファイル名：microbit-py-rei4-1)
from microbit import *import radio

while True:
if display.read_light_level() < 10:
pin0.write_digital(1)else:
pin0.write_digital(0)radio.config(group=1)
radio.on()
while True:
if button_a.was_pressed():radio.send('hello')
sa = radio.receive()
if sa != None:
display.scroll(sa)

演習問題
（1）
(保存ファイル名：microbit-py-ens3-1)
from microbit import *4.2 無線通信を利用したじゃんけんゲーム

def calc(value):ans = value/100
ans = int(ans)ans = ans+2
if ans > 4:
ans = 4elif ans < 0:ans = 0
return ans【例題 4-2】(保存ファイル名：microbit-py-rei4-2)
from microbit import *import radio
import random
radio.config(group=1)
radio.on()

while True:
value = accelerometer.get_x()x = calc(value)
value = accelerometer.get_y()y = calc(value)

while True:
if button_a.was_pressed():a = random.randint(0, 2)
display.scroll(str(a))
radio.send(str(a))
7sb = radio.receive()
if sb != None:
sleep(1000)
if button_b.was_pressed():
if str(a) == sb:
display.show(Image.HEART)
else:
display.show(Image.NO)【練習 4-3】
プログラムなし
radio.config(group=1)を変更して実施する。
4.3

信号機の制御【例題 4-4】(保存ファイル名：microbit-py-rei4-4)
from microbit import *【例題 4-3】(保存ファイル名：microbit-py-rei4-3)
from microbit import *import radio
import random

while True:
pin2.write_digital(1)sleep(4000)
pin2.write_digital(0)pin1.write_digital(1)sleep(1000)
pin1.write_digital(0)pin0.write_digital(1)sleep(5000)
pin0.write_digital(0)radio.config(group=1)
radio.on()
Scissors =Image("99009:99090:00900:99090:99009")
def hyouji():
if c == 0:
display.show(Image.DIAMOND_SMALL)
elif c == 1:
display.show(Scissors)else:
display.show(Image.SQUARE)
sleep(100)【練習 4-2】(保存ファイル名：microbit-py-ren4-2-1)
from microbit import *while True:
pin2.write_digital(1)sleep(4000)
pin2.write_digital(0)pin1.write_digital(1)sleep(1000)
pin1.write_digital(0)pin0.write_digital(1)sleep(5000)
pin0.write_digital(0)

d=0
a=0
c=0
sb = ""
while True:
if button_a.was_pressed():a = random.randint(0, 2)
c=ahyouji()
if button_b.was_pressed():radio.send(str(a))
sb = radio.receive()
if sb != None:d = (a - int(sb) + 3) % 3
if d == 2:
display.show(Image.HAPPY)
elif d == 1:
display.show(Image.SAD)
else:
display.show(Image.CONFUSED)
sleep(500)(保存ファイル名：microbit-py-ren4-2-2)
from microbit import *while True:
pin0.write_digital(1)sleep(5000)
pin0.write_digital(0)pin2.write_digital(1)sleep(4000)
pin2.write_digital(0)pin1.write_digital(1)sleep(1000)
pin1.write_digital(0)4.4(保存ファイル名：microbit-py-rei4-3-1)関数を def hyouji(c): にした場合
c = 0 を削除
c = a を削除
hyouji() を hyouji(a) に変更

無線通信による信号機の制御【例題 4-5】(保存ファイル名：microbit-py-rei4-5)
from microbit import *import radio8elif mes == "0":pin0.write_digital(1)pin1.write_digital(0)pin2.write_digital(0)radio.config(group=1)
radio.on()
while True:
pin2.write_digital(1)radio.send("2")
sleep(4000)
pin2.write_digital(0)pin1.write_digital(1)radio.send("1")
sleep(1000)
pin1.write_digital(0)pin0.write_digital(1)radio.send("0")
sleep(5000)
pin0.write_digital(0)【練習 4-3】
プログラムなし【練習 4-4】(保存ファイル名：microbit-py-ren4-4-1)
from microbit import *import radio
radio.config(group=1)
radio.on()
while True:
pin2.write_digital(1)radio.send("1")
sleep(4000)
pin2.write_digital(0)pin1.write_digital(1)radio.send("2")
sleep(1000)
pin1.write_digital(0)pin0.write_digital(1)radio.send("3")
sleep(4000)
radio.send("4")
sleep(1000)
pin0.write_digital(0)(保存ファイル名：microbit-py-rei4-5-2)(数値による送信)from microbit import *import radio
radio.config(group=1)
radio.on()
while True:
pin2.write_digital(1)radio.send_bytes(2)sleep(4000)
pin2.write_digital(0)pin1.write_digital(1)radio.send_bytes(1)sleep(1000)
pin1.write_digital(0)pin0.write_digital(1)radio.send_bytes(0)sleep(5000)
pin0.write_digital(0)(保存ファイル名：microbit-py-ren4-4-2)
from microbit import *import radio
radio.config(group=1)
radio.on()
while True:
msg = radio.receive()
if msg == "1":
pin0.write_digital(1)pin1.write_digital(0)pin2.write_digital(0)elif msg == "2":pin0.write_digital(1)pin1.write_digital(0)pin2.write_digital(0)elif msg == "3":pin0.write_digital(0)pin1.write_digital(0)pin2.write_digital(1)elif msg == "4":pin0.write_digital(0)pin1.write_digital(1)pin2.write_digital(0)【例題 4-6】(保存ファイル名：microbit-py-rei4-6)
from microbit import *import radio
radio.config(group=1)
radio.on()
while True:
mes = radio.receive()
if mes == "2":pin0.write_digital(0)pin1.write_digital(0)pin2.write_digital(1)elif mes == "1":
pin0.write_digital(0)pin1.write_digital(1)pin2.write_digital(0)9【例題 4-7】(保存ファイル名：microbit-py-rei4-7-1)（車道用）
from microbit import *import radio

５．アルゴリズムとプログラム
5.1 探索【例題 5-1】(保存ファイル名：microbit-py-rei5-1)
from microbit import *import random

radio.config(group=1)
radio.on()
pin2.write_digital(1)pin1.write_digital(0)pin0.write_digital(0)a = [6, 4, 2, 3, 7, 1, 5]
b=0

while True:
msg = radio.receive()
if msg == "1":sleep(2000)
pin2.write_digital(0)pin1.write_digital(1)pin0.write_digital(0)sleep(2000)
pin2.write_digital(0)pin1.write_digital(0)pin0.write_digital(1)radio.send("1")
sleep(4000)
radio.send("0")
pin2.write_digital(1)pin1.write_digital(0)pin0.write_digital(0)while True:
if button_a.is_pressed():b = random.randint(1, 7)
display.scroll(str(b))
sleep(1000)
for i in range(len(a)):
if b == a[i]:display.show(Image.HEART)
display.scroll(i+1)
display.scroll(" BanMe!")break【練習 5-1】(保存ファイル名：microbit-py-ren5-1)
from microbit import *a = [6, 4, 2, 3, 7, 1, 5]
b=0(保存ファイル名：microbit-py-rei4-7-2)（歩行者用）
from microbit import *import radio

while True:
if button_a.was_pressed():b = (b + 1) % 10
display.scroll(str(b))
if button_b.is_pressed():sh = -1
for i in range(len(a)):
if a[i] == b:
sh = ibreak
if sh >= 0:
display.show(Image.HEART)
display.scroll(sh+1)
display.scroll(" BanMe!")
else:
display.show(Image.NO)

radio.config(group=1)
radio.on()
pin2.write_digital(0)pin1.write_digital(0)pin0.write_digital(1)while True:
if button_a.was_pressed():radio.send("1")
msg=radio.receive()
if msg =="1":
pin2.write_digital(1)pin1.write_digital(0)pin0.write_digital(0)elif msg =="0":pin2.write_digital(0)pin1.write_digital(0)pin0.write_digital(1)【例題 5-2】(保存ファイル名：microbit-py-rei5-2)
from microbit import *import random

演習問題

a = ["red", "green", "blue", "cyan", "magenta","yellow", "white"]

プログラムなし10j=6
b = a[random.randint(0, 6)]
display.scroll(b)sleep(500)
while i <= j:m = int((i+j)/2)
if a[m] > b:
display.show(Image.ARROW_W)
sleep(500)j=m–1elif a[m] < b:display.show(Image.ARROW_E)
sleep(500)
i=m+1
else:
display.show(Image.HEART)
break
display.clear()sleep(500)

while True:
if button_a.is_pressed():c = a[random.randint(0, 6)]
display.scroll(c)for i in range(len(a)):
if a[i] == c:display.show(Image.HEART)
sleep(500)display.scroll(c)sleep(100)display.scroll(str(i+1))
sleep(500)display.scroll(" BanMe!")【例題 5-3】(保存ファイル名：microbit-py-rei5-3)
from microbit import *import randoma = [1, 2, 3, 4, 5, 6, 7]

5.2 整列while True:
if button_a.is_pressed():b = a[random.randint(0, 6)]
display.scroll(str(b))
sleep(500)i=0
j=6while i <= j:m = int((i+j)/2)
if a[m] > b:
display.show(Image.ARROW_W)
sleep(500)j=m-1
elif a[m] < b:display.show(Image.ARROW_E)
sleep(500)
i=m+1
else:
display.show(Image.HEART)
break
display.clear()sleep(500)【例題 5-5】(保存ファイル名：microbit-py-rei5-5)
from microbit import *a = [3, 2, 1, 5, 4]
for i in range(4, 0, -1):
for j in range(i):if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]for i in range(len(a)):
display.scroll(str(a[i]))sleep(1000)【練習 5-3】(保存ファイル名：microbit-py-ren5-3)
from microbit import *a = [3, 2, 1, 5, 4]
def plot():for x in range(5):for z in range(a[x]):y=4-zdisplay.set_pixel(x, y, 9)
sleep(100)【練習 5-2】
プログラムなし【例題 5-4】(保存ファイル名：microbit-py-rei5-4)
from microbit import *import randoma = ["blue", "cyan", "green", "magenta", "red","white", "yellow"]

for i in range(4, 0, -1):
for j in range(i):if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]plot()

while True:
if button_a.is_pressed():i=0【練習 5-4】(保存ファイル名：microbit-py-ren5-4)
from microbit import *11

if n != 0:
return n * fact(n - 1)
return 1

a = ["gr", "ye", "bl", "re"]for i in range(3, 0, -1):
for j in range(i):if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]for i in range(len(a)):
display.scroll(str(a[i]))c = fact(5)display.scroll(str(c))
【練習 5-6】
プログラムなし

5.3 ハノイの塔

5.4 自動販売機の状態遷移図【例題 5-6】(保存ファイル名：microbit-py-rei5-6)
from microbit import *【例題 5-7】(保存ファイル名：microbit-py-rei5-7)
from microbit import *def hanoi(n, a, b):
if n > 1:
hanoi(n-1, a, 6-a-b)
display.show(Image.HEART)
sleep(1000)
display.scroll(str(n))
sleep(1000)
display.scroll(chr(ord('@')+a))sleep(1000)
display.show(Image.ARROW_S)
sleep(1000)
display.scroll(chr(ord('@')+b))
sleep(1000)
display.clear()sleep(1000)
if n > 1:
hanoi(n-1, 6-a-b, b)s=0
s0 = 0s1 = 1
def syohin():display.show(Image.TARGET)
sleep(1000)
while True:
if button_a.was_pressed():
if s == s0:
s = s1elif s == s1:
syohin()s = s0display.clear()else:
display.show(Image.NO)
display.scroll(str(s))
sleep(500)display.clear()while True:
if button_a.was_pressed():n=1
display.scroll(str(n))
sleep(1000)
display.scroll("Mai")
hanoi(n, 1, 3)
display.scroll("End")if button_b.was_pressed():n=n+1
display.scroll(str(n))
sleep(1000)
display.scroll("Mai")
hanoi(n, 1, 3)
display.scroll("End")【例題 5-8】(保存ファイル名：microbit-py-rei5-8)
from microbit import *s=0
s0 = 0s1 = 1s2 = 2
def syohin():display.show(Image.TARGET)
sleep(1000)【練習 5-5】
プログラムなし

def otsuri():display.show(Image.DIAMOND_SMALL)
sleep(1000)【再帰呼び出し（コラム）】(保存ファイル名：microbit-py-c23-fact)from microbit import *while True:
if button_a.was_pressed():
if s == s0:

def fact(n):12sleep(1000)s = s2elif s == s1:
syohin()s = s0display.clear()
elif s == s2:
syohin()otsuri()s = s0display.clear()else:
display.show(Image.NO)
display.scroll(str(s))
sleep(500)display.clear()
if button_b.was_pressed():
if s == s0:
s = s1elif s == s1:
s = s2elif s == s2:
syohin()s = s0display.clear()else:
display.show(Image.NO)
display.scroll(str(s))
sleep(500)display.clear()while True:
if button_a.was_pressed():
if s == s0:
s = s1elif s == s1:
s = s2elif s == s2:
syohin()s = s0display.clear()else:
display.show(Image.NO)
display.scroll(str(s))
sleep(500)display.clear()(2)(b)(保存ファイル名：microbit-py-ens5-2-2)
from microbit import *s=0
s0 = 0s1 = 1s2 = 2s3 = 3s4 = 4def syohin():display.show(Image.TARGET)
sleep(1000)

演習問題
(1)
(保存ファイル名：microbit-py-ens5-1)
from microbit import *def otsuri():display.show(Image.DIAMOND_SMALL)
sleep(1000)

a = [3, 2, 1, 5, 4]
while True:
if button_a.was_pressed():
if s >= s0 and s <= s2:
s += 2elif s == s3:
syohin()s = s0display.clear()
elif s == s4:
syohin()otsuri()s = s0display.clear()else:
display.show(Image.NO)
display.scroll(str(s))
sleep(500)display.clear()
if button_b.was_pressed():
if s >= s0 and s <= s3:
s += 1for i in range(4, 0, -1):
k=0
for j in range(1, i+1, 1):
if a[j] > a[k]:k=ja[i], a[k] = a[k], a[i]for i in range(0, 5):display.scroll(str(a[i]))(2)(a)(保存ファイル名：microbit-py-ens5-2-1)
from microbit import *s=0
s0 = 0s1 = 1s2 = 2
def syohin():display.show(Image.TARGET)
13

radio.on()
a=0
youraddress = "2"
myaddress = "1"
yad = 0elif s == s4:
s = s0syohin()display.clear()else:
display.show(Image.NO)
display.scroll(str(s))
sleep(500)display.clear()while True:
if button_a.was_pressed():yad = (yad + 1) % 9
youraddress = chr(48 + yad)display.scroll(youraddress)
if button_b.was_pressed():message = youraddress + myaddress +"hello"radio.send(message)b = radio.receive()
if b != None:
if myaddress == b[0]:display.scroll(b[2:])６．通信とプログラム
6.1 通信の基本【例題 6-1】(保存ファイル名：microbit-py-rei6-1)
from microbit import *import radio【練習 6-2】(保存ファイル名：microbit-py-ren6-2)
from microbit import *import radio

radio.config(group=1)
radio.on()
while True:
if button_b.was_pressed():radio.send("hello")a = radio.receive()
if a != None:
display.scroll(a)radio.config(group=1)
radio.on()
a=0
youraddress = "6"
myaddress = "5"yad = 0

【練習 6-1】(保存ファイル名：microbit-py-ren6-1)
from microbit import *import radio

while True:
if button_a.was_pressed():yad = (yad + 1) % 10
youraddress = chr(48 + yad)display.scroll(youraddress)
if button_b.was_pressed():message = youraddress + myaddress +"Hello"radio.send(message)b = radio.receive()
if b != None:
if myaddress == b[0] or "9" == b[0]:display.scroll(b[2:])radio.config(group=1)
radio.on()
a=0
while True:
if button_b.was_pressed():if a == 0:
radio.send("hello")
a=1
else:
radio.send("world")b = radio.receive()
if b != None:
display.scroll(b)6.3 暗号通信【例題 6-3】(保存ファイル名：microbit-py-rei6-3)
from microbit import *import radio

6.2 ネットワークにおけるアドレッシング【例題 6-2】(保存ファイル名：microbit-py-rei6-2)
from microbit import *import radio

radio.config(group=1)
radio.on()
shift = 5
while True:radio.config(group=1)
14

"00900:""09090:""00000")

if button_a.was_pressed():msg = "dream"
msg2 = ""for i in range(len(msg)):
msg2 += chr(ord(msg[i])+shift)radio.send(msg2)
b = radio.receive()
if b != None:
display.scroll(b)display.show(Image.HEART)
sleep(1000)
msg3 = ""for i in range(len(msg)):
msg3 += chr(ord(b[i])-shift)display.scroll(msg3)

def set_data():data = 0
for i in range(4):data = data + random.randint(0, 1)
data = data << 1
return data
def set_parity(n):c=0m=nfor i in range(5):if m % 2 == 1:
c=c+1m = m >> 1
if c % 2 != 0:
n=n+1
return n【練習 6-3】
プログラムなし【例題 6-4】(保存ファイル名：microbit-py-rei6-4)
from microbit import *import radio

def check_parity(n):m=nd=0for i in range(5):if m % 2 == 1:
d=d+1m = m >> 1
if d % 2 == 0:
return True
else:
return False

radio.config(group=1)
radio.on()
A = 17
N = 55E=3
D=7
while True:
if button_a.was_pressed():x = A ** E % N
radio.send(str(x))
b = radio.receive()
if b != None:y = int(b) ** D % N
display.scroll(str(y))

def Rev(x, c):a=1
a = a << (c - 1)
if a & x == 0:
return a | x
else:
return (a ^ 31) & x

6.4 エラー検出
def Plotx(k, n):for i in range(4, -1, -1):
if n % 2 == 1:
display.set_pixel(i, k, 9)n = n >> 1

【例題 6-5】(保存ファイル名：microbit-py-rei6-5)
from microbit import *import random
import radio

while True:
if button_a.was_pressed():display.clear()data2 = set_data()
x = set_parity(data2)
Plotx(0, x)
radio.send(str(x))
if button_b.was_pressed():display.clear()data3 = set_data()

radio.config(group=1)
radio.on()
data2 = 0
data3 = 0
display.clear()
NO_SMALL = Image("00000:""09090:"15

from microbit import *import random
import radioy = set_parity(data3)
y = Rev(y, random.randint(1, 4))
Plotx(0, y)radio.send(str(y))
b = radio.receive()
if b != None:n = int(b)if n >= 0:
if check_parity(n):display.clear()display.show(Image.DIAMOND_SMALL)
Plotx(4, n)
sleep(1000)
radio.send(str(-1))
else:
display.show(NO_SMALL)
Plotx(4, n)
sleep(1000)
radio.send(str(-100))
elif n < -1:
display.clear()z = set_parity(data3)
Plotx(0, z)
sleep(1000)
radio.send(str(z))

radio.config(group=1)
radio.on()
data2 = 0
data3 = 0
display.clear()
NO_SMALL = Image("00000:""09090:""00900:""09090:""00000")def set_data():data = 0
for i in range(4):data = data + random.randint(0, 1)
data = data << 1
return data
def set_parity(n):c=0m=nfor i in range(5):if m % 2 == 1:
c=c+1m = m >> 1
if c % 2 == 0:
n=n+1
return n

演習問題(1)(保存ファイル名：microbit-py-ens6-1)
from microbit import *import radio
radio.config(group=1)
radio.on()
wait_for_ack = 0

def check_parity(n):m=nd=0for i in range(5):if m % 2 == 1:
d=d+1m = m >> 1
if d % 2 != 0:
return True
else:
return False

while True:
if button_b.was_pressed():
wait_for_ack = 1
sstring = "hello"
radio.send(sstring)b = radio.receive()
if b != None:
if wait_for_ack == 0:
display.scroll(b)sstring = "world"
radio.send(sstring)else:
wait_for_ack = 0
display.scroll(b)def Rev(x, c):a=1
a = a << (c - 1)
if a & x == 0:
return a | x
else:
return (a ^ 31) & x(2)
プログラムなし

def Plotx(k, n):for i in range(4, -1, -1):
if n % 2 == 1:(3)(保存ファイル名：microbit-py-ens6-3)
16

display.set_pixel(i, k, 9)n = n >> 1

pin2.write_digital(0)pin1.write_digital(1)radio.send("2")
sleep(1000)
pin1.write_digital(0)pin0.write_digital(1)radio.send("3")
sleep(4000)
radio.send("4")
sleep(1000)
radio.send("5")
sleep(3000)
radio.send("6")
sleep(1000)
radio.send("7")
sleep(1000)
pin0.write_digital(0)while True:
if button_a.was_pressed():display.clear()data2 = set_data()
x = set_parity(data2)
Plotx(0, x)
radio.send(str(x))
if button_b.was_pressed():display.clear()data3 = set_data()y = set_parity(data3)
y = Rev(y, random.randint(1, 4))
Plotx(0, y)radio.send(str(y))
b = radio.receive()
if b != None:n = int(b)if n >= 0:
if check_parity(n):display.clear()display.show(Image.DIAMOND_SMALL)
Plotx(4, n)
sleep(1000)
radio.send(str(-1))
else:
display.show(NO_SMALL)
Plotx(4, n)
sleep(1000)
radio.send(str(-100))
elif n < -1:
display.clear()z = set_parity(data3)
Plotx(0, z)
sleep(1000)
radio.send(str(z))(保存ファイル名：microbit-py-hat7-1-2)（受信用）
from microbit import *import radio
radio.config(group=1)
radio.on()
while True:
msg = radio.receive()
if msg == "1":
pin0.write_digital(1)pin1.write_digital(0)pin2.write_digital(0)elif msg == "3":pin0.write_digital(0)pin1.write_digital(0)pin2.write_digital(1)elif msg == "4":pin0.write_digital(0)pin1.write_digital(1)pin2.write_digital(0)elif msg == "5":pin0.write_digital(1)pin1.write_digital(0)pin2.write_digital(0)７．総合問題7.1

信号機（スクランブル交差点）(保存ファイル名：microbit-py-hat7-1-3)（歩行者用）
from microbit import *import radio(保存ファイル名：microbit-py-hat7-1-1)（送信用）
from microbit import *import radio

radio.config(group=1)
radio.on()radio.config(group=1)
radio.on()

while True:
msg = radio.receive()
if msg == "1":
pin0.write_digital(1)while True:
pin2.write_digital(1)radio.send("1")
sleep(4000)
17

display.show(Image.CONFUSED)
sleep(1000)
elif (a+1) % 3 == b or (a+1) % 3 == c:display.show(Image.HAPPY)
sleep(1000)
else:
display.show(Image.SAD)
sleep(1000)
count = 0

pin1.write_digital(0)pin2.write_digital(0)elif msg == "5":pin0.write_digital(0)pin1.write_digital(0)pin2.write_digital(1)elif msg == "7":for var in range(0, 4):
pin2.write_digital(1)sleep(100)pin2.write_digital(0)sleep(100)
7.2

7.3

ハノイの塔(複数台による表示)(保存ファイル名：microbit-py-hat7-3-1)
from microbit import *import radio

じゃんけんゲーム（3 人対戦）

(保存ファイル名：microbit-py-hat7-2)
from microbit import *import radio
import random

radio.config(group=1)
radio.on()
def send_pop(bar):
msg = (bar * 100) + 20
radio.send(str(msg))

radio.config(group=1)
radio.on()

def send_push(bar, n):msg = (bar * 100) + 10 + n
radio.send(str(msg))

count = 0d = [0, 0]
a=0
display.clear()def hanoi(n, a, b):
if n > 1:
hanoi(n-1, a, 6-a-b)
display.show(Image.HEART)
sleep(1000)
display.scroll(str(n))
sleep(1000)
display.scroll(chr(ord('@')+a))sleep(1000)
display.show(Image.ARROW_S)
sleep(1000)
display.scroll(chr(ord('@')+b))
sleep(1000)
display.clear()sleep(1000)
send_pop(a)send_push(b, n)
if n > 1:
hanoi(n-1, 6-a-b, b)

def hyouji(c):display.clear()
Scissors = Image("99009:99090:00900:99090:99009")
if c == 0:
display.show(Image.DIAMOND_SMALL)
elif c == 1:
display.show(Scissors)else:
display.show(Image.SQUARE)
while True:
if button_a.is_pressed() andbutton_b.was_pressed():reset()
elif button_a.is_pressed():a = random.randint(0, 2)
hyouji(a)elif button_b.is_pressed():radio.send(str(a))
s = radio.receive()
if s != None:d[count] = int(s)count = count + 1
if count >= 2:b = d[0]c = d[1]if a == b and a == c and b == c or
a != b and a != c and b != c:while True:
if button_a.was_pressed():n=3
display.scroll(str(n))
sleep(1000)
display.scroll("Mai")
hanoi(n, 1, 3)
display.scroll("End")if button_b.was_pressed():
n=n+1
18

mynum = 1
display.scroll(str(mynum))
sleep(500)
if button_a.is_pressed() andbutton_b.is_pressed():display.clear()
if mynum == 1:
bar.push(3)bar.push(2)bar.push(1)b = radio.receive()
if b != None:
data = int(b)if int(data / 100) == mynum:
cmd = int(data % 100 / 10)
n = data % 10
if cmd == 1:
bar.push(n)elif cmd == 2:
bar.pop()display.set_pixel(0, mynum - 1, 9)

display.scroll(str(n))
sleep(1000)
display.scroll("Mai")
hanoi(n, 1, 3)
display.scroll("End")(保存ファイル名：microbit-py-hat7-3-2)
from microbit import *import radio
radio.config(group=1)
radio.on()
mynum = 3class Bar:def __init__(self):
self.stk = [0, 0, 0, 0, 0]
self.sp = 0
def diskonoff(self, n, y, l):dr = [[2, 3], [1, 4], [0, 5]]
for i in range(dr[n-1][0], dr[n-1][1]):display.set_pixel(i, y, l)

7.4

通信プログラム（不具合問題）(保存ファイル名：microbit-py-hat7-4)
from microbit import *import radio

def push(self, n):self.stk[self.sp] = n
self.sp = self.sp + 1
for i in range(5 - self.sp):
self.diskonoff(n, i, 9)
sleep(500)
self.diskonoff(n, i, 0)
self.diskonoff(n, 5 - self.sp, 9)radio.config(group=1)
radio.on()
while True:
if button_b.was_pressed():sstring = "s" + "hello"
radio.send(sstring)b = radio.receive()
if b != None:if b[0] == "s":display.scroll(b[1:])sstring = "a" + "world"
radio.send(sstring)else:
display.scroll(b[1:])def pop(self):
if self.sp > 0:
self.sp = self.sp - 1
n = self.stk[self.sp]
self.stk[self.sp] = 0
self.diskonoff(n, 4-self.sp, 0)
bar = Bar()
while True:
if button_a.is_pressed() andnot button_b.is_pressed():mynum = mynum + 1
if mynum == 4:19