ATmega328Pで作るMetaboard互換回路

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

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

## ブートローダー

まずは先日の[AVRライター](http://qiita.com/erukiti/items/0a51d959082e242e2e2a#ft232rl-ae-um232r%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9Favr%E3%83%A9%E3%82%A4%E3%82%BF%E3%83%BC)で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](https://www.obdev.at/products/vusb/usbasploader.html)の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](https://github.com/baerwolf/USBaspLoader)で行われているようですので、これを自前でコンパイルしてもいいかもしれません。(僕は面倒くさがって既にある2012-12-08のバイナリを使ってしまいました。)

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

## 回路

[Metaboard clone by erukiti dd2cee5aa4e2e737 - Upverter](https://upverter.com/erukiti/dd2cee5aa4e2e737/Metaboard-clone/)

![Metaboard-clone.png](https://qiita-image-store.s3.amazonaws.com/0/32870/28ba038c-4b3c-85f9-8670-0c6d98378321.png)

補足: 最初のバージョンでは文字がつぶれてましたが、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経由で書き込みができる) このピンはタクトスイッチではなくスライドスイッチかジャンパピンで実現するのが好ましい。

### 参考

* [Metaboard – Metalab](https://metalab.at/wiki/Metaboard)
* [USBasp - USB programmer for Atmel AVR controllers - fischl.de](http://www.fischl.de/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経由で焼き込めるという利点も大きい

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