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ならばピンヘッダを立てるなど。 |
ジャンパー線 | メス-メス。基板に組むならアイデア次第。 |
具合のいいことに
Raspberry Piなら持ってる。
パソコンのUSB端子から電源取れるという意味では、ラズパイ1系がいいんでないか、と思ったところ、うまい具合にうちのラズパイはB+だったりする。*5
でもラズパイ1/ZeroってArduino IDE動かないんだっけ?JavaのVMガー、とかのエラーが出て最後まで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とか使ってゴージャスに仕上げてみました。
何となくクリスタルを付けていますが、ひょっとしたら無用の長物かもしれない。
ちなみに+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でも書き込んでください。