※本情報は、参考のために残しており、古い情報を含みます。
現在主に更新しているのはwikiですので、最新の情報はwikiを参照してください。
---
FlashAirでLuaスクリプトを組む時のコツ※FlashAir本体をアップデートすること!
W3.00.01にしないと、さまざまなバグに悩まされます。
・メモリは少ない。
スクリプト含めて16KBくらいと思っておくこと。
なので、配列確保できるのは大抵10KBくらい。
大きなデータを処理するのなら、マイコンのようにちまちま小分けで処理しないといけない。
・メモリのお掃除は頻繁に。
Luaは本来メモリが潤沢にある環境で使うものだと思うのだが、
そうでないので仕方がない。
メモリ不足になると、メモリ確保に時間を食うので、処理速度が落ちる。
また、メモリ不足のメッセージが出力に混ざりこむ。
これを避けるには、collectgarbage()をプログラムの随所に入れておくこと。
そうすると速度が落ちない。
ただ、collectgarbage()自体が時間を食うので、頻繁に呼びすぎてもいけない。
・ライブラリは小さく。
ライブラリのコードサイズがおもいっきりメモリを食い潰す。
ライブラリ読み込み時にcollectgarbage()する必要が出ることもある。
・コメント少なく。
コメントもコードの一部。コメントが大きすぎるとそれだけでメモリエラーになる。
リリース時にはコメントを全削除するなり、別ファイルにするなりする方がいい。
・変数名・関数名は短く。別名を使うのが良い。
変数名も多分食ってる。関数名も。
なので、組み込み関数には別名を割り振って使うと多分軽くなる。
ただ、これは自分がそう思っているだけで、実際には違うかもしれない。
・argの制限
arg[0]で自身のパスが分かる。
arg[1]で引数がわかる。
引数はrun.lua?Helloのように与えることができる。
file=A&name=Bのように与えても、分解されることはなくそのままでてくる。
引数がなければnil。
URLエンコードしたものは解かれる。バイナリを渡すとバグる。
URLは(たしか全長含めて)128文字しか受け付けない。
超えると414が帰る(3.00.01)。古いバージョン(3.00.00)だとバグる。
末端にはLFがくっついているので注意。
・mathが無いので
数学関数mathがない。ので、浮動小数点を切り捨てることすら出来ない。
ビット演算は適当に丸めやがるので、切り捨てたい時には使えない。
解決方法: block = tonumber(string.format ("%d",num));
アホみたいだが、こういうやり方になる。
・RTCあるって知ってた?
地味にあるんです。
・ファイルの書き込みという悪魔の所業
ファイルの書き込みは色々と問題があるので、正直やりたいものではない。
ホスト機器に差し込まれているときは尚更だ。
外部からuploadやPUTをした時は、FATにロックが掛かることを忘れるな。
Luaスクリプトから書き換えるときは、FATにロックがかからないことを忘れるな。
FATにロックを掛けたければ
fa.request("http://127.0.0.1/upload.cgi?WRITEPROTECT=ON")
逆に、ファイルシステム破壊を恐れず解除したければ(再マウントすれば問題ない)
fa.request("http://127.0.0.1/upload.cgi?WRITEPROTECT=OFF")
一旦終了したスクリプトから、次に起動するスクリプトに情報を渡すには
ファイルに書き込む方法を思いつくだろうが、それは上記の理由でおすすめしない。
W3.00.01から、Luaで共有メモリにアクセスできるようになったので、
こちらを使うことをおすすめする。512バイトまで記録できる。
ブラウザからアクセスすることもできる。
・fa.requestの罠
まず、3KBまでしか受信できない。
タイムアウトがない。
エラーが起きると最悪応答がなくなる。
ポート番号も指定できない。
ただ、TLS(https)はできる。
せめてタイムアウト指定とか、なければタイマー割り込みとかほしい...
・隠し関数は積極的に
ファイルの削除とか、ファイル名変更とか、ping飛ばしたりとか、できるんですよ実は。
将来的に削除される可能性もありますが。
・処理速度は20kHz?
fa.pioで色々測ってみた限り、1処理に500usくらい食ってる感がある。
また、処理中にWi-Fi関係とかの割り込みが掛かっている感がある。
・Wi-Fi起動電流に注意
かなり食います。電流測定用にテスターかませるだけでダメになることも。
起動時に200mA、定常120mA程度食うようです。
Wi-fiをオフにすると数mA〜数十mAで収まります。
参考。
・pioとホスト
fa.pioはホストとの通信を妨害します。
ホストが初期化する前にpioを呼ぼうものなら、信号が衝突しますし、
初期化後に拒否られた状態でpio呼んでも不安定になるようです。
対策:スクリプトの冒頭に下のような行を入れる。
sleep(15000);
if(fa.pio(0,0) == 0)then return; end;
・結果を手早く見れるのはLEDと液晶
ブラウザからLuaスクリプトを起動すると、CGIなので
スクリプトが終了するまで結果が出てきません。
なので、途中状態を知りたいのなら、LEDなり液晶なりを繋ぐか、
fa.requestを受け取るサーバーでも用意するか、な必要があります。
・デバッグ面倒くさいならFTLEがおすすめ(ステマ)
ブラウザからLuaスクリプトの書き換え・デバッグができるエディターあります。
デバッグが楽になること間違いなし。
・IOポートの動作確認から始めるといいよ(ステマ)
IOポートでなにかするのなら、まずはIOポートの出力が対象に伝わっているか
からチェックするのがいいと思います。便利なツールが有ります。
・ライブラリを使いましょう
悩む時間のほうがもったいないので。
Airioを使うならこれ。
AirioRPをつかうならこれ
秋月FlashAir DIP IOボードを使うならこれ。
・ブリッジモードオススメ
APモードでデバッグというのはやりづらいです。(ネットから切断されるので)
なので、ネットが使えるSTAモードやブリッジモードを使うことをおすすめします。
STAモードだとIPアドレス変わるからデバッグしにくいじゃないか、という方は
こちらのIPアドレス固定方法を御覧ください。
APモードやブリッジモードのFlashAir側のIPアドレスも同様に固定できます。
・古いファームウェアでスクリプトが動かない問題は、以下の様なコードでバージョンチェック
してしまうことをおすすめします。
特に新しい関数を使っている場合は読み込み時に落ちるので、
その場合はブートストラップと本体にスクリプトを分けましょう。
if(fa.md5 ~= nil) then
print("FlashAir firmware version is too old!");
error("error() has been called.");
end;