Memoteki

メモ的な何か。https://memoteki.net/about をお読みください。

Arduino

Arduinoに書き込めない問題を修正する方法[not in sync]

2017/12/24

LINEで送る
Pocket

Arduinoのリセットピンの接続方法が問題で以下のようなエラーが出て、スケッチをアップロードできませんでした。その対処方法をメモしておきます。

avrdude: stk500_getsync(): not in sync: resp=0x00

----2017年12月24日追記----
タイトルを変更しました。
旧タイトル「ArduinoIDEのスケッチがアップロードできないエラー その2」

このエラーは2013年1月に発生したエラーです。
現在も同じようなミスでこのエラーに遭遇するので大幅に加筆修正しました。
----追記ここまで----

概要

Arduinoクローンを作成しました。ATmega328Pのマイコン単体にブレッドボード上で部品を接続して使用しました。
その際、リセットピンの接続方法が違っていたため以下のエラーが出て書き込みができなかった問題に対処しました。
このエラーに対する対処方法をメモしておきます。

avrdude: Version 6.3, compiled on Jan 17 2017 at 12:00:53
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "D:\arduino\arduino-1.8.3\hardware\tools\avr/etc/avrdude.conf"

         Using Port                    : COM5
         Using Programmer              : arduino
         Overriding Baud Rate          : 115200
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x0a

avrdude done.  Thank you.

マイコンボードに書き込もうとしましたが、エラーが発生しました。
このページを参考にしてください。
http://www.arduino.cc/en/Guide/Troubleshooting#upload

「not in sync」の原因

このエラーが発生するのには複数の理由があります。簡単なものからいくつかあげていきます。

  • 指定するシリアルポートが間違っている
    • Arduinoを外すとそのシリアルポートが認識されなくなるか再度確認してみてください
  • 指定するボードが間違っている
    • Arduinoクローン(Arduino Diecimila)なのにArduino UNOを指定していませんか?
  • 配線が抜けている/基板のパターンが途切れている/半田付けした配線がつながっていない
    • テスタで導通確認をしてみてください
  • 配線ミス
    • 電源はマイコンにつながっていますか?
    • MISO/MOSIを逆につないだりしていませんか?
    • 外部クロックを使用するようにしている場合、水晶発振子は正しくついていますか?
    • マイコンのRESETピンにはリセット信号が届くようになっていますか?

あくまで筆者の経験談ですが、多くの場合はここまで確認するとほとんどの場合「not in sync」のエラーを解消できました。
ここまで来ても解決できていない場合、考えられるのは

  • マイコンのリセットがうまくできていない
  • マイコンのフューズビットの設定が間違っている

の2点です。

ネット上には旧来のArduinoのリセット信号(RTS信号)と現在のArduinoのリセット信号(DTR信号)の情報が混在しているので注意してください。

DTR信号をダイレクトにAVRマイコンに接続していると信号がGNDレベルになっている時間が長すぎて書き込みができません。

そこで、以下のようにFT232シリーズICのDTRピンとマイコンのRESETピンの間に0.1uFのコンデンサを挟みます。

FT232シリーズICのDTRピン <---> 0.1uFコンデンサ <---> マイコンのRESETピン

これで無事にリセットできるようになったと思います。

ここまでたどり着く際に参考にしたサイトをいくつか紹介しておきます。

Arduino互換機を作りたい(3): くつしたねこのTinkering,Tinkering and Obliquity
http://kutsushita-neko.cocolog-nifty.com/blog/2013/09/arduino-e10d.html

USB<->シリアル (USB to TTL)
https://ht-deko.com/arduino/usb2serial.html

さらに、これでもだめな場合、ブートローダを書き直してみます。

書き込み環境の設定は次のサイトを見ながら行いました。Kosakaさん、ありがとうございます。

外付けAVRライタ無しでBootloaderを書き込む
http://make.kosakalab.com/arduino/bootloader/

ATmega328Pで設定したフューズビットは以下の通りです。

ATmega328P + ATmegaBOOT_168_atmega328.hex

lfuse:0xFF
hfuse:0xDA
efuse:0xFD
lockbit:0xCF

ここまでたどり着く際に参考にしたサイトを紹介しておきます。

外付けAVRライタ無しでBootloaderを書き込む
http://make.kosakalab.com/arduino/bootloader/

1チップマイコン AVR で、遊んでみる | 情報通信技術コンサルタント くわ ICT-Kuwa
http://ict-kuwa.net/tech/avr1/

まとめ

「not in sync」のエラーが出た場合、まず、ここを見て落ち着いて順番に1つずつ確認してみてください。
ほとんどの場合、ここでエラーが解決すると思います。
それでもだめな場合、リセット信号を疑ってみてください。
FT232のDTRピンとマイコンのRESETピンの間には0.1uF程度のコンデンサを挟まないとリセットできない場合があります。
それでもだめな場合、おそらくマイコンのフューズビットが違うと思いますので、確認してみてください。
参考までにATmega328Pのフューズビットの設定をここに記載しておきます。

ATmega328P + ATmegaBOOT_168_atmega328.hex

lfuse:0xFF
hfuse:0xDA
efuse:0xFD
lockbit:0xCF

おまけ

エラー解決方法

たまに「どうやってこのようなエラーを解消しているのか」を聞かれるので、聞かれる前に書いておきます。

まず、自分の書いた回路図と実物を見比べます。

今回は秋月電子通商のArduino Pro Mini互換機とほとんど同じでした。Arduino Pro Mini互換機の回路図

ですが、設計する際はArduino Diecimilaの回路図(http://www.arduino.cc/en/uploads/Main/Arduino-Diecimila-schematic.pdf)を見ながら回路図を書いていたので一部異なりました。具体的には秋月電子通商のArduino Pro Mini互換機の回路図のC2に該当するコンデンサがありませんでした。

Arduino.ccにあるArduino UNOの回路図(http://arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf)を見てみると、ATmega328PのRESETにC6としてコンデンサが挟まれています。

また、Arduino Duemilanoveの回路図(https://www.arduino.cc/en/uploads/Main/arduino-duemilanove-schematic.pdf)にもC13としてコンデンサが挟まれています。

どうやらこのコンデンサがなくてはリセットがうまくできない場合があるのでは……???と推測してコンデンサを入れてみたところ、無事に動いたという具合です。

昔の話

昔はエラーメッセージも簡素だったようです。

         Using Port                    : \\.\COM13
         Using Programmer              : arduino
         Overriding Baud Rate          : 115200
avrdude: Send: 0 [30]   [20] 
avrdude: Send: 0 [30]   [20] 
avrdude: Send: 0 [30]   [20] 
avrdude: Recv: 
avrdude: stk500_getsync(): not in sync: resp=0x00

avrdude done.  Thank you.
LINEで送る
Pocket

-Arduino
-, , , , , ,