はじめに
今回は手頃な価格で人気上昇中の中華IoTモジュールについてその開発方法や注意事項について紹介いたします。
注意事項 - 本記の掲載内容について
今回の記事に掲載されている内容について一部非公式な情報を含んでおります。そのため弊社側では記事内容を用いたことによる損害や責任等については負いかねますので、あらかじめ了承ください。
安価でも実力派の中華IoTモジュール
・なぜ安価になるのか
今までのIoT向けチップはスマホやタブレット向けに開発された無線チップと汎用の32ビットマイコンを組み合わせた構成が多数を占めています。しかしこの構成では無線チップとマイコンで製品価格が決まってしまうため抜本的なコストダウンを行うことができませんでした。また国内では小型化に迫られて力技でSIPモジュール化してしまったものもありさらにコストが上がる要因となっています。
今回紹介するモジュールの特徴は、これらの部分をカスタムLSIとして構築し、全てのソフトウェア階層を1チップでこなすようにしていることにあります。
参考資料:ESP8266EXのダイ写真
URL:https://github.com/esp8266/esp8266-wiki/wiki/chip-internals
見るからに高周波アナログ&大規模デジタル回路の混載LSIです。さらに不揮発メモリ混載せず作りやすい製造プロセスに落とし込んでいるところが低価格化への鍵なのではないかと思われます。
また価格に関しても、もし割高なら即コピー品が出回るお国柄ですので自然と低価格となるわけです。
・購入方法
日本国内では次の業者さんより入手することができます。※2015年7月16日現在、人気のあまり全てのオンラインストアでも売り切れ状態になっています。
http://cerevo.shop-pro.jp/?pid=91592223
https://www.switch-science.com/catalog/2347/
http://www.amazon.co.jp/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%83%86%E3%82%AF%E3%83%8B%E3%82%AB-ESP-WROOM-02-ESP8266EX%E6%90%AD%E8%BC%89%E3%80%80WiFi-UART%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%EF%BC%88%E6%8A%80%E9%81%A9%E5%8F%96%E5%BE%97%E6%B8%88%E3%81%BF%EF%BC%89ESP-WROOM-02/dp/B00ZWS8L3I/ref=sr_1_1?ie=UTF8&qid=1437030581&sr=8-1&keywords=esp8266
中華IoTモジュールの概要
ESP-WROOM-02モジュールおよびSoCは中国上海のEspressif Systems社が製造したものになります。Espressif社からは今まで類似したモジュールが多数出ており、無線好きなハッカー達にとって格好のオモチャになっていました。今回、最新のESP-WROOM-02が技適マーク付きとなり、さらに人気が出ています。・外部端子
このモジュールの外部端子は次のようになっています。外部に出ている端子のうちGPIO0,GPIO2,GPIO15はリセット時に起動モード選択に使われており、接続できる回路はモード選択と競合しないものに限られます。U0-TXDとU0-RXDはファームウェアのダウンロードに用いられますので通常動作時はシリアルポートとして使うのが無難だと思います。RST端子はLowActive信号ですので使用しないときは10KΩ程度の抵抗を用いてプルアップしておいてください。EN端子はモジュール有効化入力です。通常は10KΩ程度の抵抗を用いてプルアップしておきます。
起動モードの選択方法については次のようになっています。
○通常起動(boot from SPI-ROM)
GPIO0 = High
GPIO2 = High
GPIO15 = Low
○UARTダウンロード
GPIO0 = High
GPIO2 = Low
GPIO15 = Low
上記の基板の場合は赤色で示した部分がショートプラグで選択できるようになっており、お手軽にモード選択をすることが出来ます。
・搭載CPU、デバイス
CPUはTensilicaというIPコアを使用しています。2000年代前半にASICをやったことのある人ならば「なんて懐かしいもの使っているんだぁ!」と叫びたくなるCPUです。Tensilica自身はEDAベンダのケイデンスに買収されてはいますが、現在も多くのSoCの隙間に入っているようです。Espressif社も2015年1月にケイデンスからTensilica L106というIPライセンスを受けています。
インターフェイスについてはESP8266というSoCのピン数が少ないこともあり、外部で使用できる機能は最小限に抑えられています。
<公式データシート"ESP8266__WROOM_WiFi_Module_Datasheet__EN_v0.3"より引用>
・ファームウェア
ファームウェアは我々がよく見かける1チップマイコンとは異なり、外付けROMから内部RAMにコピーし、RAM上で実行されるようになっています。ROMのアドレスとファームウェア領域は次のようになっています (SDK version 0.8 以降)
00000hから始まるUser application 領域にユーザアプリケーションを格納します。また40000hから始まるSDK Libraries領域にはESP8266のベースバンドファームウェアも含むSDKを格納します。
7C000hと7E000hのConfigration 領域はデバイスに設定するパラメータが入っていますので、この部分は弄らないようにしましょう。
<tips> 技適を失効しないために
ESP8266を用いた製品は全てのデータが外付けSPI-ROMに格納されているため、ユーザーが製品の特性を容易に改変することが可能となっています。もし特性が申請時の範囲を逸脱してしまうと技術基準適合証明が無効となり違法な改造無線機という扱いとなります。つまりファームウェア書き換えは限りなくグレー領域の行為にあたります。
特にネットから非正規のファームウェアを入手し書き込んだ場合は、製品規格を維持できているか確認する術も無く完全にクロということになります。
そこで現時点では製品の動作スペックに関わる部分が出荷時のまま維持され規格の適合外ならないよう努力する必要があります。
製品の特性を決定しているデータは7C000hに格納されているデフォルト設定データと7E000hに格納されている設定データにあります。これらに関しては不用意に書き換えたりしないよう注意して下さい。
厳密に言うとSDKライブラリ内に含まれるいくつかのバイナリファイルも適用範囲に入りますが、これらに関しては改変するための手段が用意されておらず公式SDKライブラリのみを使うことになるので特性逸脱に繋がることは少ないと思われます。
ただし、この事項に関しては本来我々のようなユーザーが独自判断で考えるべきことではなく、製造メーカもしくは輸入代理店が製品の将来性を考慮したうえで明確な見解を持っていただけることを期待します。
ソフトウェア開発環境
ソフトウェア開発環境について今回は次のような手順に従い準備を行っていきます。1) ビルド関連ツールのダウンロード
2) ツールチェインの準備
3) 関連ツールのダウンロード
4) SDKのダウンロード
公式サポートサイト(http://bbs.espressif.com/)では断片的な情報しか掲載されていないことから今回は次のURLの情報を参考に多少アレンジしたものを掲載いたします。
https://github.com/esp8266/esp8266-wiki/wiki
また今回はubuntu 14.04.02 LTSを用いた事例として作業手順を記載しております。もし他のOSバージョンをお使いになる場合は各自で依存関係を調整してください。
・ビルド関連ツールのダウンロード
AndroidをやGCCをソースからビルドしたことのある方には馴染みの作業です。GCCやPythonなどのツールをダウンロードします。$ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get install git autoconf build-essential gperf bison flex texinfo libtool libncurses5-dev $ sudo apt-get install wget gawk $ sudo apt-get install libc6-dev-amd64 libexpat-dev g++
また今回利用するSDKでは Python 2.7を必須としています。ubuntu 14.04ではデフォルトでインストールされているはずですのでバージョンのみ確認を行います。
$ python --version Python 2.7.6
・ツールチェインの準備
このモジュールで使われているCPUはTensilicaのIPコアをベースにしています。ARMやx86などとは異なりマイナー路線なCPUであることからビルド済みツールチェインを入手することができません。そのためツールチェインのソース配布を行っているGNUからソースコードをダウンロードしビルドを行います。$ mkdir ~/build_sdk $ cd ~/build_sdk $ git clone -b lx106 git://github.com/jcmvbkbc/crosstool-NG.git $ cd crosstool-NG $ ./bootstrap $ ./configure --prefix=/opt/Espressif $ make $ sudo make install $ ./ct-ng xtensa-lx106-elf $ ./ct-ng buildGNUのFTPサイトからソースコードをダウンロードするため非常に時間がかかります(30分~1時間)
ビルドが成功するとbuildsフォルダ以下にバイナリが生成されていますので/opt/Espressif以下にコピーします
$ sudo cp -r builds/xtensa-lx106-elf /opt/Espressif/
ファームウェアビルドの際にツールチェインが参照されるようPATH変数を更新します
$ PATH=/opt/Espressif/xtensa-lx106-elf/bin:$PATH
・関連ツールのダウンロード
書き込みツール$ cd /opt/Espressif/bin sudo git clone https://github.com/themadinventor/esptool esptool-py
・SDKのダウンロード
このSDKはビルド時の一時ファイルをSDKフォルダ内に作成するようになっているため複数の作業者で共有することができません。そのため作業者のフォルダにダウンロードしますSDKのバージョンは掲載時最新の15_07_03を使用しています
$ cd ~/build_sdk $ wget -O esp_iot_sdk_v1.2.0_15_07_03.zip https://github.com/esp8266/esp8266-wiki/raw/master/sdk/esp_iot_sdk_v1.2.0_15_07_03.zip $ unzip esp_iot_sdk_v1.2.0_15_07_03.zip $ mv esp_iot_sdk_v1.2.0 ~/ESP8266_SDK $ mv License ~/ESP8266_SDK/ $ wget -O include.tgz https://github.com/esp8266/esp8266-wiki/raw/master/include.tgz $ tar -xvzf include.tgz $ mv include/* ~/ESP8266_SDK/include/
ビルドに必要なライブラリを追加します
$ cd ~/ESP8266_SDK $ wget -O lib/libc.a https://github.com/esp8266/esp8266-wiki/raw/master/libs/libc.a $ wget -O lib/libhal.a https://github.com/esp8266/esp8266-wiki/raw/master/libs/libhal.a
書き込みツール
$ cd /opt/Espressif/bin $ sudo git clone https://github.com/themadinventor/esptool esptool-py
アプリケーション開発
・モジュール搭載ハードウェアの準備
今回はcerevo社より購入したESP-WROOM-02とブレイクアウト基板を用いてハードウェアを作成しました。ファームウェアのダウンロードおよびATコマンドの入力のために秋月電子製のUSBシリアル変換基板を使用しています。なおUSBシリアル変換基板に付いている3.3V出力は100mA程度の出力しかなく最大200mA以上を使用するESP-WROOM-02を動作させることができないことから、500mAクラスの3端子レギュレータを用いて3.3Vの電源を作っています。
またサンプルプログラムの動作確認のためにGPIO2にLEDを接続しています。
今回使用したcerevo社のブレイクアウトボードには起動モード設定を行うためのパターンが付いていますが、このままハンダで繋いでしまうとサンプルプログラムで使用しているGPIOが使えなくなってしまいます。そこで10KΩのチップ抵抗を載せてモード選択とGPIOの両方が使えるようにしています。
(7/19追補) ファームウェアのダウンロード時にGPIO2が出力となることが判明しました。この基板で上記パターンをハンダ接続してしまうとGPIO2が短絡状態になりますので、必ず抵抗を用いてモード選択を行うようにしてください。
・まずはLチカ
ハードウェアの動作確認として定番のLチカ(LED点滅)を動かしてみましょう。既にサンプルコードが公開されていますのでそれを利用します。
ダウンロードを行います
$ cd ~/ESP8266_SDK $ git clone https://github.com/esp8266/source-code-examples.git $ cd source-code-examples/blinky
エディタでuser/user_main.cを編集
ESP8266_SDK_1.1.0以降、ユーザRF初期化関数 user_rf_pre_init() を実装する必要があります
user_main.cにダミーの関数を追加します
echo -e "\nvoid user_rf_pre_init(void)\n{\n}\n" >> user/user_main.c
ビルドを行います。環境変数にSDKのインストールパスを指定しmakeコマンドでビルドを行います。
$ export SDK_BASE=~/ESP8266_SDK $ export XTENSA_TOOLS_ROOT=/opt/Espressif/xtensa-lx106-elf/bin $ export ESPTOOL=/opt/Espressif/blin/esptool-py/esptool.py $ make clean;make
書き込み
ブレイクアウトボート上にあるショートプラグをDownload(UART-Boot)側に切り替えたのち、開発環境が入ったPCとUSBケーブル接続します。
次に書き込みコマンドを実行するとモジュールへのダウンロードが開始されます。
ここではハードウェアが/dev/ttyUSB0で認識されていることが前提となっています。もし/dev/ttyUSB0以外のデバイスとして認識された場合はMakefileを書き換えてください。
$ make flash
(7/19追補) デフォルト状態では /dev/ttyUSB0 は一般ユーザからのアクセスが行えないことから /etc/udev/rules.d/50-udev.rulesに次の行を追加しアクセス制限を緩くしておくとよいでしょう
KERNEL=="ttyUSB*",NAME="%k",GROUP="uucp",MODE="666"
ダウンロードが成功するとモジュールが再起動しLEDの点滅が開始されます。
内蔵ROMにファームウェアから起動する場合はショートプラグを"Boot From SPI"側に切り替えてください。
なおサンプルプログラムにはLチカ以外に割り込み等の例も含まれていますので、読み解いていくとESP8266の使い方が見えてきて面白いかと思います。
・標準ファームウェアをアップグレード
今度は出荷時に書き込まれているファームウェアのアップグレートを行います。$ cd ~/ESP8266_SDK $ cp -r examples/at . $ cd at $ make clean $ make COMPILE=gcc
成功すると~/ESP8266_SDK/binにバイナリが保存されます。
書き込み
ブレイクアウトボート上にあるショートプラグをUART-BOOT側に切り替えたのち、開発環境が入ったPCとUSBケーブル接続します。
次のコマンドを実行するとモジュールへのダウンロードが開始されます。
ここではハードウェアが/dev/ttyUSB0で認識されていることが前提となっています。もし/dev/ttyUSB0以外のデバイスとして認識された場合はデバイス名部分を書き換えるようにしてください。
$sudo /opt/Espressif/bin/esptool-py/esptool.py --port /dev/ttyUSB0 write_flash 0x00000 ../bin/eagle.flash.bin 0x40000 ../bin/eagle.irom0text.bin
ダウンロードが成功するとモジュールが再起動し新しいファームウェアで動作が開始されます。
ターミナルソフト使いUSBシリアルに接続します。
通信条件は15200bps 8bit NP 1stop 改行CR+LFです。
ATコマンドを入力すると次のような応答が帰ってくれば、ファーム更新が成功しています
AT+GMR[Enter] AT version:0.30.0.0(Jul 3 2015 19:35:49) SDK version:1.2.0 compile time:Jul 13 2015 22:02:34 OK
ちなみに出荷版のときは次のバージョンとなっていました。
AT version:0.23.0.0(Apr 24 2015 21:11:01) SDK version:1.0.1 compile time:May 5 2015 14:03:58
SDKの中には標準ファームウェア以外に数種類のサンプルコードが含まれており、これらを流用することにより独自のファームウェアを作成することができます。ビルドが通らないものもありますが以外と簡単に回避できるものばかりですのでいろいろ試してみると面白いと思います。
まとめ
今回は中華IoTモジュールについて開発環境とネイティブアプリの作成方法について掲載いたしました。 既存のATコマンドベースのモジュールに比べて自分のアプリがモジュール上で動くということがどんなに有用であるかご理解頂けたかと思います。本記事は今回限りで終了しますがIoTデバイス界に新しい流れが出てきたときには再度記事を掲載していきたいと思います。記載されている会社名、および商品名等は、各社の商標または登録商標です。
有意義なページをありがとうございます。感謝します。
返信削除export ESPTOOL=/opt/Espressif/blin/esptool-py/esptool.py
は
export ESPTOOL=/opt/Espressif/bin/esptool-py/esptool.py
ですよね。