ファームウェアを改造していたら、ブートローダーを壊した。
その結果、新しいファームウェアを書き込めなくなり、文鎮と化した。
AVRライターかArduinoがあれば直せる。

壊した原因

プログラムが28672byteを超えたため、Arduino互換機であるIRKitのブートローダー領域を上書きした。Arduinoはブートローダーと実行プログラムが同じプログラムメモリ上に共存しているのだ。
普通のArduino IDEを使っていれば書き込み前にサイズチェックして、こういう事にはならないのだが、inoだと考慮てくれないらしい。

githubでissueを立てたら助けてもらえた。


28672 byte以上書き込むとbootloader領域破壊する

書き込む前に.hexのサイズをチェックする
% /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/avr-size -B .build/irkit/firmware.hex | tail -n 1 | cut -b 11-15
Arduino IDEの中にあるavr-sizeを使う。


直し方


3手必要

  1. IRKitにArduinoのブートローダーを書き込む
  2. IRKitにEEPROMを初期化するツールを書き込む
  3. IRkitのファームウェアを書き込む

前提としてIRKitのファームウェアを改造してセンサー読めるようにするに書いた、inoのインストールやboards.txtへパッチを当てる、などの作業が必要。
また、IRKitの基板上のAVRマイコンに書き込む「AVRライター」も必要。

1. IRKitにArduinoのbootloaderを書き込む


Arduino IDEのバージョンは1.0.5(現在の最新版)

基盤を取り出す


ケース背面のネジを4つ外せば取り出せる。
AVRライターを接続するためのピンヘッダ(オス)を付けた。ケースの蓋を閉めるためにピンヘッダのハンダ付けした側を少し削った。

IRKit

AVRライターを作る


純正のライターが今家に無いので、Arduino UNOをAVR書き込み器にした。
純正のSTK500やAVR-ISP、あるいはusbaspを持ってるなら必要なし。

Arduino – ArduinoISPを参考にした。

  • [ファイル]→[スケッチの例]→[ArduinoISP]

を適当なArduinoに書き込むだけ。


これでSTK500と同等のISPライターになる。
In System Programmingライター、つまり回路からターゲットCPUを取り出さずにプログラムを書き込む事ができる。

うまく書き込めない場合がある

このままライターとして使ってもうまく動かなかった。
"avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x14"
というエラーがでた。
Arduino UNOだからだろうか?他のArduinoだと大丈夫かもしれない。


のパッチをArdunoISPに当てる。empty_reply()を1回だけしか送らないようにする。
-
+int initSent=0;
int error=0;
int pmode=0;
// address for reading and writing, set by 'U' command
@@ -399,7 +399,8 @@
uint8_t ch = getch();
switch (ch) {
case '0': // signon
- empty_reply();
+ if(! initSent) empty_reply();
+ initSent = 1;
break;
case '1':
if (getch() == CRC_EOP) {
これをライター用Arduinoに書き込み直した。


IRKitとAVRライターを接続


IRKitの回路図を見ると、基板上のICPSコネクタにMISO/MOSI/SCK/RESET/5V/GNDの6ピンがある。これは上から見た図。

ICSPコネクタ
Arduino – ArduinoISPを参考に、オス-メスのジャンパワイヤ

  • Arduinoのピン13 → IRKitのSCK
  • ピン12 → MISO
  • ピン11 → MOSI
  • ピン10 → RESET
  • GND → GND
  • VCC → 5V
と接続する。

IRKit


ブートローダーを書き込む

  • [ツール]→[マイコンボード]→[IRKit]
  • [ツール]→[書込装置]→[Arduino as ISP]
  • [ツール]→[ブートローダを書き込む]

で「ブートローダの書き込みが完了しました。」と出ればok。
書き込み中はArduinoのRXとTXのLEDが点滅する。



2. IRKitにEEPROMを初期化するツールを書き込む

このままファームウェアを書き込んでも、IRKitがWiFiに接続できない。
ブートローダの書き込みにより、EEPROMが初期化されてしまっている為。(これはArduinoISPの設定でなんとかできるかもしれない)

EEPROMにはiOSアプリで設定した接続先のWiFiアクセスポイントの情報だけでなく、IRKit本体の設定用アドホックWiFiアクセスポイントの情報や、赤外線データの解析用のデータ構造も含まれている。

EEPROM初期化ツールをビルドしてIRKitに書き込む

前提としてIRKitのファームウェアを改造してセンサー読めるようにするに書いたinoのインストールやboards.txtへパッチを当てる、などの作業が必要。

IRKitのリポジトリからファームウェアやEEPROM初期化ツールのソースコードを持ってくる

% git clone git@github.com:irkit/device.git
% cd device/firmware/t/initialize-eeprom
% ino build -m irkit
% ino upload -m irkit

電源入れてすぐuploadすると書き込める。

設定用のアドホックWiFi APのパスワードはfirmware/t/initialize-eeprom/src/initialize.inoのsaveLimitedAPPassword関数で指定されている。

フルカラーLEDが赤→青に変わるとEEPROMの設定は終了。


3. IRKitにファームウェアを書き込む

IRKitのリポジトリからファームウェアをビルドする

% cd device/firmware
% ino build -m irkit
% ino upload -m irkit

なおmasterブランチが動かなければ
% git tag
% git checkout v1.3.5
などして安定版のファームウェアを書き込むと良い。


これで出荷時状態に戻る(パスワードはsaveLimitedAPPassword関数で指定したものだが)
iOSアプリで自宅のWiFiに接続する設定をして完了。