MicroPythonで寿司を回してみた

Posted by 技術ブログ by Strawhat.net on Thursday, December 22, 2016

これは、Python Advent Calendar 2016の22日目の記事です。

MicroPythonスクリプトをマイコンボードに配置してPCから切り離した状態で実行させる方法と、その応用例として寿司を回してみた例を紹介します。

MicroPythonでのマイコンアプリ開発

Web、機械学習、数値計算をはじめ、様々な分野で利用されているPythonですが、ken5owataさんのPython Advent Calendar 2016の10日目の記事「micropythonを始めよう(ESP8266編)」で紹介されているように、MicroPythonを使ってマイコンのアプリを開発することもできます。

MicroPythonの詳細は先ほどの記事で説明されているので割愛しますが、国内で安価に入手できるESP8266に対応しているメリットがあると思います。今回もESPr Developer(ESP-WROOM-02開発ボード)を使って説明をします。なお、先ほどの記事でも書かれていますが、MicroPythonファームウェアヘの更新で工事設計認証に影響を及ぼす可能性がある点は注意が必要です。この点がクリアされるといいのですが。

MicroPythonボードへのスクリプトの配置

MicroPythonはPCとシリアル接続して、REPL(Read Evaluate Print Loopの略)を使ってPCから対話的にPythonスクリプトを評価・実行できる特徴があります。MicroPythonを学習したり、コードを検証しているときはとても便利な機能なのですが、マイコンをPCから切り離してガジェットとして動作させるときには使えない方法です。

そこで、スクリプトをESP8266に配置して、PCと接続されていない状態でも実行できる方法がないか調べてみて、見つけたツールがadafrui-ampyです。

(参考)Adafruitによる解説記事

ampyはシリアル通信を用いて、MicroPythonボードのファイルを操作したり、指定したPC上のPythonスクリプトをMicroPythonボードで実行できるツールです。ボード上のファイル操作をできるツールは他にありますが、PC上のファイルを指定してボードで実行できる機能はampyの特徴かと思います。

インストール方法

ampyはpipでインストールできます。

C:\temp>pip install adafruit-ampy
Collecting adafruit-ampy
  Downloading adafruit_ampy-0.6.3-py2.py3-none-any.whl
Requirement already satisfied (use --upgrade to upgrade): click in c:\python\winpython-64bit-3.5.2.3qt5\python-3.5.2.amd64\lib\site-packages (from adafruit-ampy)
Requirement already satisfied (use --upgrade to upgrade): pyserial in c:\python\winpython-64bit-3.5.2.3qt5\python-3.5.2.amd64\lib\site-packages (from adafruit-ampy)
Installing collected packages: adafruit-ampy
Successfully installed adafruit-ampy-0.6.3

ampyでの操作方法

まずampyのヘルプを見てみます。

C:\temp>ampy --help
Usage: ampy [OPTIONS] COMMAND [ARGS]...

  ampy - Adafruit MicroPython Tool

  Ampy is a tool to control MicroPython boards over a serial connection.
  Using ampy you can manipulate files on the board's internal filesystem and
  even run scripts.

Options:
  -p, --port PORT  Name of serial port for connected board.  Can optionally
                   specify with AMPY_PORT environemnt variable.  [required]
  -b, --baud BAUD  Baud rate for the serial connection (default 115200).  Can
                   optionally specify with AMPY_BAUD environment variable.
  --version        Show the version and exit.
  --help           Show this message and exit.

Commands:
  get    Retrieve a file from the board.
  ls     List contents of a directory on the board.
  mkdir  Create a directory on the board.
  put    Put a file on the board.
  reset  Perform soft reset/reboot of the board.
  rm     Remove a file from the board.
  run    Run a script and print its output.

ヘルプからわかるように、ampyでできることは以下の4種類です。

  • ボード上のファイル操作(PCへのファイル取得、一覧表示、PCからのファイル配置、削除)
  • ボードでのディレクトリ作成
  • ボードのソフトリセットとリブート
  • (引数に指定したPC上の)Pythonスクリプトの実行と結果の表示

操作するときはMicroPythonボードをシリアル接続して、そのCOMポート番号を-pオプションに指定します。ボードレートは指定しなくても問題ないと思います。

ファイル操作の例

ampy get/ls/put/rmコマンドでMicroPythonボード上のファイルを取得・一覧表示・配置・削除できます。

ちなみに、putコマンドでのファイルの配置では、ボード上のファイル名を指定することもできて、コマンドの最後にフルパスで記述します。

C:\temp>ampy -p COM5 ls
boot.py
webrepl_cfg.py
data.py
main.py

C:\temp>ampy -p COM5 put hello.py /main.py

C:\temp>ampy -p COM5 get main.py

C:\temp>ampy -p COM5 rm main.py

Pythonスクリプトの実行例

ampy runコマンドを使うと、PCにあるPythonスクリプトをMicroPythonボードで実行できます。例外が発生した場合のスタックトレースは、ampyコマンドを実行しているターミナル画面に表示されます。Pythonスクリプトの開発中は、このコマンドでデバッグできます。

C:\temp>ampy -p COM5 run hello.py
(出力は省略)

PCから切り離したMicroPythonボードでスクリプトを実行する方法

MicroPythonボードは、電源が投入されたときに実行される2種類のファイルがあります。

  • boot.py: 電源が投入されるとはじめに実行されるスクリプト

  • main.py: boot.pyの後に実行されるスクリプト

(参考)3. The internal filesystem — MicroPython 1.9.1 documentation…

そこで、MicroPythonボードで実行したスクリプトをampy putコマンドでmain.pyとしてボードに配置すれば、 PCと接続していなくても実行することができます。

応用例:ESP-WROOM-02+AQM1248Aで寿司を回す

MicroPythonスクリプトをマイコンボード単体で実行できることが分かったら、次は寿司を回したくなるものです。 さっそくESPr DeveloperにSPI接続の小型グラフィック液晶ボード AQM1248Aをつないで、寿司を回してみました。

ソースコードはこちらで公開しています。コード自体の説明は別の記事にまとめることにします。

MicroPythonSushiRotator

これを実行するためには、まずESPr DeveloperとAQM1248Aを接続します。

20161221230850png 20161221062702jpg

次に、ampy putコマンドでdata.pyファイルとSushiRotator_ESP8266_AQM1248A_SPI.pyファイル(ボード上の名前をmain.pyとする)をESP-WROOM-02に配置します。

C:\temp>ampy -p COM5 put data.py

C:\temp>ampy -p COM5 put SushiRotator_ESP8266_AQM1248A_SPI.py /main.py

この状態でESPr DeveloperのマイクロUSB端子に電源をつなぐと、液晶ボードに寿司が回り始めます。これで、どこでも寿司を回すことができますね。実際にモバイルバッテリーで動作させている様子を動画で見てください。

遅い…

寿司の移動がだいぶ遅いのと、寿司が1組だけで寂しいので、もっと回転寿司らしく動くように改善したいと思います。

まとめ

手になじんだPythonでマイコンのアプリを開発できるMicroPythonはとても魅力的です。 開発環境も、シリアル接続したマイコンでREPLを使って対話的にコードを実行できるだけでなく、ampyコマンドでスクリプトファイルを実行したり、マイコンボードに配置して単独で実行できたりします。

現時点ではMicroPythonをサポートしたIDEを知らないのですが、ampyのようなツールもあるので、いずれはIDEでサポートされるのではないかと期待しています。

明日の担当はJoJeongMinさんです。よろしくお願いします。