クロックの精度が悪いなら分周比をいじる

今日は、実験で作ってたロボットの仕上げ作業をしてた。

夏休み前に状況を整理して方針を決定するべく作業していたのだが、

見事に完成したので、もう夏休みは作業しなくていいねって話になった。


まだ未解決だった問題はいくつかあったのだが、その中でも僕の担当に関係する問題は、

Androidとカメラの接続が確認出来ていないこと と 無線LANモジュールとマイコンのUARTの通信が不調 なこと。

カメラの接続については、意外にもあっさりと確認出来た。

少しトラブルもあったのだが、ゴミデータを捨てる処理を追加したらあっさりうまくいった。

Arduinoのソースコードが上がってたのでこれをもとに実装してくれたら、それでほとんどOKだったようで。


さて、残る問題はUARTの通信だけである。

いろいろ確認したが、RC発振回路の精度があまりよくないのが原因というのはほぼ間違えないようだ。

内蔵RC発振器の精度がどうも3%ぐらいしかないようで。それを基準にしてちゃUARTで要求する誤差1%以下は確かに満たせない。

(参考記事 : UARTはシンプルだけど )

ただ、詳しい人に聞いてみたら、9600bpsぐらいなら内蔵RC発振器でも経験則的には問題はないようで。

とはいえ現に問題が生じているのでどうにかしないといけない。


クロックの精度を上げればよいというのが正攻法だが、

新しく水晶振動子かセラロックか用意しないといけないのがまず問題。まぁセラロックなら学校に転がってるよって言われたけど。

その問題よりもなにより問題なのがマイコンのピン割り当てを変えないといけないこと。

プログラムも書き直しになるし、なによりはんだ付けをやり直してもらわないといけないので手間がかかる。

なのでなんとか現状のハードウェアで何とかする方法を模索することにした。


とりあえず通信速度を落としてみよう。というわけで2400bpsに落としてみた。

ただ、これでもデータが化けた。まぁ元のクロックの精度が悪いんじゃ速度を落としても仕方ないよねって。

そこで分周比をいじることにした。分周比を下げていくとデータが化けずうまく通信できるところを見いだすことができた。

もっともRC発振回路は温度などにより変動が生じる。

なので今はこの設定でよくても条件がかわるとうまくいかない可能性もある。

が、そんな極端に暑いところや寒いところで使うわけでもなし、これでもおそらく問題ないだろうと。

これで今度やったときデータが化けたらまた分周比を変えるまでだ。

場当たり的な対策だが、手っ取り早く問題を解決できるのはこれだろう。


最初からセラロックか水晶振動子か使う設計にしとけばよかったんですけどね。

セラロックは1個80円で買えるし。

それを前提としてピン割り当ても決めておけば、同じ品種でもなんとかなったわけで。

そうでなくてもクロック用のポートを開けておくべきだったね。それならセラロック買ってきて付けるだけで事足りたわけだし。

設計してたときは内蔵の発振回路使っとけばいいわ、と思ってたんだけど、まさかこんなことになるとはね。

UARTは落とし穴だった。


少し気になるところはあるけど、これでもちゃんと動いたことして問題ないでしょ。多分。

このクロックの問題は反省点として挙げるべきことだろうけど、

内蔵RC発振器の精度をプログラムで補正しましたって言い方もできるわけだし。