スケッチが書き込めない
まず確認してみる事
Arduino LeonardoやArduino MicroといったUSB機能を持つArduinoを使用してスケッチを書いていると、書き込みに失敗することがあります。
よく起こるエラーとして、下記のメッセージが出るかと思います。
指定されたポートには、ボードが接続されていません。正しいポートを選んである事を確認してください。もしも正しいポートを選んである場合には、書き込みを開始した直後にボードのリセットボタンを押してみてください。
ロボット(QX-001R3J)など、Arduino互換機の場合はリセットスイッチが無いなど、どうして良いか分らないメッセージですが、このエラーが出て書けない場合は、以下の手順で書ける場合がほとんどです。
1.USBケーブルを抜く
2.スケッチの書き込みを実行する
3.”マイコンボードに書き込んでます” とメッセージが変わったらUSBケーブルを繫ぐ
ハードに問題がなければ書き込みが成功すると思います。
もし、3のUSBを繋ぐタイミングが難しい場合は、「ファイル」メニューの「環境設定」から
「より詳細な情報を表示する:□書き込み」にチェックを付け有効にすることでシリアルポートの変化を監視している出力が出て来るようになり、分りやすいかと思います。
なぜ書き込めないのか
Arduino IDEでは、あからかじめ選択したシリアルポートを使って、書き込み対象のArduinoをリセットし、bootloaderと通信する事でスケッチを書き込こみます。
Arduinoのbootloaderは電源が入った初めかリセット後に起動され、専用の通信が無ければスケッチプログラムへ実行を切り替えます。
UNO などのシリアル通信用に別途マイコンが乗っている機種はシリアル通信のDTR信号を使ってハードリセットを行う様になっています。
Leonardo などUSB機能を直接持つArduinoは bootloaderが書き込み用シリアルポートを用意して少し待機し、スケッチプログラムが切り替わると、ソフトリセットが出来るシリアルポートが認識されて動きます。
スケッチを書きこむ際は、プログラム転送前にシリアルポートを使ってArdinoをbootloaderへ切り替えるためのリセットを掛ける仕組みが共通して用意されています。
なので、スケッチプログラムでシリアルポートが認識できないプログラムが走っているとリセットが出来ず、bootloaderとの通信に失敗してしまい、書き込みが失敗することになります。
まとめ
ATmega32U4などUSB機能を持ったArduinoのスケッチプログラムの場合、シリアルポートがPCから見えている状態であればArduino IDEからいつでも書き込みが出来ます。
※ setup 関数が呼ばれる前に準備されているので、Serial.begin() などを書く必要はありません。
下記の様にシリアルポートが無効になるスケッチだと、書き込み時にケーブルを繫ぎなおす等のリセットを手動で行う必要があります。
・割り込みを禁止したままで使用する
・レジスタを直接触るなどで標準のUSBシリアルが無効なスケッチを書いている
例として、シリアルポートが使えなくなるスケッチを載せておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// お試しスケッチ // このスケッチを書き込むとシリアルポートが消えてしまい、次の書き込みが出来なくなります。 // void setup() { //NG 1, 割り込み禁止のまま。許可に戻していない! cli(); //NG 2, timer 0 レジスタを変更して 時間管理を止めている!(delay関数が使えない) TIMSK0 = 0; } void loop() { delay(100); // timer0の時間管理が動作していないと 帰ってこなくなる! } |
余談
スケッチプログラムで動いているシリアルポートは、1200bps で開くとリセット動作を行います。
逆に 通常使わない速度と思いますが、スケッチ上で動いているシリアルポートとは 1200bpsで通信はできません。
Arduino IDEでこの辺りの振る舞いについては、GitHubのソース上にコメントがあります。
・リセットしている場所 touchForCDCReset
・1200bpsで開くおまじない Upload
コメント