結論からいうと、リセットボタンをダブルクリックで解決。
以下、詳細。
OSからArduinoが見えなくなった
Arduino UNO R4 MINIMAで、まずはLチカやって動いたので、今度は自分で書いたコードをコンパイルして書き込んだ。そこまではできたのだけど、その後、コードを修正して書き込もうと思ったらエラー。

エラーメッセージは以下の通り。
No DFU capable USB device available Failed uploading: uploading error: exit status 74
OS(Windows)からデバイスが認識されていない。本来なら、下のように「UNO R4 Minima」として見るはず。


しかし、デバイスのリストにそれが出て来ず、Arduino IDEからも該当するポートが見えない。

Lチカが確認できただけで文鎮化してしまった…。
ブーロトーダモード
色々調べているうちに、Arduino UNO R4 Minimaのデータシートにこの記述を見つけた。

(USB経由で見えなくなってしまったら)リセットボタンをダブルタップすればブートローダモードに入れるとある。ならば、これでOSから見えるようになる(再び書き込めるようになる)のだろうと思ったのだけど、「UNO R4 Minima」は相変わらず無い。
しかし、よく見ると、「Santiago DFU」というのがある。

そう言えば、Arduino UNO R4 Minimaを最初にPCにつないだときに自動でデバイスドライバがインストールされたけど、その際のメッセージ「Santiago DFU」というのを見かけた気がする。
もしかしたら、これ?
Arduino IDEの方で確認すると、「Arduino Uno R4 Minima 1-7」というのがある。

これを選んだら、元通りに書き込めた。

一旦書き込めると、「Arduino Uno R4 Minima COM3」として、シリアルポート接続で見える。

復旧したようだ。
ちなみに、Santiago DFUの状態のときにはArduino UNO R4 Minima本体上のビルトインLEDの明暗がゆっくり変化する。しかし、データシートのあの記述ではこういう動作になる(使い方をする)とは理解できないなぁ。
なお、ここまでの記述はArduino IDE 2.1.1のもの。1.8.19だとDFUモード状態のArduino UNO R4 Minimaを認識できないみたい。
トラブル対策としては以上。以下は関連して気づいたことなど。
書込み時にはDFUモードに自動遷移
Arduino IDEで書き込むときの挙動を見ていると、コンパイル終了後に書き込みに入るタイミングでCOMポートで見えていたものがSantiago DFUに変り(ビルトインLEDはゆっくり明暗になる)、その後に書き込みが始まる。書き込んだあとで再びCOMポートに戻る。
切替りの際に待ち時間が発生している。5秒くらいかな。リセットスイッチをダブルクリックすると強制的にDFUモードになり、これだとコンパイルから書込みまでの待ち時間はない。もちろん、このやり方でも書き込みが終ったらCOMポートになる。
コンパイルを始めてからでも大丈夫なので、「書込みはリセットスイッチをダブルクリック」したほうが早い。
ブートローダの書込みには専用ジグが必要?
今回のトラブルが起きたときにブートローダが潰れてしまったのだろうから、ブートローダを書き込み直さなきゃいけないんじゃないかと思っていた。
Arduino UNO R3だと、適当な書込み装置(Arduino as ISPとかUSBasp)を用意してISP経由でブートローダを書き込むことができた(やったことはないけど)。

Arduino UNO R4も同じようなことはできそうだけど、指定できる書込み装置の種類が少ない。

ARM CMSIS-DAP compatible、Renesas Flash Programmer、STMicroelectronics STLINKの三種類、どれも持っていないので、もし、ブートローダを書き込むならどれかを入手しなきゃいけないだろうし、どうつなぐのかもよくわからない。R4にもISP端子はあるけれど、これらの装置にはそこに直接つなげられる信号はないようで。
さらに調べてみると、Arduino UNO R4 Minima Cheat Sheetにブートローダに関する記述があった。

現状ではRenesas Flash Programmerしか使えないようだ。
Step 5の手順(BOOTピンをGNDに落とす)をやると、COMポートとして見えることは確認した(通常の書込みとは別のポート番号になる)。
Arduino UNO R4 Minimaにブートローダを書き込むのは厄介そう。
それはともかく、リセットスイッチのダブルクリックですんだので良かった。
書き込みできなくなった原因
今回のトラブルが生じた原因は自分のコードの記述ミス。
<略>
void loop() {
int i;
while (1) {
analogWrite(DAC, wave[i]);
i++;
if (i >= N_WAVE) {
i = 0;
}
}
}
変数iの初期化を忘れていたのでwave[i]であらぬところをアクセスしてしまったことによる。
しかし、これでプログラムが動かないのはともかくとして、プログラムの書込みができなくなるとは…。
【追記】コンパイルオプションで警告が出せるのではないかと指摘を頂いた。

なるほど。「コンパイラの警告」を「詳細」か「全て」にすれば、上のようにiが初期化されていないとの警告が表示される。ただし、「より詳細な情報を表示する」の「コンパイル」にチェックを入れるとメッセージがどんどん流れていくのでコンパイル後で警告が見えない(スクロールしてさかのぼれば確認できる)。
コメント