Arudino UNO R3(その3)
気を取り直して次の課題に...
・ADを含めて素のArudino UNO R3でどこまでいけるのか?
であるが115200bpsでも動かないArudino UNO R3ではどうしようもなく、結局はFTDIでやってみた。
やってみるとFTDIだとどれもアプリが落ちるということはない。ってことはドライバにどこか足りない点があるのかしら?
1.転送速度の高速化
115200bps 正常動作
230400bps 正常動作
460800bps おかしな値を示す
921600bps 上よりさらにおかしな値を示す
となっていて、230400bpsあたりが限界のようだ。
で、これでやると2.5Khzが5Khzになるか?といえばそうでもない。
そもそも460800bpsとか921600bpsでも倍々になる様子もない。
2.ADの高速化
どうもADの部分がかかっているようだ。
100us=10KHzほどなのでは?違うかな?これだとどう頑張っても5KHzだ。
Arduinoは普通だと10bit保証している時間をかけているが転送が8bitなので
例えば
ADCSRA = ((1<<ADEN) | 4); //16M/16=1Mhz(max) 13us
と1MHzのクロックにすれば...。
ADCのセットアップの後にやった。
115200bpsだと、そちらがネックになってさほど効果があるようにも見えない。
ただ倍速にすると効果が出る。
またADCも割り込みであれば転送時間に隠れさせられる可能性もある。
http://garretlab.web.fc2.com/arduino/inside/arduino/wiring_analog.c/analogRead.html
を見ると割り込みは使ってない感じ。
ここに割り込みを使う手もあるが、もっと手っ取り早くは
・AD開始
・AD完了待ち
・送信開始
・送信完了待ち
みたいにせずに
...
・AD完了待ち
・送信開始
・AD開始
・送信完了待ち
・AD完了待ち
・送信開始
・AD開始
...みたいにすれば待ち時間がかなり隠されて早くなりそう。
ただArduinoは送信も割り込みになったらしいし。
これらを自前で書くことはどうも...。
全部そうすればいいのかな?追求の余地がありそう。
3.余分な時間の短縮
Serial.flush();
のあとの
delayMicroseconds(100);
は外してもOKでこれは速度があがった。(ただ少なくして残したほうがいいのかも)
エラーはbpsをあげない限りは大丈夫のようだ。
まとめ)
速度をあげていくにつれ感じも良くなるが...それでも遅いような。根源的に桁が違うというか...。
bpsをあげると多少なりとも早くなるが、今度はADが問題になる。
あまりあげてもデータがおかしくなるだけのようで230400bpsが限界の模様。
それにAndroidの受信が追いついているのか?という疑問もある。(Thread.sleepが入っているがこれが曲者かも。)
結論としては
・Arudino UNO R3は何らかの工夫が必要
ドライバなのかもしれないが詳細不明(とりあえずは保留)
・230400bpsならFTDIでかろうじてとれている
焼け石に水かもしれないが倍速にはなるが信頼性は不明
・ADも工夫しないと高速にはならない
そちらは35kHzぐらいにはなるかもしれない。
きちんとやるならArduinoのライブラリではなく自前で記述する必要がある。
今のところは最高でも4KHzのオシロって感じ。
頑張れば倍速ぐらいまでにはできるかもしれないような印象。
ただ転送に関しては、汎用的には安全をとって115200bpsの方がいいように思う。
<その後>
・通常は115200bpsとし、
ArduinoではdelayMicroseconds(100);
AndroidではThread.sleep
をそれぞれ削除。これで4KHzのスコープができる。
・倍速化として
ADの高速化。元々は125KHzなのを1MHzにする。
方法1)
arduino\hardware\arduino\cores\arduino\wiring.c
で308行ほどの以下の2箇所をコメントアウト。
sbi(ADCSRA, ADPS2);
//sbi(ADCSRA, ADPS1);
//sbi(ADCSRA, ADPS0);
方法2)
SetupにADの設定後以下を追加。
ADCSRA = ((1<
・転送速度を115200bpsから230400bpsにする
とやると8KHzほどのオシロになった。2chで8KHzなので1chだと16KHzというか転送も変えれば20KHzぐらいは出るかもしれない。
現状:転送が5KHz/chでADが5KHz/ch。総合で2chで4KHzほど
倍速:転送が10KHz/chでADが35KHz/ch。総合で2chで8KHzほど
というのが結果。
これ以上はbpsをあげると転送がおかしくなってしまう。
Arudino UNO R3に期待したが望むべくもないのか実力不足なのか...。
やる気が一番問題かもしれない。(TT)
このあたりで挫折して一気にRAMの情熱がうせてしまった。
そのうち気を取り直せばやるかも。
コメントはありません