作ろうとしているもの
ただいま、Flashairに書き込まれたデータを読み出して、枯山水を自動で描くマシーンを作っています。
枯山水マシーン、砂をふるいにかけて細かくした。あと、光の当たり方がみえかたに重要みたい。
— おぼぁ (@obor1994) 2019年6月1日
かなり綺麗に書けるようになったぞ。あとは制御パターンをSDから読み出せるようにせねば! pic.twitter.com/uVftrdpIX6
今週の進捗
— おぼぁ (@obor1994) 2019年6月9日
SDカードからのパターン読み出しに対応。ついでにFlashAirをつかってるので、ウェブページを組んでインストールされているパターンをスマホなどから閲覧可能にした。web開発なれてないからちょっと手間取ったけど。
あとは操作とかアップロードにも対応させてもいいかもね pic.twitter.com/5yrcWK4OTS
使用しているもの
- Arduino Mega 2560
- SD基盤(自作)
- Flashair W-03 8GB (ソフトウェアV3.00.02, STAモードで使用)
問題
今回の問題は単に自分の環境かもしれません。
他の人で同じような現象に悩んでいる、あるいは同じようなこと(FlashairからSD.hを利用した読み出し)をしているが動いているという方がいましたらご報告ください。
ただ、どうもFlashairをからデータを繰り返し読むコードを実行するとFlashairのWi-fiがストップしている様子です。
今回実行しているファイル読み出し部分を超簡単に書くと以下のようなコードになります。
具体的にはSDのマウントを行ってからWi-fiが停止するようです。
(実際はcsvファイルの構文解析処理などが入りますが、以下のように読み出しを定期的に行うコードだけでもWi-fiが停止していました。)
// wi-fiが停止する
SD.begin(A0);
while(1){
char c;
delay(1000);
File myFile = SD.open("TEST.TXT",FILE_READ);
c = myFile.read();
myFile.close();
}
解決策
ダミーファイルを作って定期的に書き込みを行えば通信が維持します。
// これなら動く
SD.begin(A0);
while(1){
char c;
delay(1000);
File myFile = SD.open("TEST.TXT",FILE_READ);
c = myFile.read();
myFile.close();
// ダミーファイル書き込み
myFile = SD.open("TEST2.TXT",FILE_WRITE);
myFile.seek(0);
myFile.println("hey");
myFile.close();
}
考察
最初これが発生したときは、閃 ソラ(@Hirameki_Sora)様やあおいさや(@La_zlo)様の助言を頂き、電源周りを疑って安定化電源を使うなど行いましたが、効果がありませんでした。
そこで試しに公式のサンプルを動作させたところ正常に動きました。これのSD処理周りを抜き出して超単純に書くと以下のようになります。
// これなら動く
SD.begin(A0);
while(1){
delay(1000);
File myFile = SD.open("TEST.TXT",FILE_WRITE);
myFile.println("hey");
myFile.close();
}
どうやらSDをマウント(SD.begin())しても、ファイルに書き込む操作(File.println())が定期的に行われていればwi-fi機能が持続するらしい…です。
SDライブラリとFlashairの組み合わせの都合かはわからないのですが、なんだか気持ち悪い結果になりました。
この書き込み操作を何かしらのコマンドで置き換えればかなり無駄が減ると思います。
何かより良い方法があれば追記していきたいと思います。