最近はコンパイル無しで気軽にプログラミングができるMicroPythonを使うことが多いのですが、小中学生に自由に試行錯誤しながらプログラミングの楽しさを体験してもらうには、MicroPythonでもまだもう一段ハードルがあるような気がしています。
先日、二人の中学生にMicroBitを使ったロボットカーのプログラミングを体験してもらいました。Scratchでブロック言語にはなじんでいるようで、特に使い方を説明することなくロボットカーの衝突回避動作を2時間ぐらいで完成させていました。MicroBitも良いのですが、基板が大きいことと、ブレッドボードでは使いにくいこと、さらに値段が安くないことなどがあって講習会用の機材としては使いづらいと感じています。
電子工作向きの、できればMicroPythonへのステップになるようなブロック言語はないものかと検索してみると、Piper Makeを試してみたよ、というようなレポートが何件か見つかりました。
ホームページの他に有力な情報は
SunFounder
Amazonでキットも販売しています。
Piper Makeはいわゆるブロック言語です。シンプルなLEDのON-OFFを試してみます。Pico Wの15ピンにLEDを接続して適当な抵抗を介してGNDに戻します。

pin 15を1秒間隔でOn-Offしています。Scratchを使ったことがある人であればほとんど違和感は感じないでしょう。
ウィンドウの下部には四つのタブがあって”DIGITAL VIEW”ではPicoのイラストで15pinが色が赤と黄色に変化します。
“CONSOLE”はPicoからの応答が表示されます。”DATA”は今のところ”?”です。
“PYTHON”はブロックコードをPythonコードに変換したものを見ることができます。3行目に”from piper_blockly import *”と書いてあることを覚えておいてください。
さて、USBメモリのようにCIRCUITPYというドライブが接続されています。boot_out.txtを見るとAdafruitのCircuitPythonのバージョン7.0.0-115がインストールされているようです。CircuitPythonの最新バージョンは9.1.4ですから2年前の古いまま使っていることになります。きっと定期的に更新をするのでしょう。
2024.12.15時点ではCircuitPythonのバージョン9.0.0(2024-10-04)になっていました。新しいPico2(rp2350マイコン)への対応を準備しているようですが、Pico2にはまだPiper MakeからCONNECTして使うことはできないようです。
ここまでで理解できたことは、WebブラウザのブロックコードをCircuitPythonに変換してシリアル通信でPicoのCircuitPythonに1行づつ送っているようです。Piper Make特有のコマンドはライブラリ”piper_blockly”は、CIRCUITPYドライブでは見えないCircuitPythonのファームウェアの近くに置かれているのだろうと思います。
さて、コードを自動実行する方法は、CircuitPythonではcode.pyに書けば良いとのことです。オリジナルのcode.pyはファイル名を”_code.py”と変更しておいて、PYTHONタブのコードを”code.py”として保存すればOKです。
ここまでで”Piper Make”にかなり親しみを感じることができました。
プログラムの保存はかなりクールです。
名前をつけてDOWNLOADボタンを押すとブロックコードのPNG画像ファイルとして保存されます。
PIN形式の仕様で独自のチャンクを書き込むことができるのですが、おそらくPythonコードを埋め込んでいるのでしょう。”import project”でPNGファイルを読み込むと実際にプログラムが動きます。
<<<関数>>>
関数も使うことができます。ラズパイPicoと同じマイコンrp2040を使っているWaveshare RP2040 ZeroというマイコンボードでもPiper Makeを使うことができますので、Waveshare RP2040 ZeroにフルカラーLEDマトリクス(4x4)を接続した例で関数を使った例を示します。

フルカラーLEDマトリクス(4x4)はシリアル接続なので、下の図のような順番で並んでいます。このままでは思った場所のLEDを点灯することが難しいので、左上を(0,0)とした2次元座標で指定できる関数を作ります。関数にxとyを入力するとLEDの番号(count)を返します。
xが0の時には、count = 4 – y
xが1の時には、count = 5 + y
xが2の時には、count = 12 – y
xが3の時には、count = 13 + y
4×4だけなら四つの場合分けでも、そんなに煩雑ではありませんが、将来8×8のマトリクスを使いたいので、xが偶数と奇数に分けます。
xが偶数の時は、count = x*4 +(4- y)
xが奇数の時は、count = x*4 + (y+1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
## ---- Imports ---- ## import board from piper_blockly import * import time ## ---- Definitions ---- ## x = None y = None s = None led_n = None neopixels = piperNeoPixels(board.GP14, "GP14", 16) try: set_digital_view(True) except: pass # Describe this function... def count(x, y): global s, led_n if x % 2 == 1: s = x * 4 + y else: s = x * 4 + (3 - y) s = s + 1 return s ## ---- Code ---- ## while True: for y in range(4): for x in range(4): led_n = count(x, y) neopixels.pixels[led_n - 1] = ((0, 255, 0)) neopixels.show() time.sleep(0.2) neopixels.pixels[led_n - 1] = ((0, 0, 0)) neopixels.show() |
一応希望通りの関数を作ることができますが、変数がグローバルで指定されている点に注意です。Piper MakeのシリアルLEDの番号付けは1から始まるのでPythonコードでは1を引いています。
<<マイクで音声認識>>
マイク用のブロックがあるのでPicoにマイクを接続するのかと想像しましたが、PCのマイクにアクセスして音声認識ができます。
きっと、カメラでのジェスチャー認識もPC側のカメラを使うのだろうと思います。
<<Pythonコード>>
ブロックコードが面倒な時にはPythonのコードを直接記述することができます。
4×4 LEDマトリクスに表示するデータをリストで与えます。
code_list_imageという名前でブロックコードになりました。
custum python codeのブロックがあるおかげで柔軟に対応できそうな気がします。
とりあえずこんな感じで理解してみました。(2024.10.1)
さらに気がついたことのメモ
ブロックをコピーして他のプロジェクトにペーストすることができる。
neopixelのセットアップでは255個までしか設定できないけれど、別のピン番号で256個定義するパイソンコードを作れば動く。
メインのプログラムでセットされていない変数は、関数内でローカル変数として使える。
PYTHONタブの右上のアイコンをクリックするとPythonコードがマイコンに保存され、電源投入時およびPimerMake停止時に自動起動する。