東芝から発売されているFlashAirを用いた開発を行う人々向けのまとめwikiです。※本wikiは東芝及びフィックスターズとは何の関係もありません。お問合わせは管理者へお願いします。

当wikiでは現在,利用者アンケートを実施しています

FlashAirでLuaスクリプトを組む時のコツ

FlashAir本体をアップデートすること!

最新のファームウェアにしないと、さまざまなバグに悩まされます。
2017年5月現在、W3.00.02が出ています

開発ボードで動作確認

電源が不安定だったり、Wi-Fiが通りにくかったり、ノイズにまみれた環境では
当然のことながらデバッグがしにくくなる。
開発ボード(Airioがおすすめ)にスマホ用電源をつなぎ動作確認することを勧める。

開発ボードは、FlashAirの電波を遮蔽しないよう設計されている上、
電源も一般的なSDカードには過剰なほどの容量を持たせてあるため、不安定要素を排除できる。

FlashAirが不安定な場合

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

外部ファイル実行

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

また、pcallを用いると、読み込んだLuaスクリプト中でエラーが発生しても
そのエラー内容を報告し、処理を続行できる。
Lua:保護実行

HTTPSが使えるのはFlashAirの強み。

OAuth2.0が使える。
...が、最近になって、各サービスでError argument:c003fe09が帰り、動作しない現象も発生しているため、
当てにしないほうが良いかもしれない。

証明書は検証されない.(証明書を登録すれば検証されるようにもなる)
HTTPS/TLS証明書問題

fa.requestの中身

fa.requestは、

HTTP/1.1 / GET
Host: 0.0.0.0 (アドレスはアクセス先による)

しか送らない。あと必要なヘッダは自分でheadersに追加する必要がある。
fa.HTTPGetFileの場合は追加もできないので注意。

自己アクセス

FlashAirの関数として用意されていない、ホストの書き込み禁止などは
fa.requestにて、http://127.0.0.1/upload.cgiや、http://127.0.0.1/command.cgiにアクセスすれば
操作することが出来る。

http://flashair/upload.cgiとかでは、名前解決できずにエラーになる。
また、ブラウザからcgi的に呼び出すLuaスクリプトから、
自分自身へアクセスしようとすると503エラーやタイムアウトになる。

恐らく、FlashAir内部のWebサーバーが処理不能になっている。
起動時および、書き込み時実行のLuaスクリプトからは正常にアクセスでき、機能する。

メモリは少ない。

スクリプト含めて16KBくらいと思っておくこと。
なので、配列確保できるのは大抵10KBくらい。
大きなデータを処理するのなら、マイコンのようにちまちま小分けで処理しなくなります。
参考:Lua:Tarアーカイブ展開

メモリのお掃除は頻繁に。

LUA : not enough memory
LUA : not enough memory
LUA : not enough memory

Luaは本来メモリが比較的潤沢にある環境で使うものですが、そうでないので仕方がない。
メモリ不足になると、メモリ確保に時間を食うので、処理速度が落ちる。
また、メモリ不足のメッセージが出力に混ざりこむ。
これを避けるには、collectgarbage()をプログラムの随所に入れておくこと。
そうすると速度が落ちない。
ただ、collectgarbage()自体が時間を食うので、頻繁に呼びすぎてもいけない。

変数名・関数名は短く。別名を使うのが良い。

変数名も多分食ってる。関数名も。
なので、組み込み関数には別名を割り振って使うと多少軽くなるようです。

argの制限

arg[0]で自身のパスが分かり、arg[1]で引数がわかる。
引数はrun.lua?Helloのように与えることができる。
file=A&name=Bのように与えても、分解されることはなくそのままでてくる。

ただし、%20で区切ると、arg[2],arg[3]と別れるはず。
引数がなければ、arg[1]以降はnilとなる。

URLエンコードしたものは、自動でデコードされるが、バイナリを渡すとうまく動かない。
URLは(たしか全長含めて)128文字しか受け付けない。
超えると414が帰る(3.00.01)ようになった。古いバージョン(3.00.00)のファームウェアだと異常動作を起こす。
コマンド実行の名残か、argの末端にはLFがくっついているので注意。

時計機能あります。

lib:libFlashTime
Lua:FlashAirのレジスタから時刻を得る
2秒単位になりますが、Luaスクリプトで時間測るよりはよっぽどマシだと思います。

ファイルの書き込みには細心の注意を

ファイルの書き込みは色々と問題が発生する可能性があります。
特に、ホスト機器に差し込まれているときは尚更大変なことになります。(FAT不整合など)

外部からのupload(upload.cgi)や、WebDAVを用いたアップロード(PUT)を行うと、
ホスト機器からの書き込み動作にロックがかかります。

Luaスクリプト側からFATにロックを掛けたければ、upload.cgiの機能を用いて
fa.request("http://127.0.0.1/upload.cgi?WRITEPROTECT=ON")
逆に、ファイルシステム破壊を恐れず解除したければ
fa.request("http://127.0.0.1/upload.cgi?WRITEPROTECT=OFF")

後者は、ファイルアクセスの度にFATを読み直す、異常に行儀の良い機器か
あるいは手動再マウントする場合でもなければお勧めできません。

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

共有メモリはスクリプト間共通変数としても使える

一旦終了したスクリプトから、次に起動するスクリプトに情報を渡すには
第一としてファイルに書き込む方法があるが、ホスト機器に差し込まれている場合は、
上記のような理由で使えない。

そのため、W3.00.01から使用できるようになった共有メモリを使うと、
電源入っている間のみではあるが、512バイトまで記録できる。
javascriptやホスト機器(iSDIOアクセス時)からアクセスすることもできるため、
使い方によっては非常に便利なものとなる。

隠し関数が色々あります

詳しくはこちら
関数一覧

処理速度はおおよそ20kHz?

fa.pioで色々測ってみた限り、1処理に500usくらい食ってる感があります。あまり高速な処理は期待できません。
また、処理中にWi-Fi関係とかの割り込みが掛かっている感があるため、処理速度は均等ではありません。

結果を手早く見れるのはLEDと液晶

ブラウザからLuaスクリプトを起動すると、CGIなので
スクリプトが終了するまで結果が出てきません。
なので、途中状態を知りたいのなら、LEDなり液晶なりを繋ぐか、
fa.requestを受け取るサーバーでも用意する必要があります。

ブラウザ上でLuaスクリプト編集&実行ができます

ブラウザからLuaスクリプトの書き換え・デバッグができるエディターあります。
デバッグが楽になること間違いなし。
Tool:FlashTools Lua Editor (FTLE)

IOポートの動作確認から始める

IOポートでなにかするのなら、まずはIOポートの出力が対象に伝わっているかからチェックするのが
一番手っ取り早い方法です。
以下のツールを使用することで、ブラウザ上で確認することができます。
Tool:FlashTools GPIO Tester & Checker

開発ボードを使用するときはライブラリを使いましょう

悩む時間のほうがもったいないので。
Airioを使うならlib:pioduino
AirioRPをつかうならこれlib:libAirioRP
秋月FlashAir DIP IOボードを使うならこれ。lib:libAE_FAIO

ブリッジモードオススメ

APモードでデバッグというのはやりづらいです。(ネットから切断されるので)
なので、ネットが使えるSTAモードやブリッジモード(インターネット同時接続機能)を使うことをおすすめします。

STAモードだとIPアドレス変わるからデバッグしにくいじゃないか、という方は
こちらのIPアドレス固定方法を御覧ください。
APモードやブリッジモードのFlashAir側のIPアドレスも同様に固定できます。

IPアドレスを固定化する

※この、インターネット同時接続機能使用時にLAN側からアクセスできる機能そのものが、
 あろうことか脆弱性として報告されたため将来のバージョンでは使えなくなるかもしれません

簡単なファームウェアバージョンチェック

古いファームウェアでスクリプトが動かない問題は、以下の様なコードで
バージョンチェックしてしまうことをおすすめします。
if(fa.md5 ~= nil) then
 print("FlashAir firmware version is too old!");
 error();
end;

コメントをかく


ユーザーIDでかく場合はこちら

画像に記載されている文字を下のフォームに入力してください。

「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

スマートフォンの方は画面下部よりPC版に切り替えることをおすすめします

アクセス解析中

忍者アナライズ

GoogleAnalytics

編集にはIDが必要です