ガイド · 読了まで20分

Failed uploading: no upload port provided?Arduinoの書き込みエラーの直し方

Arduinoでno upload port providedやavrdudeのnot in syncが出る?COMポートが出ない、CH340ドライバ、NanoのOld Bootloader、ESP32のBOOTボタン、PicoのBOOTSELの直し方を解説します。

Arduinoにコードが書き込めず、出力ウィンドウに赤いavrdudeのエラーが出ていますか?心配はいりません。こうした問題のほとんどは、ボードの故障ではありません。原因は充電専用のUSBケーブル、CH340ドライバの不足、ボードやポートの選択ミス、0番・1番ピンにつないだモジュール、またはポートを使っている別のプログラムです。正しい順番で確認すれば、たいてい数分で直ります。もし本当にボードが故障していても、それを確かめる簡単な方法があります。

このガイドでは、まず書き込みのときに裏で何が起きているか、エラーメッセージをどう読むかを紹介します。次に、症状・原因・対処法の診断表で問題をステップごとに絞り込みます。Arduino NanoのATmega328P (Old Bootloader)の設定、シリアルモニタなどのプログラムがポートをふさぐ問題、ESP32のFailed to connectエラーとBOOTボタン、Raspberry Pi PicoのBOOTSELとUF2を使う方法も取り上げます。各セクションには短いテスト用スケッチがあるので、問題が解決したらボードを確認できます。

Arduino Uno R3ボード
Arduino Uno:USBソケットの横にある小さなチップがパソコンとの通信を担当します。純正品はATmega16U2、互換品の多くはCH340を使っています。TX、RX、LのLEDで書き込みの様子を追えます。

書き込みのしくみ:コンパイルエラーか、書き込みエラーか?

「書き込み」を押すと、2つの別々の処理が行われます。まずIDEがコードをコンパイルします。うまくいけば、出力ウィンドウにスケッチが何バイト使うかを示す行(Sketch uses 924 bytes)が表示されます。次にavrdudeというプログラムが選択したポートを開き、DTR信号でボードを再起動して、ボード内の小さな読み込みプログラムであるブートローダとハンドシェイクを行います。リセット後、ブートローダが待ち受けるのは約1秒だけで、データが届かなければボードに入っている古いプログラムがそのまま動きます。エラーメッセージは、この流れのどこで途切れたかを教えてくれます。赤い文字がコンパイル中に出た場合、問題はコードにあり、ボードやケーブルとは関係ありません。

段階何が起きるか失敗したときのメッセージ
1. コンパイルコードがプロセッサ用の機械語に変換されるCompilation error: 'x' was not declared in this scope(コードのエラーで、書き込みの問題ではありません)
2. ポートを開くIDEが選択したCOMポートを開くno upload port provided、can't open device、Access is denied(いずれもポートを開けない)
3. リセットDTR信号でボードが再起動するprogrammer is not responding(書込装置が応答しない)
4. ハンドシェイクavrdudeとブートローダが同期するstk500_getsync(): not in sync: resp=0x00(同期できない)
5. 書き込みと検証プログラムがフラッシュに書き込まれ、読み戻して比較されるverification error, first mismatch at byte(検証エラー)
エラーを正しく読むには、「ファイル」>「基本設定」を開き、「より詳細な情報を表示する」の横にある「書き込み」にチェックを入れてください。最後に出るexit status 1やFailed uploadingは、何かがうまくいかなかったことを示しているだけです。本当の手がかりは、その上にあるavrdude:で始まる最初のエラー行です。フォーラムで質問するときも、その行をそのままコピーしてください。

よくあるavrdudeのエラーとその意味

エラーメッセージ(要点)意味最初に確認する場所
stk500_recv(): programmer is not responding(書込装置が応答しない)ポートは開いたが、ボードが一度も応答しなかったポートの選択、ケーブル、0番・1番ピン、NanoならOld Bootloader
stk500_getsync() attempt 1 of 10: not in sync: resp=0x00(同期できない)ラインにデータがなく、ブートローダがハンドシェイクに加わらなかったプロセッサの設定、自動リセット、ブートローダ
not in sync:resp=0x00以外の値(例:0xfe)何かが応答しているが、ブートローダではない0番ピンのモジュール、動作中のスケッチのシリアル出力、ボーレートの不一致
ser_open(): can't open device "\\.\COM3": Access is denied.(アクセスが拒否されました)別のプログラムがポートを使っているシリアルモニタ、2つ目のIDEウィンドウ、PuTTY、Curaなどのプログラム
ser_open(): can't open device ... The system cannot find the file specified(指定されたファイルが見つかりません)選択したポートがもう存在しないボードが抜けたか、ポート番号が変わった。ポートを選び直す
Failed uploading: no upload port provided(ポートが選択されていない)ポートがまったく選択されていない「ツール」>「ポート」、または上部のボード選択欄
Device signature = 0x1e950f ... Expected signature for ATmega2560(チップIDの不一致)選択したボードのチップが、実際に載っているものと違うボードメニューで書き込み先のボードを正しく選ぶ(0x1e950fはATmega328PのID)。この行は主にISPでブートローダを書き込むときに出る
stk500v2_ReceiveMessage(): timeoutMega 2560を選択しているが、ボードが応答しない本当にMegaか、ポートは正しいか
verification error, first mismatch at byte 0x0000(検証エラー)書き込んだ内容と読み戻した内容が違うケーブル、USBハブ、弱い電源、劣化したフラッシュ

ステップごとの診断表:症状、原因、対処法

表は上から順に読んでください。最初の行ほどよくある問題で、直すのも簡単です。変更するたびに書き込みを試し直しましょう。いくつも同時に変えると、どれで直ったのかわからず、次に同じエラーが出たときにまた困ることになります。

症状考えられる原因対処法
ボードをつないでもLEDがひとつも点かないUSBポートやケーブルから電源が来ていない、またはボードがショートしている別のポートとケーブルを試し、モジュールをすべて外し、5VとGNDの間を測る
電源LEDは点くが、「ツール」>「ポート」がグレーで選べない、または空充電専用ケーブル、またはドライバがないデータ通信用のケーブルを使う。デバイスマネージャーでUSB2.0-Serialに黄色い印があれば、CH340ドライバをインストールする
リストにCOMポートがいくつもあるBluetoothやシステムの仮想ポートボードを抜き差しし、消えてまた現れるポートを選ぶ
Failed uploading: no upload port provided(ポートが選択されていない)ポートが選択されていない上部のボード選択欄か、「ツール」>「ポート」でポートを選ぶ
Access is denied、ポートが使用中ポートが別のプログラムで開かれている2つ目のIDEウィンドウ、シリアルプロッタ、PuTTY、Cura、Pythonスクリプトを閉じ、ボードを抜き差しする
Nanoでnot in sync: resp=0x00ボードに古いブートローダが入っている「ツール」>「プロセッサ」>「ATmega328P (Old Bootloader)」
D0やD1にモジュールをつなぐと同じエラーが出るモジュールがシリアルラインで通信し、ハンドシェイクを乱している書き込み中はD0とD1の線を外し、SoftwareSerialでモジュールを別のピンに移す
何もつないでいないのに同じエラーが出るボードやポートの選択ミス、自動リセットの故障、ブートローダの消失設定を確認し、手動リセットを試し、ループバックテストを行い、必要ならブートローダを書き込む
Device signatureの行に予想外のIDが出るボードメニューで違うモデルを選んでいるチップに印字された文字に合うボードを選ぶ
書き込みが途中で止まる、検証エラー質の悪いケーブル、USBハブ、モーターやサーボが消費する電流短くて質のよいケーブル、パソコン本体のポート、モーターには外部電源
ボードをつなぐとパソコンがUSBポートを止めてしまう回路のショートや過電流配線をすべて外してボード単体でテストし、回路を少しずつ戻す
ESP32:Connecting...のあとにFailed to connectボードがダウンロードモードに入れなかったConnectingが表示されたらBOOTボタンを押し続ける
Pico:ポートがない、またはNo drive to deployボードがBOOTSELモードになっていないBOOTSELを押したままUSBケーブルを挿す

クイックチェックリストと書き込みテスト用スケッチ

  1. ボードからシールド、モジュール、0番・1番ピンの線など、すべてを外します。USBケーブルだけをつないだ状態にします。
  2. ボードをパソコン背面のUSBポートに直接つなぎます。ハブ、延長ケーブル、前面のソケットは避けましょう。
  3. 「ツール」>「ポート」を開いてリストを見ます。ボードを抜き差しし、どのポートが消えてまた現れるかを確認します。リストがまったく変わらないなら、問題はケーブルかドライバです。
  4. 「ツール」>「ボード」でボードのモデルを正確に選びます。Nanoなら「ツール」>「プロセッサ」で正しいブートローダも選びます。
  5. ほかのプログラムや2つ目のIDEウィンドウがポートを使っていないか確認します。迷ったら、すべて閉じてください。
  6. 書き込み時の詳細表示をオンにし、下の小さなテスト用スケッチを書き込みます。エラーがないとわかっているコードで試せば、コンパイルの問題を除外できます。
  7. それでも失敗する?リセットボタンを押してみてください。LのLEDが1回または数回すばやく点滅すれば、ブートローダは生きています。その場合は下のループバックテストに進みます。
  8. 別のパソコンや別のボードで試します。問題がボードについて回るならボードに、パソコンに残るならドライバかOSの設定にあります。
C++ (Arduino IDE)
1// Yükleme testi: LED yanıp söner, sayaç yazılır / Upload test: blinks the LED, prints a counter
2unsigned long sayac = 0;   // çalışma sayacı / run counter
3
4void setup() {
5  pinMode(LED_BUILTIN, OUTPUT);   // Uno ve Nano'da pin 13 / pin 13 on Uno and Nano
6  Serial.begin(9600);
7  Serial.println("Yukleme basarili / Upload OK");
8}
9
10void loop() {
11  digitalWrite(LED_BUILTIN, HIGH);
12  delay(200);                     // yanma süresi: değiştirip tekrar yükle / on time: change it and re-upload
13  digitalWrite(LED_BUILTIN, LOW);
14  delay(800);
15  Serial.println(sayac++);        // Seri Monitör 9600 baud / Serial Monitor at 9600 baud
16}

書き込みに成功すると、LのLEDが短く点いて長めに消え、9600ボーでシリアルモニタを開くとカウンターが増えていきます。新しいコードが本当にボードに届いたか確かめるには、delay(200)をdelay(50)に変えてもう一度書き込みます。点滅のリズムが変わらなければ、古いプログラムがまだ動いています。シリアルモニタに文字化けが出る場合は、シリアルモニタのボーレート設定がコードと合っていないだけで、書き込みエラーではありません。

COMポートが表示されない:USBケーブルとCH340、CP2102のドライバ

ポートのメニューがグレーで選べない、または空なら、まずケーブルを疑いましょう。スマホの充電器に付いてくる細いケーブルの多くは電源用の2本の線しかなく、データ用のD+とD-の線がまったくありません。こうしたケーブルではボードの電源LEDが点くので紛らわしいのですが、パソコンはデバイスを認識せず、接続音すら鳴りません。スマホへのファイル転送や、動くとわかっている別のボードでケーブルを試してください。Unoの太いタイプBのケーブルではこの問題はまれですが、NanoのMini USBや、ESP32やPicoのボードのMicro USB、USB-Cのケーブルではとてもよくあります。

ケーブルに問題がなければ、次に疑うのはドライバです。USBソケットの横にあるチップの文字を読んでください。純正品のArduino UnoとMegaはATmega16U2、互換品のUnoとNanoの多くはCH340GかCH340C、ESP32の開発ボードはたいていCP2102かCH340を使っています。Windowsではデバイスマネージャーを開きます。ボードが認識されていればPorts (COM & LPT)(ポート(COMとLPT))の下に表示されます。Other devices(ほかのデバイス)の下に黄色い感嘆符付きのUSB2.0-Serialがあれば、CH340ドライバが入っていません。

CH340 USB-TTL変換モジュール
CH340チップ:互換品のArduino UnoやNanoの多くでは、このチップがUSBとシリアルの通信を担当します。パソコンがボードを認識するには、このドライバのインストールが必要です。
USBチップ搭載されているボードWindowsでの名前macOSとLinuxでのポート名
ATmega16U2純正品のUno R3、Mega 2560Arduino Uno (COMx)/dev/cu.usbmodem…、/dev/ttyACM0
CH340G, CH340C互換品のUno、Nano、Mega、一部のESP32ボードUSB-SERIAL CH340 (COMx)/dev/cu.usbserial-…、/dev/ttyUSB0
CP2102, CP2104ESP32 DevKit、NodeMCUSilicon Labs CP210x USB to UART Bridge (COMx)/dev/cu.SLAB_USBtoUARTまたは/dev/cu.usbserial-…、/dev/ttyUSB0
FT232RL古い純正品のNano、FTDIアダプターUSB Serial Port (COMx)/dev/cu.usbserial-…、/dev/ttyUSB0
CH9102新しいESP32開発ボードUSB-Enhanced-SERIAL CH9102 (COMx)/dev/cu.wchusbserial…または/dev/cu.usbmodem…、/dev/ttyACM0
ネイティブUSB(RP2040、ATmega32U4)Raspberry Pi Pico、Leonardo、MicroUSB Serial Deviceまたはボード名 (COMx)/dev/cu.usbmodem…、/dev/ttyACM0

Windows 10と11では、たいていWindows UpdateがCH340とCP2102のドライバを自動でインストールします。そうならない場合は、チップメーカーのWebサイトからCH340用のCH341SERドライバ、またはCP2102用のCP210x VCPドライバをダウンロードしてインストールし、ボードを抜き差ししてください。現在のmacOSには両方のチップのドライバが含まれていて、出どころの違う古いドライバを重ねて入れると、かえって悪化することがほとんどです。Linuxではドライバはすでにカーネルに入っていますが、ポートを使うにはユーザーをdialoutグループに追加し(sudo usermod -a -G dialout $USER)、ログインし直す必要があります。そうしないとPermission deniedエラーが出ます。Ubuntu 22.04以降でCH340のボードを挿した直後にポートが消える場合、原因はたいていスクリーンリーダーのパッケージbrlttyです。使っていなければsudo apt remove brlttyで削除してください。

ボードを挿した瞬間にパソコンがUSBポートを止めてしまう、またはボードが接続と切断を繰り返す場合は、回路にショートか過電流があります。Arduino Unoには、USBラインを守る500 mAの自己復帰型ヒューズがあり、これが働くとボードがまったく表示されなくなります。配線をすべて外し、テスターで5VとGNDの間を測り、大きなモーターやサーボはUSBの5Vではなく外部電源から給電してください。

ボード、プロセッサ、ポートの選択ミス

Arduino IDE 2では、上部バーのドロップダウンか、「ツール」>「ボード」と「ツール」>「ポート」のメニューでボードとポートを選びます。Windowsでは、リストにCOM1やいくつかのBluetoothの仮想ポートが表示されることがあります。正しいポートを見つけるいちばん簡単な方法は、ボードを抜いてどのポートが消えるかを見ることです。UnoなのにMega、NanoなのにLeonardoのように、ボードメニューで違うモデルを選んでいると、avrdudeはまったく応答を得られないか、Device signatureの行で予想外のチップIDを見ることになります。もう1つ注意点があります。ふつうの書き込みにはCtrl+Uを使ってください。「スケッチ」>「書込装置を使って書き込む」は外部のISP書込装置を前提にしていて、成功するとボードのブートローダを消してしまいます。そうなると、ボードはUSBからの書き込みを受け付けなくなります。

Arduino Nanoに書き込めない:ATmega328P (Old Bootloader)

市販の安価なNanoの多くはCH340を使った互換品で、その多くにはまだ古いブートローダが入っています。2018年の初めに、ArduinoはNanoのブートローダを、Unoで使われているより小さくて速いOptibootに切り替えました。それ以来、IDEの標準のATmega328Pオプションは115200ボーで通信します。古いブートローダが待っているのは57600ボーです。速度が合わないと、ボードがまったく応答しないように見え、not in sync: resp=0x00エラーが10回の試行で繰り返されます。対処法はメニューの設定1つだけです:「ツール」>「プロセッサ」>「ATmega328P (Old Bootloader)」。どちらが正しいかわからなければ、選択肢を順番に試してください。選び間違えてもボードが傷むことはありません。

プロセッサの選択肢ブートローダ書き込み速度選ぶ場面
ATmega328POptiboot(新)115200ボー純正品のNanoと、ブートローダを更新したボード
ATmega328P (Old Bootloader)ATmegaBOOT(旧)57600ボーCH340互換品のNanoのほとんど
ATmega168ATmegaBOOT(旧)19200ボーチップにATmega168と印字された古いボード

0番・1番ピンのモジュールが書き込みを妨げる

UnoとNanoでは、USBシリアル変換チップが1 kΩの抵抗を通してATmega328PのD0(RX)とD1(TX)ピンにつながっています。書き込みの間、このラインはパソコンのものです。HC-05 Bluetoothモジュール、GPS、ESP-01、指紋センサーのようなシリアルモジュールがこれらのピンにつながっていると、自分のデータをラインに流したり、ラインを一定のレベルに固定したりして、ブートローダのハンドシェイクを乱します。その結果、やはりprogrammer is not respondingやnot in syncが出ます。いちばん手っ取り早いのは書き込み中にD0とD1の線を外すことで、根本的な対策はSoftwareSerialでモジュールを別のピンに移すことです。

C++ (Arduino IDE)
1#include <SoftwareSerial.h>
2
3// HC-05 TX -> D10, HC-05 RX <- D11 (gerilim bölücüyle / through a voltage divider)
4SoftwareSerial bt(10, 11);   // RX, TX pinleri / RX, TX pins
5
6void setup() {
7  Serial.begin(9600);        // USB: Seri Monitör / USB: Serial Monitor
8  bt.begin(9600);            // HC-05 veri modu hızı / HC-05 data mode baud rate
9  Serial.println("Hazir / Ready");
10}
11
12void loop() {
13  if (bt.available()) Serial.write(bt.read());      // telefondan bilgisayara / phone to PC
14  if (Serial.available()) bt.write(Serial.read());  // bilgisayardan telefona / PC to phone
15}

このスケッチでは、HC-05のTXをD10に、RXをD11につなぎます。HC-05のRX入力は3.3 Vで動くので、D11との間に1 kΩと2 kΩの抵抗で作った分圧回路を入れてください。これでモジュールをつないだまま書き込めて、シリアルモニタに入力した内容をスマホに送れます。配線の全体とATコマンドモードについてはHC-05 Bluetoothモジュールのガイドを参照してください。MegaならSoftwareSerialは不要です。Serial1(TX1 = D18、RX1 = D19)のような追加のハードウェアシリアルポートがあります。

シリアルモニタとポートをふさぐプログラム

シリアルポートを開けるのは、一度に1つのプログラムだけです。そのため、WindowsではAccess is denied、macOSとLinuxではResource busyと表示されます。Arduino IDEは書き込み中にふつう自分のシリアルモニタを一時停止しますが、すべてのバージョンやボード、とくにESP32で完璧に動くわけではありません。エラーが出たら、まずシリアルモニタのタブを閉じてください。それ以上によくあるのは、別のものがポートをつかんでいるケースです。2つ目のIDEウィンドウ、開いたままのシリアルプロッタ、PuTTY、Curaのような3Dプリンターのソフト、VS CodeのPlatformIOモニター、バックグラウンドで動くPythonスクリプトなどです。これらを閉じ、ボードを抜き差ししてもう一度試してください。Linuxではsudo lsof /dev/ttyUSB0で、どのプログラムがポートをつかんでいるかを確認できます。

ボードは壊れている?ループバックテストとブートローダの書き込み

ここまでをすべて試してもまだ書き込めない場合は、問題がUSB側にあるのか、メインのプロセッサにあるのかを突き止める必要があります。UnoとNanoでの定番の方法はループバックテストです。メインのプロセッサをリセット状態に保ち、USBシリアル変換チップに自分自身と通信させます。このテストではコードを書き込む必要はありません。

  1. ボードから配線をすべて外し、USBケーブルだけをつないだ状態にします。
  2. ジャンパーワイヤーでRESETピンをGNDにつなぎます。これでATmega328Pがリセット状態に保たれ、ラインから外れます。
  3. 2本目のワイヤーでD0とD1ピンをつなぎます。
  4. IDEでボードのポートを選び、シリアルモニタを開きます。このテストではボーレートは関係ありません。
  5. 入力欄に文字をいくつか入力して送信します。入力した文字がそのまま返ってくれば、ケーブル、ドライバ、USBシリアル変換チップは正常で、問題はメインのプロセッサかブートローダにあります。何も返ってこなければ、問題はUSB側です。
  6. 終わったら、2本のワイヤーを忘れずに外してください。

ループバックテストは通るのに書き込みが失敗し、リセットを押してもLのLEDが短く点滅しない場合は、ブートローダが消えたか、チップが交換されている可能性があります。2台目のUnoを使えば、ブートローダを書き込み直せます。書込装置役のUnoに「ファイル」>「スケッチ例」>「11.ArduinoISP」>「ArduinoISP」を書き込みます。次に、書込装置のD10を書き込み先のRESETピンに、D11、D12、D13を書き込み先の同じ番号のピンに、5VとGNDどうしをつなぎます。書込装置のUnoのRESETとGNDの間に10 µFのコンデンサを入れてください。これで書込装置が自分自身をリセットするのを防げます。最後に「ツール」>「書込装置」>「Arduino as ISP」を選び、ボードメニューで書き込み先のボードを選んで、「ツール」>「ブートローダを書き込む」を実行します。この方法で、互換品のNanoに新しいOptibootを入れることもできます。

ESP32に書き込めない:Failed to connectとBOOTボタン

ESP32では、書き込みを行うのはavrdudeではなくesptoolです。出力にはまずConnecting........_____.....という行が表示され、esptoolがボードをダウンロードモードにしようとします。失敗すると、A fatal error occurred: Failed to connect to ESP32で始まるエラーが出ます。現在のesptoolでは、ボードがふつうに起動してしまった場合、メッセージはWrong boot mode detected (0x13)! The chip needs to be in download mode.と続きます。0x13は、ボードがダウンロードモードではなく通常の起動モードで立ち上がったことを意味します。ボードがまったく応答しない場合、メッセージはNo serial data receivedで終わります。古いバージョンでは、これがTimed out waiting for packet headerと表示されます。ボードが自分でダウンロードモードに入れないなら、手で入れます。

ESP32開発ボード
ESP32開発ボード:基板上のEN(リセット)とBOOT(GPIO0)ボタンを使えば、自動での書き込みに失敗したときに手でダウンロードモードにできます。
  1. IDEで「書き込み」をクリックし、出力ウィンドウを見ます。
  2. Connecting...が表示されたらすぐに、ボードのBOOTボタンを押し続けます。
  3. それでもつながらない場合は、BOOTを押したままENを1回短く押して離します。
  4. 出力にWriting atで始まる行と書き込みの割合が流れ始めたら、BOOTを離します。
  5. 書き込みはHard resetting via RTS pin...で終わります。プログラムが始まらなければ、ENを1回押してください。

なぜこうなるのでしょうか。ダウンロードモードに入るには、ESP32のGPIO0ピンが起動の瞬間にLOWになっている必要があります。開発ボードにある2つのトランジスタの自動リセット回路は、USBチップのDTRとRTS信号でこれを自動的に行いますが、安価なボードではタイミングが合わないことがあります。毎回BOOTを押すのに疲れたら、根本的な対策があります。ボードのENピンとGNDの間に10 µFの電解コンデンサをつなぎます(マイナスの足をGNDに)。コンデンサがENラインの立ち上がりを遅くし、自動リセット回路がGPIO0をLOWに保つ時間を作ってくれます。

ESP32のエラーメッセージ考えられる原因対処法
Wrong boot mode detected (0x13)(起動モードが違う)自動リセット回路がボードをダウンロードモードにできなかったBOOTボタン。根本対策はENとGNDの間に10 µF
No serial data receivedまたはTimed out waiting for packet headerボードからデータがまったく来ない:充電専用ケーブル、ポートの選択ミス、ダウンロードモードに入っていないボードデータ通信用のケーブル、「ツール」>「ポート」で正しいポート、BOOTボタン
This chip is ESP32-S3 not ESP32. Wrong --chip argument?(チップの種類が違う)「ツール」>「ボード」で、お使いのボードと違うESP32のモデルを選んでいるボードのモジュールに合うモデルを選ぶ(ESP32、ESP32-S3、ESP32-C3は別のボード)
Could not open COM3, the port is busy or doesn't exist(ポートが使用中か存在しない)シリアルモニタや別のプログラムがポートをつかんでいるシリアルモニタとほかのプログラムを閉じ、ボードを抜き差しする
Invalid head of packet: Possible serial noise or corruption(シリアルのノイズやデータ破損)長い、または質の悪いケーブル、弱い電源、速すぎる書き込み速度「ツール」>「Upload Speed」を921600から115200に下げる
書き込みは成功するが、起動時にflash read err, 1000と出る起動時にGPIO12がHIGHに引っぱられ、間違ったフラッシュ電圧が選ばれているGPIO12のモジュールを別のピンに移す
書き込み後にポートが消える(ESP32-S3、ESP32-C3)ネイティブUSBのボードで、プログラムがクラッシュしたかUSBをオフにしたBOOTを押したままUSBを挿す。「ツール」>「USB CDC On Boot」をEnabledにする
ESP32のGPIO0、GPIO2、GPIO12、GPIO15ピンは、起動時に読み取られるストラッピングピンです。GPIO2をHIGHに引っぱるモジュールや、GPIO0がLOWになるのを妨げるモジュールがあるとダウンロードモードに入れず、GPIO12をHIGHに引っぱるモジュールがあるとボードがまったく起動しないこともあります。回路をつないだときだけ書き込みに失敗するなら、まずこれらのピンを確認してください。安全なピンの一覧はピン配置ツールとESP32とは?のガイドを参照してください。
C++ (Arduino IDE)
1// ESP32 yükleme testi / ESP32 upload test
2const int LED_PIN = 2;   // birçok DevKit kartında dahili LED / onboard LED on many DevKit boards
3
4void setup() {
5  pinMode(LED_PIN, OUTPUT);
6  Serial.begin(115200);   // Seri Monitör 115200 baud / Serial Monitor at 115200 baud
7  delay(500);
8  Serial.print("Model: ");
9  Serial.println(ESP.getChipModel());                 // ör. ESP32-D0WD-V3 / e.g. ESP32-D0WD-V3
10  Serial.print("Flash (MB): ");
11  Serial.println(ESP.getFlashChipSize() / (1024 * 1024));
12  Serial.print("CPU (MHz): ");
13  Serial.println(getCpuFrequencyMhz());
14}
15
16void loop() {
17  digitalWrite(LED_PIN, !digitalRead(LED_PIN));   // LED'i tersle / toggle the LED
18  delay(500);
19}

Raspberry Pi Pico:BOOTSELとUF2で書き込む

Picoには独立したUSBシリアル変換チップがありません。RP2040が自分のUSBコントローラーを持ち、ブートローダは消せないチップのROMに入っています。そのため、ソフトウェアでPicoを文鎮化させることはほぼ不可能です。BOOTSELボタンを押したままUSBケーブルを挿すと、Picoはパソコン上でRPI-RP2というUSBメモリとして表示されます(Pico 2ではドライブ名がRP2350)。このドライブにドラッグした.uf2ファイルはボードに書き込まれ、ボードは自動で再起動します。MicroPythonもこの方法でインストールします。

Arduino IDEでPicoをプログラムする場合、最初の書き込みではまだCOMポートがありません。BOOTSELを押したままボードを挿し、「書き込み」をクリックしてください。最初のスケッチのあとはボードがシリアルポートを開くので、以降の書き込みにBOOTSELは不要です。コードがクラッシュしたりUSBをオフにしたりすると、ポートがまた消えてNo drive to deployエラーが出ます。そのときはBOOTSELの方法に戻ってください。MicroPythonを使う場合は、Thonnyの右下でインタープリターとしてMicroPython (Raspberry Pi Pico)を選んでおく必要があります。PicoのピンとセットアップについてはRaspberry Pi Picoとは?のガイドを参照してください。

症状考えられる原因対処法
RPI-RP2ドライブがまったく表示されない充電専用ケーブル、またはケーブルを挿してからBOOTSELを押したデータ通信用のケーブルを使う。先にBOOTSELを押してからケーブルを挿し、ドライブが出たら離す
Arduino IDE:No drive to deployボードがBOOTSELモードになっておらず、シリアルポートもないBOOTSELを押したまま挿し直し、「書き込み」をクリックする
Thonny:Couldn't find the device automaticallyMicroPythonがインストールされていない、またはボードがまだBOOTSELモードThonnyのInstall or update MicroPythonでUF2をインストールする
Thonny:Device is busy or does not respondmain.pyが無限ループで止まっていて命令を受け付けない停止ボタンかCtrl+Cを押す。だめならボードを抜き差しする
コードは動いたが、ボードが自分で起動しないファイルがmain.pyとしてPicoに保存されていないファイルをRaspberry Pi Picoの保存先にmain.pyとして保存する
ボードが固まり続け、何も書き込めないフラッシュ内の壊れたファイルや不具合のあるプログラムflash_nuke.uf2でフラッシュを消去し、MicroPythonを入れ直す
MicroPython
1import time
2from machine import Pin
3
4time.sleep(3)   # açılışta 3 sn bekle, Thonny durdurabilsin / wait 3 s so Thonny can stop the script
5
6led = Pin("LED", Pin.OUT)   # Pico ve Pico W dahili LED / onboard LED on Pico and Pico W
7sayac = 0
8while True:
9    led.toggle()
10    print("Calisiyor / running", sayac)
11    sayac += 1
12    time.sleep(0.5)

見落としやすい、小さいけれど厄介な原因

  • Leonardo、Micro、Uno R4:ネイティブUSBを持つこれらのボードでは、書き込み中にポートが一時的に変わることがあります。書き込みが止まる場合は、「書き込み」をクリックし、コンパイルが終わって書き込みの段階に入ったらすぐにリセットボタンを1回押してください(Uno R4ではすばやく2回)。ボードがしばらくブートローダで待機し、その間にコードが書き込まれます。
  • 自動リセットの故障:UnoやNanoで自動リセットが働かない場合は、リセットボタンを押したまま「書き込み」をクリックし、出力にスケッチのサイズの行が出たらすぐに離してください。
  • シールドと外部回路:モータードライバのシールドや5Vラインに負荷をかける回路があると、書き込み中に電源電圧が下がり、書き込みが途中で途切れることがあります。
  • macOSでのポートの選択ミス:ポートのリストにある/dev/cu.Bluetooth-Incoming-Portと/dev/cu.debug-consoleはボードではなく、システムのポートです。ボードのポート名にはusbmodem、usbserial、wchusbserialのいずれかが含まれます。迷ったらボードを抜き差しして、どれが消えるかを見てください。
  • ユーザー名にASCII以外の文字がある:Windowsのユーザーフォルダ名にアクセント付きの文字や日本語などのラテン文字以外が含まれていると、一部のボードパッケージ、とくにESP32のコンパイルや書き込みのツールがファイルを見つけられないことがあります。基本設定でスケッチブックの場所をそうした文字のないパスに移してください。それでも直らなければ、新しいWindowsユーザーを作成してください。
  • スケッチが大きすぎる:Sketch too bigの警告は書き込みエラーではありません。ブートローダを除いてUnoに残っている約31.5 KBのフラッシュにコードが収まらない、という意味です。ライブラリや長い文字列を減らすか、より大きなボードに移りましょう。
  • スリープ後にポートが固まる:パソコンがスリープから復帰したあと、ポートが固まることがあります。IDEを再起動するか、ボードを別のUSBポートに挿せば、たいてい直ります。
新しいボードを初めて試すときは、プロジェクトのコードではなく、上のテスト用スケッチのようなエラーがないとわかっている簡単なコードから始めましょう。簡単なスケッチは書き込めるのにプロジェクトが書き込めないなら、ボードは正常です。問題はコードのコンパイルか、プロジェクトが使っているピンにあります。この切り分けができれば、診断は半分終わったようなものです。

書き込めるようになったら次は?

  • 初めての回路:LEDと抵抗で自分のBlink回路を組み、ボタンを加えて初めてのインタラクティブなプロジェクトを作りましょう。
  • シリアル通信:0番・1番ピンが書き込みにどう影響するかがわかったので、HC-05 BluetoothモジュールでスマホからLEDを切り替えてみましょう。
  • センサーの読み取り:Arduinoセンサーガイドで、温度、距離、明るさを測る最初のプロジェクトを選びましょう。
  • ワイヤレスへ:ESP32でWi-Fiにつながり、スマホから操作できるプロジェクトを作りましょう。OTAのおかげで、あとからコードを無線で書き込むこともできます。
  • ボード選び:Uno、Nano、Megaで迷っているなら、どのArduinoを買えばいい?を読んでみてください。

書き込みエラーは初めて出会うと面倒ですが、どれにも筋の通った原因があり、そのほとんどは同じ順番で見つかります。ケーブル、ドライバ、ポート、ボードの設定、シリアルライン、そして最後にブートローダです。この順番を覚えておけば、次のエラーは数分で解決できます。ボードがコードを受け付けるようになったら、BlueGraysアプリには、LEDの点滅からWi-Fiや無線のOTA更新まで、Arduino、ESP32、Raspberry Pi Pico向けのプロジェクトがたくさんあります。どれもステップごとの回路図とすぐに使えるコード付きなので、すぐにボードを活躍させられます。

よくある質問

Arduinoにコードが書き込めないのはなぜですか?

いちばん多い原因は、充電専用のUSBケーブル、CH340ドライバの不足、ボードやポートの選択ミス、0番・1番ピンにつないだモジュールです。互換品のNanoでは、プロセッサの設定をATmega328P (Old Bootloader)にする必要もあります。これらを順番に確認すれば、ほとんどの場合ボードは正常だとわかります。

avrdudeのstk500_getsync not in sync resp=0x00はどう直しますか?

このエラーは、パソコンがボードのブートローダとのハンドシェイクを完了できないという意味です。まず正しいポートとボードを選び、Nanoならプロセッサの「Old Bootloader」の選択肢を試し、D0とD1の線を外してください。それでも続く場合は、ループバックテストでUSB側を確認し、必要ならブートローダを書き込み直してください。

パソコンにArduinoが表示されないのはなぜですか?

「ツール」>「ポート」が空なら、ケーブルがデータを通さないか、USBシリアル変換チップのドライバがインストールされていません。別のデータ通信用ケーブルを試し、Windowsのデバイスマネージャーでボードが「ポート(COMとLPT)」の下に表示されるか確認してください。「ほかのデバイス」の下に黄色い印付きのUSB2.0-Serialがあれば、CH340ドライバをインストールしてください。

CH340ドライバはどうやってインストールしますか?

Windows 10と11では、たいてい自動でインストールされます。されない場合は、メーカーのWCHからCH341SERパッケージをダウンロードして実行し、ボードを抜き差ししてください。現在のmacOSにはドライバが含まれていて、Linuxではカーネルに入っています。Linuxで必要なのは、ユーザーをdialoutグループに追加することだけです。

ESP32に書き込むとき、BOOTボタンはいつ押しますか?

出力にConnecting...が表示されたらすぐにBOOTを押し続け、書き込みの割合が流れ始めたら離します。これでESP32がダウンロードモードに入ります。毎回の書き込みで必要になる場合は、ENとGNDの間に10 µFのコンデンサを入れると、たいてい問題がなくなります。

Raspberry Pi Picoが認識されないときはどうすればいいですか?

BOOTSELボタンを押したまま、データ通信用のケーブルでPicoをパソコンにつなぎます。RPI-RP2というドライブとして表示されるはずです。このモードでは、MicroPythonのUF2ファイルをドラッグ&ドロップしたり、Arduino IDEからコードを書き込んだりできます。ドライブが表示されなければ、ケーブルがデータを通していません。PicoのブートローダはROMにあるので、ソフトウェアで壊れることはありません。

全プロジェクトを見る
LEDの点滅
#1初級

LEDの点滅

電子工作の第一歩は、1個のLEDを点けたり消したりすることです。Arduinoで短い間隔で点灯と消灯を繰り返すと、LEDが素早く点滅します。ボードが光を制御する仕組みを最もシンプルな形で確かめ、これから取り組むプロジェクトの基礎を身につけます。

4.6(188)
1127
ESP32でLEDを点滅
#103初級

ESP32でLEDを点滅

ESP32のGPIO出力の基本を学びます。デジタルピンからLEDを点灯・消灯させて、点滅させます。Arduino UNOの定番のLED点滅プロジェクトのESP32版です。Arduino環境で使う基本的な点滅コマンドは同じですが、ESP32のピン配置と3.3 VのGPIO電圧レベルはArduino UNOとは異なります。

4.7(37)
99
ESP32の内蔵LEDを点滅
#106初級

ESP32の内蔵LEDを点滅

ESP32 DevKit V1に内蔵された青色LEDを点滅させます。外付け部品は不要です!ESP32を購入したら、最初に試すプロジェクトです。GPIO 2が内蔵LEDにつながっています。

4.8(29)
53
Raspberry Pi Picoの内蔵LEDを点滅(PicoとPico W)
#147初級

Raspberry Pi Picoの内蔵LEDを点滅(PicoとPico W)

Raspberry Pi Picoシリーズの最初のプロジェクトです!ボード上の緑色LEDを点滅させて動作を確認する、定番の「Hello World」に相当する実験です。外付け部品は不要で、PicoとUSBケーブルだけで始められます。コードはMicroPython(Raspberry Pi Foundationが公式にサポートする言語)で書きます。Thonny IDEでmachine.Pinクラス、Pin.OUTモード、led.on()/off()メソッド、time.sleep()を学びます。シリアル(REPL)出力で、切り替わる様子をリアルタイムに確認できます。

5.0(1)
10
HC-SR04で距離を測定(シリアルモニタ表示)
#27初級

HC-SR04で距離を測定(シリアルモニタ表示)

HC-SR04センサーは、コウモリが暗闇で道を見つけるのと同じ仕組みで動作します。人には聞こえない音を出し、その反響を捉えて前方の物体までの距離を測ります。Arduinoは0.5秒ごとに距離をセンチメートル単位でコンピューターの画面に表示し、3〜100センチメートルの測定値を示します。駐車センサーや障害物を避けるロボットなどのプロジェクトの基礎になります。

4.6(46)
71
BluetoothでスマートフォンからLEDを操作
#34初級
プレミアム

BluetoothでスマートフォンからLEDを操作

スマートフォンで部屋の照明をつけたり消したりするための、小さな練習です。Bluetoothモジュールがスマートフォンから送られた文字をArduinoに伝えます。ある文字で赤いLEDが、別の文字で緑のLEDが点灯し、同じ文字を小文字で送ると消灯します。無線操作の仕組みを、ごくシンプルな形で学べます。

4.8(68)
89
2台のArduinoで一方向通信
#57中級
プレミアム

2台のArduinoで一方向通信

2台のArduinoを1本のワイヤーで通信させます。一方のボタンを押すともう一方のLEDが点灯し、もう一度押すと消灯します。送信側のボードがボタンの押下を短いメッセージで伝え、受信側のボードはそのメッセージを受け取るとLEDの点灯と消灯を切り替えます。機器同士が情報を伝える仕組みを、最もシンプルな形で確かめられます。

4.4(37)
50
ESP32 OTA更新:無線でファームウェアを書き込み(LCD付き)
#132上級
プレミアム

ESP32 OTA更新:無線でファームウェアを書き込み(LCD付き)

このプロジェクトでは、USBケーブルを使わず、Wi-Fi経由でESP32に新しいファームウェアを書き込む方法を学びます。ArduinoOTAライブラリを使うと、ESP32がネットワーク上で検出され、Arduino IDEの「ネットワークポート」タブにbluegrays-otaとして自動表示されます。初回はUSBで書き込み、その後の更新はすべて無線で行えます。設置済みのデバイスにとって非常に重要な機能です。I2C LCDディスプレイには、Wi-Fiの状態、IPアドレス、ホスト名、OTA書き込みの進捗率、エラーメッセージをトルコ語と英語で表示します。

4.6(14)
22