こんにちは、春休みに入れて
とてもうれしい電装班長のマイケルです
前回のAndroid用マップの作り方ブログが割りと好評だったので、今回も情報系の人向けのテクニカルな内容とします。(実は引き継ぎ資料の一部として書いてます。お許しください。)
今回は今流行りのWi-FiモジュールであるESP8266について書いてみたりします。
ESP8266はArduinoIDE、PlatformIO、MicroPython、NodeMCU/LUAなど様々な方法で開発できる低価格Wi-Fiモジュールであり、うまく使えば無限に可能性は広がるものです。
「esp8266 使い方」とかでググると「IFTTT+LEDで簡単IoT!ESP8266で特定のハッシュタグのツイートがあったらLEDを光らせる」や「ESP8266でのサーバー機能の使い方」というように、大量のブログが出てくるのでたくさん調べれて学べば入門に関してはそんなに大変じゃないと思います。
そこで今回は主に「ググってもなかなか出てこない(気がする)ESP8266の機能」について少し紹介してみます。ESP8266内蔵のファイルシステムとデバッグ方法についてはなかなかネット上に使い方が最新版のドキュメンテーションを読めば全部わかりますが長いし(英語なので)なかなかツライですね。
今回は基本的に、主流のArduinoIDEを使う前提で話を進めます。
1. ファイルシステム(SPIFFS)について
現在日本で一般的に販売されているESP-WROOM-02には2MBのストレージが内蔵されており、1MBがプログラム用ストレージ、もう1MBがファイルシステム用のストレージに割り当てられている。ファイルシステム用のストレージにはSDカードと同じようにファイルの読み書きができます。
1MBのファイルシステム用ストレージを使ってみましょう。元ネタはこれです。
ArduinoIDEを使用している場合、パソコンから任意のファイルを書き込んでくれる便利なツールがあります。
・ツールのインストール方法
1 ツールをダウンロードする (https://github.com/esp8266/arduino-esp8266fs-plugin/releases/download/0.3.0/ESP8266FS-0.3.0.zip) (クリック後にダウンロードが開始します)
2 ArduinoのSketchディレクトリに”tools”というディレクトリを作る(存在しない場合)
3 ダウンロードしたzipファイルを先程の”tools”ディレクトリに解凍する(ディレクトリ的に”<home_dir>/Arduino/tools/ESP8266FS/tool/esp8266fs.jar”という構造になります)
4 Arduino IDE を再起動する
5 スケッチを開く
6 そのスケッチのディレクトリを開く
7 そのディレクトリに”data”というディレクトリを作る
8 Arduino IDE でボードやポートを設定する
9 上のバーにある”Tools”→”ESP8266 Sketch Data Upload”をクリックして “SPIFFS Image Uploaded” が表示されるまで待つ。割りと時間かかるので落ち着いて待ちましょう。
・SPIFFSオブジェクトの使い方
※使用時は冒頭に#include "FS.h"
を入れておく必要があります。
SPIFFS.begin()
SPIFFSシステムをマウントする。SPIFFS系の処理を行う前に実行する必要がある。マウントが成功したらtrueを返し、失敗したらfalseを返す。
SPIFFS.end()
SPIFFSシステムを取り外す。OTAを使ったファームウェア書き込みの前に使う。
SPIFFS.format()
SPIFFSシステムをフォーマットする。要はストレージを初期化する。
SPIFFS.open(path, mode)
path
のファイルをmode
で開く(文字列の文字数上限:31)。mode
はC言語でファイルを開くときと同じで、"r"
,"r+"
,"w"
,"w+"
,"a"
,"a+"
のようにファイルモードを入れておけば良い。
このメソッドではFile
オブジェクトが返される。ArduinoのStream
オブジェクトで使えるメソッドは基本的に全部使える。
使用例:
File f = SPIFFS.open("/f.txt", "w");
if (!f) {
Serial.println("file open failed");
}
while (f.available()){
Serial.print(f.read());
}
Serial.println();
f.close();
SPIFFS.exists(path)
path
のファイルの存在を確かめる。
SPIFFS.openDir(path)
path
にあるディレクトリを開いてDir
オブジェクトを返す。
SPIFFS.remove(path)
path
にあるファイルを削除する。
SPIFFS.rename(pathFrom, pathTo)
pathFrom
からpathTo
へファイル名を変える。(ファイルの移動とかできます)
FSInfo fs_info;
SPIFFS.info(fs_info);
path
にあるファイルのサイズなどの情報を取得する。
ファイルシステムをうまく使うことで、外付けストレージを使わずに小さなファイルサーバーやデータロガーが作れるので是非使ってみましょう。
WASAではこの機能を操舵系統の各種パラメータを初期設定するためのデバイスに使ってます。
2. デバッグ方法
ESP8266を使った開発には「謎のバグ」がつきものです。
しかし、「謎のバグ」に立ち向かう方法はいくつかあるのでご紹介してみます。
元ネタはこれとこれです。
1.リアルタイムで細かいデバッグ情報を得る。
ESP8266にはメインプログラムに割り込んでデバッグ情報を吐き出す機能があります。これの使い方を軽くご紹介します。
まずは上のバーからボートやシリアルポートの設定をしてください。
次に、下図のように、”Debug Port”を”Serial”に設定してください。
“Debug Level”には取得したいデバッグ情報の種類を選択します。COREにしたらESP8266の基本情報、WIFIにしたらWi-Fiの接続状況などについての情報がSerialポートを介して得られます。これらの情報を基にデバッグしましょう。
デバッグ情報の種類が多いとSerialに出力するのに時間がかかってメインプログラムの処理に悪影響を及ぼすことがあります。プログラムがバグって詰みそうなときにだけ有効にすることをオススメします。


2.システムクラッシュ時に吐き出される情報を解読する。
「謎のバグ」のほとんどはシステムクラッシュ時に発生します。
入力電力が不足した場合や、不正なメモリアクセスを行ってしまった場合には以下のようなスタックダンプが行われます。
Exception (0): epc1=0x402103f4 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
ctx: sys
sp: 3ffffc10 end: 3fffffb0 offset: 01a0
>>>stack>>>
3ffffdb0: 40223e00 3fff6f50 00000010 60000600
3ffffdc0: 00000001 4021f774 3fffc250 4000050c
3ffffdd0: 400043d5 00000030 00000016 ffffffff
3ffffde0: 400044ab 3fffc718 3ffffed0 08000000
3ffffdf0: 60000200 08000000 00000003 00000000
3ffffe00: 0000ffff 00000001 04000002 003fd000
3ffffe10: 3fff7188 000003fd 3fff2564 00000030
3ffffe20: 40101709 00000008 00000008 00000020
3ffffe30: c1948db3 394c5e70 7f2060f2 c6ba0c87
3ffffe40: 3fff7058 00000001 40238d41 3fff6ff0
3ffffe50: 3fff6f50 00000010 60000600 00000020
3ffffe60: 402301a8 3fff7098 3fff7014 40238c77
3ffffe70: 4022fb6c 40230ebe 3fff1a5b 3fff6f00
3ffffe80: 3ffffec8 00000010 40231061 3fff0f90
3ffffe90: 3fff6848 3ffed0c0 60000600 3fff6ae0
3ffffea0: 3fff0f90 3fff0f90 3fff6848 3fff6d40
3ffffeb0: 3fff28e8 40101233 d634fe1a fffeffff
3ffffec0: 00000001 00000000 4022d5d6 3fff6848
3ffffed0: 00000002 4000410f 3fff2394 3fff6848
3ffffee0: 3fffc718 40004a3c 000003fd 3fff7188
3ffffef0: 3fffc718 40101510 00000378 3fff1a5b
3fffff00: 000003fd 4021d2e7 00000378 000003ff
3fffff10: 00001000 4021d37d 3fff2564 000003ff
3fffff20: 000003fd 60000600 003fd000 3fff2564
3fffff30: ffffff00 55aa55aa 00000312 0000001c
3fffff40: 0000001c 0000008a 0000006d 000003ff
3fffff50: 4021d224 3ffecf90 00000000 3ffed0c0
3fffff60: 00000001 4021c2e9 00000003 3fff1238
3fffff70: 4021c071 3ffecf84 3ffecf30 0026a2b0
3fffff80: 4021c0b6 3fffdab0 00000000 3fffdcb0
3fffff90: 3ffecf40 3fffdab0 00000000 3fffdcc0
3fffffa0: 40000f49 40000f49 3fffdab0 40000f49
<<<stack<<<
一見意味分からなさそうですが、解読ツールがあるので解読してみましょう。
インストール方法は上で説明した書き込みツールと同じです。ツールはhttps://github.com/me-no-dev/EspExceptionDecoderにてzip形式でダウンロードできます。
エラーが発生してシリアルモニタにスタックダンプが行われたら下図のボタンのようにツールを開いてください。
なお、ツールを開く際にELF形式のファイルを要求されることがあります。プログラムを再びコンパイルし書き込むと解消されます。

ツールが開かれたらダンプされた情報をツール上半分の画面に貼っつけてみましょう。「◯◯行にある〇〇が悪いです!」というように詳しいデバッグ情報が返されますのでデバッグが捗ると思います。
非常に便利だと思うので是非ツールを有効活用しましょう!
今回のブログはこれで終わりにします。お役に立てたら幸いです。
今後もこんな感じのブログを何回かやりますがネタが切れそうなのでリクエスト等ありましたらご気軽にお声掛けください。鳥人間の電装関係なら書けそうなものは書きます!
春休みに入ってから、電装班は鳥人間コンテストに向けたケーブルづくり、各種部品の設計、プログラム調整など、さまざまな活動に励んでいます。
引き続きご声援、よろしくお願い致します!
WASA2018年度電装班長 藤田一輝(マイケル)
@hujatadayo
[email protected]