chakokuのブログ(rev4)

日々のごった煮ブログです

micro:bitを買った。micropythonで操作してみる

自分で使うというより、micro:bitをプログラミング教育に活用しているNPO団体が近くにあり、そこの活動内容に興味があり、そもそもmicro:bitとはどんなものかを理解しようと思って一つ買った。

Webサイトにもmicro:bitに関する記事がいろいろ掲載されているようですが、、手っ取り早く概要を理解したくて、以下の本を購入

Programming the BBC micro:bit: Getting Started with MicroPython

Programming the BBC micro:bit: Getting Started with MicroPython

microPythonを中心に、micro:bitに搭載されている各種デバイスをどうやったら制御できるか?について細かく説明がなされてます。ただ、最後のリファレンスには、micro:bit用のモジュールの一覧はありません。クラスのリファレンスは以下の仕様書を参考になさってください。

microbit用micropython言語仕様
http://microbit-micropython.readthedocs.io/en/latest/
(日本語版)
http://microbit-micropython.readthedocs.io/ja/latest/

https://codewith.mu/


プログラミング言語は大きく分けて、Javascript系かPython系が用意されていると理解しましたが、自分はjavascriptはダメな方なのでPython(micropython)でプログラムすることに。評価ボードでのプログラミングでは、打ち込んですぐに実行評価できる、REPL(Read-eval-print loop)が使えるのが非常にありがたいので、、MUエディタを導入。

muエディタをPCにインストールしてmicro:bitを接続して、REPLで操作した例
(microbitをインポートしてdirコマンドを実行すると、IO制御用に追加されたクラスが分かる)

>>> import microbit
>>> dir(microbit)
['__name__', 'Image', 'display', 'button_a', 'button_b', 'accelerometer', 'compass', 'i2c', 'uart', 'spi', 'reset', 'sleep', 'running_time', 'panic', 'temperature', 'pin0', 'pin1', 'pin2', 'pin3', 'pin4', 'pin5', 'pin6', 'pin7', 'pin8', 'pin9', 'pin10', 'pin11', 'pin12', 'pin13', 'pin14', 'pin15', 'pin16', 'pin19', 'pin20']
>>> 

REPLで対話的に操作できると、最低限の事*1さえ覚えておけば、dirコマンドとhelpコマンドでだいたいどうやったらいいか手探りでも使えてしまう。

>>> import microbit            <- microbitライブラリをインポート
>>> dir(microbit)              <- どんなクラスがあるのか確認
['__name__', 'Image', 'display', 'button_a', 'button_b', 
'accelerometer', 'compass', 'i2c', 'uart', 'spi', 'reset',
 'sleep', 'running_time', 'panic', 'temperature', 'pin0', 
'pin1', 'pin2', 'pin3', 'pin4', 'pin5', 'pin6', 'pin7', 
'pin8', 'pin9', 'pin10', 'pin11', 'pin12', 'pin13', 
'pin14', 'pin15', 'pin16', 'pin19', 'pin20']

>>> dir(Image)                 <- Imageクラスの内容を確認
['width', 'height', 'get_pixel', 'set_pixel', 'shift_left',
 'shift_right', 'shift_up', 'shift_down', 'copy', 'crop',
 'invert', 'HEART', 'HEART_SMALL', 'HAPPY', 'SMILE', 'SAD',
 'CONFUSED', 'ANGRY', 'ASLEEP', 'SURPRISED', 'SILLY',
 'FABULOUS', 'MEH', 'YES', 'NO', 'CLOCK12', 'CLOCK1',
 'CLOCK2', 'CLOCK3', 'CLOCK4', 'CLOCK5', 'CLOCK6', 'CLOCK7',
 'CLOCK8', 'CLOCK9', 'CLOCK10', 'CLOCK11', 'ARROW_N',
 'ARROW_NE', 'ARROW_E', 'ARROW_SE', 'ARROW_S', 'ARROW_SW',
 'ARROW_W', 'ARROW_NW', 'TRIANGLE', 'TRIANGLE_LEFT',
 'CHESSBOARD', 'DIAMOND', 'DIAMOND_SMALL', 'SQUARE',
 'SQUARE_SMALL', 'RABBIT', 'COW', 'MUSIC_CROTCHET',
 'MUSIC_QUAVER', 'MUSIC_QUAVERS', 'PITCHFORK', 'XMAS',
 'PACMAN', 'TARGET', 'ALL_CLOCKS', 'ALL_ARROWS', 'TSHIRT',
 'ROLLERSKATE', 'DUCK', 'HOUSE', 'TORTOISE', 'BUTTERFLY',
 'STICKFIGURE', 'GHOST', 'SWORD', 'GIRAFFE', 'SKULL',
 'UMBRELLA', 'SNAKE']

>>> Image.SNAKE                  <- Image.SNAKEの内容を見てみる
Image('99000:99099:09090:09990:00000:')

>>> dir(display)                 <- displayクラスがLED表示とあたりを
                  つけて確認、showが表示だろうと
['get_pixel', 'set_pixel', 'show', 'scroll', 'clear', 'on', 'off', 'is_on']

>>> help(microbit.display)       <- helpで見る
micro:bit's 5x5 LED display.

>>> help(display.show)          <- 確かに表示用関数である
Use show(x) to print the string or images 'x' to the display. 
Try show('Hi!'). Use show(s, i) to show string 's', 
one character at a time with a delay of 'i' milliseconds.


>>> display.show(Image.SNAKE)    <- Image.SNAKEをLEDに表示させてみる

micro:bitのLEDにヘビがされた

micro:bitをmicropythonで少し動かした印象

  • pythonでプログラムすると言えども、バグは出る。プログラムはmicro:bit上で動作するため、デバッガで好き勝手に実行止めたりできないので、デバッグが困難。普通のPythonのようには開発できない(パイソンデバッガ(pdb)が動かないので。まぁそらそうでしょう)
  • フラッシュ書き込みの時間待ちがあるので、開発サイクル(プログラミングー>実行ー>テストー>デバッグ)に時間がかかる
  • muエディタのソースチェック機能はめちゃくちゃ細かく指摘してくる。普段緩くコーディングしている人には細かすぎるかも。

理想的にはmicropythonが走るmicro:bitシミュレータがあり、そこでバグを潰してから最終バージョンをmicro:bit本体に焼きこんで実機テストするようなフローが望ましい。でもそうなるとほぼほんまもんの開発になってしまう。
開発サイクルだけで言うと、Blockプログラミング環境の方はmicro:bitシミュレータが提供されているので、実行待ち時間もないので効率がいいかも。ブロックでプログラムを作りたいかどうかは目的によると思いますが。。

イギリスではmicro:bitは11歳と12歳の小学生に配布されたらしいですが、彼らは多分Blockでプログラミングしてるのだろう。。micropythonでのプログラムは苦労が多すぎるような。。(もちろんPCでPythonを使ってる人は、デバッグ環境の整ったPC版Pythonで基本部分を試してからmicro:bitで最終実装とか、いろんな逃げの手があるので必要以上に時間を消費したりするのは避けられると思いますが)

以下は試しに作った、イメージ次々表示サンプル。イメージ一覧がどうにかして取れれば、imageリストを作る所がちょっと楽になりそうですが。。

from microbit import *

images = [Image.HEART, Image.HEART_SMALL, Image.HAPPY]
images.extend([Image.SMILE, Image.SAD, Image.CONFUSED])
images.extend([Image.ANGRY, Image.ASLEEP, Image.SURPRISED])
images.extend([Image.SILLY, Image.FABULOUS, Image.MEH, Image.YES])

while True:
    for i in images:
        display.show(i)   # , wait=True, delay=1000
        sleep(1000)

主観ですが、、Blockの方は全然分かっていませんが、micropythonによるmicro:bitのプログラムは一見手軽そうに見えてシミュレータがないのでデバッグ手段がほとんどなく、デバッグが厄介な印象。。

■追記
デバッグ手段がないというのはちょっと間違いで、、print("hoge")が使えるようなので、プリント文デバッグは可能。また、シリアル等も使えるようで、シリアルに実行トレースを出したりもできるだろう。。pdbが提供する対話的デバッグができない。

■追記(180519)
micro pythonだとBLEで通信できないようである(メモリ領域が足りないためか)。JavaScript系なら可能らしい。ちょっと(かなり)飽きてきた。。あぁいけない。。

*1:micro:bit用モジュール名は、 microbit