月刊I/O 2022年5月号『Raspberry Piで作る電子工作』に記事を掲載して頂きました!

【Arduino】デバイスが認識されない!ATmega16U2のファームウェアの修復で対処出来る場合があります!【壊れたArduinoの修復 その③】

マイコンボードとして優秀で便利なArduinoですが、突然動かなくなったり正常に動作しなくなったりする事が稀にあります。

原因はいろいろとあるようですが、これまでArduinoのマイコンチップATmega328Pの交換やブートローダの修復(書き換え)作業によりいくつかのArduinoボードを復活させることが出来ました。

【Arduino】ブートローダーの修復(書き換え)でArduinoボードが復活する場合があります!【壊れたArduinoの修復 その①】
【Arduino Uno】壊れたArduinoを修理する!マイコンチップATmega328Pの交換方法【壊れたArduinoの修復 その②】

これ以外にもArduinoを使っていて起こるトラブルとして、PCと接続してもデバイスとして認識されないというものは比較的多いかと思います。
PC側のドライバの問題が多いように思いますが、Arduinoボード上にあるUSB-シリアル変換器として動いている『ATmega16U2』チップ内のファームウェアの修復により対処出来る場合もあります。

今回は正常に動かなく(機能しなく)なったArduinoボードをUSB-シリアル変換を担っているATmega16U2チップ内に書き込まれているファームウェアの書き換え(修復)作業により復活させることが出来た話となります。

Arduinoボードがデバイスとして認識されない場合の対処法!

Arduinoボードを使っていて起こるトラブルとして、PCからデバイスとして認識されないというものがあります。

PC側のドライバの問題が多いように思いますが、Arduinoボードに搭載されているUSB-シリアル変換(USB to TTL)を担っているATmega16U2チップ内に書き込まれているファームウェアの修復(書き換え)作業により対処出来る場合があります。

まずArduinoボードで起こるトラブルの原因を切り分けていきたいと思います。

Arduinoボードのチェック!

Arduinoボードの故障(トラブル)の原因にはいろいろな要因が考えられます。
今回PCと接続しデバイスとして認識されない問題を解決しようと考えていますが、まずそのトラブルの原因をチェックし今回行う方法で対処出来るか切り分けていきます。

①電源投入時、ボード上のON LEDが点灯する

Arduinoに電源を投入時、ボード上の[ON LED]が点灯しない場合は電源ラインのパーツ等の破損が原因だと考えられます。

通電時にこのLEDが点灯しない場合は、ボードに搭載されているレギュレーターの破損や過電圧を加えたことによるヒューズの破損、その他電源ラインのパーツの物理的な破損が考えられるため今回の方法では対処出来ません。

ボードに電源投入時、正常にON LEDが点灯する場合は次の項目をチェックします。

②PCにデバイスとして認識される

次に上記電源ラインは正常に動作しPCからデバイスとして認識されている場合、マイコンチップATmega328Pの問題が考えられます。

電源投入時やボード上のリセットボタンを押した際にビルトインLED(デジタルピン13の横にあるLと書かれたLED)が早く点滅しない場合は、ATmega328Pに書き込まれているブートローダの破損やチップ自体の破損が考えられます。

この場合は、ブートローダ(ATmega328Pに書き込まれているソフトウェアです)の修復やATmega328Pチップ自体の交換で修復することが出来る可能性があります。

デバイスとして認識されているけど正常に動かない場合となり、今回の目的とは異なるのでこちらの記事を参考にして下さい。

【Arduino Uno】壊れたArduinoを修理する!マイコンチップATmega328Pの交換方法【壊れたArduinoの修復 その②】
【Arduino】ブートローダーの修復(書き換え)でArduinoボードが復活する場合があります!【壊れたArduinoの修復 その①】

PCと接続しArduinoボードがデバイスとして認識されていない場合は、USB-シリアル変換を行っているATmega16U2内のファームウェア修復により復活出来る場合があるので話を進めていきます。

USB-シリアル変換を行うATmega16U2チップ

Arduinoボードには(こちらではArduino Unoで説明してきます)、ブートローダが書き込まれスケッチ(プログラム)を動かすなどArduinoとして機能させるためのマイコンチップとしてAtmel(アトメル)のATmega328Pチップが搭載されています。
Arduinoボードを動かす心臓部ですね!

また、Arduino UnoにはPCと接続しスケッチをこのATmega328Pチップに書き込むためにUSBシリアル変換を行うATmega16U2チップも搭載されています。(互換ボードではCH340が搭載されている場合もあります)

[画像引用:Arduino公式サイト]

USB端子に接続したPCからスケッチの書き込みを行う際に、このATmega16U2でUSB-シリアル変換を行いUART(シリアル通信)によりATmega328Pに書き込みが行えるようになっています。

何らかの原因でこのATmega16U2チップ内に書き込まれているファームウェアが破損してしまいPCにデバイスとして認識されず機能しない場合は、ファームウェアの修復(書き換え)により復活できる場合があります。(物理的なチップの破損の場合もあります)

今回、ATmega16U2のファームウェアの修復作業を行っていきます。

ATmega16U2 ファームウェア修復の手順

ATmega16U2チップに書き込まれているUSB-シリアル変換器として機能するファームウェアの書き込みを行う場合、Arduino IDEから直接書き込みを行うことが出来ません。

そのため、ArduinoをDFUモードにし専用の書き込みソフトを使用してファームウェアの書き込みを行います

Arduino公式のこちらのサイトを参考に作業を行いました。
今回Mac環境で作業を行いまいしたが、WindowsやLinux環境でも少し手順は異なりますがほぼ同様の手順で行えるかと思います。

参考 Updating the Atmega8U2 and 16U2 on an Uno or Mega2560 Using DFUArduino公式サイト
ATmega16U2 ファームウェア書き換え手順
  1. dfu-programmerのインストール
  2. ArduinoをDFUモードで起動
  3. ATmega16U2のファームウェアの書き換え

①dfu-programmerのインストール

ATmega16U2のファームウェアの書き換えを行うためのソフトウェアが必要となってきます。
書き換えで使えるソフトはいろいろとあるようですが、上記Arduino公式サイトに記載されていた[dfu-programmer]を使い作業を行いました。

OS環境により少し手順が異なりますが、Mac環境ではMacPortsのインストールが必要となってきます。
使用しているOSを選択しインストールして下さい。

参考 Installing MacPortsMacPorts

MacPortsはターミナルを介して操作するソフトウェアとなります。
dfu-programmerはMacPortsからインストールする事ができます。

MacPortsのインストールが出来たらターミナルを立ち上げ、次のように入力しdfu-programmerをインストールします。(Mac環境以外の方は上記Arduino公式サイトを参考にして下さい)

sudo port install dfu-programmer

MEMO
パスワードの入力を求められます。
Macにログインする時に使用するパスワードを入力して下さい!

dfu-programmerのインストールが完了したらATmega16U2にファームウェアを書き込むための環境が整いました。

②ArduinoをDFUモードで起動

次にATmega16U2チップにファームウェアを書き込む作業を行います。

このファームウェア書き込み作業では、ArduinoボードをDFUモードで起動する必要があります
DFUモードとは、「Device Firmware Upgrade」の略となりファームウェアを書き込む機能(モード)になります。
これはUSB経由で行うことが出来ます。

Arduino UnoにはATmega16U2チップの上にICSPピンが6本付いています。
RESETとGNDにあたる5番ピンと6番ピン(左側の2本)を短絡させて電源を投入する事によりDFUモードで起動する事ができます。

短絡にはジャンパーピンがあれば便利ですが、ドライバーなどを使い接触させ短絡して下さい。
短絡させた状態でUSB端子をPCと接続し電源投入後、数秒(3秒ほど)でジャンパーピンを外します。
これでDFUモードで起動します。

③ATmega16U2のファームウェアの書き換え

DFUモードでArduinoを起動することが出来たら、ATmega16U2のファームウェアの書き換え(修復)を行います。

ATmega16U2用のファームウェア(Hexファイル)は、Arduino IDEの奥底のフォルダ内に格納されています。

一応確認しておきます。
[Applications]→[Arduino.app]→[Contents]→[Java]→[hardware]→[arduino]→[avr]→[firmwares]→[atmegaxxu2]とパスをたどり[arduino-usbserial]フォルダ内にあるArduino-usbserial-atmega16u2-Uno-Rev3.hexファイルがそれにあたります。

ここからdfu-programmerを使いファームウェアの書き換えを行います。
ターミナルからこちらを入力し上記ファームウェアが入っているフォルダを指定します。

cd /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/

次にATmega16U2の初期化です。

sudo dfu-programmer atmega16u2 erase

ファームウェアの書き込みです。
今回Arduino Uno Rev3を使っているので以下のファイルを指定して書き込みを行います。(同フォルダ内にはMega用のファイルなども入っています)

sudo dfu-programmer atmega16u2 flash Arduino-usbserial-atmega16u2-Uno-Rev3.hex

最後にこちらのコマンドでリセットして完了です。

sudo dfu-programmer atmega16u2 reset

これでATmega16U2チップ内のファームウェアの書き込みは完了です!

一旦USB端子を外し再接続してシリアルポートとして正しく認識されていれば成功です!

PCにArduinoボードが認識されない原因がATmega16U2のファームウェアの破損が原因なら復活させることが出来ますが、チップ自体の物理的な破損の場合は上記ファーム書き込みの際にエラーが出ると思います。

最後に!

ATmega16U2チップ内のファームウェア書き換えにより無事PCにボードが認識され正常に使えるようになりました。

これまでATmega328Pチップの交換やブートローダの書き換え、そして今回のATmega16U2のファームウェアの書き換えをやってきましたが、故障として眠っていたArduinoを数台復活させることが出来ました。(捨てなくてよかったー!)
意外と復活出来るものですね!

どうしても修復することが出来なかったArduino Unoが1台あります。
電源ラインは正常でATmega328Pチップの交換でLチカプログラムも正常に動作していますが、ATmega16U2のファーム書き換えの際にエラーが出るようで、こちらはおそらくチップ自体の破損が原因だと思われます。
このチップの交換はほぼ不可能なので、これはもうどうしようもないですね。

しかし、USB-シリアル変換機能が動作せずUSB端子からのスケッチの書き込みが出来ませんが、このようなシリアル変換器を使えば直接スケッチの書き込みを行い動かすことは出来ます。
Arduino Pro Miniの書き込みと同様な感じですね。

Arduino Pro MiniはArduino Unoと同様に動作しますが、Unoからシリアル変換器を取り除きボードを非常に小さくしています。
チップ自体の破損でもこのような使い方が出来るようなのでまたご紹介出来ればと思います。

【ELEGOO Arduino Uno】Arduino完全互換ボードの中ではダントツのクオリティーですね!

コメントを残す