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つのファイルをそこに置く。


 ブートローダーはoptifixスケッチによって、このように書き込まれる。


以下はこの結論に至る過程とエラー内容です。



 まず、環境は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

=====



 次の手段として、aitendo ブートローダライタキット [AKIT-SBW]のサイトでoptifixというスケッチ経由でブートローダーを書き込むことを勧めています。

手順は、商品ページ(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日金曜日

 
 
Made on a Mac
次へ  
 
  前ヘ