電子工作のためのPython: MicroPython on the ESP8266

2016年11月12日に PyCon mini Hiroshima 2016 を開催しました。
開催報告記事は準備中ですが、まず私の発表を紹介しておきます。


作ったプログラムと回路図

準備のためにいろいろ実験していた記録

過去のIoTLT広島での私の発表の記録

録画(YouTube)

質疑応答の時間に「産業界での利用状況は?」というコメントがあり、産業界というよりも教育分野での盛り上がり(BBC micro:bit 対応など)のことしか触れなかったのですが、Damien George さんの講演(YouTube GOTO2016 の動画)では「宇宙開発への応用のための SPARC 移植版」などに言及されていました。開発者がもともとそういう分野の出身なのだそうです。思い出せなくてすみませんでした。。

私の発表では ESP8266 での動作状況だけをお話しましたが、もともとのターゲットである PyBoard などの ARM 系 CPU については、実行時にバイトコードではなくCPUのネイティブ命令を生成する機能など、性能を上げる処理がいろいろ実現されています。

 

このブログ記事では、今回の発表をどのように準備したかを簡単に振り返っておきます。

まず9月末に ESPr One を入手し、MicroPython の書き込み、動作確認をしました。

そして手頃なセンサーやデバイスをいろいろESP8266の入出力につないでMicroPythonで動かしてみました。

明るさセンサー(NJL7502)は「IchigoJamではじめる電子工作&プログラミング (I・O BOOKS)」で紹介されていて、いずれ遊ぼうと思って入手していました。

また圧電サウンダ(ピエゾ圧電ブザー)は IchigoJamU に付属していたものをそのまま拝借しました。すでにモデルチェンジしているようなので、現在購入できるモデルにブザーがついているかどうかはわかりません。

超音波センサーHC-SR04は5月にソラコムのハンズオンをやった(IoTLT広島で紹介済み)ときのパーツです。
ESPr Oneからは5Vと3.3Vの両方の電源をとることができます。
HC-SR04は5V駆動で、ESP8266のGPIOは(Arduinoと同じ)3.3Vとのことなので、ECHO の入力側は抵抗で分圧しています。
こういうのは “Arduino 3.3V HC-SR04” で検索すると見つかるので、人気のあるパーツを選ぶと便利ですね。

MicroPython for ESP8266 の Quick Reference にはデジタルの入出力方式として SPI, I2C, OneWire が紹介されています。
今回 SPI は手頃なパーツがなかったので実験しませんでした。

I2C でつないだのは小型のディスプレイ(OLED)です。
MicroPython のライブラリや Adafruit のサイト記事や動画を見て SSD1306 というドライバーのものが簡単に使えると知ったので安価なものを Amazon で探しました。
TonyDさんは ssd1306.py を組み込んでビルドし直していますが、MicroPythonのソースに入っているドライバーファイルをWebREPLでアップロードすればそのまま動きました。メモリを節約したかったら組み込んでビルドしたほうがいいと思います。

OneWire は Quick Reference に書かれていた温度センサー DS18B20 をすでに入手していました。
Arduino や Raspberry Pi などの書籍や記事でよく出てくるパーツだったので買っておいたのでした。
手で触ると体温で温度が上がるのはわかるのですが、実際に組み合わせて使い道を思いつかなかったので、マイコンの起動直後に温度を表示して、18度から20度までの範囲だったら “good condition” と表示する、みたいな「しょうもない」使い方しかしていません。
OneWire はプルアップの抵抗が必要なのですが、ESPr One のボード内の(おそらくは Arduino のプログラミングモード切り替えのための)抵抗をそのまま使えるように GPIO のポート番号を選びました。

ESPr Oneにはスイッチがあって GPIO で値を読むことができますが、ボードをケースに入れてしまったせいで、細い棒のようなもので突かないと押せません。

じゃあ光センサーと超音波距離センサーをスイッチの代わりにするか、ということで、全体を「光線銃ゲーム」に仕立てることに決めました。

光センサーを「懐中電灯を当てたときに閾値を超える」ように AD 変換で使う抵抗の値を選び、超音波センサーは「距離測定を3回実行して80センチ未満が1回以上あったかどうか」を判定することで誤判定をなるべく回避するように実装しました。まあ誤判定しますけど。。

ゲームにつきものの乱数は MicroPython の math にはなくて os.urandom で得られるランダムなバイト列を使いました。

MicroPython の PWM は LED の明るさを変える目的で使われると思いますが、ここでは LED と圧電ブザーを並列につなぎ、メロディを流すのに使いました。
性能が足りないのか精度が足りないのか、高い音は綺麗に出ません。
音が出ているときはLEDも光ります。音を止める時は duty=0 にして信号が0になるようにしています。

ゲームそのものの実装とデバッグは本番直前の2〜3日でやりましたが、よく考えると(電子工作やマイコンに親しんでいた子供時代を含めて)人に見せるために電子工作やミニゲームを開発したのはこれが初めてだなあ、と思いました。

私が子供のころの電子工作はハンダ付けで組み立てるのが普通で、ブロックを組み合わせるような電子工作実験回路を羨ましく思ったものでした。
いま、こういう回路がブレッドボードで簡単に組み立てできて、入出力デバイスもモジュール化されて、マイコンとデジタルで繋がって、しかもPythonで対話的に開発、実行できる。
いい時代になったんだな、と素直に思った、そんなこの数日間でした。

私に懐かしい世界を思い出させてくれた IchigoJam も好きですが、MicroPython と ESP8266 も、教材が充実してくれば、子どもの遊びやプログラミングの教育に使えるのではないでしょうか。