Japaninoの忘れ物2:外部発振モードにしてJapaninoをフルに使いこなそう!

MTM05 の会期中あたりから既に「その噂」はあったのですが*1、「わりとシビアな実験」をしてみたかたによって、その「新たな事実」は明らかになりました。

JapaninoのXTALは飾りかな?だってデフォルト内蔵RC発振モードでしたよ! #japanino
2010/06/08/05:51:17

http://twitter.com/Nabe_RMC/status/15707516426

すぐに追試されたかたもいらっしゃいました。確かに、そのようです。

Japanino 公式サイトでも、(いつの間にやら…) FAQ に項目が追加されていました。

というわけで、これは誠に勿体無いことです。何が勿体無いかって、ギリギリまで詰めたコストダウンに負けず採用された水晶振動子が、何千台、何万台出荷されたのかは知りませんが、ほとんどの Japanino で使われないままその生涯を閉じるわけです*2

実害は(ほぼ)ありません。

「水晶が付いているのに、実際は使われていない」。

これは、痛恨のミスには違いないと思われます。ただし、多くの場合においてそのまま使用しても何ら差し支えがありません。

  • ほぼ影響がないと考えられる用途(例)
    • LED を点滅させる
    • LCD表示など、低速度、または I2C 、SPI など、ハンドシェーク方式のデバイス通信
    • RTC、SNTP、GPS など時刻源から情報を取得して表示する時計
    • tone() 関数などを使用して音楽を奏でる*3
    • サーボモーターをざっくりと動かす
    • アナログセンサの値を読み取る
  • 動作が安定しないなど、影響の出る可能性のある用途(例)
    • サーボモーターの制御など、パルス制御のデバイスを厳密な動作で使用したい場合
    • MIDI などの、リトライがあまり望ましくない機器間通信
  • できれば使用を避けたい用途(例)
    • 外部に時刻源を持たない(GPS や RTC などを使用しない)時計
    • 高速シリアル通信(38400bps より高速の UART など)
    • ビデオ信号などをダイレクトに出力する実験

要するに、Japanino に付属の POV を使用したり、マガジンの記事として掲載されている作例を試したりするぶんには、まず問題ありません(だからこそ気付くのも遅れたのでしょうけどね!)。


そして、もし望むならば(失敗した場合のリスクはありますが)比較的簡単な装備と手順で、「水晶を使用する設定」に書き換えることが可能です。
ここはひとつ、「Jananino / Arduino 初心者」からの卒業検定、という位置づけで、この水晶問題を捉えてみるというのはいかがなものでしょうか。

何が必要なのか

「AVRライタ」と、書き込み用のソフトウェアが必要です。
Japanino / Arduino に使用されているマイコンチップは ATMEL 社の AVR というシリーズで、このチップの中に記憶された設定を読み書きするためには、パソコンとマイコンチップをリンクするための簡単なハードウェアが必要です。またこの読み書きには複数の方式があり、それぞれ対応したハードウェア(とソフトウェア)が必要になりますが、今回のケースには、一番簡単な「ISPモード」で対応できます。
(もし失敗した場合には、別の方法で書き込む必要が生じます。→ がんばれ!)
ハードウェアは、 ATMEL 社純正のものも販売されていますし、安いものは数百円で入手可能です。

…というか、Japanino とは別に Arduino Duemilanove / Duecimila を持っている人は、これをそのままライタとして使用することができるし、FT232RL USB−シリアル変換チップを利用した変換ボードを持っている人はこれもそのままライタとして使用することが可能。

いちから揃える場合は、秋月電子の↑このモジュール、ブレッドボード、ジャンパ線を用意して、こちらの手順((番外) FTDI BitBang AVR-Writer)で作業するのが「もっとも手軽」だろうか…。
ソフトウェアについては、フリーで公開してくださっているかたがたがいらっしゃるので、それらを利用することができます。感謝。


今回は Arduino をライタとして利用し、フリーのライティングソフトを利用する方式でチャレンジします。

では、実際どの程度の誤差なのか

一般に、外付けの水晶発振子を使用しないでマイコンチップに内蔵されている CR 発振モードを使用すると「クロックの精度が低い」とか「動作が安定しない」などと言われるようですが、じゃあ、現実にはどんなもんなんでしょうか。リスクを負ってまで作業するメリットは、どのくらいあるのか。 ざっと調べてみることにしました。
クロックといえば、時計です。(…何を言ってるんだとか言わないでください。)
スケッチは↓こちら。

時刻あわせはシリアルコンソールから”yyyymmddHHmmss”書式で数字列を送ってやると有無を言わさずその時刻に合わせる方式(というか、それしかできない)。バックアップなんていう高級なことはやっていないのでリセットがかかったり電源を抜いたりすれば初期化されてしまいます。あと、1時間毎に「時報」を鳴らします(結構うざい)。
これをまず、 Arduino Duemilanove で実験。…写真は無い(撮ったつもりで忘れていたらしい)。結果だけ大まかに言うと、24時間稼働させて1秒狂ってない。というか、ほとんどズレは生じていないもよう。流石です。(仮に 0.5秒/日程度として、月差 15秒ならば市販のクオーツ時計と同レベルの精度ということになります。)
で、 Japanino で試してみた。……ってこれがすごい。みるみるうちに狂っていく。温度やその他の条件によっても違うのだろうけど、1分で 1秒ずつ、確実に狂っていく。これは確かにクロック基準でシンクロさせるようなデバイスだと、かなり厳しいなぁ…。

結局、0x5E7ED00 ミリ秒 ≒ 9.9万秒 ≒ 27時間半 ほど稼働させた結果、写真のとおり 21分半ほど進んだ。つまり 1日あたりざっと +1200秒、+19分。+1.3%。 これは時計としては明らかに使えない部類*4に属しますね…。
これが 1秒/日 (0.001%)以下になるのなら、試してみる価値は「あり」かもしれません。 是非やってみましょう。

というわけで、「目覚めよ、外付け発振子!」をやってみたよ

マイコンチップ「AVR」の中に書き込まれている設定の一種である「ヒューズビット」を書き換えることにより、使用するクロックを「内蔵モード」にするか外付けの「外部モード」にするか決められるという仕掛けになっています。今回のケースでは、水晶発振子は正しく取り付け済みであり、(なにかの事故で水晶が壊れてさえいなければ)必要な作業は単にマイコン内部の設定の書き換えだけになります。
なお、御注意。
公式サイトの Q&A には

デフォルトは内蔵CR発信設定になっております。ブートローダーの書換(Q13)で、外部Xtal発信に変更できます。(通常使用で変更の必要はありません)

と書いてありますが、



以下、初期記述から(比較的重要な)訂正【2010/06/13】

ブートローダーの書き換え」と「ヒューズビットの書き換え」は基本的に「別の作業」です。(通常、同じ環境(ハード・ソフト)でできますし、新しいマイコンチップを買ってきてプログラムを書き込むとか Arduino 化するとかの際には、両方やるわけですが。)とりわけ、Arduino IDE のメニューから「[ツール] > [ブートローダーを書き込む]」([Tools] > [Burn Bootloader])の操作のみでは、今回やりたい「ヒューズビットの書き換え」はできません(…たぶん…(未確認です。できるのかもしれません。すみません。))ので気をつけてください。

…などとと書きましたが、実際は上記操作によってヒューズビットも書き換えが行われます。訂正してお詫び申し上げます。 m(_ _)m
ただし、そのままでは不可で、Arduino IDE の設定ファイル(boards.txt)の内容を書き換える必要があります。詳しくは、新たにエントリを起こしましたので、こちら を御参照ください。
(訂正ここまで)


あと、当レポートで実行した「Arduino を AVRライタとして使用する方法」は、Arduino に搭載されている USB - シリアルチップ FT232RL の「BitBangモード」を使用する方式ですので、FT232RL ではなく CP2104 が搭載されている Japanino がもう 1台あったとしても、同じようにはできませんので、この点も御注意ください。
あと、FT232RL が搭載されていても BitBang モードに必要な信号線の出ていないタイプのシリアルアダプタでは書き換えのための結線ができませんので、やはり不可です。(例:SparkFun の FTDI Breakout など)
また、使用しているソフトウェアが Windows 版のみなので、Mac では(そのままでは)できません。
こうした場合は、こちら arms22 さん御執筆「なんでも作っちゃう、かも」

で紹介されている、ソフトウェアのほうも Arduino のスケッチで実現している方式などを検討してみてください。
【後日追記】おぐらむさんが実証実験を敢行して下さいました。Japanino をホストとしても、遂行可能とのことです。詳しく書かれているので一読の価値アリです → 『半田付け無しでJapanino同士ヒューズビットを再設定する』


さて、私自身は「初心者に産毛が生えた程度のただの Arduino 好き」ですので、この作業で発揮できるオリジナリティは特にありません。基本的に小坂先生の

この手順に 100% 従って実施しました。(ありがとうございます。 m(_ _)m)
Arduino 基板上にピンヘッダを設置するために、半田付けと半田吸い取りの作業が必要です。これを回避したい場合には、上でも挙げた秋月電子USBシリアルモジュールを使用するこちらの方式を検討したほうがいいかもしれません。

取り付けた 4ピンのピンヘッダ。手前が USBシリアルチップの FT232RL 。

因みに

Japanino に 2×3 のピンヘッダを取り付けるとこんな塩梅ですが…
(Japanino には ICSP コネクタのピン番号が記入されていませんが、流石にここは Arduino と同じ(デジタル側の「上寄り」が 1番ピン)です。)

ジャパニーノにAVRライタつなぐにICSPピンヘッダは不要 AVRライタの信号線を,ソケットにつなぐ。MOSI-->デジタル11,MISO-->デジタル12,SCK-->デジタル13,RST-->リセット,Vcc-->+5V,GND-->GND #Japanino
2010/06/11/21:41:22

http://twitter.com/arduino_diecimi/status/15924985775

この方式で行けば(ISP コネクタに出ている信号線は、全て Arduino 標準のピンソケットに出ているのです)、Japanino のほうも改造は不要です。(すばらしい!)


Japanino のほうには手を加えずに済む この方式で配線する場合、こんなかんじです。

使用しているのは、以前作成したこういうケーブルと

今回作成したこういうケーブル。

ええ、確かに Excel で作図しましたけど、何か?
使用したパーツは「虹色すだれケーブル」と、「汎用信号コネクタ(2550)」。(千石電商で売ってます(店頭には 2×3 もあります)) あと参考までに、コネクタピンのかしめは、汎用精密圧着ペンチ(こういうの)を使用する場合、先端部(被覆を剥いた部分)は思い切って強めに、根元部(被覆ごとかしめる部分)はかなり軽めに、でやるとうまくいくようです。(コツを掴むまでにどれだけ無駄にしたことか… orz)


ソフトウェアのセッティングについてはこちらを御参照ください。(私もそれ以上はわかりません ^^;)


設定を完了し、 Arduino と Japanino をケーブル接続し、Arduino を PC と USB 接続します。Japanino に 6ピンのピンヘッダを取り付けた場合の接続はこのようになります。

一瞬気になって Arduino 側の ATMega328P を外したりしてますが、正直全く関係ないです。(ぉぃ)
なお、Arduino 側の ICSP コネクタから出ている 2本は VCC と GND 、ただの電源ですので、別にここから取らずに別のピンから抜いても構いません。
ただし、間違えて 6本フル接続のほうのコネクタを ライタ側(Arduino 側)に挿してしまうと、ライタ側 Arduino の AVR を書き換えることになってしまいますので、ここはくれぐれもお間違えなきよう。(というか、Arduino を単体で AVR チップライタとして使用する場合はそういう接続になります(電源のみのほうの6ピンコネクタを余らせる)。)

準備完了。書き換えに入ります。
ライタソフトである avrdude-GUI.exe を起動…ですが、ひとつ注意すべき点があります。(起動してからでも構いませんが。)今回使用する Arduino 以外に、PC に他の Arduino やその他の「USB - シリアルデバイス」が挿さっていた場合、抜いておいてください。デバイスが複数ある場合、通信がうまくいかないことがあるようです。
(あと、特に X3 の 4ピンコネクタは逆挿しに注意するといいと思います。別に私がやったから言っているわけではありません。大事なことなのでもういちど言いますが、断じて私が逆に挿して気付かず 10分ぐらい悩んだとかそういうことではありません。上の写真でも何か、線の色が逆のように見えなくもないですが、たぶんそれは気の所為か、「いまのは悪い見本」的な何かです。)


ソフト起動画面。

今回操作するのは、「FUSE」の部分の「lFuse」だけです。(※ 緑と青で囲った部分は選択/入力が必要です。)「Read」を押して読み出しが成功すれば、画面のように上から「DE」「D2」「00」と表示されるはずです。資料をみると、「lFuse」のうち下位 4ビットがクロックの選択になっており、とりあえず他は手をつけないという方針で行けば、設定する値は

D6」(0xD6)ということになります。緊張しつつ「Write」を押します。(※ ここで間違えたり、いい加減なことをやったりすれば、マイコンチップが一切使えなくなったりして、復旧のために「高圧(12V)書き込み」対応の上位機能ライタが必要になったりする。)

更に緊張しつつ(こわー)「はい(Y)」を押します。一瞬で完了。AVR チップが正常に動作し、反応するかどうかはもういっかい「Read」を押してエラーが出たりしなければ、一応大丈夫。


ヒューズビットを書き換えただけならば、先にロードしてあったスケッチもそのまま残っています。さて、どうでしょう……

はい! 無事起動しました! (拍手!) …で、肝心の精度ですが

起動してから(正確にはちょっと違う)、約2000秒後*5。おお、ずれてない!
因みにくっついてる丸いのは超小型スピーカーで、起動音とか時報を担当しています。この、ピンソケットに挿して使用するちょっとした hacks は、こんな感じ。→ http://twitpic.com/1od18n (すみません、これも記事書いたつもりになってましたが書いてませんでした m(_ _)m) あと、このスピーカーは秋月電子で以前扱っていたものですが今はディスコンになってしまったようで、たいへん残念。*6

約4万秒(約11時間)後。若干…ずれてきている気はしなくもなかったですが、まだ 1秒ずれていません。ヒューズ書き換え前と比較すれば、明瞭な差が出ています。書き換え、成功です。


因みに

まだ 24時間経過していませんが、このあたりで電波時計とのずれが約1秒に達しました(※ 開始時からのずれ、ということです。また、正確な計測ではありません)。 Arduino Duemilanove での実験の際より若干精度は落ちる感じでしょうか…。ロードテストはここまで。


というわけで、私も無事「Arduino 初心者」から昇格することができました…「初級者」に。
まだまだ道程は長いです。


次エントリに、今回テストに使用した時計のスケッチを置いておきます。


なお、一応書くまでもないとは思いますが、この記事に書かれた内容を参考に何かなさる場合は、自己責任にて。最悪、大事な Arduino / Japanino が一切使いものにならなくなる危険があることは御承知おきください。

【参考】Japanino 関連情報ならば、これを読め!【リコメンド】

Japanino(ジャパニーノ) まとめ @wiki - Tipsや裏技や技術情報など:http://www35.atwiki.jp/japanino/pages/24.html
ヒューズビットの書き換え方法の様々についてもまとめてあります。


私が公開した情報・画像なども結構載ってるよ!

*1:具体的にはこういうことでした → http://twitter.com/Sim0000/status/16004126250

*2:この趣旨のオリジナル発言は こちらの tweet になります: http://twitter.com/morecat_lab/status/15842662976

*3:tone() 関数には、そもそも楽器として考えた場合の精度はありません。

*4:というか私の書いた「時計スケッチ」も相当に使えない部類なんですが、それは今回あんまり関係ないので気にしないでください。

*5:最初にテストしたときからスケッチも若干バージョンアップしています。

*6:19mmφ×2.6mm、32Ω(35Ωという説もあり)、2個入りで¥100。
ピッタリ同じものは無いが近いものなら鈴商で入手可能。店頭には 20mmφ×2.0mm、32Ω、0.2W、1個¥150というものがあった。