高速世界 - Arduino

高速の世界を指向/思考する。

某企画でレーザーとモーターとの組み合わせである特殊なレーザープロジェクタのDIYに取り組んでいる。
モーターとレーザーとの同期がなかなかセクシーなことになってて、ミリ秒単位(ms)の制御じゃ全然精度が悪くて、マイクロ秒(us)の世界に突入している。そして0.003%以下のモーターのフラッターに悩まされ、Arduinoのクリスタル(16MHz)の誤差にさらに悩まされる。

モーターの性能としては、オーディオ用のACモーターでも誤差は0.006%とかってなっているからきっと悪くないんだろうけど、オーディオ用のモーターと比較すると回転数が全然早いので、何週も回しているうちにどんどん誤差が集積されていってしまってずれていってしまう。さらにクリスタルも誤差があるから、ステッピングモーターでモーターをちゃんとArduinoから制御するか、もしくは周回ごとにフォトダイオードなりできっちり同期を取らないと。そしてさらなる高速世界へずぶずぶと、、、

AVRの1フロップはクリスタルが16MHzなので1us辺り16フロップ、1フロップは0.0625us。62.5ナノ秒か。us単位できっちり同期をと思うとArduinoのdigitalWrite関数なんかじゃ(フォーラムによるとdigitalWriteを呼ぶだけで50フロップ程度使用しているとか、、、)遅い。今ちょうどみつけたんだけど
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1226290298
この辺りの記事を参考に、Arduinoではなく、AVRを直に叩く必要がある。それでも速度が足りない場合は、クリスタルを32MHzに交換か、もしくはmbedを使うという手もあるのかも?

そしてそれだけの精度を要求される作業になると、loop関数の中でちまちまやるよりは、Timerを使って割り込み処理をさせる。Arduinoでやるべき作業ではなくなってきているけれど、USB経由で簡単にプログラムの書き換えができるってのはやっぱり助かるので、その部分だけを使って、内部はよりプレーンなAVRプログラミングへ向かう。

mbedはこれまで使ったことが無いのだけれど、ちょろっと見た記事では32bitのプロセッサと96MHzのクロックで、AVRと比較するとかなり早いことになってる。とりあえず1枚発注してみて試してみよう。

そんな高速世界はそもそもその振る舞いをちゃんと確認するだけでも大変だ。目で見てその振る舞いは正しいのか、ずれているのかを判別できない。Arduinoのクリスタルの誤差はtoneでジェネった矩形波をブザーでならしつつ、コンピュータ側からも同じ周波数の矩形波をならしてその誤差でチューニングを図ったりする。

そんな高速世界。