2023-03-19
C言語で開発するレゴSPIKEプライムは、Pybricksという様々なレゴのHub上でMicroPythonを動かすオープンソースが使われていました。

Pybricksのフロントを担当する、Webアプリ、Pybricks Codeは、ブラウザからBluetoothで接続し、REPLで対話的に動かしたり、PythonのコードをHubに書き込めて便利です。

Pybricks CodeのWebBluetoothでの接続部分を切り出し、汎用的に使える PybricksHub.js を作ってみました。

「PybricksHub test」
src on GitHub
最小限のCSSしか使っていないのでJavaScriptのプログラムも含めて86行のHTMLと改造しやすいのが特徴です。PybricksのAPIドキュメントを見ながら、REPLでレゴとの対話を楽しんだり、Pythonのコードを書き込んだりできます。レゴのHubをPybricksのファームウェアに変更してお試しください(Pybricks Codeの左メニューの歯車を選択、Install Pybricks Firmware)。


落ちゲー風を作ってみました。明るさの3段階で表したブロックを左右に動かしながら積んでいきます。真ん中上が詰まったら終了。 from pybricks.hubs import PrimeHub from pybricks.pupdevices import Motor, ColorSensor, UltrasonicSensor, ForceSensor from pybricks.parameters import Button, Color, Direction, Port, Side, Stop from pybricks.robotics import DriveBase from pybricks.tools import wait, StopWatch from pybricks.geometry import Matrix from urandom import randint hub = PrimeHub() field = [ [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], ] y = 0 x = 2 n = randint(1, 3) * 30 t = StopWatch() while True: btns = hub.buttons.pressed() if Button.LEFT in btns and x > 0 and field[y][x - 1] == 0: x -= 1 if Button.RIGHT in btns and x < 4 and field[y][x + 1] == 0: x += 1 hub.display.icon(field) hub.display.pixel(y, x, n) wait(100) if t.time() > 500: t.reset() y += 1 if y == 5 or field[y][x] != 0: field[y - 1][x] = n y = 0 x = 2 n = randint(1, 3) * 30 if field[y][x] != 0: break for i in range(0, 5): for j in range(0, 5): field[4 - i][j] = 0 hub.display.icon(field) wait(100) wait(1000) 1129文字のこのプログラムがバイナリ形式で929byteとほぼ同じ。261,624byteまで入るのでそこそこ大きなプロジェクトにも使えそうです。

モーターをコントローラーにしたり、音を入れたり、センサーに合わせたかわいいアニメーションを作ったり、いろいろと遊んでみましょう!


「code4fukui/PybricksHub.js」

ESモジュール、PybricksHub.js をインポートするだけでサクッと使えます。Pythonのコードは、バイナリのMPY形式に変換する mpy-cross-v6 ES modules を使った compilePy.js を使っています。

links
- Web BluetoothでつなぐLEGOテクニックシリーズ、なんと25種類の入出力!
- LEGOのマリオで作るリアルカラーピッカー by Web Bluetooth
- レゴ SPIKE プライムをC言語で開発 on Mac

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS