トラブルシューティング その1(Arduino IDEでNanoに書き込み時にCOMポート設定エラーが発生)
こんにちは、Ideagearの鈴木陽介です。
先日、Arduino Nanoにコードを書き込む際に「COMポート設定エラー」という想定外のエラーが発生し、困り果ててしまいました。結論としては、
原因:パソコンとの相性が悪かった。
解決策:別のパソコンに変える。あるいは、そのパソコンと相性が良いNanoを使う。
という、非常にシンプルというか、そんなことあるんか?という結果でした。
正直、驚きというか、何とも言えない理由でしたがw、事実として解決まで半日が消えてしまったため、しかも初めて経験したうえにネット上の文献にも解決策が見つからないトラブルだっため、備忘として記事に残しておくことにしました。
はじめに
去る8月30日の夜に、深セン市福田区で、友人のイタリア人エンジニアが主催するBBQパーティが開催されました。(彼とは、かつて華強北にあった「華強北国際創客中心」というメーカーセンターに一緒に入居していた頃からの友人です。)
で、前回は都合がつかず行けなかったため、今回はデジペの1つや2つは持って行こうとはりきって作業していたところ、今回のエラーにハマってしまいました。。。
その原因は、前述の通り至ってシンプルですが、これまでも、そしてこれからも、私の他にも同じ原因でハマる方がいると思われるため、また、Arduino Nanoは気をつけねばならないことが他にもあるため、全体の理解を深めるためにも、ことの経緯から解決策、検証結果に至るまで細かく書いていきたいと思います。
プログラム書き込み時によくあるエラー
まず、Arduino IDEでプログラムを書き込む時によくありがちなミス3選として、
1. ボードで、正しいボードを選択していない
2. シリアルポートで、ポート未選択あるいは正しいCOポートを選択していない
3. 必要なライブラリーをインクルードしていない
などがあると思います。
特に最初の2つは、Arduino IDEの基本の「き」ですので情けないミスですが、この2つはどれだけ慣れていてもついやらかしてしまいますねw
また、3つ目は、新しいプログラムを書き込む場合やパソコンを変えた場合に起こりがちで、エラーが出てから気づく場合も少なくありませんが、ライブラリーを入れればいいだけです。まぁそのライブラリーの取得に手こずる場合も結構ありますが、、、
で、Arduino Nanoについては、上記3点とは別で、書き込み時に「スケッチの書き込み中にエラーが発生しました」という文言と共に下記のようなエラーがまぁまぁ発生します。
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xe0
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0xe0
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0xe0
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0xe0
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0xe0
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0xe0
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0xe0
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x5d
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x5d
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x5d
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x5d
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x5d
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x5d
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x5d
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x5d
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x5d
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x5d
エラー内容は上記2種類に限らないと思いますが、いずれにせよ、これらの原因は、
4. プロセッサで、正しいブートローダーを選択していない
ということに起因しています。
プロセッサで正しいブートローダーを選ぶ
前述のエラーの解決方法ですが、具体的には、ツール -> プロセッサ -> と進むと、
ATMega328P
ATMega328P (Old Bootloader)
ATMega168
の3つが表示されますので、そこから正しいブートローダーを選びます。
で、ATMega168はかなり古い製品に使われていたMCUのようで、現在ではネットであれ実店舗であれ、普通にNanoを買うとほぼすべてATMega328Pが使われていますので無視して大丈夫です。※MCU = Micro Controller Unit、つまり、メインのICチップのこと。
ちなみに、私は電子工作を始めて5年くらいですが、まだ一度もATMega168を選んだことはありません。
ということで、選択肢は上の2つに絞られますが、Nanoを買ってATMega328Pを選ぶとして、Old Bootloaderとそうでない方とどちらを選べば良いでしょうか?結論は、
わかりませんw
え?(笑)まぁ結局書き込んでみないとわからないということです。
ただ、それだけだと不親切なのでちょいと付け足しますと、基本的にアマゾンなどのネットで売られている安いNanoはほぼすべてOld Bootloaderの方です。
余談ですが、私の場合はArduinoやESP32などのマイコンは、中国深センの華強北という世界最大規模の電気街にあるお店で仕入れることが多いのですが、毎回、2種類のうちどちらを買うかを聞かれます。これはUnoでもNanoでも同じです。
2種類というのはどういうことかというと、オリジナルと同じMCUを使ってる方を欲しいのか、国産(中国産の廉価版)のMCUの方でいいのか、どちらを買うか聞かれます。ちなみに、値段は倍違います。
で、ブートローダーの話に戻すと、オリジナルの方はATMega328Pで、廉価版の方はATMega328P (Old Bootloader)を選択して書き込める場合が非常に多いです。ちなみに、両方とも書き込めるというのはこれまで遭遇したことがありません。必ず、どちらか一方は書き込めて、もう一方は書き込みエラーになります。
Old Bootloaderの有り無しだとちょっとわかりにくいと思いますが、実質的には、
ATMega328P (New Bootloader)
ATMega328P (Old Bootloader)
の違いだと捉えてください。この場合、本当に最新の生産品だとNewの方で、少し古いのだとOldを使えば良いと理解していただいて構いません。つまり、最新のMCUか少し古いMCUかという話でもあり、つまるところ、値段が高いか安いかという話につながってきます。もちろん、一概には言えませんが、、、
ちなみに、下記記事によると、DegiKeyでは20218年1月以降は新しい方のブートローダーを使用しているようです。
そして、日本のネット上に出回っているNanoは中華廉価版であるケースが多いため、基本的にはOld Bootloaderを選べば使えます。ただ、そうじゃない時もあります。
ということで、最初の結論に戻りますが、結局は実際に書き込んでみないとどちらのブートローダーを使えばいいかわからないですし、仮に違っていても、もう一つを選べば済む話なので大した問題ではありません。
問題は、今回のようにブートローダーとは関係ないトラブルがあった場合です。
エラー内容
ようやく本題に入ります。
今回詰まったトラブルとして、Arduino Nanoへの書き込み時に、
「avrdude: ser_open(): can't set com-state for "\.\COM3"」
というエラーが発生しました。※COM3の部分はその時選択しているCOMポートにより変わります。
前述のブートローダーは新旧どちらを試しても書き込みが成功しません。
ネット上の記事もその多くはブートローダーの話ばかりで、このようなことは初めてだったので困りました。
試したこと
COMポートの確認
まず、ボードをUnoに変えて書き込んでみます。UnoでもNanoでもポートはCOM3のままです。
→書き込みOK
ということで、選択しているシリアルポートは問題なし。
念のためにデバイスマネージャーを開いて確認します。
ご覧のとおり、COM3で問題なし。
もう一つは、Arduino側のCOMポートの設定です。
ファイル -> 環境設定
と進み、環境設定の画面を開きます。
以下のファイルを直接編集すれば、より多くの設定を行うことができます。
C:¥Users¥(ユーザー名)¥AppData¥Local¥Arduino15¥preferences.txt
となっている上記をクリックすると、Arduino15というフォルダが開くので、改めて、preferences.txtを開いてください。そこに書かれている
serial.debug_rate=9600
serial.port=COM3
あたりが関係していそうですが、特に問題なさそうです。
ブートローダーの書き換え
次に試したのはブートローダーの書き換えです。
上記を含めたいろんな記事を参照したところ、Arduino Unoをプログラマー(書き込み装置)にして、Nanoをターゲットにしてブートローダーを書き込めば良さそうなことがわかりました。詳細は下記:
まずは、UnoとNanoを下図の通り配線します。
画像引用元:https://docs.arduino.cc/built-in-examples/arduino-isp/ArduinoISP
次に、スケッチ例の中にあるArduino ISPを使います。
ファイル -> スケッチ例 -> 11.ArduinoISP -> ArduinoISP
と選択し、ArduinoISPのプログラムを呼び出します。
一応コンパイルしますが、当然問題ありません。
続いて、書き込み装置を変えます。
ツール -> 書き込み装置 -> Arduino as ISP
と選択し、書き込み装置をArduino as ISPへ変えます。
このように変更しました。
ツール -> ブードローダを書き込む
からブードローダを書き込みを試みますが、「ブートローダの書き込み中にエラーが発生しました。」となり、失敗しました。
ボードを追加
続いて、下記動画を見て、ボードが間違っているかもしれないと思い、試しました。
ツール -> ボード -> ボードマネージャ
と選択し、検索窓にmegaと入力して、「Arduino megaAVR Boards」をインストールします。
「このデバイスソフトウェアをインストールしますか?」というのが出てきます。
COMポートがなんちゃらと言ってきているので、期待大ですね!
インストールが完了しました。ただ、
→結果は関係なし
別のNanoを試す
もちろん、単純にNanoの故障の可能性もあります。
ただ、それはここまでに試行錯誤した中でとっくに別の個体も試していますが、
→結果は同じ
ということで、関係あるとは思えませんが、足つきのNanoをいくつか試してもダメだったため、足なしのNanoも試してみました。足は自分ではんだづけしたわけではなく、購入時にすでにはんだづけされていましたが、生産時のはんだづけで壊れた可能性もゼロではないからです。
→結果は同じ
次に、足つきであろうとなかろうと、タオバオ(中国のECサイト)の同じお店から購入したため、そこのお店で売られている製品が全部パチモノでダメなのかもと思いました。
ということで、「NANO 33 BLE」もトライ。
→結果はダメ
他方で、相変わらずUnoはOKということで、Nanoだけの問題であるのは間違いありません。
古いNanoを試す
・COMポートは問題ない
・ブートローダーの問題ではなさそう(とは言え、ブートローダの書き換えが成功していないので実際はちゃんと確認できていない)
・ボードを追加したが関係ない
目下、考えられる方法はすべて試したため、困り果ててしまいました。
しかし、ここでようやく気づきました。
最後の手段?
ひょっとしたらパソコンとの相性の問題かも?
というのも、ソフトと違ってハードはどうしてもハード同士の相性というものがあります。
正直に言えば、実際上は、ハードの問題である可能性は低いですが、逆にここまでいろいろ試した後ではハードに起因する可能性が高くなったと考えました。それに、ひとつ前のPCでは、同じネットショップで購入したNanoでも書き込みは問題なく実施できていました。
ということで、半年前のデジペを引っ張り出してきて、そこのNanoに書き込んでみました。
結果は成功!
(このNanoではOld Bootloaderではない方で成功しました。)
別のパソコンで試す
新しいPCと古いNanoで書き込みが出来たので、今度はその逆、古いPCと新しいNanoでも試してみました。まぁ新旧はわかりやすいと思ってそう表現しただけで、要は、再検証として、別のPCとNanoの組み合わせでも試してみたということです。
結果は、、、
さっき書き込めなかったNanoを別のPCで試したら無事書き込めました。
→NanoとPCに相性があることを証明!
検証結果
先ほどご説明したハードウェアの交換による解決方法をもう一度まとめます。
検証1
東芝のWindows 11のPCで、半年前に華強北の店舗で購入したNanoに書き込み。
ATMega328P (Old Bootloader)→書き込み失敗
ATMega328P→書き込み成功
検証2
パナソニックのWindows 10のPCで、最近中国のネットショップで購入したNanoに書き込み。
ATMega328P→書き込み失敗
ATMega328P (Old Bootloader)→書き込み成功
検証3
東芝のWindows 11のPCで、華強北の店先で購入したNanoに書き込み。
昨日お店で買い、その場で書き込めるか試してみました。
ATMega328P→書き込み失敗
ATMega328P (Old Bootloader)→書き込み成功
考察
実は、少し前までメインで使っていたDELLのWindows 10のPCでは、ネットで購入したNanoでもお店で購入したNanoでも関係なしに書き込めました。
一方で、現在メインで使ってる東芝dynabookのWindows 11のPCだとNanoによっては書き込めないのがあることが判明。何か損した気分ですがw、すべてのNanoがダメということではないので、それがわかったことは朗報です。
しかし、この違いな何なんでしょうか?
DELLのPCは、2020年夏に中国華強北で購入したWindows 10
東芝のPCは、2023年夏に大阪なんばの家電量販店で購入したWindows 11
パナソニックのPCは、ずいぶん前に秋葉原で中古で買ったWindows 10
これらの結果から類推すると、OSバージョンの違いが原因である可能性が非常に高いという結論に至りました。
日本語OSか中国語OSかはおそらく影響していません。
そもそも、DELLのPCは日本語OSを再インストールして使っていましたしね。
また、関連のトラブルとして、実は、Arduino IDEも最新版である2.x.x系では書き込みエラーになることが多いです。
ですので、ワークショップの際には、参加者の皆さんには、Legacy IDE (1.8.X)であるArduino IDE 1.8.19を使ってもらっています。
いずれにせよ、この辺のソフトとハードの相性はよくある話ですね。
ソフト同士ですら、古いPCソフトは最新バージョンのOSでは使えませんからね。
ということで、パソコンのOSのバージョンが変わっていたことに気づくべきでしたが、OSのバージョンが問題になるとは露程も思っていなかったため仕方ないですね。
※PCに関しては、OSバージョンだけでなく、プロセッサなど他の要素も関係するかもしれませんが、説明が複雑になるため省きました。また、Mac OSやLinux等の他のOSでは検証していませんので悪しからず。
余談
今回使用したNanoはいわゆる互換機です。
少し話が逸れますが、8月に電子工作のワークショップを深センで開催したのですが、その際も華強北のお店で購入したUnoの互換機を使いました。ただ、参加者が使っていて2、3台ほど書き込みがうまくいかない個体があっため、お店に文句を言ったところ、CH340のドライバーをインストールしたかとしきりに聞かれました。
以前までは、互換機であろうとなかろうと、CH340のドライバーをインストールしたことが無く、それでも使えていたため、関係ないと思いその時は無視しました。
そのうえで、昨日店先でNanoだけでなく、Unoも一緒に書き込みを確認したところ、最終的に1台だけどうしても書き込めなかったため、単純に不良品として交換してもらいました。
不良品の台数が減った理由は不明ですが、おそらく当時の設定の問題やブレッドボードと接続しながら書き込む際に、ブレッドボードで軽くショートしていて変な電流がUnoに流れていたなど、考えたらキリがないため、また1台だけだったため不良品として処理してもらいました。
が、改めて、Nanoの書き込みエラーと関係しているかもしれないと考えて先ほど試してみました。
こちらの参考記事によると、CH340は中国南京にあるWCH社製のチップで、ドライバーは下記公式サイトからダウンロードできます。
相変わらず、COMポート設定エラーが発生します。
まぁ元々、COMポート関係のエラーですから、当然といえば当然の帰結ですが、、、
まとめ
いかがでしたでしょうか?
いろいろ試して、またこの記事を書いていて感じたのは、結局のところ、世の中に出回っているArduinoのほとんどは互換機なので、何かが足りなくて追加でインストールが必要だったり、使っているチップの品質の問題やチェック不足で互換性が完璧でなかったりするということを理解したうえで、使っていただければと思います。
ということで、ハードウェアは稀にハード同士の相性があるというのは頭の中ではわかっていたものの実際に起こるとは思っていなかったため、今回はガチでハマってしまったというお話でした。
それではまた!
Discussion