Raspberry Pi で avrdude を使用して linuxgpio モードで Arduino hex 書込
えっ、何?
Raspberry Pi の GPIO ピンから AVR ISP 経由で ブートローダー込みの Arduino スケッチを Arduino(AVRチップ) に書き込む話
前提
以下の環境である
Raspberry Pi
table:lsb_release -a
Distributor ID Raspbian
Description Raspbian GNU/Linux 9.11 (stretch)
Release 9.11
Codename stretch
今回対象としたArduinoボード
Arduino Pro/Pro Mini 互換 3.3V 8MHz RC発振
...と販売サイトの説明にはあるだが挙動的にブートローダーが書かれていない感じ(製造不良っぽい)
USBシリアル変換器経由の書き込みがうまくいかない(応答がない)
ヒューズビットが正しく設定されている(発振器の分周など)ことは確認済み
table:fuses
fuse名 読み取り
efuse 0xFD
hfuse 0xDA
lfuse 0xE2
lock 0x0F
ヒューズビットの読み出しも簡単にではあるが後述する
Arduino IDE 1.8.10 (macOS 版)
avrdude
書き込みソフト
今回の主役
バージョン 6.2
ちなみに、apt get install avrdudeでインストールできるものはうまくいかなかった (謎) 手順(目次)
avrdude をビルド/インストール
linuxgpio 設定をコンフィグファイルに記述
Raspberry Pi GPIOとISPコネクタ間の配線
hexファイルを準備
avrdude で書き込み
(おまけ)ヒューズビットの読み出し
avrdude をビルド/インストール
ダウンロード
解凍
$ tar -xf avrdude-6.2.tar.gz
ビルド
ディレクトリに入る
$ cd avrdude-6.2
linuxgpio を使用できるようにコンフィグする
$ ./configure --enable-linuxgpio
ビルド
$ make
インストール
$ sudo make install
インストール確認
せっかくなので-cオプションでプログラマー種類の一覧を出してみる
$ avrdude -c?
リストが出てくるがlinuxgpioが見当たらない。これを次の手順で追加する必要がある。
linuxgpio 設定をコンフィグファイルに記述
avrdude.conf ファイルの編集
$ sudo vim /usr/local/etc/avrdude.conf
編集する
1172行目付近のコメントアウトを外し、?になっている以下のようにピンを設定する。
code:avrdude.conf
programmer
id = "linuxgpio";
desc = "Use the Linux sysfs interface to bitbang GPIO lines";
type = "linuxgpio";
reset = 25;
sck = 24;
mosi = 18;
miso = 23;
;
再度プログラマー一覧を出してみる
code:shell
avrdude -c?
...中略...
jtagmkII_avr32 = Atmel JTAG ICE mkII im AVR32 mode
linuxgpio = Use the Linux sysfs interface to bitbang GPIO lines
lm3s811 = Luminary Micro LM3S811 Eval Board (Rev. A)
...以下略...
linuxgpioが見つかるようになった!
Raspberry Pi GPIOとISPコネクタ間の配線
Raspberry Pi GPIO
基本的にavrdude.confに書いた通り
table:raspberrypigpio
GPIO 信号名
18 mosi
23 miso
24 sck
25 reset
電源ピン
3.3V
GND
ISPコネクタ(6P)
table:ISPconnector
信号名 ピン番号 ピン番号 信号名
miso 1 2 Vcc(3.3V)
sck 3 4 mosi
reset 5 6 GND
配線
ジャンパケーブル等で Raspberry Pi GPIO と ISPコネクタの同じ信号名同士と電源を接続する
本当はmosi,miso,sckの信号線はダンピング抵抗を入れた方が良い(けど、今回のレベルでは無くてもおそらく問題ない)
抵抗の位置は下記のように寄せる。つまりは信号出力側に寄せる。
mosi,sckは Raspberry Pi 側
misoは Arduino 側
hexファイルを準備
Arduino IDE
動作確認しやすいスケッチ(Blinkなど)を用意する
スケッチ>コンパイルしたバイナリを出力する
https://gyazo.com/0bc24f7daf976d76c71640e27c05014f
スケッチの格納ディレクトリに.hexファイルが2種類できている
{スケッチ名}.ino.eightanaloginputs.hex
{スケッチ名}.ino.with_bootloader.eightanaloginputs.hex
with_bootloaderの方にはその名の通りブートローダー入りである
これを Raspberry Pi にscpなどで移動させる
avrdude で書き込み
書き込み
$ sudo avrdude -c linuxgpio -p m328p -e -U flash:w:{上記で出力/移動した}.hex -v
基本的にこれだけ。
異常がある場合rc=-1などと出てくる
その場合、配線や諸々を疑う
Can't export GPIO 25, already exported/busy?: Device or resource busyなどと出てくる場合
GPIOピン番号に合わせて以下を実行する(Raspberry Pi の方で GPIO として確保されているようで、それを解放する)
$ echo 25 > /sys/class/gpio/unexport
Blink等のスケッチであれば、動作が確認できるはずである。
ブートローダーも書き込まれたので、以後USBシリアル変換器で書き込みもできるようになった
めでたしめでたし
(おまけ)ヒューズビットの読み出し
$ sudo avrdude -c linuxgpio -p m328p -U lfuse:r:lfuse:h -U hfuse:r:hfuse:h -U efuse:r:efuse:h -U lock:r:lock:h
接続が正しければ以下ファイルに読み出したヒューズビットが書き出されている
efuse
hfuse
lfuse
lock
ヒューズビットの詳細はデータシート等で別途調べてください