「IoTフロントエンド開発」を考えるシリーズ　④MicroPythonでIoTプロトタイピング　その１

#序

農地などの屋外で、IoT機器を用いる、いわゆるフィールドIoTに興味を持っている。この分野でのIoT機器の普及のカギは、各フィールドで機能をカスタマイズできる柔軟性と機器あたりのコストの低減と考えている。以下、こうした分野での入門に役立ちそうな、組込機器向けpython環境のMicroPythonを取り上げていく。

MicroPython、要注目♪　


![](https://raw.githubusercontent.com/micropython/micropython/master/logo/upython-with-micro.jpg)

（グクりやすいキーワードなので、気になった人は、各自でグクってね。）

#IoT向けにMicroPythonに注目する理由

##ラズパイより低スペックな機器で動作。

教育用シングルボードコンピュータとして有名なRaspberry pi(ラズパイ)は、2016年には約200万台が産業用途向けとして出荷されたという。
出典　[なぜ「ラズパイ」が産業機器向けに伸びているのか](http://techfactory.itmedia.co.jp/tf/articles/1612/28/news010.html)

委細は、組み込み系メディアの解説を参考にするとして、教育向け、あるいは、「素人」向けのラズパイが、産業用コンピュータとして広く活用されるようになった現実は興味深い。

今回注目するmicropythonは、安価なものは小売価格数百円で購入できるSTM32等のマイコンボード上でpythonベースでI/O制御等が行えるもの。公式サイトでは、*"MicroPython employs many advanced coding techniques, and lots of tricks to maintain a compact size while still having a full set of features."*と、技を尽くしてコンパクトでフル機能のpythonを作り上げていく決意が述べられている。MicroPythonの作り手がギークであるのは間違いないとして、作り上げられたMicroPython環境はready to useであり、REPLを使って一歩一歩試していけるなど、けっこう使い手にやさしい(少なくとも、組込系に縁のないITエンジニアでもなじめそうなほどには)。

リファレンスボードであるpyboardのスペックは以下のような感じ(委細は、公式サイトを参考のこと)

- STM32F405RG microcontroller
- 168 MHz Cortex M4 CPU with hardware floating point
- 1024KiB flash ROM and 192KiB RAM
- 4つのLED、GPIO、DAC(デジアナ変換)などなど

200KB以下のRAM容量でpythonが動作することが分かる（「マイコン」の中ではリッチな環境だけどね）。

私は、以前から、STM32マイコンボード程度のスペックでC言語よりも高級(?)な言語が動作して、ネットワーク通信を行えるようになることが、IoT機器普及のキープレイヤーになるのではと思っている。MicroPythonは、その候補のひとつと考えられる。もちろん、lua/mruby/軽量javascriptなども間違いなく魅力的な候補者となっいくだろう。ただ、既に実ユーザーが登場しているMicroPythonは、一歩抜きんでいるものと考える。


##これからの数年で起きるかもしれないこと。

新年らしく、MicroPython的な言語が搭載されたマイコンボードの５年後を初夢的に書いておこう。

> ①今から５年後の2022年。アジア/アフリカの農村部で、IoTによる農業生産性向上の実証が行われている(世銀か何かの少額の助成金が使われいる)。導入されたのは、１台数十円で小口購入できるマイコンボードに防水防塵加工が施されたセンサー機器。MicroPython的なスクリプト言語が動作する。各マイコンボードは村人n人にm台ずつ手渡され、皆、それらを各自が管理する農地やその周辺地域の土に差し込んでいる。

- n×m=10,000台程度で、100万円強の調達原価、かな。

> ②NGO職員によるマイコンボード設定教室が開催され、マイコンボード上にスクリプト言語を導入するためのグラフィカルな開発環境が説明される。この開発環境では、10000万台の機器を俯瞰でき、「枯れそうな植物をレポートさせる」といった粒度での各マイコンボードをカスタマイズできる。

- なんとなくSqueakの発展版みたいな開発環境を想定している。アラン・ケイ博士のSqueak(Smalltalk-80)は、eToy分野で割合と有名。以下の「手書きの車を走らせる」（以下　例）的な奴だ。こうした抽象化力をIoToy的に(?)発展させていくこと勝手に期待。実際には、AIの活用は必須だろうね。
https://youtu.be/DXMScjdzl_I?t=8m10s

> ③（ここからは実現するまではただの理想論なので、アフリカ前提であえて箇条書き風に。）農村の人々は、マイコンボード10000台をX平方キロメールに設置。全体からのレポートを人々は、中間技術的に活用し、多くのアフリカ農村に共通する課題である「水不足」の問題にできるようになっていく。数年後、村の生産組合は、生産予測レポートを近隣都市に送り、村人の所得向上につなげていく。

- ODA予算などを駆使して国際協力に取り組む「援助業界」の方々からは、技術先行のただの夢想に見えてしまうだろうし、事実、技術そのものは単なる下支えにすぎない。ただ技術なくしては突破不可能な事柄はある。仮にノードあたり30円のセンサー機器が登場すれば、国際線のジェット機で、援助業界の人々が１万人が飛ぶくらいのお金で、農地の状態をレポートできる数千万台のセンサーネットワークが構築できるようになるだろう(付加価値次第では民間ビジネスになっていくだろう)。
- 単なる夢想なので委細は書かないが、キーとなる通信技術は、IoT向けの携帯電話網に加え、衛星通信技術及び、Bluetooth 5以降のBluetooth技術あたりか。

参考　[Bluetooth SIG、「Bluetooth 5」を発表——複雑化するIoT環境に対応する機能拡張](https://fabcross.jp/news/2016/20161228_bluetooth5.html?fm=side_news)

#MicroPythonの概要

##公式サイトとコード例
参考　MicroPython公式サイト　https://micropython.org

トップページのコード例がなかなかキャッチー。

いかにも、な「LEDチカ」の例から、

```led.py
import pyb

# turn on an LED
pyb.LED(1).on()

```

「ふつうのpython」的なSDカードからのファイル読み取りまで。

```os.py
import os

# list root directory
print(os.listdir('/'))

# print current directory
print(os.getcwd())

# open and read a file from the SD card
with open('/sd/readme.txt') as f:
    print(f.read())
```

## 私が注目しているmicropythonの特徴

以下のあたり。

- micropythonは、C言語(C99)でスクラッチから実装された軽量python3である（MITライセンス）。
- ラズパイより低スペックのマシンで、pythonコードでのネットワーク通信が行える(現状で小売価格500円程度のボードでwifi通信可能)。
- C言語側での機能拡張が、FFIを介しスムーズに行えそう。
(例えば、音声読上機能の追加などローカル機能の拡張、JSONベースでのREST通信モジュールなどサーバ連携機能の拡張)

日本でも何人もの先人たちがトライしているので、そちらを参考にすることが良い。


#micropython開発環境の構築
micropythonは、C99のコンパイラを用いて、各種環境にビルドできる。OSがない環境の他、各種*nix環境にもビルドできる。
IoT素人(私)にとってはひとまず自身のLinux機でビルドできることは楽ちん。
せっかくなので、５年後ならば1000円程度となるのではないかと思われる低スペックな機器(中古のwindows vistaマシン(RAM 1GB)をSSD換装し、OSとして軽量Ubuntu16.04(32bit)を入れたもの)で取り組んでいく。

##ソースコードの入手とビルド
本家githubより、ソースコードを入手。
https://github.com/micropython/micropython
/unixフォルダ以下に、*nix向けのソースコードが置かれている。

すでにgccまたはclangが入っているUbuntuでは、以下をインストールするだけでビルドできた。

> sudo apt install libffi-dev pkg-config

Cのソースコードサイズが大きくないので、低スペックマシンでも、ビルドは２分くらいで完了。

##生成されたmicropythonバイナリ
ビルドが終わると単体で動作できる小さなpython3互換環境ができる(現時点のサイズは378KB)。どこまでpython3互換か試してみると良いだろう。
バージョン確認しつつREPLを起動できる。

![micropyREPL.png](https://qiita-image-store.s3.amazonaws.com/0/16455/4780f9cd-e75c-374c-f0b9-8c53a22cc0e6.png)

##ソースコードを読み解き、カスタマイズしていくために。
- (付記) 低スペックなlinux環境では、ソースコードの閲覧にsublimetext3を活用するのが快適そう。数十万行のソースコードを開くのも一瞬だし、バイナリもそのまま開いてくれる。

ソースコードを見て、拡張ポイントを探る。クロスコンパイルできるように配慮されているだけに、各環境ごとに用意されたmakefileが出発点となる。
/pyフォルダがmicropython本体で、各種環境向けのmakefileから参照されている。

※例　unix向けのmakefile冒頭部

```makefile
-include mpconfigport.mk
include ../py/mkenv.mk

FROZEN_DIR = scripts

# define main target
PROG = micropython

# qstr definitions (must come before including py.mk)
QSTR_DEFS = qstrdefsport.h

# OS name, for simple autoconfig
UNAME_S := $(shell uname -s)

# include py core make definitions
include ../py/py.mk

（以下略）

```

カスタマイズの方向性としては、以下が考えられる。

- pythonインタープリタのコマンド自体を追加する。
- pythonから呼び出すC言語ライブラリを追加する。

私のイメージは、pythonのREPLで試して動いた機能のうち、有用なものをCのライブラリに「固めていく」アプローチだ。

#今後は。
現時点では、インターネット4.0的なフィールドIoTの普及は道半ば(はじまったばかり)といったところ。また、MircoPythonは私の仕事とは全く関係ない。そして、いわゆる国際協力の分野でのIoT活用でめぼしい事例はほとんどないのだろう。

今が「仕込み時」と考えている。
ほおっておけば機器が錆びついていくフィールドIoT分野。けっこうなコストがかかるためか、ここ１０年位をふりかえってみるに、その進歩の道は意外と遅い。そのためには、さまざまな技術アプローチが必要であり、いろいろなソリューションが活用される可能性がある。

オリンピックイヤーの前までにそれなりの成果を出せば、トップランナーとなれるかもしれない。
だから，[「IoTフロントエンド開発」を考えるシリーズ　①IoT時代の実装言語Nim](http://qiita.com/kmry2045/items/7c8265cafe8de46dab4f)を書いた頃から、以下のあたりを考え中。

- 小型超省電力のIoT機器の振る舞いをC言語ベースでを効率よくカスタマイズするにnimの活用していきたい ※[参考](http://qiita.com/kmry2045/items/28133dd2aea3333c3269)。
- 数千万台におよぶフィールドIoT機器のデータをなるべく確実に保存し、処理するためのサーバ側の実装を進めたい(ここは昼間の仕事で少し似たようなことをしている。もちろん、お手軽な解も登場してきている[^1])。
- 自動車、農業機械など、動力源があるフィールドユーザー向けの機器と連携していきたい(物流まで統合されていけば、モビリティIoT分野のターゲットともなっていく)。
- サーバ側に蓄えられたデータの真正性を中長期的に追求できる仕組みを用意したい(ブロックチェーンの活用を考え中)　※[参考](http://qiita.com/kmry2045/items/37c907a4c2b4c714b268)
- IoT機器とフィールドに関わるユーザーとのインターフェース(対話的なものが望ましい気がしている。)　Smalltalk環境の歴史的な教育環境が活きるのかも。　※[参考](http://qiita.com/kmry2045/items/bc74b67a4a368c98e24a)

すべてに通底するのは、技術合理性と費用対効果だ。

私にとって次の一歩は、**Python <-->  C <--> Nim**という実行環境を実現することなので、次回はそのあたりから。


[^1]: 例えば、MilkCocoa https://mlkcca.com/sample.html