Arduino bootloader Problem

Arduino bootloader Problem
ArduinoからArduinoISPスケッチを用いてATmega328Pチップにブートローダーを書き込む方法が、Arduino本家の英語サイト及び日本語サイト「Arduino を AVR プログラマ(ISP: In-System Programmer)として使う」 http://n.mtng.org/ele/arduino/ArduinoISP.html に紹介されています。
そこに書かれているリセットピン問題は今も支障になっており、その解決策としてoptifixスケッチを見つけました。
なお、Arduino IDEとはパソコンからArduinoを操作するソフトウェアを指し、スケッチとはArduino上で動作するプログラムを指します。Arduino as ISPは一つのArduinoが書き込み装置となり別のCPUにブートローダーを書く方式です。
整理すると問題は2つでした。
1.IDEがどのバージョンであっても、ArduinoISPスケッチは母艦(書き込み元)のArduinoのリセットピン(1ピン)が接続されていると誤動作するので、スケッチを書き込み後、ブートローダーを焼く前に、IDEを終了し、USBケーブルを外し、CPUを外して1ピンを曲げる必要がある。
2.このピン曲げ作業を回避できるopitifixというスケッチは、Mac版Arduino IDEのバージョンが1.05なら動作しCPUチップを外すこと無くブートローダーを書き込めるが、IDEバージョン1.5~1.6ではスケッチのコンパイルの段階でエラーが生じる。1.05にダウングレードするにはjavaもダウングレードする必要があり、面倒だ。
対応策は、
1.Arduino IDEバージョン1.5以上+ArduinoISPスケッチでブートローダーを書き込みたい場合は、作業時に1ピンを外すしかない。言い換えればDIPのように容易に1ピンの外せない、フラットパッケージタイプのCPUを載せたArduino互換機は使用できない。 また、CPUを外す際には、先にArduinoIDEを終了してUSBケーブルを抜いてから行わないと、CPUを破損したりパソコンのUSBポートが再起動まで効かなくなるので注意する。
こうすると現行のArduino1.610+ArduinoISPスケッチにて書き込み装置としてArduino as ISP(AVR ISPやArduinoISPではない事に注意)を指定し「ブートローダーを書き込む」を選ぶ事で書き込みに成功する。その際、optibootを書き込みたいときはUNOを、通常速度の純正ブートローダーを書きたいときはDuemilanoveを機種として指定する(母艦の機種とは無関係に選べる)。Mac版の現行のIDEはバージョン1.69、Hourly buildsで1.6.10である。https://www.arduino.cc/en/Main/Software
2.CPUが外せない、あるいはCPUのピンを曲げて破損したくない場合はoptifixというスケッチを使う事ができる。このソフトは「ブートローダーを書き込む」メニューを使わずに、スケッチの内部でブートローダーの転送を行うので、リセット問題が起きない。ただし、この場合Arduino 1.05とMac版java6の環境に戻す必要がある。IDE 1.5以降で使えないのはソフトウェア的な問題なのでエキスパートに今後解決してもらいたいと願う。
Arduino IDE 1.05の入手先はここで、 1.05の右のMAC OS Xをクリックするとダウンロードできる。https://www.arduino.cc/en/Main/OldSoftwareReleases#1.0.x
Macに旧版のJava 6を入れる必要があり、ここからダウンロードする。現行のjava7以降を消す必要は無い。https://support.apple.com/kb/DL1572?locale=ja_JP
optifixの入手先は、http://forum.arduino.cc/index.php/topic,28733.0.htmlに2011年の古い紹介記事があるのでここからoptifix.zipをダウンロードする。(このリンク先はhttps://doc-0o-84-docs.googleusercontent.com/docs/securesc/ha0ro937gcuc7l7deffksulhg5h7mbp1/hr0h6kithh77cv6juer45o2rbv5u2m56/1465459200000/09356349801039513958/*/0B6dMB5dovDUZM2ZhMmUxYTItM2ExNy00MWM1LWIzMTgtNWI0ZGUwYTNhZTE2?e=downloadoptifix.zip)
これを解凍するとoptifix.pdeとoptiLoader.hの2つのファイルがあり、optiLoader.hはArduinoIDE 1.0に対応させるためにエディターで開いて、最初の行を#include <WProgram.h> から #include <Arduino.h>に変更する。optifix.pdeは、Arduino IDE 1.0以上で開くためにサフィックスを.pdeから.inoにするが、IDEから一度開いて保存する際に、必然的に同名のフォルダーに入れて.inoを付ける事になっている。こちらのファイルは内容の変更不要。スケッチを入れるフォルダー内にoptifixという名前のフォルダーをつくり、2つのファイルをそこに置く。
以下はこの結論に至る過程とエラー内容です。
まず、環境はMacOS 10.11.5を載せたMacBookProRetinaで、書き込みのための母艦はoptibootのブートローダーを書き込んだATMega 328P CPUを載せた秋月のArduino互換機で、秋月のFT232RLのシリアルインターフェースを載せ、MacにはFT232RL用ドライバーを入れてあります。これはArduino UNOとしてArduinoIDEに認識されます。代わりにArduino UNOやDuemilanoveを使っても問題ないと思いますが、それ以降の新機種はわかりません。
aitendo製ブートローダライタキット [AKIT-SBW]の結線はArduino本家のサイトと同じで、特に問題はありません。サイト「Arduino を AVR プログラマ(ISP: In-System Programmer)として使う」の最上段の図と同じですが、そこにリセットピンの問題(★)が指摘されています。実際にMac版のどのバージョンのArduinoISPでもこれが障壁でした。IDEのメニューから「ブートローダーを書き込む」を選ぶと、エラーメッセージはavrdudeが出しているようです。
=====
ブートローダーの書き込み中にエラーが発生しました。
avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x14
avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x01
avrdude: stk500_initialize(): (a) protocol error, expect=0x14, resp=0x10
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
avrdude: stk500_disable(): unknown response=0x12
=====
手順は、商品ページ(http://www.aitendo.com/product/10961)に書かれています。
しかし、手持ちのArduino IDE 1.57〜1.69ではoptifixのUnoへのスケッチ書き込みの前の、コンパイルの時点でエラーが発生します。変数の宣言とシフトの処理に問題があるそうです。
=====
Arduino:1.6.10 Hourly Build 2016/05/31 11:12 (Mac OS X), ボード:"Arduino/Genuino Uno"
In file included from /Users/Username/Documents/Arduino/optifix/optifix.ino:43:0:
optiLoader.h:19: error: variable 'image_328' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
extern image_t PROGMEM image_328;
^
/Users/Username/Documents/Arduino/optifix/optifix.ino: In function 'long unsigned int spi_transaction(uint8_t, uint8_t, uint8_t, uint8_t)':
/Users/Username/Documents/Arduino/optifix/optifix.ino:470:26: warning: left shift count >= width of type [enabled by default]
return 0xFFFFFF & ((n<<16)+(m<<8) + spi_send(d));
^
/Users/Username/Documents/Arduino/optifix/optifix.ino: At global scope:
optifix:573: error: variable 'image_328' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
image_t PROGMEM image_328 = {
^
exit status 1
variable 'image_328' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
=====
この2重の問題により、暫定的に1.0環境を用いる対策が勧められています。例:http://p31415926535.blogspot.jp/2015/05/arduino.html
Arduino IDE 1.05の環境であれば、optifix.inoやoptiLoader.hの置き場、1ピンはそのままで、Unoにoptifixスケッチを転送でき、19200bpsを指定したシリアルモニターウインドウからoptiboot_atmega328.hexというブートローダーを送りつけてヒューズビットまで修正する様子を見ることが出来ますし、連続で焼くことも出来ます。 ブートローダーを書き込んだATMega328Pを5個焼き、いずれもArduinoに挿し直し、Unoと見なしてスケッチを転送すると正常動作しました。この環境のままでArduino IDE 1.69を用いるとoptifixのコンパイルができない問題を再確認しましたが、他のスケッチの書き込みには何も問題がなく、プログラミングにそのまま使えます。
なお、optifixの記事は5年前と古く、使うブートローダーのファイル自体はIDEに含まれるものなので、1.05では古いかと思いましたが、最新のIDEに含まれるものとファイルは同一でした。1.05からの書き込みで充分です。
最後に、ATMega 328Pにoptibootを書き込むと、Arduino Duemilanoveに比べてUSB通信速度が19200bpsと速くなり、Arduino UNO互換になります。UNOとoptibootの違いの一つはシリアルインターフェースのチップと、もうひとつはスケッチアップロード時の内蔵EEPROM消去に関するヒューズビットの設定だそうです。その点が重要なユーザーはこのサイトを参照して下さい。「Memoteki: ATmega328Pにoptifixを書き込む」https://tiryoh.com/blog/archives/70
以上レポートでした。
Arduino Bootloader
2016年6月10日金曜日