プログラミング
Gpiozero Flow
Gpiozero Flow (bennuttall.com)
要約
Pythonライブラリgpiozeroの概念を視覚的に表現するWebベースのUIツール「gpiozero flow」が紹介されています。このツールは、Raspberry PiのGPIOデバイス間の値の流れをドラッグ&ドロップで接続し、プログラミングを直感的に行うことを可能にします。AIの支援を受けて開発されたこのツールは、シミュレーションからリモート制御まで対応し、計算論的思考を養うツールとしても期待されています。
全文翻訳
2015年、私はgpiozeroというRaspberry Pi向けのPythonライブラリのアイデアを思いつきました。これはGPIOデバイスのプログラミングを抽象化によってシンプルにするもので、ピンチャンネル、電圧、プルアップ抵抗、立ち上がり・立ち下がりエッジといった低レベルな概念ではなく、ボタンが押されたり離されたり、センサーが光や動きを検知したり、モーターが前後に回転したりといった、より高レベルなデバイスの動作に焦点を当てています。gpiozeroを使えば、これらの言葉でコードを書くことができました。
私たちはデバイス中心のAPIを開発し、いくつかのパターンが現れました。結果として、3種類のプログラミングスタイルをサポートすることになりました。
手続き型: while True: if button.is_pressed: led.on() else: led.off()
イベント駆動型: button.when_pressed = led.on
button.when_released = led.off
宣言型: led.source = button
これらの3つのスニペットは、異なる方法で同じことを達成しています。1つ目は繰り返しボタンが押されているかを確認し、2つ目はボタンがLEDを制御するように指示し、3つ目はLEDがボタンの状態に追従するように指示します。どれが最も読みやすく、書きやすく、理解しやすいかを言うのは難しいです。おそらく最後のもの、単一行なので。しかし、もしロジックを反転させて、ボタンがLEDをオンにするのではなくオフにするようにしたい場合、最初の2つを変更する方法は簡単にわかりますが、3つ目はそうではありません。
しかし、そこが面白いところです!私たちは、値のストリームが1つのデバイスから別のデバイスへ流れる際に、それを操作するための関数を提供しています。例えば、led.source = negated(button) や、sin_values() のような人工的な値ストリームを提供するものまであります。これにより、サーボは最小値と最大値の間を安定して駆動します。
これらすべてが機能する仕組みは、gpiozeroがデバイスに標準的な値の範囲を割り当てることです。ボタンやLEDのような単純なブール値のものもあります。ボタンは押されているときは1、それ以外は0です。LEDの場合、0はオフ、1はオンです。PWMを使用してLEDを制御でき、0から1のスケールで明るさを設定できます。そして、0から1までのアナログ入力を読み取ることができれば、そのデバイスから直接LEDの明るさを制御できます。例えば、pot = MCP3008() led = PWMLED(pin) led.source = pot のようになります。
モーターのような一部のデバイスは-1から1の範囲を持ちます。0から1の部分は前進速度、0から-1の部分は後進速度です。したがって、サイン波はモーターを全速力で加速させ、減速させ、方向転換し、反対方向に全速力で加速させることになります。
値ストリームを操作したり組み合わせたりしたい場合があるでしょう。そのため、negated、inverted、clamped、scaled、absoluted、booleanized、zipped、smoothedのような一般的なユースケースのための関数のコレクションを提供しています。独自のジェネレーター関数を書くこともできます。
私はRaspberry Piで働いていた頃、多くのカンファレンストークでこの概念を定期的に取り上げていましたし、それを説明するドキュメントページも書きました。このページでは、デバイス間の関係を単純なフロー図で表現できることを示しました。gpiozero flowです。
これがアイデアにつながりました。サイドパネルからGPIOデバイスをフリーフォームのキャンバスにドラッグ&ドロップし、それらを接続する線を描画できるWebベースのUIです。LEDをボタンに接続すると、ボタンはソース/値に基づいてLEDを制御します。Node-REDというプロジェクトがこのようになっていますが、私はそれが複雑すぎると感じ、そのGPIO機能はデバイス中心ではなくピンベースでした。私が考えていたのは、gpiozeroのソース/値の仕組みに完全に基盤を置いたものでした。
私は何をしたいかはわかっていましたが、管理するには複雑すぎることが多く、最新のJavaScriptに関する多くの知識が必要でした。そこで、2026年になり、Claudeがこのようなことを容易にしてくれました。アイデアの説明とMVP(Minimum Viable Product)の仕様を書き、技術とデザインの選択肢について合意した後、すぐに動作するプロトタイプができました。UIの調整、設定、アイコン、アニメーションの追加に時間を費やしました。すぐに、いじって遊ぶのが楽しいツールになりました。
Pythonコードジェネレーターを追加したので、プロジェクトの同等のPythonコードを確認できるようになりました。次に、PiのGPIOピンをリモートで制御する方法を検討し、Pi上で実行するエージェントを作成しました。WebアプリはWebSocketsを使用してPiと通信し、それはうまく機能しました。gpiozeroのほとんどすべてのデバイス(TimeOfDayのような内部デバイス、値ストリームを操作するためのソースツールの範囲、sin_valuesのような人工ソースを含む)をサポートするように、さらに多くの機能を追加・改善しました。
アドオンボードをサポートしたかったのですが、それはソース/値の仕組みにはあまり適していませんでした。なぜなら、入力と出力コンポーネントで構成される複合デバイスの形状が使用を困難にするからです。しかし、持っているボードをドラッグインして、それが使用するすべての特定のピン番号を割り当てる必要がないのは便利です。そのため、ボードを含めましたが、それらはキャンバス上に個別のコンポーネントとして表示され、正しいピンに事前に設定されていました。
信号機のような複合デバイスをその構成要素に分解したり、LEDをPWMLEDに変換したり、その逆を行ったりできると便利だと思いました。そのため、それらを追加しました。限定された初期化パラメータのセットを追加し、各クラスまたは関数へのgpiozeroドキュメントへのリンクを追加しました。複数のキャンバスを保存できるようにしたかったので、localStorageサポートを追加しました。
そこから、共有可能なリンクの作成、およびインポートとエクスポートを可能にするために、圧縮されたJSONベース64エンコーディングを構築しました。リモートGPIOはローカルホストで私には機能しましたが、Claudeは、HTTPS経由でホストする場合に問題が発生するだろうと指摘しました。なぜなら、HTTPSオリジンからは安全でないWebSocket接続を行うことができず、LAN上のデバイスの証明書を取得できないため、安全なWebSocketを使用できないからです。
当初、Webアプリを単純なダウンロードにバンドルし、ローカルで実行するための手順を提供していましたが、友人のRobieからの提案がそれをさらにシンプルにしました。gpiozero-flowというPythonパッケージを公開しました。これにはWebSocketエージェントとWebアプリの両方が含まれています。Piにこれをインストールし、Webアプリとエージェントの両方を実行すると、flow.bennuttall.com のホストされたアプリで、Pi自身のアプリインスタンスに引き継ぐことができます。そのIPまたはホスト名を入力するだけで、プロジェクトが共有リンク経由であなたと共に移動します。そこからライブモードに切り替えることができ、GPIOピンを直接制御できます。
これで、プロジェクトの初期バージョンが公開されました。ぜひ試してみて、ご意見をお聞かせください!誰がそれを見つけるかはわかりません。実験的なもので、私はただアイデアを形にしてみたかったのです。ある意味では、Scratch、Blockly、Edublocksのような単純なグラフィカルプログラミングツールです。しかし、基本以上のことを行うには、より高度なロジックが必要になると主張することもできます。
おそらく、コンピューティングよりもシステムと制御の科目に適しているかもしれません。コンピューティングプログラミングツールというよりは、有用な計算思考ツールかもしれません。gpiozeroのイベント駆動型パラダイムのサポートを追加することを検討できます。これはうまく機能すると思いますが、デバイス間の値の流れを理解するというメンタルモデルを壊す可能性があります。カスタム関数をジェネレーターとして使用する可能性もありますが、これもまた、手続き型プログラミングツールを後付けすることになるでしょう。
タグ: python claude ai web開発 github オープンソース gpiozero raspberry pi