ブログ
ESP32のポート:COMポートの探し方とシリアル番号
ポートが出ない、ポートが違う、ポートが消えた——ESP32での作業は、シリアルポートでつまずくのが一番多いと言っても過言ではありません。COMポートの探し方、エラーメッセージがなぜそう言うのか、そしてこの基板における「ID」の本当の意味まで、順番に解説します。
ESP32で「Could not open port /dev/ttyUSB0」?
Linuxでこのエラーが出るのは、ほとんどが権限かデバイス名の間違いです。まず dmesg でケーブルのUSBチップが認識されているか確認し、続けて ls /dev/tty* を実行してください。基板が ttyACM0 なのに ttyUSB0 を指定している可能性があります。権限の問題なら sudo usermod -aG dialout $USER で自分をdialoutグループに追加し、一度ログアウトしてから入り直せば、「could not open port」の行は消えます。それでも出ない場合は、ナレッジベースのドライバ対応表を次に確認しましょう。
ESP32のポートを探すには?
OSごとに方法が決まっています。Windowsならデバイスマネージャー → ポート(COMとLPT)を開き、基板を挿してどのCOM番号が現れるか見ます。Linuxは ls /dev/ttyUSB* /dev/ttyACM*。macOSは ls /dev/cu.usbserial-* です。ここで大事なポイント。ポートの持ち主はESP32ではなく、基板に載っているUSBシリアルチップです。CH340搭載基板は「USB-SERIAL CH340」、CP2102搭載基板は「Silicon Labs CP210x」と表示されます。名前を見ればどのチップかすぐわかります。
ESP32のIDを読み取るには?
実用上の「ID」はMACアドレスです。チップごとに一意で、esptool.py chip_id で表示されるか、コード内では ESP.getEfuseMac() で取得できます。チップのモデルとリビジョンを知りたい場合は ESP.getChipModel() を使います。なお、多くの開発キットにはシリアル番号のようなものは付いていません。MQTTやBLE、OTAでデバイスを識別する際に意味を持つIDは、実質MACアドレスのほうです。同じ型番の基板を何枚も持っている人ほど、この区別が後で効いてきます。
書き込み後にポートが消えたのはなぜ?
USBシリアルチップは基板ごとリセットされるので、ポートがいったん消えること自体は正常です。問題は「戻ってこない」場合で、原因はたいてい3つ。充電専用ケーブル、ドライバの消失、あるいは基板がブートループに陥ってポートが点滅している——のどれかです。ブートループが疑われる場合は、デバイスマネージャーを注視してみてください。COMポートがちらちら点滅するのが決め手になります。リセットが止まらない系のトラブルはデバッグFAQが詳しいです。
ポートはあるのにシリアルモニタが「開けません」?
他の何かがポートを握っています。たいていは2つ目のシリアルモニタか、IDE本体です。対処は、シリアル関連のウィンドウを全部閉じ、ケーブルを抜いて挿し直し、もう一度試すだけです。Windowsでは、クラッシュ後にドライバが古いポートロックを残すことがあり、その場合はPCの再起動で解消します。私自身、机に「先に他のモニタを閉じる」と付箋を貼っているほど、この手の見落としは日常的に起きています。まずは開いているものを全部閉じる、が基本です。
ポートが2つ見えるのはなぜ?
ESP32-S3とC3の基板は、USBインターフェースを2つ公開しているからです。ネイティブUSBのCDCとUARTブリッジ——この2つが、それぞれCOMポートとして見えます。どちらを使えばいいかは、基板のシルク印刷(表面の文字)に書かれたラベルで判断します。たいてい「UART」と書かれたほうが書き込み用で、CDC側はネイティブUSBを使うスケッチ専用です。間違ったポートに書き込もうとして失敗した経験がある人も多いので、まずラベルを見る習慣をつけましょう。
ドライバなしでポートを見つけるには?
できません——ドライバのインストールが第一歩です。Windowsでデバイスマネージャーに「不明なデバイス」と表示されるなら、CH340かCP2102のドライバが欠けています。親しみやすい「USB-SERIAL」という名前が表示されるのは、ドライバを入れた後です。そして、デバイス自体がまったく出てこない場合は、ケーブルが充電専用(データ線なし)の可能性が高いです。基板を疑う前に、まずケーブルを交換してください。この順番で確かめるだけで、「ポートがまったく出ない」問題の大半は解決します。
ポート番号に意味はある?
ありません。今日はCOM5、明日はCOM12——Windowsは気まぐれに番号を振り直します。落とし穴は、ツールが古い番号を覚えていることです。ケーブルを挿し直すとArduino IDEは新しいポートを表示するので、毎回選び直す必要があります。一方、シリアルモニタやPlatformIOは自動検出するので、「port not found」にはほとんど出会いません。Linuxも同じで、ttyUSBの後ろの数字には深い意味がありません。番号に一喜一憂せず、ポートが出たら選ぶ、それだけで十分です。
ポートを知らなくても書き込みはできる?
だいたいできます。esptool.pyは -p オプションを省略すると、よく使うポートを自動で試します。PlatformIOはポートを自動スキャンし、OTAならポートを完全にスキップできます。とはいえ、シリアルモニタでログを見る作業にはポート番号がどうしても必要なので、探すのに30秒かける価値は十分あります。ポートを指定せずに済む書き込み方法は、書き込みFAQに順番どおりまとめてあります。状況に合わせて使い分けましょう。
ポートがいつまで経っても出ない場合は?
順番にチェックリストを潰していきましょう。1つ目、別のケーブル(充電用でなくデータ用)に交換。2つ目、別のUSBポートへ——フロントパネルのポートは電源が不安定でよく問題を起こします。3つ目、別のマシンで試す。4つ目、ドライバの再インストール。ここで1つ知っておきたいのが、USBチップが死んだ基板でも電源は通って動作すること。LEDは点滅するのにポートだけ出ない、という場合はUSBシリアルチップが被害者です。私のモジュールの1つでも起きましたが、4ドルのUSB-TTLアダプタで以後問題なく書き込みできました。
この記事のテーマのプロジェクトは、sensbench の無料シミュレーターでそのまま実行できます。回路は配線済み、ファームウェア同梱、アカウントもインストールも不要です。