写真 青い空と雲と建物と木々の緑

nishimotzの日記

  • 電子工作のための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 も、教材が充実してくれば、子どもの遊びやプログラミングの教育に使えるのではないでしょうか。

  • 如法会 2 と「2つのPython」

    如法会2の報告を書いていただいたのですが、過大に評価していただいたようなので言い訳を書きます。
    私のトークはこういう内容でした。
    Pythonで統計や機械学習という記事、文献、書籍がこの1年くらい日本語でもどんどん出版されています。
    私は英語の書籍も含めてそうした資料をいろいろ読んでいて「いわゆる PyData とオリジナルの Python は本当に同じ言語仕様なんだろうか」と疑問に感じてきました。
    そこで NumPy が Python という言語をどのように拡張しているのか、という観点から資料を探していたら見つけたのが神嶌さんの「機械学習とPythonとの出会い」でした。
    無料で公開されている文献なら紹介しやすいし、単純ベイズだけを扱っているので、やりたいことはわかりやすい。通して読んでみたのですが、さて勉強会で紹介するとしたら「単純ベイズ」のところだけが難しく感じられるだろうなあ。そう思って準備したのが「『機械学習とPythonとの出会い』との出会い」でした。
    このテキストを説明しようとして、別の文献をいろいろ読むことになったので、私自身も勉強のきっかけになりました。また、いわゆる Jupyter Notebook をスライドのように使う方法もあわせて勉強させてもらいました。
    1990年代の音声認識技術からパターン認識の分野に関わったので、ひとつのアプリケーションで有用な技術がどう他の対象に応用できるか、といった発想で物事を考えることはあいかわらず多く、そういうことが(データさえあれば)すぐに形にできる時代になったのはすごいことだなあと思いつつ、一見時代遅れのパターン認識手法をどこかでしゃべるのも、なにか新しいことに役立つかも、と思ったりもします。
    Pythonのエコシステムが機械学習をコモディティ化してしまった現実に凄まじさすら感じた、というのが私にとっての PyCon JP 2016 でしたが、オマケのように喋ったのが「2つのPython」というキーワードでした。
    Python 2 と Python 3 ですよね、と思われるかも知れませんが、もうその話は終わってたんだな、ということを東京で納得してきました。
    むしろ新たな「2つのPython」は、簡単に言えば pip でパッケージ管理される公式 Python の世界と、Anaconda に代表される数値計算コミュニティ向け Python の世界ですね。いろいろ温度差があるということを薄々感じ始めています。。
    このニーズや方向性の微妙に違う2つのコミュニティが関わり合って未来の Python が作られている、その現場を私は PyCon JP で見た気がしました。
    コミュニティが分断されないためには多様性が尊重されるカンファレンスの場が必要なのだ、ということも強く感じました。
    如法さんのブログでは PyCon mini Hiroshima 2016 (11月12日開催)でこの続きが聞きたいと書いておられましたが、取っておこうと思ったことを如法会で喋ってしまい、大したことでもなかったな、と思えてしまったので、私はたぶん別の話を(時間があれば)すると思います。
    実は講演プロポーザルの締切を10月5日まで延長したので、まだ講演の提案をお待ちしているところです。詳しくは connpass をご参照ください。最後はまたイベントの宣伝になってしまってすみません。

  • PyCon JP 2016 ポスター発表: NVDA の開発とコミュニティ活動

    9月21日と22日の2日間、PyCon JP 2016 に参加しました。2日目に「スクリーンリーダー NVDA の開発とコミュニティ活動」というポスター発表をしました。多くの人に見ていただけたようです。長い時間をかけてこちらの話に付き合ってくださったかたも多かったです。
    PyCon JP 2016 ポスターの前に立つ西本
    23日には開発スプリントのリーダーとして、NVDA 日本語版の開発の具体的な作業を紹介、そして Python でアドオンを開発するチュートリアルなどを行いました。メンバー4人で楽しくハッカソン的な時間を過ごしました。
    NVDA日本語チームは2013年からユーザーを対象にしたイベントを行ってきましたが、今年、方針を変更してこういう技術者向けイベントに参加しました。結果として、より多くの人にNVDAを知ってもらったり、コミュニティのメンバーを広げたりする手段になったと感じています。
    特に今年の PyCon JP は「多様性」がキーノートや講演でも取り上げられました。そのような中で、アクセシビリティの話が、多様性についての視野を広げるお役に立てていたらうれしいです。
    PyCon JP の参加を通じて得た知識、気づいたことなどは、また改めて書いたり喋ったりしたいと思います。
    11月12日開催の PyCon mini Hiroshima 2016 も「視覚や聴覚に障害をお持ちのかたを含めて、 誰にでも参加して楽しんでいただけるイベント」を目指しています。発表のプロポーザルを9月30日まで募集しています。
    それから10月2日に広島での勉強会で Python と機械学習をテーマにLTをしようと思っています。こちらもよろしくお願いします。