ATmega328Pで作るMetaboard互換回路


最近様々なLチカばっかりやってる気がするerukitiです、ごきげんよう。

先日書いたFT232RLでAVRライターを自作してATtiny85をDigispark互換にするまで - Qiitaという記事ですが、micronucleusはATtinyシリーズにしか対応していませんでした。ATmega328Pで同じ事はできないものか?と調べていたところ、どうもATmegaシリーズでの事例の方が先にあったようです。今日はそんなATmegaシリーズで可能なMetaboard互換回路を作成してみました。

ブートローダー

まずは先日のAVRライターでmicronucleusに変わるブートローダー(むしろこっちが元祖?) USBaspLoader を書き込みます。

回路的には9番と10番にクロックを入れてください。調べた限りではどうもUSBを駆動する場合、セラロックはばらつきが多いという話もあるので、ちゃんとしたクリスタルとコンデンサを入れた方がいいかもしれません。(僕はその情報を知らずにセラロックを入れてましたが、一応ちゃんと動いているようです。)

avrdude -c diecimila -p m328p -B9600 -U lfuse:w:0xf7:m -U hfuse:w:0xda:m -U efuse:w:0xfc:m -U flash:mega328p_16mhz.hex:w

さて、このmega328p_16mhzをどこから入手するか。V-USB - A Firmware-Only USB Driver for Atmel AVR MicrocontrollersのDownloadから https://www.obdev.at/downloads/vusb/USBaspLoader.2012-12-08.tar.gz をダウンロードしてきて展開するのは手ですが、どうもこの後の開発はforkされたbaerwolf/USBaspLoader: An (V)USB bootloader firmware for AVR-MCUs emulating the popular USBasp for programming itselfで行われているようですので、これを自前でコンパイルしてもいいかもしれません。(僕は面倒くさがって既にある2012-12-08のバイナリを使ってしまいました。)

注意点はコンパイルする場合、最低でも12MHzを指定しないといけないらしく外部クロックが必須っぽいです。

回路

Metaboard clone by erukiti dd2cee5aa4e2e737 - Upverter

補足: 最初のバージョンでは文字がつぶれてましたが、7of9さんの出力したバージョンによって綺麗になりました。

ピン接続

ATmega328P 名前 接続先
1 reset(PC6) タクトスイッチでGND
4 PD2 抵抗経由でD+
6 PD4 抵抗経由でD-
7 VCC VCC
8 GND GND
9 PB6 XTAL
10 PB7 XTAL
13 PD7 enable boot loader (※1)
19 PB5 Lチカ用LED
22 GND GND

※1: 起動時にboot loaderに行くかどうかを決める。GNDに落ちている間、ブートローダーにいる (USBasp経由で書き込みができる) このピンはタクトスイッチではなくスライドスイッチかジャンパピンで実現するのが好ましい。

参考

スケッチを焼く

まずはplatformioを使ってコンパイルだけします。

$ platformio init
$ cat > platformio.ini
[env:328p16m]
platform = atmelavr
framework = arduino
board = 328p16m
program = usbasp
$ cat > src/test.ino
#define LED_PIN 13
void setup() {                
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(1000);
  digitalWrite(LED_PIN, LOW); 
  delay(1000);
}
$ platform run

本当はPlatformIOでアップロードまでしたかったんですが、やり方がわかりませんでした…。

$ avrdude -c usbasp -p m328p -U flash:w:".pioenvs/328p16m/firmware.hex"
avrdude: error: could not find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp'

avrdude done.  Thank you.

おやUSB deviceが見つからないと言われます。ハードウェアを間違えたのでしょうか?そうではありません。リセットボタンを押さないとUSBaspのブートローダーが反応してくれないのです。

ATmega328Pの13ピン(Enable boot loader)がGNDに落ちている事を確認したらタクトスイッチを一度押してください。その後、もう一度コマンドを実行すれば、今度はうまく書き込めたはずです。(ダメなら回路が間違っているかもしれません。)

うまく書き込めればLEDがチカチカすると思います。

まとめ

  • Digisparkと同じ事はATmega328Pでも可能
  • ATtinyよりも性能が高く、I/Oの数が多いので色々と使い勝手がいい
  • 安価でスケッチをUSB経由で焼き込めるという利点も大きい

といったところでしょうか。それではごきげんよう。