たぶんflashがcorruptした3.3VのArduinoのプログラムをRaspberry PiからAVRDUDEで書き込むと復活した

### 1. Arduinoの調子が悪くなった
* *Arduino ProMini*(3.3V/8MHz)へのプログラムアップロードができなくなった。
* 小さいことが特徴の*ProMini*にはUSBが付いていないので、PC上の*Arduino IDE*との接続にUSB-FTDI変換ケーブルを利用する。
* このUSB-FTDI変換ケーブルにちょっと難があり、プログラムアップロードができなくなってしまった。
* RESETしてもLED(D13)が高速点滅するのみでアップロード前のプログラムも動作していない。たぶん、書込が失敗してflashがどうにかなったと思われる。

#### 1.1 ロジックレベル3.3VのRaspberry Piが役に立つかも
* しばらく使っていない*Raspberry Pi*(私のは *model B2*)も3.3Vなので何か手があるのではと調べてみると、[AVRDUDE(AVR Downloader/UploaDEr)](http://savannah.nongnu.org/projects/avrdude/)
のマニュアルに嬉しい記述を発見し、これを実行することにした。

> If you happen to have a **Linux system with** at least **4 hardware GPIOs** available (like almost all embedded Linux boards) you can do without any additional hardware - just connect them to the **MOSI**, **MISO**, **RESET** and **SCK** pins on the AVR and use the **linuxgpio** programmer type.
>

* なお、以下の説明では、次の３者が登場し、1.と2.はネットワーク接続された状態(sshを利用)、2.と3.はGPIO pin等をワイヤーで接続した状態で動作する。
    1. PC(Ubuntu) -- Mac, Windowsでも同じはず
    2. Raspberry Pi(Jessie)
    3. Arduino ProMini(3.3V/8MHz)

### 2. Raspberry Piにavrdudeを準備
* 基本的に、[参照ページ](https://oxygene.sk/2015/02/using-raspberry-pi-as-an-arduino-avr-programmer/)を参照してその通りに実行したのだが、つまづいた点や異なる点などを共有したい。
* なお、参照ページがいつかなくなるかもしれないので、コマンドのみメモしておく。
<pre><code>
pi@raspberrypi:~ $ sudo apt-get install bison flex libusb-dev
pi@raspberrypi:~ $ mkdir /avr
pi@raspberrypi:~ $ cd /avr
pi@raspberrypi:/avr $ wget http://download.savannah.gnu.org/releases/avrdude/avrdude-6.1.tar.gz
pi@raspberrypi:/avr $ tar xf avrdude-6.1.tar.gz 
pi@raspberrypi:/avr $ cd avrdude-6.1
pi@raspberrypi:/avr/avrdude-6.1 $ ./configure --prefix=/opt/avrdude61 --enable-linuxgpio
pi@raspberrypi:/avr/avrdude-6.1 $ make
pi@raspberrypi:/avr/avrdude-6.1 $ sudo make install
</code></pre>

#### 2.1 ビルド必須、~~最新版はエラー~~
* *Jessie*で<code>apt-cache search avrdude</code>すると*avrdude*はあったので、ビルドしないでそのまま使えることを期待して<code>sudo apt-get install avrdude</code>したが、これは、*linuxgpio*が利用できなかった。
    * ちなみに、利用可能な*programmer type*を調べるには、*avrdude*の<code>-c?</code>オプションを利用する。

* 参照ページでは、avrdude version 6.1を利用しているが、現在の最新版は6.3なので、~~6.3を利用したが、実行時に、<code>Can't export GPIO *, already exported/busy?: Invalid argument</code>のエラーが出てしまい、うまくいかなかった。<code>/sys/class/gpio/</code>には、既にexportされている様子は見当たらない。~~
  (この項目、取り下げさせてください。書いたことは嘘ではないのですが、版の違いとは別の問題のようです。すみません。）
* 6.3は諦めて、6.1（参照ページのまま）を取得しなおして解決。

#### 2.2 Raspberry Pi model B2とArduino ProMiniの場合の接続例
![Program_ProMini_from_RPiB2.png](https://qiita-image-store.s3.amazonaws.com/0/162998/90483cde-3b9c-e678-50b2-784b74fde5d3.png)
この接続の時の*avrdude*の*configuration file*は、次の通りでした。ただし、()内は説明のために追加しました。
<pre><code>
pi@raspberrypi:/opt/avrdude61/etc $ sudo vi ./avrdude.conf
(linuxgpioのところのコメントを外して、GPIO番号を入力する)
#
programmer
  id    = "linuxgpio";
  desc  = "Use the Linux sysfs interface to bitbang GPIO lines";
  type  = "linuxgpio";
  reset = 2;
  sck   = 3;	(→ arduinoのsck(D13)に接続)
  mosi  = 17;	(→ arduinoのmosi(D11)に接続)
  miso  = 4;	(→ arduinoのmiso(D12)に接続)
;
</code></pre>
 
### 3. アップロードする.hexファイルを準備
* PC上のArduino IDEで、ArduinoのサンプルのBlinkを開き、（自分のプログラムとわかるようにちょっと変更し、）好きなフォルダで一度コンパイルする。
* メニューから、「スケッチ -> コンパイルしたバイナリを出力」を選択する。
* Blink.inoと同じフォルダに、２つの.hexファイルが生成され、ファイル名でbootloader付きと無しがわかる。
    * Blink.ino.eightanaloginputs.hex
    * Blink.ino.with_bootloader.eightanaloginputs.hex
* bootloader付きの方を、Raspberry Piに転送する。
<pre><code>
$ scp Blink.ino.with_bootloader.eightanaloginputs.hex 	pi@XXX.XXX.XXX.XXX:arduino/BlinkwB.hex
</code></pre>

### 4. Raspberry PiからArduinoにプログラムをアップロード
<pre><code>
pi@raspberrypi:~/arduino $ sudo /opt/avrdude61/bin/avrdude -c linuxgpio -p m328p -e -U flash:w:BlinkwB.hex -v
</code></pre>

以上です。Blinkが動いてこんなに感動するとは思いませんでした。