Atmel ATmega1284P-PUへのArduino BL書込やスケッチULについて色々試行錯誤したメモ。
BL書込みに成功したのでドーパミン分泌が萎まないうちに覚書も含め記録させて頂きます
自分には以下の様な展望がありました。
- 328Pではメモリ容量的に限界がある。以下の理屈に続く
- 一つのAVRに沢山のセンサを付けたい(うち1〜2点だけはAD変換を利用したい)
- C言語に長じていないため、自分のPG技量で省メモリ的に組むには厳しい。
- RasPI+I2CのA/D変換ICとかモジュールという方法も考えうるが、消費電力、ネット上のサンプルのリソース量なども含めてRasPI自身の習得や設定に時間がかかるだろう。
そこで、ATmega1284Pや644PのDIP版に注目する。しかし調べた範囲ではこんな認識だった。
- ebayなどで大きいAVRの格安のArduino互換の開発ボードがあるが、実用にコンパクトで無く、MCが基板実装なので自由度に欠ける。
- 秋月や共立で644*や1284*のDIP版のAVRが売られている。ebayで探すと殆ど送料がかかるものだし1284のDIP版なら秋月が最安?
- SOP版の値段もそんなに変わらず安くならないようである。
- Sanguinoのブートローダー導入の情報もあり、調べて知っていたがIDEのバージョン等扱いにひと癖ある印象で試そうと思わなかった。若干敷居が高そう。
調べ物をしているうちに以下のURLの頁に行き着く。
Mighty-1284Pというブートローダーを使っているようである。そこでこの方法をまんま真似てArduino化出来ないかと計画を立てる
新たに調達したものや準備・利用したもの
- Atmel ATmega 1284P-PU / 秋月にて新たに購入
- ebayのFT232RL FTDIのUSBシリアル変換器 / この出品者のは安いし、思いのほか早く届いた。台湾の出品者は大凡早めな印象
- ブレッドボード, ジャンパワイヤ, セラコン 0.1μF×3, レジスタ 10kΩ×1, セラミックレゾネータ(水晶振動子が高額なため代用), タクトスイッチ, Arduino UNO
丸々上記のURLの作業でやってみたが、発振子は水晶の物を持っていなかったのでセラロックを利用。精度は水晶振動子より悪いらしいが、動作については低クロックのものを328Pで利用して動作に成功しているので大丈夫だろうと予想しました(これが後述の問題となる)。水晶振動子の方はebayで安価で10個セットとかで売られているので購入したが未だ届いていない。大凡以下の様なワイヤリングで行った(ブレッドボードの上下の電力ラインが2ラインづつじゃなく、実際には上+、下-づつの配線だった)。左からブートローダ書込、アップロード(※作図画像のAVRは644Pだけど、1284Pと置換えて見てください) BL書込はSPI、スケッチULはUSBシリアル変換器からクロス接続で利用する感じであろうか? コンデンサは殆どバイパス用、リセットの抵抗はプルアップ用でしょう。
〜作業の流れ 準備
- 上記のURLの掲示板にアクセスし、Atmega_Board_Programmer.zipとAtmega_Fuse_Calculator.zipをDL
- GitHubのmighty-1284pプロジェクト頁に行き、頁右側の[Download Zip]からDL
- mighty-1284p-master.zipを展開し、Arduino IDEの環境設定のスケッチ保存場所以下のhardwareフォルダ(なければ作る)に移動する。
- Arduino IDEを起動し、マイコンボードの欄に Mighty-1284p 16MHz using Optiboot等の一覧への追加の確認をする。
- FT232RLのドライバは導入に一癖あり、自己解凍形式を展開できるアーカイバで適宜のディレクトリに一旦展開し、デバイスマネージャ一覧から [ディスク使用] のボタンを押す所迄行き指定する形で、USB Serial Converter, USB Serial Portの段取でインストールする (そのままインストーラを実行するだけではドライバがインストールされず、更に何処にファイルが転送されたかわかりにくく、ディスク使用の時に指定先が不明なため)
- FT232RLの規定の電流申告量90mAでは厳しいかもしれないのでFT_Prog(ドライバと同じ配布元のUtil)で少々だけ上げたほうがいいかもしれない。自分の場合出来るだけ繋ぎっぱで動作確認可能にするため、500mAの申告に変更してみたが寿命を早めるかも?(参考:Google検索 "Arduino 消費電力")
〜作業の流れ ブートローダー書込
- 左上図のように配線し、Atmega_Board_Programmer.zipを展開(どこでも良い)、Atmega_Board_Programmer.inoをIDEに読み込む。
- COMポートの番号、マイコンボードがArduino UNOであることを確認し、スケッチ(Atmega_Board_Programmer.ino)の書込を開始。
- 書込が終了したらシリアルモニタを開き、ボーレートを115200に合わせ、UNOのリセットボタンを押す。
- 対話形式の流れに従ってBL書込を行う( GがBL書込、VがVerify)。終わったらVerifyを行い確認する。
〜作業の流れ スケッチアップロード
- 右上図のように配線しその後USBケーブルを繋げる。
- IDEを起動しマイコンボードをMighty-1284p 16MHz using Optibootに選択、シリアルポートの番号が合っているか確認
- スケッチをアップロードする。
書込みには成功したが、スケッチのアップロードがうまくいかない。この問題が解決するのに2日程かかった。FT232RLが正しく機能しているか疑うところから、いろいろ調べて試してみたが駄目だったりした。調べているうちにMCの微妙なシグネチャの違いの情報もあった。そして疑いは水晶を使用していないという点に行き着く
原因はセラロックを使用していることにあるらしく、Atmega_Board_Programmer.inoが設定するヒューズビットが水晶発信器向けらしい。
- The resonator works perfectly with lfuse 0xF7 (not 0xFF).
- Sanguinololu 1.3a - Part 3:Not Out of The Woods Yet / オンラインのfuse計算器を利用している例も見られる。異なるヒューズビットになっている
Atmega_Board_Programmer.ino ファイルを
// ATmega1284P family { { 0x1E, 0x97, 0x05 }, "ATmega1284P", 128 * kb, 1 * kb, optiboot_atmega1284p_hex, 0x1FC00, // start address sizeof optiboot_atmega1284p_hex, 256, // page size (for committing) [変更前] 0xFF, // fuse low byte: external clock, max start-up time [変更後] 0xF7, // fuse low byte: external clock, max start-up time
のように変更(コメアウトして追加するのがいいでしょう)してブートローダーの再書込作業を行ったら、無事スケッチをアップロード出来るようになった。とりあえず、A0への0-5v入力だけ動作確認しているのみなものの、予備の1284P-PUがひとつ欲しくなりました。
(14/11/12 追記事項) avrdude.confの変更
上記のスケッチがアップロード出来ていない時に、色々試行錯誤してみた中に既に含まれていたので気が付きませんでしたが、追記します。MCの微妙なシグネチャの違いの情報http://forum.arduino.cc/index.php?topic=121305.0
MCには製品種の判別の為のシグネチャというものがあるようで、Arduino ISPではそのままではMCが認識されずにスケッチが書き込めずエラーが出るようです。そこで無難に動作すればととりあえず Arduino ISPのavrdude.confを開いて編集する
desc = "ATMEGA1284P"; has_jtag = yes; stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one avr910_devcode = 0x74; # signature = 0x1e 0x97 0x06; (コメントアウト) signature = 0x1e 0x97 0x05; (追加)