Simplicity is the Ultimate Sophistication / シンプルis 究極:micro:bitとMaqueenで学ぶ組込み開発


はじめに

最近、MaqueenロボットカーとそのラインセンサーのPython実装に取り組
む機会があった。当初は「より良い」キャリブレーション機能を実装し
ようとしたが、予想外の困難に直面し、結果として大きな学びを得るこ
とになった。この記事では、その過程で見つけた「シンプルさの価値」
について共有したい。

最初のアプローチ:複雑な機能を目指して

最初の計画は野心的だった。環境の変化に対応できる高機能なラインセ
ンサーキャリブレーションシステムを作ろうと考えた:

  1. アナログ値を読み取り、黒線と白地での値を測定
  2. 適切な閾値を計算してmicro:bitのファイルシステムに保存
  3. 保存した値を次回起動時に読み込んで使用 コードを書き始め、次のような機能を実装した:
  • ボタン操作によるキャリブレーションモード切替
  • ファイルシステムへの設定値保存
  • リアルタイムセンサー値表示
  • LEDマトリックスによる視覚的フィードバック

しかし、micro:bitに書き込んだ瞬間、問題が発生した。

直面した問題:制約との闘い

MemoryError: Memory allocation failed

最初のエラーはメモリ不足。

機能を削って再挑戦したが、今度は違うエラーが出た: object has no attribute ‘read_analog’

さらに文字列処理でも問題が: cannot mix bytes and no bytes literals 特に文字列とバイト列の扱いが面倒だった。

通常のPythonでは当たり前のコード

display.scroll(f"L:{left_value} R:{right_value}") 

がMicroPythonでは動かない。.format()メソッドに変更したが、これも同様なエラーが起こる。いったい本家のpxt-maqueenはどう実装しているのだろう?

原点回帰:本家コードから学ぶ

DFRobotの公式pxt-maqueenコードを調査したところ、驚くべき発見があ
った:

// バージョン4の実装
export function readPatrol(patrol: Patrol): number {
if (patrol == Patrol.PatrolLeft) {
return pins.digitalReadPin(DigitalPin.P13)
} else if (patrol == Patrol.PatrolRight) {
return pins.digitalReadPin(DigitalPin.P14)
} else {
return -1
}
}

なんと、本家はキャリブレーション機能すら実装していなかった!単に
デジタルピンから0/1の値を読むだけの超シンプルな実装だったのだ。 バージョン5でもI2C経由になるものの、基本的にはデジタル値を返すだけの単純な実装だった。

学び:シンプルさの勝利

この発見から下記の気づきを得た:

  1. 組込み開発ではシンプルさが最優先事項
    メモリやCPUが限られた環境では、必要最小限の機能に絞るべき
  2. 文字列処理は意外なリソース消費源
    デバッグ出力のような単純な処理でもメモリを圧迫する
  3. 既存実装から学ぶ姿勢が重要
    車輪の再発明をする前に、既存のソリューションを調査する価値がある

最終的な実装

本家に倣った超シンプルなものになった:

 from microbit import display, Image, button_a, sleep, pin13,
pin14 while True:
# デジタル値を直接読み取り
left = pin13.read_digital()
right = pin14.read_digital() # LEDで視覚化(文字列表示は最小限に)
if left == 0 and right == 0:
display.show(Image("99999:99999:00000:00000:00000"))
elif left == 0:
display.show(Image("99900:99900:00000:00000:00000"))
elif right == 0:
display.show(Image("00999:00999:00000:00000:00000"))
else:
display.show(Image("00000:00000:00000:00000:00000")) sleep(100) 

結論:シンプル is

この経験から得た最大の教訓は、「複雑な問題に対しても、単純な解決策が最良の場合がある」ということ。ハードウェアの制約を理解し、その中で最も効率的なアプローチを見つけることが重要なのかもしれない。 最初は「より良いキャリブレーション機能」を目指したが、結果的には「キャリブレーションを必要としないシンプルな実装」が最適解だった。時には、機能を増やすことよりも、不要な複雑さを取り除くことの方が価値がある。 組込み開発で成功するためには、技術的な知識だけでなく、制約の中で最適なバランスを見つける知恵が必要だということを、学ぶことができた。

参考リンク

https://github.com/DFRobot/pxt-maqueen

https://microbit-micropython.readthedocs.io/

, ,