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

一般用途向けのQ&Aはこちら → よくある質問

うまく動かない、何も出力されない

まず、エラーが出てないか調査しましょう。
普通の実行の仕方では、エラーメッセージは表示されず黙ったままになります。
エラーを調べる方法

無限ループから帰ってこない

FlashAirのLuaインタプリタは、1つの系統につき1つのスクリプトしか走りません。
また、無限ループに陥ると、電源抜差ししない限り復帰しません。
途中で止める方法はありますが、スクリプトに工夫が必要になります→Lua:実行中の停止と取得

FlashAirのアップデートはお済みですか?

FlashAir(W-03)には、アップデータが配信されています。
Lua機能や、安定化などが施されており、これを入れないと一部の関数は全く機能しません。

http://www.toshiba-personalstorage.net/support/dow...

FlashAirは劣悪な電波環境に弱いです

FlashAirは,劣悪な電波環境にさらされると急激に速度が低下します.
シールドに覆われていないか,強いノイズを発する機器とともに置いていないか
電源が安定しているかを十分確認してください.

まさかメモ帳で開発してたりはしないですよね...?

開発ボードで動作確認

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

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

サムネイルがないです

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

ブラウザから呼び出す場合

Luaスクリプトでcgi的に応答する場合、まずHTTPレスポンスを返す必要がある。
大抵のブラウザは無くても適当に反応してくれるが、
一部のブラウザや機器は、レスポンスがおかしい時点で接続を切断してしまう。
print("HTTP/1.1 200 OK\n")

Luaスクリプト実行にブラウザアクセスはおすすめしない

LUA_RUN_SCRIPTなどでLuaスクリプトを実行している最中に、
追加でブラウザなどからLuaスクリプトを実行することは、一応できるようではあるが、
大抵動作が不安定になったり、メモリ不足が発生するため、おすすめしない。

特に、FTLEなどLuaスクリプトを使うツールが異常動作をする場合は、
裏で別のLuaスクリプトが動作していないか確認すべきである。

ライブラリは小さく。

ライブラリのコードサイズがおもいっきりメモリを食い潰すようです。
ライブラリ読み込み時にcollectgarbage()するのは当たり前と言ってもいいレベル。
ライブラリの方で読み込み時にcollectgarbage()するようになっていることもありますす。

mathが無いので

数学関数mathがない。ので、浮動小数点を切り捨てることすら出来ない。
ビット演算は適当に丸める(bankers roundで行われる)ため、
単に切り捨てたい時には使えない。(変な結果になります)

block = tonumber(string.format ("%d",num));
あるいは
block = num - (num%1)

おそらく後者のほうが早い。

参考:RoundingInFlashAir - Radi開別館
https://sites.google.com/site/radikaiwarehouse/lua...

コメント少なく。

コメントもコードの一部。コメントが大きすぎるとそれだけでメモリエラーになるようです。
リリース時にはコメントを全削除するなり、別ファイルにするなりしたほうが良いでしょう。

fa.requestの罠

  • 3KBまでしか受信できない。
  • タイムアウトがない。 → タイムアウトは120秒
  • エラーが起きると最悪応答がなくなる。
  • ポート番号も指定できない。
  • ただ、TLS(https)はできる。
せめてタイムアウト指定とか、なければタイマー割り込みとかほしい...

Wi-Fi起動電流に注意

pioとホスト

fa.pioはホストとの通信を妨害するようです。
ホストが初期化する前にpioを呼ぼうものなら、信号が衝突しますし、
初期化後に拒否られた状態でpioを呼び続けても不安定になるようです。

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

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

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

少なくとも、PIO関数は、ホスト機器と接続されているか否かの判別には使用できない。

一応、衝突対策には、スクリプトの冒頭に下のような行を入れることで対処できます。
sleep(15000); --初期化を待つ
if(fa.pio(0,0) == 0)then return; end; --pioが使えない場合は処理を終了する

FlashAirからfa.requestを投げる時の注意

例えば以下の様なスクリプトがある場合、
これをブラウザ(およびFTLE)から実行すると、大抵はc = -1(fa.requestの実行失敗)になる。
たとえ、現在つないでいるWi-Fi APに接続しなおしたとしても。

 --Wi-FiアクセスポイントのSSID
 ssid="FlashAir";
 --Wi-Fiアクセスポイントのパスワード
 networkkey="12345678";
 --ここから
 fa.Disconnect();
 sleep(3000);
 fa.Connect(ssid, networkkey);
 sleep(15000);
 --ここまでをコメントアウトすると動く。
 b,c,h = fa.request("http://example.com/")
 f = io.open("file.txt","w")
 f:write(c);
 f:close();

おそらく、ブラウザとの通信が強制的に切断されてスクリプトが動作不能になるか、
あるいは、Wi-Fi接続状況を変更できなくなるのか。

回避するには、
・ブラウザ(もしくはFTLE)から実行する場合は、Wi-Fi通信設定関係の操作をしない
・SDカードイベントもしくは、起動時実行から実行する

LUA_RUN_SCRIPTが動かない時の切り分け方

FlashAirのLuaスクリプト実行機能に、
起動時に実行する"LUA_RUN_SCRIPT"という設定がありますが、これが結構クセモノです。

なにがクセモノかというと、スクリプトでエラーが起きたことを知る手段がありません。
それだけなのですが、それが本当に致命的。文法エラーひとつわからない。
デバッグの方法はRUN/EVENTのデバッグを参照。

ので、そんな時の切り分け方を以下に記します。

ファームウェアバージョンを確認する

CONFIGファイルのVERSIONを確認してください。
末端がW3.00.00の場合は古いバージョンですので、ファームウェアアップデートをしてください。
Luaスクリプトの実行に関していくつものバグが有ります。

ブラウザから実行できるか確認する

起動時に動くスクリプトなら、ブラウザからも実行できるはずです。
公式チュートリアルだとなぜか、一番最初にやることが起動時に実行になってますが、
正直ハマります。まずはブラウザからLuaスクリプトを叩いて実行できるか確認しましょう。
それで実行できないものはそもそも起動時にも実行できません。
FlashAirでは、実行エラーは出力なしのだんまりになります。

ちなみに、手前味噌ですが、FlashTools Lua EditorのDebug機能を使うと、
具体的に何のエラーが起きているのか知ることができます。

※ただし、Wi-Fi設定を変更するLuaスクリプトは、ブラウザからは正常に動きません!

CONFIGの記述ミスをしていないか確認する。

スペルミスをしていませんか?
最終行を空行にしていますか?

ファイル書き込みの場合: 差し込んで、10秒待って抜いて、また差し込んでみる

ファイルはブラウザ上ではリアルタイムに更新されますが、
PCなどからは確認できないことが多いです。
というのも、差込時に読み出し、その後の変化は知らんぷりなためです。
なので、実行が終わった辺りで差し込み直すといいでしょう。
ちなみに、LUA_RUN_SCRIPTは暴走防止等で、起動から実行まで最低5秒くらい待たされます。

通信系の場合: スクリプトの頭に30秒〜60秒くらいの待ち時間を入れてみる

割と見落としがちなのですが、LUA_RUN_SCRIPTはWi-Fi接続が確立する前から
実行が始まります。ので、スクリプト起動後すぐにfa.requestなどの通信をしようとしても、
どうやってもうまく行きません。
ブラウザでは動くのに起動時に動かないの大抵はこれです。

おまけ. fa.pioを叩きまくるとホスト機器と通信不能になります。

スクリプト内でfa.pioをループで叩き続ける場合は、必ず成功可否をチェックし、
(少なくともスクリプトの頭でチェックし)失敗している場合は無理に叩き続けないようにしましょう。
起動猶予時間を使えば脱出は可能ですが、半分文鎮みたいになります。

コメントをかく


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

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

Menu

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

アクセス解析中

忍者アナライズ

GoogleAnalytics

編集にはIDが必要です