ねこにコベイン

にゃーにゃーにゃー

Raspberry Piを使ってArduinoのbootloaderを書き込んだ話

ことの起こり

ASUSのAuraSyncってあるじゃないですか。あのLEDが一斉に同じ色で光るやつ。*1

間違えてあれ対応のファンを買ってから*2、なんとか家のパソコンで使えないもんかと考えて、「PWMってやつで制御するんだったら、Arduino使えばチョロインじゃないのか?」ってえことで、家のお道具箱からAtMega8を掘り出してきた。

これbootloader書き込めばArduinoになるんだろうけど、どうやって書くのか。
ググると「Arduinoを使ってbootloaderを書き込もう」みたいなページがたくさん見つかるが、だからそのArduinoが無いんだってば。*3

使ったもの

マイコン焼き

AtMega8 28pinのAVRならまあなんでもOK。
今から買うならAtMega328とかの方がPWMが多いんでないかい?
Raspberry Pi 機種はなんでもよい。Zeroならばピンヘッダを立てるなど。
ジャンパー線 メス-メス。基板に組むならアイデア次第。

パチモンのあちゃんでいいの

ユニバーサル基板 28pinのAVRが載る程度の大きさ+αは欲しい。
水晶発振子 16MHz。クロックはAVR次第。
パスコン 少々。22pFくらいと104と106。
抵抗 10kΩを挟むところがある。
LED 付けるなら抵抗を挟む。PWRは1kΩ、SCKは330Ωらしい。
スイッチ RESETボタンほか。必要ならば。
ピンヘッダ お好みで。
USB-シリアル変換 あちゃんでいいのをPCとUSBでつなぐ。*4

具合のいいことに

Raspberry Piなら持ってる。

パソコンのUSB端子から電源取れるという意味では、ラズパイ1系がいいんでないか、と思ったところ、うまい具合にうちのラズパイはB+だったりする。*5
でもラズパイ1/ZeroってArduino IDE動かないんだっけ?JavaVMガー、とかのエラーが出て最後までaptが走らなかった気がする。bootloader焼くだけなら関係ないけど。

AVRにラズパイから書き込むためには

Adafruitのページhttps://learn.adafruit.com/program-an-avr-or-arduino-using-raspberry-pi-gpio-pins/configurationに載っているのですが、+5V、GND、MISO、MOSI、SCKとRESETをラズパイに直結して、ラズパイのGPIOが使えるようにビルドしなおしたavrdudeを使えば書けるのです。AVRの足とラズパイのGPIOをジャンパで結ぶだけでOK!

…なのですが、同じくお道具箱で持て余していたaitendoの基板https://www.aitendo.com/product/16544とか使ってゴージャスに仕上げてみました。
AVR焼き機
何となくクリスタルを付けていますが、ひょっとしたら無用の長物かもしれない。

ちなみに+5V、GND、MISO、MOSI、SCKを2x5のボックスヘッダでワンタッチで付け外しできるように、と考えたので、ラズパイ側のGPIOピンのどれを使うかは必然的に決まってしまいました。

avrdudeのビルド

やはり、Adafruitのページhttps://learn.adafruit.com/program-an-avr-or-arduino-using-raspberry-pi-gpio-pins/installationに載っているとおり、avrdudeの6.1をGPIO用にビルドして使うといいと思います。
たぶん普通にaptで導入とかしても、最新版をGPIOオンでビルドしたりしても使えるんだと思うけど、どうも自分はうまくいかなかったんだよな。

$ sudo apt-get install -y build-essential bison flex automake libelf-dev libusb-1.0-0-dev libusb-dev libftdi-dev libftdi1
$ wget http://download.savannah.gnu.org/releases/avrdude/avrdude-6.1.tar.gz
$ tar xvfz avrdude-6.1.tar.gz
$ cd avrdude-6.1
$ ./configure --enable-linuxgpio
$ make
$ sudo make install

$ avrdude -v

avrdude.confの調整

Adafruitのページhttps://learn.adafruit.com/program-an-avr-or-arduino-using-raspberry-pi-gpio-pins/configurationのとおり、avrdude.confをローカルにコピーしてきて編集します。

cp /usr/local/etc/avrdude.conf ~/avrdude_gpio.conf
nano ~/avrdude_gpio.conf

(...)

# Linux GPIO configuration for avrdude.
# Change the lines below to the GPIO pins connected to the AVR.
programmer
  id    = "pi_Zero";
  desc  = "Use the Linux sysfs interface to bitbang GPIO lines";
  type  = "linuxgpio";
  reset = 14;
  sck   = 2;
  mosi  = 3;
  miso  = 4;;

で、bootloaderってどこにあんのよ?


これは有名なoptibootというやつのgithubhttps://github.com/Optiboot/optibootを覗いてみると、だいたいの28ピンAVRで使えるbootloaderということで、MiniCoreというやつがリンクされています。https://github.com/MCUdude/MiniCore/tree/master/avr/bootloaders/optiboot_flash/bootloaders/atmega8/16000000L
何も考えずにこいつにすることにしました。
最終的に16MHz駆動させるので16000000Lの中から選びます。
恐らくArduinoからプログラムを書き込むときの転送レート別に何個もファイルがあるのですが、なんとなく38400bpsのやつをDLしてみたらスケッチの書き込み時にエラーでまくりました。
※後述するarduino.ccサイトの記述によれば「19200bpsでエラー出るんだったら9600bpsでやんべ」とのことのようなので、19200bpsを選びましょう…

$ wget https://github.com/MCUdude/MiniCore/raw/master/avr/bootloaders/optiboot_flash/bootloaders/atmega8/16000000L/optiboot_flash_atmega8_UART0_19200_16000000L_B5.hex


本家っぽいgithubを見つけました。こっちにしておきましょう。ちゃんと動くからなのか、かなり容量食いますね…Mega8だと結構響きます。
Arduinoをインストールしたなら、/usr/shareの下のArduino関連のフォルダを掘っていくと同じファイルが保存されてるよ。

$ wget https://raw.githubusercontent.com/codebendercc/arduino-core-files/master/v167/hardware/arduino/avr/bootloaders/atmega8/ATmegaBOOT-prod-firmware-2009-11-07.hex

flash以外は何を書くのよ?

Arduinoのbootloaderに関する記述https://www.arduino.cc/en/Hacking/Bootloader?from=Tutorial.Bootloaderによれば、AtMega8の場合は、
hfuseを0xca
lfuseを0xdf
lockを0x0F
にすればいいそうです。

結論:avrdudeコマンド投入例

毎回、しなぷすさんのページhttps://synapse.kyoto/tips/ArduinoISP_AVRWriter/page002.htmlをカンペに使ってます。

# avrdude -p atmega8 -C ~/avrdude_gpio.conf -c pi_Zero -U flash:w:optiboot_flash_atmega8_UART0_19200_16000000L_B5.hex:i  -U lfuse:w:0xDF:m -U hfuse:w:0xCA:m -U lock:w:0x0F:m

# avrdude -p atmega8 -C ~/avrdude_gpio.conf -c pi_Zero -U flash:w:ATmegaBOOT-prod-firmware-2009-11-07.hex:i  -U lfuse:w:0xDF:m -U hfuse:w:0xCA:m -U lock:w:0x0F:m

Arduinoの動作確認

そりゃまあ、aitendoのあちゃんでいいのhttps://www.aitendo.com/product/13095に挿すか、回路図http://aitendo3.sakura.ne.jp/aitendo_data/product_img/microcontroller/arduino/atyandeiino/2/adino2.pdfを参照して同等の回路を組むかして、USB-シリアル変換をかませてArduinoNGとして認識させてからBlinkでも書き込んでください。
Arduinoのパチモン、あちゃんでいいのの更にパチモン

*1:一斉に同じ色で光らない方もあります。あっちの方が配線が少なくて簡単なのですがまあいいや。

*2:お酒を飲んだ足で駅前のソフマップに寄ってはいけない。

*3:本当はJapaninoなら持ってるんですけど。

*4:おすすめはこれ。https://www.aitendo.com/product/11086

*5:ラズパイZeroはうまくWiFiを拾ってくれなかった。