秋月でmega328Pが250円だ。2台目からは自作で安く済ませる作戦。
1台目のarduinoは持っていて2台目に3000円出したくない。
生AVRを買ってきて完成品にarduinoを埋め込む方法。
macです。
材料
AVR mega328P
mega8=200円、88p=250円、168p=230円なので328pで良いと思う。(価格は2009/11/1現在)
FT232RL USBシリアル変換モジュール 950円
- ブートローダを焼くためのAVRライタとして使う
- その後はarduino書き込み用アダプタとして使う(DTRで自動リセット)
- デバッグ用のシリアル通信アダプタとして使う
Duemilanoveを改造して使うこともできるんだけど何かと不便なので1個ほしい。
ジャンパ(todo)
外側2つをショートしてる。意味は(todo)
USBから電源供給する→ショート
USBから電源供給しない→はずす(1ピンだけにつけとくとなくさない)
ドライバ
- ブートローダ書き込み、fuse書き込み等、AVRライタとして使うとき
VCPを無効にしてD2XXを使います。
- arduinoスケッチのアップロード、デバッグ用シリアル通信アダプタとして使うとき
VCPを有効にしてVCPを使います。
/dev/tty.usbserial-A9005bvIの様な名前の普通のシリアルポートです。
ブレッドボード&配線材
Arduino 017
オプション
FT232RL+ブレッドボードでブートローダを焼く
bootloaderのバージョン
- 1MHz RC : 省電力
- 8MHz RC : 普通
- 16MHz XTAL : Arduino標準
3パターンあればいいかな。
(todo 1MHz版は必要か?消費電力/電池の持ち時間がどれぐらい違うのか。むしろもっと遅いクロックのバージョンがいい?)
bootloaderを作る
8MHz内蔵RC発振の設定。
# /Applications/Arduino.app/Contents/Resources/Java/hardware/bootloaders/atmega/Makefile
# =======================================================================
# mega328p_default_fuse: [l:62,h:D9,e:7]
# (mega328p 8MHz RC)
# FUSE: -e -U lfuse:w:0xE2:m -U hfuse:w:0xDA:m -U efuse:w:0x07:m
atmega328p_8MHzRC: TARGET = atmega328p_8MHzRC
atmega328p_8MHzRC: MCU_TARGET = atmega328p
atmega328p_8MHzRC: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -DBAUD_RATE=19200 -DDOUBLE_SPEED
atmega328p_8MHzRC: AVR_FREQ = 8000000L
atmega328p_8MHzRC: LDSECTION = --section-start=.text=0x7800
atmega328p_8MHzRC: $(PROGRAM)_atmega328p_8MHzRC.hex
#/Applications/Arduino.app/Contents/Resources/Java/hardware/boards.txt
atmega328p_8MHzRC.name=Arduino ATmega328P_8MHzRC
atmega328p_8MHzRC.upload.protocol=stk500
atmega328p_8MHzRC.upload.maximum_size=30720
atmega328p_8MHzRC.upload.speed=19200
atmega328p_8MHzRC.build.mcu=atmega328p
atmega328p_8MHzRC.build.f_cpu=8000000L
atmega328p_8MHzRC.build.core=arduino
# ----
$ cd /Applications/Arduino.app/Contents/Resources/Java/hardware/bootloaders/atmega
$ rm ATmegaBOOT_168_atmega328p_8MHzRC.hex; make atmega328p_8MHzRC
$ sudo kextunload /System/Library/Extensions/FTDIUSBSerialDriver.kext
$ ~/tmp/mac_bitbang/avrdude-5.3.1/avrdude -C ~/tmp/mac_bitbang/avrdude-5.3.1/avrdude.conf -c diecimila -p m328p ¥
-vv -B 4800 -e -U lfuse:w:0xE2:m -U hfuse:w:0xDA:m -U efuse:w:0x07:m
$ ~/tmp/mac_bitbang/avrdude-5.3.1/avrdude -C ~/tmp/mac_bitbang/avrdude-5.3.1/avrdude.conf -c diecimila -p m328p ¥
-vv -U flash:w:ATmegaBOOT_168_atmega328p_8MHzRC.hex:i
$ sudo kextload /System/Library/Extensions/FTDIUSBSerialDriver.kext
BAUD_RATEは57600だと安定しなかった(8MHz RC)
スケッチ転送
- ArduinoIDEでBlinkをひらく。
- Tools -> Board でデバイス選択。
- Tools -> Serial Port でシリアルポートを選択。
- 転送ボタンを押す。
- 上手いタイミングでリセットをかける。(AVRの1ピンとGNDをちょこんとショートさせる。)
自動リセット回路
FT232RLのDTR----0.1uF(104)----RESET
と接続すればArduino IDEからスケッチをアップロードするときに自動リセットがかかる。
(タイミングと運が良ければ。)
参考URL
fuseが168と328で入れ替わっている件、リセット祭の件が地雷です。
最終更新:2009年11月01日 12:19