メリット・デメリット

メリット

  • AVRマイコン+プログラムライター+電源が安価(\3,200くらい)に手に入る。
  • USB接続なので、シリアルポート、パラレルポートのないPCでAVRを使った工作ができる。

デメリット

  • USB経由のプログラム書き込みを行うにはArduinoのブートローダが必要(販売されているArduinoには書き込み済み)。これが32kバイトあるフラッシュメモリのうち、2kバイトを消費してしまう。
  • プログラムの書き込み、基盤上のピン配置がオリジナルのAVRマイコンと微妙に異なる。

参考になるWebページ

Program Arduino with AVR-GCC
Linuxでの開発環境(AVR用GCC、LIBCなど)の揃え方、プログラムのコンパイルの仕方、プログラムのアップロードの仕方など、一通りの情報が得られる。
USB接続のみでプログラムを書き込むには"Upload with a Bootloader"に書かれた方法を使うのだが、ATMega328pが搭載された最近のArduino Duemilanoveではアップロードに失敗してしまう。対処法は以下に。

新型Arduino Duemilanoveにおけるプログラムのコンパイル・アップロード

コンパイル

新しいavr-gcc(少なくともversion 4.3.2では対応を確認)ではATMega328p向けのコンパイルオプションが実装されている。したがって
avr-gcc -g -Wall -O2 -mmcu=atmega328p -DF_CPU=16000000UL
とやれば良い。あとは上記参考ページと同じ。

アップロード

今回最大のハマりどころ。参考ページに書かれた通り、
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向けに設定の変更が必要。
  • 設定ファイルの更新
avrdude(少なくともVersion 5.5以下)に付属する設定ファイルavrdude.confにはATMega328p向けの設定がない。
Arduino IDEに付属(hardware/toolsの下)のavrdude.confに設定項目があるのでこれを拝借する。
設定ファイルだけ使えば良く、IDE付属のavrdudeでなくても動作することを確認した。
コマンドラインオプションに”-C (avrdude.confのパス)”を追加し、"-p m328p"とすればATMega328p向けの設定を使えるようになる。
  • 転送速度の変更
ATMega328pになったことで、転送速度が19200から57600に変わった模様。上記コマンドラインオプションを"-b 57600"とすることで対処できる。
  • シリアルポートのリセット
上記2つのオプションの変更をしつつ、Arduino IDEで使われているコマンドラインオプションに準拠させると、
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のピン配置参照。
タグ

Wiki内検索

管理人/副管理人のみ編集できます