FlashAirをいじってわかったこと。

現在、V3.00.02が配布中です。


---

※本サイトに記載されているFlashAir関連の情報は、
 参考のために残しており、古い情報を含みます。
 現在主に更新しているのはwikiですので、最新の情報はwikiを参照してください。

---


※FlashAirの写真を、Eye-FiみたいにPCに自動取込したい人はこの辺がおすすめです。
FlashAir”から手軽に写真を無線転送できるChromeアプリ「Yokin's FlashAir Sync」

FlashAir-Developers アプリショーケース

※今月号のinterfaceにツールの記事がのりました。
2016年8月号 SDカード便利帳付き!切手サイズIoT無線センサ入門


---作成したツール---
PC・スマホなどからオンラインでLua編集&実行&デバッグできます。

FlashAir GPIO Tester & Checker
FlashAirのGPIOを視覚的に操作できます。

init値計算機
fa.spiの速度設定用の値を計算します。



FlashAir + AE-FAIOのGPIOを視覚的に操作できます。

---ライブラリ---
AE_FAIO_HTTP_IO(HTTPから秋月FlashAir DIP IOボードを扱う)

---サイト内リンク---
→ほぼすべてバージョンアップで治りました。





---外部サイトの紹介、メモ---

RoundingInFlashAir (FlashAir上での実数→整数のキャストについて)
https://sites.google.com/site/radikaiwarehouse/luascripting/roundinginflashair

Mathspeed(FlashAirにおいては、組み込み用に最適化された整数シフト演算が、浮動小数点演算より遅くなる検証)
https://sites.google.com/site/radikaiwarehouse/luascripting/mathspeed

Luaのリファレンスにはこちらのサイトが便利です

ファームウェアから解析したらしい、さらに追加のConfig(Wi-Fiの種別・チャネルの設定等)
Toshiba FlashAir WiFi-Enabled SD Card - Extrud3d

ファームウェアから、デバッグコンソール出力らしきeva.cgiと、そこにコマンドを与える方法、与えた結果の解析
Reverse Engineering Toshiba Flashair Wifi SD card - Hackaday.io

なにやら使えそうな特殊タグなど。

公式のFlashAir紹介スライド
TOSHIBAxGUGEN FlashAirハッカソン-FlashAirでなに作る? by @FlashAirDev_ja 
http://www.slideshare.net/FlashAirDev-ja/flash-airideathon-20150411handsout

-----------------------

#FlashAir をいじった記録 - Togetterまとめ でつぶやき散らした情報をいったん整理しました。
今後もたぶん増えます。

最新の動画などは、Togetter側にいろいろ貼ってあるので、そちらを参照してください。
一応ここのページ下部にも貼っておきます。

FlashAirってデジカメに使うものでしょ?
と思う方はこちらの動画をご覧ください。


公式・非公式開発ボード類

・FlashAir評価ボード エアリオ【Airio】(1833円)
W-02時代に開発されたもの。
USBから電源供給でき、
RGB-LEDと、スライドスイッチを用いたGPIO制御の簡単なテストができるほか、
ArduinoのSDカードシールドとしても動作する。もちろん、5V-3.3Vのレベル変換機能付き。
FlashAirからとりあえずLチカしたいとか、Arduinoから、iSDIOカードとしてのFlashAirの真の力を使いたい、という場合にはこれがおすすめ。
余談だが、モバイルバッテリーに直結できるので、出先でデモするのならこれが一番便利だろうと思う。

FlashAirプロトタイピングボード Airio RP【MTO-EV101】(3232円)
http://www.marutsu.co.jp/pc/i/557784/
W-03用に開発された、ブレッドボードでFlashAirを扱うためのボード。
GPIOを生で触るか、SPI-I2Cブリッジを用いるか、をスライドスイッチで選ぶことができる。
また、そのSPI-I2CブリッジをIOポートエキスパンダーとしても使うための機能も実装されている。
こちらもmicroUSBポートから電源供給でき、5V-3.3Vレギュレータも実装されている。地味にリセットボタンが便利。
ブレッドボード用でいろいろしたい、そしてFlashAirの生のIOポートも使いたい、という場合にはこちらがオススメ。
とにかく汎用的に使える。
ただし、SPI機能解放前のもののため、高速なSPI通信は期待できない。ソフトSPIでの通信となる。
追記:追加されたSPI機能のピンアサインはこれらボードに準じたもののようです。
  1.2Mbps(瞬時)での通信が可能なことがわかりました!

 参考:FlashAirでIOエキスパンダMCP23017を制御してみた by @ayasehiro 様

FlashAir DIP IOボードキット(980円)
秋月製のコストダウン版Airio RPといったところ。
コスパが良い反面、FlashAirの生のGPIOに触ることは出来ない。
必然的に、SPI-I2Cブリッジを用いたI2C通信か、そのGPIOエキスパンダーを用いた制御になる。
GPIOの本数は、FlashAirが5本に対し、このGPIOエキスパンダーでは4本(+I2C)となること、
また、SPI機能解放前のもののため、高速なSPI通信は期待できない=I2Cも遅ければGPIOも遅いという点には注意。
追記:追加されたSPI機能のピンアサインはこれらボードに準じたもののようです。
  1.2Mbps(瞬時)での通信が可能なことがわかりました!

それを呑んだ上で使うのなら、安くて便利でしかもSPI-I2Cブリッジまで乗ってる便利なボードだろう。
小さいブレッドボードにつなげて使うには便利。温度センサーなどを繋げて使うにはこれが一番便利かもしれない。

・おまけ SDカードスロットDIP化モジュール(250円)
-電源供給機能がある
-DIPで引き出してある
それしかない汎用ボード。ただ、シンプルで安い。必要十分。
昔のver1では、SPIで使わない端子が殺されていたが、ver2からは基板上のランドから引き出せるようになった。
余計なものは要らない、という場合は、これがおすすめ。


今のところFlashAirを使ってやったこと。
・ポメラ DM100からLuaスクリプトを編集して動かす(書き込み時イベント、保護実行を利用)
・ツイートする(Stewgateを利用)
・マートフォンへプッシュ通知する(pushoverを利用)
・pastebinからテキストをダウンロードする
・Dropboxへ更新のあったファイルを選択アップロードする
・LAN内のWebサーバーからスクリプトを逐次ダウンロードして実行
 実行時エラー含めて実行結果をサーバーに返却する


(2015/12/5)Lua関数リファレンスが更新されました。
過去の隠し関数はSetChannel以外隠されたままでしたが、
共有メモリのLuaアクセスや、メール送信、文字コード変換、SPIマスターなど、かなり有用そうな関数の詳細が公開されました。

SPIマスターのクロック周波数の関係は、init値計算機を参照してください。1.2MHzから1Hzまで結構自由に設定できます。

(2015/11/11)FA9CAW3AW3.00.01が公開されました。
バージョン履歴にはぱっとしないことが書いてありますが、実体はLua関係の整備やバグ取りのようです。

隠し命令等に以下の変更があることがわかっています。
一部のバグ的挙動も治っているかもしれませんが、まだ検証していません。



FlashAirをいじってわかったこと。

・Chromeからアクセスするとやたら時間がかかる問題は、
 FlashAirのルートのfavicon.icoを探しに行って、たらい回しにされてるのが原因。
 メインコンテンツが数msで読み込み終わってもfaviconに10secかかってるとかザラ。
 対策は、ルートに中身が空でも良いからfavicon.icoを配置すること。爆速になる。

FA9CAW3AW3.00.01になり、スタックオーバーフローみたいなフリーズを起こす問題は解決したようだ。
 それも、そういうコードなら動作をやめるといった消極的なものではなく、
 全て正常に動作するようになったようだ。

・今まで悩んでいたバグ挙動がほとんど治っている(妙な仕様は少し残っているが)

・/SD_WLAN/LUA/LIB/にファイルを配置することで、共通のライブラリが使用できるようだ。

・メモリは13KBちょい使える。スクリプトのサイズ等にも寄るだろう。
 collectgarbage()をお忘れなく。


以下はFA9CAW3AW3.00.00の時の情報です。
以下(2015/4/12)の情報
・多分、FlashAirの一番の強みは、HTTPS(SSL)通信がこのサイズと電源で可能なこと。
 意外と、マイコンからやるのは大変なはずなので。

・バグる。とにかくバグる。下にも何度も書いているが、メモリ関係が非常に弱い。
 ちょっと複雑なスクリプトを書こうとするとフリーズにはとにかく遭遇するはず。
 注意して進めること。Luaスクリプトを組み込んだ状態で大切なファイルは絶対に入れないこと。
 最悪の状態も想定したテストをすること。(メモリ的な意味で)
 特にfa.request関係、require、dofileには注意。
→改善された。

・ソフトウェアSPI、ソフトウェアI2C通信には成功している。
 ソフトウェアSPIでは、800bpsほどの速度が出ている。
https://twitter.com/Seg_Faul/status/586539946346807297/video/1
→fa.SPIが実装された

・FlashAir W-03の現時点でのCGI呼び出し機能にはバグがある。具体的には、GET引数を付けて実行すると、
 実行するたびゴミがたまり、数十回~数百回でクラッシュする。
 Luaスクリプト側のメモリ使用状況、スクリプトのサイズ、引数の長さにより変化するが、再起動するまでの全累計回数であり、
 引数を短くする以外の回避方法はない(短くしても回数が数千回になるだけで、相変わらずクラッシュする)
→改善された。

・FlashAirには、隠し(非公開/未公開/内部用)関数が存在する。
 簡単なLuaの知識だけで一覧を閲覧できるので、探すとよい。
 現在のFlashAirに割り当てられたIPアドレス、固定IPアドレスの設定、ゲートウェイのIPアドレス取得、内部APへの接続子機数、ping、
 WPS機能の開始、時刻設定、ファイルの削除・変更(fsを使わず)、接続状態の取得、SPI通信、無線チャネルの設定、より応用的なHTTP通信などが
 できる、ようだ。

・ファイルを開くたびFATテーブルを読み直してくれるような
 例えばPomeraなどの機械でなければ、Luaからファイルを書き込むことは考えない方がいい。
 容易にFATが壊れる。特にWindowsはダメ

・LuaスクリプトをCGI的に使うのであれば、GETでデータは渡せる。
 arg[0]が実行パス、arg[1]が引数(Lua公式)。
 セパレータは'?'である。
  例:get.lua?abcdefの場合
 arg[0]には/get.lua
  arg[1]にはabcdef
 が入る。
 POSTでは無理のようだ。

・GETで渡せるのは、「自身のスクリプトの名前+?を含めて142文字まで」のようだ。それ以上は打ち切られる。
 また、あまりにも長すぎるURLを送ると400 Bad requestが帰る。
  (RFC的には414 Request-URI Too Large だと思うのだが)
→123文字になり、 414 Request-URI Too Largeが帰るようになった。

・GPIOをパタパタさせてSPI通信的なことをしようとすると、ノーウェイトで約31.2Bps(249.8bps)ほどでる。
 これはPIO関数をArduino風に扱うを使った場合なので、PIO関数を直接ドライブするともっと出るかも知れない。
→fa.SPIでは瞬時1.2Mbps出る。

・FATが壊れた場合、PanasonicのSDフォーマッタを使ってクイックフォーマットするとよい。
 東芝設定ツールの初期化機能はなぜか当てにならない。
 Panasonicでフォーマットをしたのち、東芝設定ツールで初期化、その後CONFIGをコピーする
 という流れが効率的。論理サイズ調整はONにしておくとよい。
 この際、CONFIGは、Wi-Fiパスワードを記入したものにするとよい
 (一度設定として読み込ませたものは、Wi-Fiパスワードが***に設定される)

・Panasonicのフォーマッタがフリーズするほど致命的に破損した場合は、
 CHKDSK /F /Rを試すことをお勧めする。それでもダメなときは、
  Windowsのコンピュータの管理からディスク管理を開き、フォーマットする。(めちゃくちゃ時間がかかる)
  (この際、クイックフォーマットのチェックは外す)
 ※デジカメでフォーマットしてたら、にっちにもさっちにも行かなくなったという話がtwitter上で見受けられたので注意。

・FlashAirのモードは6をおすすめする
 ネットにもつながり、APにもつながり、そして省電力モードにもならない。
 だだし、Luaで使うなら、モード1にして、fa.connectとfa.disconnectを使って接続を管理した方がよさそう。

・IEおすすめ。Chromeだとアクセスにやたら時間がかかる。
 でもChromeのデバッグツールやヘッダ閲覧・パケットキャプチャは便利だし、
 HTTPヘッダがないときはtxtとして扱ってくれるので便利(IEはhtmlとしてあつかう)
 →favicon.icoを配置すれば治る(上記)

・Luaスクリプトでcgi的に応答する場合、まずprint("HTTP/1.1 200 OK\n")から始める必要がある。
 (無くてもブラウザは反応してくれるが、良くない)

・FlashAirのIPアドレスは固定し、ping -tで応答を常に見ながらアクセスするとよい。
 無線LANが起動して接続成功するまで少し時間がかかるし、Luaスクリプトの組み方が悪いと
 FlashAirがフリーズするため。

・FlashAirが403や405を応答したら、たいてい死にかけている。
 SDカードを差し直し、Luaスクリプトの関数が深くないか確かめる。
 (特に注意すべきは、関数呼び出し、fa.request、dofile、これらはフリーズしやすい)

・dofileや、loadfileを活用すると、lua以外の拡張子のファイルを読み込ませることができる。
 例えばPomeraはtxt形式のファイルしか編集できないが、Lua形式のファイルからtxtを読み込ませれば
 txtファイルもスクリプトの一部として動作させられる。

・中間サービスは積極的に利用すると便利。
 twitterに投稿したいなら、stewgate
 スマホにプッシュ通知したいならPushover
 テキストのやり取りしたいならpastebin

・HTTPSが使えるのはFlashAirの強み。
 OAuth2.0が使える。

・DropboxのAPIは簡単に使える。自分のアカウントにだけ使いたいなら、
 アクセストークンの取得処理すら要らない。アプリ登録画面から発行してくれる。

・OAuthでアクセスるる場合は、ヘッダに
 Authorization: Bearer アクセストークン
 の形で書く。他にも2種類あるが、これが標準らしい。意外に書かれていない。
 ちなみに、Bearerはoauthの場合もある。

・FlashAirの関数として用意されていない、ホストの書き込み禁止や、共有メモリなどは
 127.0.0.1/upload.cgiや、127.0.0.1/command.cgiにアクセスすればできる。
 flashair/upload.cgiとかでは、名前解決できずにエラーになる。
 また、ブラウザからcgi的に呼び出すLuaスクリプトから、自分自身へアクセスしようとすると503
 エラーやタイムアウトになる。恐らく、FlashAir内部のWebサーバーが処理不能になっている。
 起動時および、書き込み時実行のLuaスクリプトからは正常にアクセスでき、機能する。

・ただし、fa.request、fa.HTTPGetFile関数などのHTTP通信関数は、
 結構不安定な面があります。(接続失敗したらタイムアウトせずだんまりになることがあるとか)

・FlashAirのホスト書き込み禁止処理は、ホスト機器によって反応が違うので注意。
 Pomeraはしばらく時間かかったのちエラーが帰るし、Windowsはエラーを吐かずに書き込めたように
 見せかけて書き込めていない、など。

・fa.requestは、
 HTTP/1.1 / GET
 Host: 0.0.0.0 (アドレスはアクセス先による)
 しか送らない。あとは自分でheadersに追加する。
 fa.HTTPGetFileの場合はそれもできない。

・fa.requestは、3KBまでしか受信できない(それ以上のデータは破棄される)
 fa.HTTPGetFileは、アクセス先のサーバーによって(条件不明)、
 ・正常に受信できる
 ・受信に成功するが、先頭と末端にゴミがつく
 ・受信失敗ということになるが、なぜか連番拡張子なしのファイルが生成され、
  中身はゴミ付きの目的のデータ
 ・受信に失敗する
 の4 2パターンがある。

 詳しく検証していないが、ゴミはチャンクストリームそのものの可能性もある。

fa.requestや、単純なスクリプトでも関数から関数呼び出す場合など、フリーズすることがあるので注意。
 このフリーズはSDカード機能も含まれるため、ホスト機器を巻き込む。
 当然、その時読み書きしていたファイルは高確率で破損する。
 特に、起動時スクリプトにフリーズするようなスクリプトを入れた場合、フォーマットも不可能になる危険がある。

 フリーズしたらどうなるかを検証したいなら、
 function f(i)
  return 0
 end
 f(f(f(f(f(f(f(0)))))))
 を呼び出すとわかる。(1回目は正常にアクセスでき、2回目は応答に時間がかかる。そのまま更新するとフリーズ)
 fa.requestで発生したパターンは、動画にして撮ってある。
 →アップデートで改善されたようです(確認済み)

・あのアホみたいに電池持ちが良いポメラでも、常時Wi-Fi接続状態のFlashAirを差し込んでおくと
 あっという間に電池切れになる。
 1度ファイル一覧を見るなどしてSDカードにアクセスしなければ電源供給されないため、
 そういう工夫をしてもいいし、Luaスクリプト側からWi-Fiをうまくコントロールしても良いだろう。

・デジカメ以外のJpegファイル(おそらく、プレビュー情報のないもの)は
 サムネイルでは破損ファイルのように表示されることがあるが、実際には正常に閲覧できる。

・公式のFacebookサンプルではfa.ReadStatusReg()というのを使ってWi-Fi接続ステータスを参照しているが
 関数リファレンスにはない。接続ステータスのほか、割り当てられたIPアドレスなども取得できるようだ。

・WebDAV機能を有効にしているとPUTでファイルアップロードしたりもできるようだ。
 WEBDAV=1で読み取り専用、WEBDAV=2で読み書き可能になるようだ(facebookサンプルからの推測)

・LUA : not enough memoryは、Luaインタプリタのガベージコレクタが作動した時に出力される。
 公式のFacebookサンプルでは、ガベージコレクタの動作を調整している節があることから、
 結構頻繁に動作しかねないようだ。

・STAモードに設定すると、http://flashair/でアクセスするとリダイレクトループにハマリ、
 アクセスできないことがある。IPアドレス直打ちで正常にアクセスできる。

・FlashAir上でLuaスクリプト自体にエラー(例外)が発生すると、ブラウザは受信失敗しか表示しない。
 PC上のLuaインタプリタで実行すればエラーは確認できるが、FlashAir上で確認したい場合、
 以下の様に実行するといい。body.luaがデバッグ対象のファイル

 pcallで保護モードで実行している。
 loadfileにしているのは、スクリプト自体に文法エラーがあると何の実行もされずにエラーになるため、それを検出する。
 このスクリプトを使うと、error関数の脱出も同様に通知される。

f = loadfile("body.lua")
local flag, ret = pcall(f)
if not flag then
   print("HTTP/1.1 500 Internal Server Error\n\n")
   print("<pre>")
   print("!!! Lua error detected.!!!\n")
   print("------------\n")
   print(ret)
   print("\n------------\n")
   print("</pre>")
else
   print("<!-- OK -->")
end

 関数として別ファイルを実行する都合上、フリーズバグ(仕様?)に引っかかりやすくなるので注意。

・PIO関数は、まずCONFIGファイルのIFMODEが1でなければ0(失敗)
 PIO関数を実行する前にSDカードが初期化されると0(失敗)
 SDカードが初期化されていなければ1(成功)

 注意点として、例えすべてのピンを入力にしていたとしても、一度PIO関数を実行すると
 FlashAirはPIOモードになるらしく、ホスト機器から初期化しようとしても失敗する。

 また、ホスト機器は電源を供給したからと言って即初期化するとは限らないため、
 その間の時間の間にPIO関数を実行すると(電源を入れなおすまで)読み書き不能になり、
 さらに、仮にホスト機器と出力信号がぶつかると、ホスト機器およびFlashAirが破壊する恐れがある。

 少なくとも、PIO関数は、ホスト機器と接続されているか否かの判別には使用できない。
 (ホスト機器の初期化シーケンスを理解してスクリプトを組んだ場合を除く)

---

ニコニコ動画のほうが画質がいいし、個人的にはそちらで見てコメントしてもらえるとうれしいです。

が、スマートフォンや、職場など、ニコニコを見に行きにくい環境のことも考え、youtubeにもアップロードしています。
フリーズの様子の動画はここには貼っていませんので、togetterからどうぞ。




Comments