PR

Arduino UNO R4に書き込めなくなったらDFUモードを使え

結論からいうと、リセットボタンをダブルクリックで解決。

以下、詳細。

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

コメント

  1. 原田正範 より:

    COMポートがなくなり困っていたところ、このページのおかげで自分のスケッチが問題であることがわかり、解決しました。ありがとうございました。
    ビルド時に「ライブラリのアーキテクチャが AVR のものなので互換性がないかもしれない」という警告が出ていたのを無視してたので、こうなりました。
    実はスケッチは K3NG キーヤーで、UNO R3 では入らない機能を全部入れるため UNO R4 互換機を入手して試してみたのですが、すんなりとはいかないです。

    • jh4vaj より:

      ユーザプログラムの問題で書き込みすらできなくなるのって困りますよね。役に立ったようで良かったです。
      K3NG CW Keyerを移植しているんですか。すごいですね。ハードウェア依存が高そうな気がしています。頑張ってください。

  2. 原田 より:

    お気遣いありがとうございます。
    その後おかげさまで K3NG キーヤーを動作させることができました。
    先日の段階で動作しなかったのは、ボタンを常にオンと認識していたからで、原因はすでにこのサイトでもとりあげられているアナログ入力の問題でした。
    ボタンではアナログ入力を使っており、当該回路ではボタンを押していない状態でポートは 4.7kΩでVccにつながっているだけになります。
    Vcc にプルアップしているのと同じで 1023 に近い値が期待されますが、調べてみると 997 でした。ご承知のとおり、実質のインピーダンスが低くなっています。
    プログラムではボタンを押した状態との閾値は 1000になっていたので、常にボタンが押されているように処理されていたのでした。
    なお、「ラジオペンチ」さんが次のページで触れられているように、コンデンサーを並列につけると、かなり改善されます。
    http://radiopench.blog96.fc2.com/?no=1272

    上記ボタンの閾値以外には悩む修正はありませんでした。
    LCD のライブラリを AVR 専用でないものに差し替えたのと、ヘッダーのインクルードの追加だけです。
    ヘッダーのインクルードは、次の4行を追加しただけです。理解はしていませんが動作はしています。

    #elif defined(ARDUINO_MINIMA)
    #include
    #include
    #include

    • jh4vaj より:

      遅くなってすみません。
      (大雑把に言えば)大きな変更なしで動いたんですね。
      ハードウェアの違いはArduino環境が面倒を見てくれてのでしょうね。すごい。

      ADコンバータの値に大きな誤差が生じるあの仕様はひどすぎますよね。
      コンデンサ追加で改善するのですか。
      その話は提示していただいた記事の中では見つけられませんでした。
      別の記事で触れられているのでしょうか?

  3. 原田 より:

    自分は内部を理解していないので、同じ UNO で リビジョンの違いだけだから、ソースコードでの互換がとれていることを期待していました。単にコンパイルしなおせばよいだろうと始めたものです。結果的には期待通りの環境だったということですね。
    互換をとるためにコンパイラが複雑な処理を入れているのかもしれません。

    提示記事中でコンデンサ追加で改善したことがわかるのは、
    http://radiopench.blog96.fc2.com/blog-entry-1272.html
    「◆特性測定」の下 「・測定結果」節の表です。
    C3.3(0.1μF)無しと有りではADC値がかなり異なり、有りの方がましになっています。
    ただし、記事では改善するとの表現はありませんでした。お手数をおかけしてすみません。

    • jh4vaj より:

      ありがとうございます。私の読解力不足でした。
      確かにかなり改善していますね。10kΩ程度の可変抵抗をつないで使うのなら問題ない程度になる感じですね。
      読取り値がふらつく問題もありましたが、それも改善されるでしょうかね?
      まぁ、K3NG CW Keyerのボタンの認識として使うのなら、多少ふらつきがあっても影響はないと思います。