2011年12月14日水曜日

UNOでATmega328にブートローダを書き込む

■はじめに ブートローダを書きこむのに使ったもの
arduino uno R3
arduino IDE 1.0
ブレッドボード
ATmega328  (Pのないやつ) 普通はPのついてる物を使う。

以上。




■石が爆発してしまった。

digital read で設定したピンを
間違って24Vに接続してしまったら、arduinoから異音と異臭が発生。
その直後、「パンッ!」っていう破裂音。
すぐにarduinoから回路を取り外す。
石は破裂したが他は大丈夫そう。
なら石を交換すれば復活するのでは?

■超初心者

これまで電子工作なんかしたことなかった。
興味はあったが、半田とか使ったことはあるけど、切れた電線の接続とかぐらいで、
電子部品を触ったり、組み込んだことはなかった。
チョット興味があってarduinoをスイッチサイエンスで注文。(日本ではここが一番安いのでは?)
わけわからんけど新しいのがいいのでR3にした。

■石って?

そんなのは誰が教えてくれるわけでもなく、自分でWEBで調べた。
arduinoを買ったが、説明書とか解説本は買ってない。
初心者なのにこの有り様。コレがおいらのスタイル。まぁ、WEBで調べるほうが有用な情報が得られる昨今なので。
しかも日本語よりも英語のほうが有用な情報が多い。最近個人的な趣向でTOEIC受けまくってるが、英語を勉強しててよかったと思う。


マイクロコンピューター 略して マイコン   巷?ではどうやら石というらしい。

で、arduino uno R3に載ってる石は ATmega328P-PU


なので、仕事が終わってから早速電気街へ
大阪日本橋の電気街。
家から近いというのもあるが、パソコンとか興味があってしょっちゅううろついてた。
電子工作はしたこと無いけど、パソコンは自作したことがある。
今は組みあがった物を買ったほうが安いと思ってる。

電子部品のパーツ屋さんには何度か出入りしたことがある。
いつも買わずにいろんな電子部品があるなぁって眺めてばっかりだったけど。

んで、「マイコンのATmega328 P」 くださいって店員さんに言ったら
「480円ですが何個いります?」
って聞かれたので2個買ってしまった。

(あれ?WEBで事前に調べたら秋月で250円っ、スイッチサイエンスでブートローダ書込済みが350円なのに~
と心のなかで思いながら。
大阪のパーツ屋さんはどこも、秋月に比べるとかなり高い気がする。
これからはWEBでまとめ買いしたほうがよさそうだなぁ。)


で、買ってきて気づいたがATmega328P じゃなくてATmega328(Pが抜けたもの) だし。
おい、店員!。。。

初心者な俺が行けないのか?

まぁ、Pがつかないくらい別に構わねぇかと。(あとで少し厄介なことに)


■AVRライター?ぶーとろーだー?

なんとなくだが、買ってきたままのプレーンなATmega328をarduino基板に取り付けたって
きちんと動くとは思ってなかった。

arduinoがスケッチを理解するための”何か”仕組みがなければいけないのじゃないかと思っていた。
でWEBで調べたらブートローダというのを石に予め書き込んでおかないといけないということを知った。

でそれをするためにはAVRライターが必要とかなんとか。。。。


えぇぇぇぇぇっっぇ!!!!



■arduinoは万能

おいらが初めてarduinoを触ったのは2日前。

arduino uno R3 スイッチサイエンス

なにがなんだかわからんが、値段がそれほど変わらないのでとりあえず、新しいものをということでR3を買った。

送料無料にするために2個買った。 
いずれXbeeとか使って通信してみたいってのもあったし、壊れた時のためのストックと思って。

で触って2日後に壊れた。というか壊してしまった。

俺も何かMAKE: したいとおもって買ったarduino uno

MAKE:する前に壊してしまった。


で、幸いにもストックがあるわけで。このストックで石にブートローダを書き込めないかとWEBで情報を探る。


!! 発見 !!

あれ、でも、arduino UNO じゃなくて Duemilaなんとか とか Decimiなんとか でないとダメって書いてある。。
なんかISPがどうとかこうとか。。。

いやいや、そんなことはない!

arduino unoは伊達じゃない!

上位機なはずなのにできないとか考えられない!


で探る。


あった。UNOで焼いてる人いるじゃん!
しかも、必要なものはUNOと新しい石とブレッドボード。
AVRライターとか要らんじゃん。

参考ページ
http://matsugee.blogspot.com/2011/12/arduino-uno.html
http://ehbtj.sora-blue.net/electrical/49/
http://blog-yama.a-quest.com/?eid=970124

で、真似してやってみる。



■書き込めない?

optifix.zipをダウンロード

展開してスケッチをアップロードしようとする。

あれ?エラーが出るけど。
何か配線間違ってるのか?
何度も確認するが、あってるはず。

■んで、ちょっとしらべる。
optifixは2011年の1月の仕様になってる。
uno R3は最近のだからブートローダが古いのか?

とおもって、ブートローダについてちょっと調査。
なにやら、UNOでは高速起動、高速書き込みのoptibootってブートローだを使ってるらしい。
でoptifixのなかにあるスケッチを眺めてたら
最後の方にoptibootのイメージらしきコードを発見。

おっ!


optibootは最新のものがv4.4なので

これをoptifixのスケッチのイメージコード部分に上書き。
で、再びスケッチを書きこもうとする。


あれ? まだ書き込めない。


■ちゃんとエラー文を読む

------------------------------------


In file included from optifix.cpp:43:
/optiLoader.h:1:22: error: WProgram.h: No such file or directory
In file included from optifix.cpp:43:
optiLoader.h:6: error: 'byte' does not name a type
optiLoader.h:7: error: 'byte' does not name a type
optiLoader.h:8: error: 'byte' does not name a type
In file included from C:\Documents and Settings\admin\デスクトップ\arduino-1.0\hardware\arduino\cores\arduino/Arduino.h:212,
                 from optifix.cpp:65:
C:\Documents and Settings\admin\デスクトップ\arduino-1.0\hardware\arduino\variants\standard/pins_arduino.h:41: error: expected unqualified-id before numeric constant
C:\Documents and Settings\admin\デスクトップ\arduino-1.0\hardware\arduino\variants\standard/pins_arduino.h:42: error: expected unqualified-id before numeric constant
C:\Documents and Settings\admin\デスクトップ\arduino-1.0\hardware\arduino\variants\standard/pins_arduino.h:43: error: expected unqualified-id before numeric constant
optifix.cpp: In function 'void read_image(image_t*)':
optifix.pde:-1: error: 'struct image' has no member named 'image_pagesize'
optifix.cpp: In function 'boolean target_progfuses()':
optifix.pde:-1: error: 'struct image' has no member named 'image_progfuses'
optifix.pde:-1: error: 'struct image' has no member named 'image_progfuses'
optifix.pde:-1: error: 'struct image' has no member named 'image_progfuses'
optifix.pde:-1: error: 'struct image' has no member named 'image_progfuses'
optifix.cpp: In function 'boolean target_normfuses()':
optifix.pde:-1: error: 'struct image' has no member named 'image_normfuses'
optifix.pde:-1: error: 'struct image' has no member named 'image_normfuses'
optifix.pde:-1: error: 'struct image' has no member named 'image_normfuses'
optifix.pde:-1: error: 'struct image' has no member named 'image_normfuses'
optifix.cpp: At global scope:
optifix.pde:-1: error: too many initializers for 'image_t'


----------------------------------------

初心者の私には何が何やらとおもいたくなるが、
2行目のところに

”WProgram.hなんてファイルやディレクトリなんか無いよ!”

って書かれてる。


そんなこといわれても。。。


ということで
optifixの中をみると、
WProgram.h の include文がある。
なんじゃこのWProgram.hってのは?

ってことでググッてみると

 【内部処理】. WProgram.hをArduino.hに改名


という一文を発見。


で、変えてみる。


と、アップロード ができた!!
で、Arduino IDE のシリアルモニタをひらく


Baud(通信速度のこと)19200にする。

----------------------------------
OptiFix Bootstrap programmer.
2011 by Bill Westfield (WestfW)


Starting Program Mode [OK]


Reading signature:9514
Searching for image...
 Not Found


Type 'G' or hit RESET for next chip
----------------------------------

「イメージ探してるけど見つからないよ」

となってしまう。
??どういうことだ??


■なぜ?




ひょっとしてATmega328 と 328P では違うのか?

http://urasandesu.blogspot.com/2010/02/eclipse-arduino-01.html

によれば328と328Pの違いは低電力かどうかのちがいとかいてある。


これだけなのか?

で、更に探ってみると

http://yatsugatake.org/kodaira/2011/09/27/burn-atmega328p-bootloader-to-atmega328/

”シグネチャーが違うよ”

だってさ。


だってさはいいけど
どうすれば????


色々探ったがよくわからない。

んで、optifixのスケッチをながめてたら

最後の方のATmega328のhexのところに


    0x950F, /* Signature bytes for 328 */

ってある。

これを

    0x9514,

に書き換えてみる。



■アレ?

スケッチをアップロードして
すぐにシリアルモニターを開こうとする。

あれ?書き込めた?

シリアルモニターを開いたら


----------------------------------
OptiFix Bootstrap programmer.
2011 by Bill Westfield (WestfW)


Starting Program Mode [OK]


Reading signature: Bad value: 0
  (no target attached?)


Type 'G' or hit RESET for next chip
----------------------------------


となる。


。。。



わからん。わからなすぎる。

その後何をやっても上の表示のまま。





■試しに

書き込めなかったはずの石をUNOの基板に取り付けてみる。

アレ? 動いてる?


Blink で確かめる。


あ、動いてる。。。。

焼けてたっぽい。


どうやら、
アップロードした瞬間のはじめの一回でブートローダを書き込めていたので、
そのあとシリアルモニターを開いてもブートローダを書きこめない(上書きができない)みたいです。









■まとめ

●結局、Arduino IDE 1.0を使うなら

1.optifix.zipをダウンロードしてきて
2.optiLoader.h の WProgram.h を Arduino.h に書き換えれば
ATmega328Pなら書き込めるみたい。


●optifixのスケッチの最後の方にある
optiboot の部分を最新のイメージにすれば、なおいいのだろう

ちなみにarduino-1.0フォルダ内に
\arduino-1.0\hardware\arduino\bootloaders\optiboot
があるので、ここからoptibootの最新のイメージ(hex)が手に入る。


●あと、
ATmega328ならoptifixスケッチのoptibootの部分で signature を 0x9514にすれば書き込めるっぽい。




■さらにわかったこと
Arduino IDE 1.0 では WProgram.h は Arduino.h に置き換わってるようだ。


んでから、どこかで読んだが、ヒューズが違うらしい。

 Uno:     Low:FF HI:D6 Ext:FD
 Optifix: Low:FF HI:DE Ext:FD

なので

optifixのスケッチの

   {0x3F,0xFF,0xDE,0x05,0}
のところを
   {0x3F,0xFF,0xD6,0x05,0}
にでもすればいいのか
初心者の俺にはさっぱりわからないが。




とりあえず、これでUNOが復活できた!
今度は2つ使って遊んでみようかなぁ~
その前に、まずは石を壊す原因となったアレをMAKEしなくては!


1 件のコメント:

  1. なんか知らんけど、感動した!
    素晴らしい(^^)v
    「アレ」がなにか気になる・・・

    返信削除