マイクロビットで使える言語

 今回はマイクロビットでLED上でランダムに点が点滅するプログラムを作成します。簡単なプログラムですが、今回はJavaScriptだけでなくPython(パイソン)も使って同じように機能するプログラムを作成します。なお、いきなりPythonで作成するのではなく、最初にJavaScriptブロックエディタで作成、その後JavaScriptコードを確認し、そのコードを元にしてPythonに移植するという形をとります。なお前回のプログラム(マイクロビットでゲームを創ろう micro:bit編)の最後の解答は最後に掲載してあります。

LEDの点をランダムに光らせる

 作成するプログラムはLED上の点をランダムに光らせます。ランダムに光らせるには乱数を使います。また、マイクロビットではLEDの明るさを個別に指定することができます。そこでLEDの明るさもランダムにし明るい星、暗い星を表現することにします。
 ブロックは以下のように組み合わせます。

  • 新規プロジェクトからはじめます。「LED」カテゴリをクリック
  • 新規プロジェクトからはじめます。「LED」カテゴリをクリック
  • 新規プロジェクトからはじめます。「LED」カテゴリをクリック

  • 「・・・さらに表示」をクリックし、「点灯 x「0」y「0」明るさ「255」」を選択し配置する
  • 「・・・さらに表示」をクリックし、「点灯 x「0」y「0」明るさ「255」」を選択し配置する
  • 「・・・さらに表示」をクリックし、「点灯 x「0」y「0」明るさ「255」」を選択し配置する

  • 「計算」カテゴリから「0~「4」の範囲の乱数」ブロックをクリックし、図のようにxに当てはめます
  • 「計算」カテゴリから「0~「4」の範囲の乱数」ブロックをクリックし、図のようにxに当てはめます
  • 「計算」カテゴリから「0~「4」の範囲の乱数」ブロックをクリックし、図のようにxに当てはめます

  • 同様にyにも「0から「4」の範囲の乱数」ブロックを当てはめ、明るさには計算ブロックから「「0」×「0」」を配置し、図のように並べます
  • 同様にyにも「0から「4」の範囲の乱数」ブロックを当てはめ、明るさには計算ブロックから「「0」×「0」」を配置し、図のように並べます
  • 同様にyにも「0から「4」の範囲の乱数」ブロックを当てはめ、明るさには計算ブロックから「「0」×「0」」を配置し、図のように並べます

 LEDを点灯するだけにしてしまうと、星空のように見えないのでランダムに4箇所ほどLEDを消して、ランダムに一箇所を点灯するようにします。また、表示後0.5秒程度のウェイト(一時停止ブロック)を入れておきます。
 ブロックは以下のように組み合わせます。

  • 「LED」カテゴリから「消灯 x「0」y「0」」ブロックをクリックし、図のように配置します
  • 「LED」カテゴリから「消灯 x「0」y「0」」ブロックをクリックし、図のように配置します
  • 「LED」カテゴリから「消灯 x「0」y「0」」ブロックをクリックし、図のように配置します

  • x、yそれぞれに乱数を配置します。これを4つ作成し、図のように並べランダムに消灯させます
  • x、yそれぞれに乱数を配置します。これを4つ作成し、図のように並べランダムに消灯させます
  • x、yそれぞれに乱数を配置します。これを4つ作成し、図のように並べランダムに消灯させます

  • 「基本」カテゴリから「一時停止(ミリ秒)「100」」を選び、一番下に配置します
  • 「基本」カテゴリから「一時停止(ミリ秒)「100」」を選び、一番下に配置します
  • 「基本」カテゴリから「一時停止(ミリ秒)「100」」を選び、一番下に配置します

これで完成です。マイクロビットにプログラムを転送して動かしてみましょう。星がランダムな明るさと位置で灯いたり消えたりします。

JavaScriptからPythonへ

 それでは、このプログラムをPythonで作成してみます。まず、JavaScriptのコードを確認してみましょう。JavaScriptブロックエディタの上部にある「ブロック { }JavaScript」の「{ }JavaScript」のボタンをクリックします。すると以下のようなJavaScriptプログラムが表示されます。

 basic.forever(() => {
     led.unplot(Math.random(5), Math.random(5))
     led.unplot(Math.random(5), Math.random(5))
     led.unplot(Math.random(5), Math.random(5))
     led.unplot(Math.random(5), Math.random(5))
     led.plotBrightness(Math.random(5), Math.random(5), Math.random(21) * 5)
     basic.pause(500)
 })
  • JavaScriptエディタで開いたところ

    JavaScriptエディタで開いたところ

このプログラムをPythonで書いてみましょう。
まず、Pythonエディタを起動します。Pythonエディタは以下のURLになります。また、マイクロビットのトップページからたどってもアクセスすることができます。

Python用のエディター
http://python.microbit.org/v/1
  • Pythonエディタの起動画面

    Pythonエディタの起動画面

なお、Pythonにはブロックエディタがありません。このため、直接プログラムを入力していくことになります。 マイクロビットで使えるPythonに関しては以下のページにチュートリアルからサンプル、リファレンスまで一式用意されています。一読しておくとよいでしょう。

マイクロビットのPythonチュートリアル
http://microbit-micropython.readthedocs.io/ja/latest/index.html

それではPythonでのプログラム作成に入ります。Pythonエディタのページにアクセスすると以下のようなプログラムが表示されます。これはマイクロビットのLEDにHello, World!♥を表示するプログラムです。

 # Add your Python code here. E.g.
 from microbit import *

 while True:
     display.scroll('Hello, World!')
     display.show(Image.HEART)
     sleep(2000)

まずは、何も修正せずに、このプログラムをマイクロビットに転送して動かしてみましょう。プログラムを生成するには「Download」のボタンをクリックします。するとJavaScriptブロックエディタの時と同様に「microbit (1).hex」といったHEXファイルが作成されます。これをマイクロビットに転送します。
プログラムが正常に動作するとLEDに「Hello, World!♥」の文字が流れてきます。

  • Hello, World!♥と横に文字が流れてきます
  • Hello, World!♥と横に文字が流れてきます
  • Hello, World!♥と横に文字が流れてきます

Pythonでプログラミング

 それではLED上でランダムに点が点滅するプログラムを作成します。今回は説明の都合上、完成したプログラムを先に見てもらいましょう。なんとなくJavaScriptプログラムと似ているのがわかるでしょうか。

 from microbit import *
 import random

 while True:
     display.set_pixel(random.randint(0, 4), random.randint(0, 4), 0)
     display.set_pixel(random.randint(0, 4), random.randint(0, 4), 0)
     display.set_pixel(random.randint(0, 4), random.randint(0, 4), 0)
     display.set_pixel(random.randint(0, 4), random.randint(0, 4), 0)
     display.set_pixel(random.randint(0, 4), random.randint(0, 4), random.randint(0, 9))
     sleep(500)

それではプログラムを上から順番に見ていきましょう。
一行目で「from microbit import *」としてmicrobitモジュールを読み込みます。この指定の場合、microbit.を省略することができます。次に説明するLEDを点灯させるメソッドであるmicrobit.display.set_pixel()はdisplay.set_pixel()として書くことができます。乱数モジュールは「import random」として読み込みます。この場合、乱数のメソッドなどはrandomは省略できず、random.から書く必要があります。

LEDの点滅は永久に繰り返すのでwhile True:とします。ここで注意しなければならないのはPythonではインデント(字下げ)が大きな意味を持つということです。インデントによってブロックの深さ(ネスト)が示されるためです。プログラムがうまく動かない場合はインデントがずれていないかも確認してください。

LEDを点灯するには以下のメソッドを使います。x,yが座標(0〜4)でvalueが明るさになります。明るさは0〜9の10段階です。0を指定すると消灯になります。1が最も暗く、9が最も明るくなります。

 microbit.display.set_pixel(x,y,value)

このメソッドのリファレンスは以下のディスプレイのカテゴリにあります。

microbit.display.set_pixel()のリファレンス
http://microbit-micropython.readthedocs.io/ja/latest/display.html

 X,Y座標と明るさは乱数を使います。乱数を生成させるには以下のメソッドになります。

 random.randint(最小値,最大値)

random.randint(0,4)とすると0〜4までの乱数(整数値)が生成されます。
このメソッドのリファレンスは以下のランダムのカテゴリにあります。

random.randint()のリファレンス
http://microbit-micropython.readthedocs.io/ja/latest/tutorials/random.html

あとはウェイト(待ち時間)を指定するsleep()メソッドです。JavaScriptと同様に待ち時間をミリ秒で指定します。500なら0.5秒の待ち時間になります。

プログラムを入力したらマイクロビットに転送して動作を確認してみましょう。

もし、エラーがある場合はマイクロビットのLEDにエラーメッセージが流れます。その際、エラーが起こっている行番号も表示されます。

このプログラムはプログラマからすると、あまり気分がよいコードではありません。というのも、同じ行を繰り返し書いているからです。つまり以下の4行です。プログラムをコピペ(コピー&ペースト)すると一時的には楽ですが、後の修正は大変になります。

     display.set_pixel(random.randint(0, 4), random.randint(0, 4), 0)
     display.set_pixel(random.randint(0, 4), random.randint(0, 4), 0)
     display.set_pixel(random.randint(0, 4), random.randint(0, 4), 0)
     display.set_pixel(random.randint(0, 4), random.randint(0, 4), 0)

そこでPythonの繰り返し命令をであるforを使って書き直してみましょう。一定回数繰り返す場合はfor 変数名 in range()を使います。range()のパラメーターに繰り返し回数を指定します。
改良したプログラムは以下のようになります。プログラムを転送して動作を確認してみましょう。

 from microbit import *
 import random

 while True:
     for i in range(4):
         display.set_pixel(random.randint(0, 4), random.randint(0, 4), 0)
     display.set_pixel(random.randint(0, 4), random.randint(0, 4), random.randint(0, 9))
     sleep(500)

なお、Pythonで作成すると若干できあがるHEXファイルのサイズが大きくなります。また、JavaScriptとPythonでは機能が異なるため、作成するプログラム内容に応じて使い分けるとよいでしょう。

前回の回答例

 前回のゲームでクリアするまでにかかった実時間を表示するプログラムは以下のようになります。
タイマー変数には最初にAボタンが押された時にマイクロビットが稼働してからの時間を入れます。
ゲームをクリアした時に現在の稼働時間からタイマー変数に入っている稼働時間を引き算します。これで、かかったミリ秒を求められます。ミリ秒なので秒数に直すために1000で割り算します。これでクリアにかかった時間を表示することができます。

 let タイマー = 0
 let 変数 = 0
 input.onButtonPressed(Button.A, () => {
     if (変数 == 0) {
         タイマー = input.runningTime()
         music.beginMelody(music.builtInMelody(Melodies.Entertainer), MelodyOptions.Once)
     }
     if (変数 < 24) {
         led.unplot(変数 % 5, 変数 / 5)
         変数 += 1
     } else {
         basic.showNumber((input.runningTime() - タイマー) / 1000)
     }
 })
 input.onButtonPressed(Button.B, () => {
     control.reset()
 })
 変数 = 0
 basic.showLeds(`
     # # # # #
     # # # # #
     # # # # #
     # # # # #
     # # # # #
     `)
著者 古籏一浩
プログラミングをベースにして面白そうなものはとりあえずやってみるというスタンス。複雑なものよりシンプルで楽しめるものが好み。
著者サイト:http://www.openspc2.org/