- USB経由のプログラム書き込みを行うにはArduinoのブートローダが必要(販売されているArduinoには書き込み済み)。これが32kバイトあるフラッシュメモリのうち、2kバイトを消費してしまう。
- プログラムの書き込み、基盤上のピン配置がオリジナルのAVRマイコンと微妙に異なる。
Program Arduino with AVR-GCC
Linuxでの開発環境(AVR用GCC、LIBCなど)の揃え方、プログラムのコンパイルの仕方、プログラムのアップロードの仕方など、一通りの情報が得られる。
USB接続のみでプログラムを書き込むには"Upload with a Bootloader"に書かれた方法を使うのだが、ATMega328pが搭載された最近のArduino Duemilanoveではアップロードに失敗してしまう。対処法は以下に。
Linuxでの開発環境(AVR用GCC、LIBCなど)の揃え方、プログラムのコンパイルの仕方、プログラムのアップロードの仕方など、一通りの情報が得られる。
USB接続のみでプログラムを書き込むには"Upload with a Bootloader"に書かれた方法を使うのだが、ATMega328pが搭載された最近のArduino Duemilanoveではアップロードに失敗してしまう。対処法は以下に。
新しいavr-gcc(少なくともversion 4.3.2では対応を確認)ではATMega328p向けのコンパイルオプションが実装されている。したがって
avr-gcc -g -Wall -O2 -mmcu=atmega328p -DF_CPU=16000000ULとやれば良い。あとは上記参考ページと同じ。
今回最大のハマりどころ。参考ページに書かれた通り、
Arduino IDEに付属(hardware/toolsの下)のavrdude.confに設定項目があるのでこれを拝借する。
設定ファイルだけ使えば良く、IDE付属のavrdudeでなくても動作することを確認した。
コマンドラインオプションに”-C (avrdude.confのパス)”を追加し、"-p m328p"とすればATMega328p向けの設定を使えるようになる。
何度やってもうまくいくArduino IDEのソース(app/src/processing/app/AvrdudeUploader.java)を見ると、一度シリアルポートをリセットした後でプログラムを転送している。
同じ動作を行うPythonスクリプトは以下のようになる。
avrdude -p m168 -P /dev/ttyUSB0 -c stk500v1 -b 19200 -F -u -U flash:w:hoge.hexとやると
avrdude: stk500_recv(): programmer is not respondingというメッセージが返ってきて書き込みできない。Arduino Duemilanove向けに設定の変更が必要。
- 設定ファイルの更新
Arduino IDEに付属(hardware/toolsの下)のavrdude.confに設定項目があるのでこれを拝借する。
設定ファイルだけ使えば良く、IDE付属のavrdudeでなくても動作することを確認した。
コマンドラインオプションに”-C (avrdude.confのパス)”を追加し、"-p m328p"とすればATMega328p向けの設定を使えるようになる。
- 転送速度の変更
- シリアルポートのリセット
avrdude -q -Cavrdude.conf -pm328p -cstk500v1 -P/dev/ttyUSB0 -b57600 -D -Uflash:w:hoge.hexとなる。これでプログラムを転送すると、ボードを接続した直後は正しく転送できるのだが、2回目以降はまた失敗するようになる。
何度やってもうまくいくArduino IDEのソース(app/src/processing/app/AvrdudeUploader.java)を見ると、一度シリアルポートをリセットした後でプログラムを転送している。
同じ動作を行うPythonスクリプトは以下のようになる。
#!/usr/bin/env python from serial import Serial import time import os devname = '/dev/ttyUSB0' if os.path.exists(devname): ser = Serial(devname) while(ser.inWaiting()>0): s = ser.inWaiting() ser.read(s) time.sleep(0.1) ser.setDTR(False) time.sleep(0.1) ser.setDTR(True)このスクリプトを実行してすぐにavrdudeを実行する(参考)。したがって手入力ではうまくいかない。タイミングはそれほどシビアでないので、Makefile中に
install: hoge.hex flush_serial.py (←上記Pythonスクリプト) avrdude -q -Cavrdude.conf -pm328p -cstk500v1 -P/dev/ttyUSB0 -b57600 -D -Uflash:w:$<と書けば問題なく転送できることを確認している。
LSIの足の並びと基盤上のピンの配置が異なる。Arduino/ATMega328のピン配置参照。
タグ
最新コメント