2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-05-04

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)
    のマニュアルに嬉しい記述を発見し、これを実行することにした。

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.

  • なお、以下の説明では、次の3者が登場し、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を準備

  • 基本的に、参照ページを参照してその通りに実行したのだが、つまづいた点や異なる点などを共有したい。
  • なお、参照ページがいつかなくなるかもしれないので、コマンドのみメモしておく。

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

2.1 ビルド必須、最新版はエラー

  • Jessieapt-cache search avrdudeするとavrdudeはあったので、ビルドしないでそのまま使えることを期待してsudo apt-get install avrdudeしたが、これは、linuxgpioが利用できなかった。

    • ちなみに、利用可能なprogrammer typeを調べるには、avrdude-c?オプションを利用する。
  • 参照ページでは、avrdude version 6.1を利用しているが、現在の最新版は6.3なので、6.3を利用したが、実行時に、Can't export GPIO *, already exported/busy?: Invalid argumentのエラーが出てしまい、うまくいかなかった。/sys/class/gpio/には、既にexportされている様子は見当たらない。
    (この項目、取り下げさせてください。書いたことは嘘ではないのですが、版の違いとは別の問題のようです。すみません。)

  • 6.3は諦めて、6.1(参照ページのまま)を取得しなおして解決。

2.2 Raspberry Pi model B2とArduino ProMiniの場合の接続例

Program_ProMini_from_RPiB2.png
この接続の時のavrdudeconfiguration fileは、次の通りでした。ただし、()内は説明のために追加しました。


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)に接続)
;

3. アップロードする.hexファイルを準備

  • PC上のArduino IDEで、ArduinoのサンプルのBlinkを開き、(自分のプログラムとわかるようにちょっと変更し、)好きなフォルダで一度コンパイルする。
  • メニューから、「スケッチ -> コンパイルしたバイナリを出力」を選択する。
  • Blink.inoと同じフォルダに、2つの.hexファイルが生成され、ファイル名でbootloader付きと無しがわかる。
    • Blink.ino.eightanaloginputs.hex
    • Blink.ino.with_bootloader.eightanaloginputs.hex
  • bootloader付きの方を、Raspberry Piに転送する。

$ scp Blink.ino.with_bootloader.eightanaloginputs.hex 	pi@XXX.XXX.XXX.XXX:arduino/BlinkwB.hex

4. Raspberry PiからArduinoにプログラムをアップロード


pi@raspberrypi:~/arduino $ sudo /opt/avrdude61/bin/avrdude -c linuxgpio -p m328p -e -U flash:w:BlinkwB.hex -v

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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?