Python on My Wrist
Python on My Wrist (tildeweb.nl)
要約
著者は安価でオープンソースのスマートウォッチ「PineTime」を購入し、MicroPythonベースのOS「wasp-os」をメンテナンスしました。彼はビルドプロセス、フラッシュ速度、メモリ使用量、安定性を改善し、メインラインMicroPythonへの移行も実現しました。さらに、オランダ語の曜日表示や8ビットスタイルの時計、Pythonの生みの親である Guido van Rossum のポートレートを表示する「Guidoアプリ」といった新しいウォッチフェイスやアプリを開発しました。
全文翻訳
Python on my wrist
私はPineTimeを持っています。これはPine64製の安価でオープン、ハック可能なスマートウォッチです。
[画像: The Dutch watch face on my PineTime]
Apple Watchではない
人々はそれを見ると、スマートウォッチのように見えるので、Apple Watchのようなスマートウォッチに違いないと思います。しかし、そうではありません!Apple Watchは約700ドルですが、これは25ドルです。カラーディスプレイ、Bluetooth、歩数計、心拍数モニターを備えたプログラム可能なカシオのようなものと考えてください。
CPUやメモリはあまり多くありません。64 MHz ARM Cortex-M4、64 KBのRAM(はい、キロバイトです)、ファームウェア用の512 KBのフラッシュ、ファイル用の4 MBの外部フラッシュです。BluetoothスタックとMicroPython自体が使用する分を差し引くと、アプリには約12 KBのRAMが残ります。この時計のすべては小さくなくてはなりません。
しかし、画面は大丈夫です。1.3インチで240×240ピクセル、約260ピクセル/インチです。したがって、この投稿で表示されるものがブロック状に見える場合は、それは意図的です。ただし、常時表示ディスプレイは使用できません。バッテリーがすぐに切れてしまうからです。Apple Watchもかつては同じ制限がありました!
この時計には、前述の時計モニターと歩数計用のアプリが搭載されており、Bluetooth経由で通知を送信できます。
ここに至るまで
私は2023年3月にPineTimeを26.99ドルで購入しました。出荷時はInfiniTimeが搭載されています。それはそれで良いのですが、InfiniTimeはC++で書かれており、私はPythonグループを運営しています。そのため、私はwasp-os(MicroPythonベースの時計OS)を好みました。しかし、2023年でもそのプロジェクトはすでにかなり停滞していました。2019年版のMicroPythonを実行しており、ビルドは非常に困難でした。最近、そのメンテナーはwasp-osが新しいメンテナーを探しているというメモを追加しました。
OSの復活
それから、私は引き出しにあった時計を再び見つけ、少し作業するのに良いだろうと思いました。そこで、wasp-osを再び形にするために、私は自分自身にそれを課しました。メインラインMicroPythonへの移行(詳細は後述)に加えて、以下の変更を行いました。
- ビルドが再び可能になりました。 Pythonツールは
uvで管理されているため、セットアップは1コマンドで済み、完全なビルドが再び機能します。ブートローダー部分も含まれます。 - フラッシュが高速化しました。 Bluetooth経由でのファームウェアの更新は、非推奨の
gatttoolの代わりにbleakを使用するようになり、8分以上かかっていたものが約3分半で完了するようになりました。失敗した場合でも、以前のようにエラーを隠すのではなく、理由を通知するようになりました。 - メモリが増加しました。 外部フラッシュ上のファイルシステムは、チップの実際の4 KBブロックを使用するようになり、永続的な4 KBバッファがなくなりました。起動時の空きRAMは7.1 KBから12.4 KBに増加しました。この時計では、これはかなりの量です!
- 自己回復機能が追加されました。 ウォッチドッグが時計のハングアップ時にリセットするようになり、Bluetoothがオンのまま停止してしまうことがなくなりました。
- ビープ音がなくなりました。 スワイプ操作でバイブレーションモーターがリセットするまで鳴り続けることがありましたが、これは修正され、モーターが正しく駆動されるようになりました。
- スワイプ操作が確実に機能するようになりました。 タッチコントローラーが指を離したときに通知するようになり、設定画面ではスライダーをスワイプして値を変更できるようになりました。
- バッテリー切れから回復します。 私の休暇中、時計を持っていかなかった後、充電器に置いたところ、起動して「INIT HARDWARE FAILED」と表示されました。I2Cバスがチップによってスタックしていたのです。現在、起動時にバスのスタックを解除し、それでも失敗した場合は実際のエラーを表示し、時計は2020年の日付ではなくビルド日を基準に開始されるようになりました。
メインラインMicroPython
wasp-osは2019年のMicroPythonのフォーク上で動作し、時計用のパッチが適用されていました。これをメインラインMicroPythonに移植するにあたり、MicroPython自体にもいくつかの変更が必要だったため、私は3つのプルリクエストをアップストリームに提出しました。frozen native code、PWM割り当ての修正、ADCサンプル時間オプションです。これら3つすべてがマージされたため、wasp-osは初めてメインラインMicroPython上で動作し、最新バージョンになりました。フォークは不要です!これらの変更は、12月に予定されているMicroPython 1.30を対象としています。
2つの新しいウォッチフェイス
もちろん、私は自分自身のウォッチフェイスが欲しかったのです。最初のものはシンプルです。既存の週表示時計ですが、オランダ語で表示されます。オランダ語では曜日を2文字で省略するため、「ma 26 okt 2026」と表示されます。この時計のメモリは非常に小さいため、完全な多言語OSを搭載する余地はありません。しかし、ウォッチフェイスを翻訳し、ビルドして、ローカライズ版を時計にインストールすることができます。投稿の冒頭にその画像が表示されています。
2番目のものはより面白いものです。8ビットスタイルの時計です。数字は小さな6×7ピクセルのフォントから来ており、各フォントピクセルは時間表示用に7×7、その他用に3×3の画面ピクセルブロックとして描画されます。これによりレトロな外観が得られ、フォントデータはまったく必要ありません。時間とISO 8601形式の日付(YYYY-MM-DD、当然)の下には、Unixエポックが表示され、毎秒カウントアップします。
[画像: The pixel watch face on my PineTime]
Guidoアプリ
そして最後に、Pythonとの関連性を強調するために、Guidoアプリを作成しました。これは、Pythonの作成者であるGuido van Rossumのブロック状のポートレートを表示します。スワイプすると、Pythonロゴ、次にMicroPythonロゴ、そして私たちのPython Leidenミートアップのロゴが表示されます。もう一度スワイプすると時計に戻ります。
[画像: The four screens of the Guido app]
ポートレートは80×80ピクセルで16色、3倍の大きさで描画されています。これにより240×240の画面が埋まり、良いレトロな外観になります。ロゴはシャープに、フル解像度で描画されます。
この時計ではフラッシュメモリがタイトです。ファームウェアは約330 KBの容量があり、単一のフルスクリーン画像(生ピクセル)で112 KB、つまりその3分の1を占めます。そのため、最大16色/画像の小さな画像フォーマットと、実行長エンコーディングを使用しました。デコーダーは約40行で、これらを直接ディスプレイに描画します。4つの画像すべてを合わせても、12 KB未満です。それでも、これほどくだらないものにデフォルトで含めるには多すぎるため、アプリはオプションです。自分でビルドに追加する必要があります。
元の写真はKushal Das氏がPyCon US 2024で撮影したもので、CC BY-SA 4.0ライセンスが付与されているため、ブロック状のバージョンも同じライセンスで共有されています。
今後の展望:PineTime Pro
Pine64は後継機であるPineTime Proを開発中です。410×502のAMOLEDスクリーン、GPS、デュアルコアCortex-M33、デジタルクラウンを搭載します。まだ初期段階で、リリース日は未定ですが、オリジナルのPineTimeは引き続き製造されます。しかし、それはMicroPythonにとってずっと大きな遊び場になるでしょう。AMOLEDのGuido!
試してみる
すべて私のwasp-osフォークのpinetime-upstream-micropythonブランチにあります。