スケッチはArduinoに書き込む際、コンパイラとアセンブラで機械語に変換されてマイコンのフラッシュに書き込まれる。
マイコンに書き込まれたデータを吸い出す事は可能である。ただ、disassemblerを使ってある程度読める形に復元する事は出来るが、それを元のスケッチの形に復元する事は出来ない。
とは言え知っておいても損は無いと思うので紹介しておく。
事前準備として、データを吸い出す対象のArduinoをブートローダーを書き込む際同様、Arduino as ISP等で接続する。
マイコンからの吸出しはavrdudeコマンドを使う。avrdudeコマンドはWindowsの場合下記フォルダーに入っている。
C:\Program Files (x86)\Arduino\hardware\tools\avr\bin
コマンドプロンプトで上記フォルダーに移動し、下記コマンドでマイコンのフラッシュデータをバイナリファイルに吸い出す事が出来る(ただし、読み取りプロテクトがかかっている場合は読めない)。
avrdude -C "..\etc\avrdude.conf" -v -v -p atmega328p -c avrisp -b 19200 -U flash:r:"c:\temp\arduino.bin":r -P COM8
-p はマイコンの種類、-U は吸出し対象と出力ファイル、-P はシリアルポートを指定する。avrdudeのパラメーターについては下記ページに説明がある。
https://www.nongnu.org/avrdude/user-manual/avrdude_4.html#Option-Descriptions
EEPROMのデータを吸い出す場合、-U flashの変わりに -U eeprom とする。
avrdude -C "..\etc\avrdude.conf" -v -v -p atmega328p -c avrisp -b 19200 -U eeprom:r:"c:\temp\eeprom.bin":r -P COM8
Arduino UNOの場合1KBのダンプファイルが作成される。EEPROMにデータを書き込んでいる場合、データが正しく書き込まれているか確認する際にも利用する事が出来る。
例えば、下記スケッチを書き込んで実行する。
#include <EEPROM.h>
void setup() {
Serial.begin(9600);
char testdata[32] = "Dummy Data";
EEPROM.put(0,testdata);
for (int i=0;i<64;i++)
EEPROM.put(0x0f*i,testdata);
}
void loop() {
}
Dummy Dataの文字列が64個分15バイト毎に書き込まれる。EEPROMを吸い出してバイナリエディタで確認すると、実際にEEPROMの中身のデータがその様になっている事を確認できる。