Устранение неполадок Ардуино

Не прошиваются программы в Ардуино

В процессе передачи программы от компьютера к Ардуино участвует множество компонентов. Если хотя бы один из них сработает некорректно - процесс прошивки будет нарушен. В частности, процесс прошивки зависит от: драйверов Ардуино, выбора модели устройства и порта в среде Ардуино, физического подключения к плате, прошивке контроллера 8U2 (на Arduino Uno и Mega 2560), загрузчика главного микроконтроллера устройства, настроек фьюз-битов, и т.д. Ниже приведено несколько рекомендаций по устранению неполадок того или иного компонента.

Среда Arduino

  • Убедитесь, что в меню Tools > Board выбрана именно ваша модель Ардуино. Если у вас Arduino Uno - выбирайте соответствующий пункт. Также имейте ввиду, что модели после Arduino Duemilanove идут с микроконтроллером ATmega328, а более старые версии - с ATmega168. Чтобы узнать, какой контроллер используется в вашем Ардуино - прочите надпись на микроконтроллере (самая большая микросхема на плате). Дополнительную информацию о меню Board можно найти в разделе Среда разработки Arduino.
  • Затем проверьте, чтобы в меню Tools > Serial Port был выбран правильный порт (если порт не появляется, попробуйте перезапустить среду IDE при подключенном к компьютеру устройстве). На компьютерах Mac, последовательный порт должен выглядеть примерно так: /dev/tty.usbmodem621 (для Arduino Uno или Mega 2560) либо /dev/tty.usbserial-A02f8e (для более старых версий Ардуино с микросхемой FTDI). На Linux: /dev/ttyACM0 или что-то наподобие (для Arduino Uno или Mega 2560), либо /dev/ttyUSB0 (для более старых версий Ардуино). На Windows - это будет COM-порт, однако перед выбором в Диспетчере устройств нужно проверить, какой именно из них ассоциирован с Ардуино. Если таковых портов в списке нет, см. следующий раздел о драйверах.

Драйверы

Драйверы позволяют прикладному ПО на компьютере (т.е. среде Ардуино) общаться с подключенным к нему "железом" (платой Ардуино). Применительно к Ардуино, драйверы отвечают за создание в системе виртуального последовательного порта (или виртуального COM-порта). Arduino Uno и Mega 2560 с микроконтроллером ATmega8U2 используют стандартные драйвера (USB CDC) операционной системы. Другие же платы Ардуино, где роль USB-UART преобразователя выполняет микросхема FTDI, используют драйвера от FTDI.

Самый простой способ проверить, правильно ли установлены драйвера - это подключить Ардуино к ПК и открыть меню Tools > Serial Port в среде разработки. После подключения Ардуино здесь должны появится новые пункты меню. При этом абсолютно не важно, какое именно имя порта будет присвоено Ардуино.

  • На Windows 7 (в частности на 64-битной версии), вам возможно потребуется зайти в Диспетчер устройств и обновить драйверы Arduino Uno или Mega 2560. Для этого в диспетчере щелкните правой кнопкой по устройству (плата должна быть подключена к компьютеру) и снова укажите Windows соответствующий .inf-файл. Этот файл лежит в папке drivers/ программного обеспечения Arduino (но не в поддиректории FTDI USB Drivers).
  • Если при установке драйверов Arduino Uno или Mega 2560 под Windows XP у вас возникает следующая ошибка: "Система не может найти указанный файл", то попробуйте это решение (о добавлении ключа "RunOnce" в ветку реестра "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion").
  • На Linux, Arduino Uno и Mega 2560 определяются в виде устройств /dev/ttyACM0, которые не поддерживаются стандартной версией библиотеки RXTX, использующейся средой Ардуино для последовательной связи. Поэтому Linux-версия этой среды включает пропатченную библиотеку RXTX, которая работает в том числе работает с устройствами  /dev/ttyACM*. Существует также специальный пакет для Ubuntu (11.04), в который включена поддержка таких устройств. Если же вы используете стандартный пакет RXTX, то вам нужно создать в системе символическую ссылку с /dev/ttyACM0 на /dev/ttyUSB0 (к примеру) - тогда последовательный порт появится в среде Arduino.

Доступ к последовательному порту

  • На Windows: если программа долго открывается или вылетает при запуске, либо меню Tools в ней открывается слишком долго, то в Диспетчере устройств попробуйте отключить все последовательные Bluetooth-порты и прочие сетевые COM-порты. Во время запуска или открытия меню Tools, среда разработки Ардуино сканирует все последовательные порты вашего компьютера, соответственно, наличие таких сетевых портов может иногда приводить к подвисаниями или вылетам программы.
  • Убедитесь, что у вас не запущены программы-сканеры последовательных портов, такие, как USB Cellular Wifi Dongle (например, от Sprint или Verizon), приложения для синхронизации PDA, драйвера Bluetooth-USB (например, BlueSoleil), виртуальные демоны и пр..
  • Убедитесь, что причиной блокирования последовательного порта не является брандмауэр (например, ZoneAlarm).
  • Нужно также закрыть все программы, осуществляющие мониторинг данных, идущих через USB между Ардуино и ПК (например, Processing, PD, vvvv и др.).
  • На Linux: попробуйте запустить среду Arduino от суперпользователя, хотя бы временно, чтобы увидеть, поможет это прошить Ардуино или нет.

Физическое подключение к плате

  • Первым делом убедитесь, что Ардуино включен (горит зеленый светодиод) и соединен с компьютером.
  • На Mac-компьютерах есть некоторые проблемы при подключении Arduino Uno и Mega 2560 через USB-хаб. Если в меню "Tools > Serial Port" ничего не появляется, попробуйте подключить плату непосредственно к компьютеру и перезапустить Arduino IDE.
  • На время прошивки отключите все устройства от цифровых выводов 0 и 1, поскольку эти выводы связаны с интерфейсом подключения Ардуино к компьютеру (после успешной прошивки кода в контроллер их можно снова задействовать).
  • Попробуйте прошить Ардуино, отключив от него все устройства (кроме USB-кабеля, разумеется).
  • Убедитесь в том, что плата не касается металлических предметов, проводящих ток.
  • Попробуйте другой USB-кабель, иногда они тоже выходят из строя.

Авто-сброс

  • Если ваш Арудино не поддерживает функцию авто-сброса, убедитесь в том, что вы сбрасываете плату за несколько секунд до прошивки. (Arduino Diecimila, Duemilanove и Nano поддерживают функцию авто-сброса, как и LilyPad, Pro и Pro Mini с 6-контактными разъемами для программирования).
  • Обратите внимание: некоторые Arduino Diecimila были случайно прошиты не тем загрузчиком. Такие модели требуют физического нажатия кнопки сброса перед загрузкой программы; подробнее об этом см. ниже.
  • На некоторых компьютерах нужно нажимать кнопку сброса (на плате) после нажатия кнопки Upload в среде Ардуино. Поэкспериментируйте с разными интервалами времени между нажатиями - от 0 до 10 секунд или больше с интервалом где-то через 2 секунды.
  • Если у вас возникает такая ошибка: "[VP 1] Device is not responding correctly." попробуйте прошить программу еще раз (другими словами, сбросьте плату и нажмите кнопку Upload еще раз).

Загрузчик

  • Убедитесь в том, что на вашем Ардуино прошит загрузчик. Для этого просто перезагрузите устройство. Встроенный светодиод (подключенный к 13-й ножке контроллера) должен замигать. Если этого не произошло, то скорее всего на вашей плате нет загрузчика.

 

Если программы по-прежнему не прошиваются, задайте вопрос на форуме. В своем сообщении укажите, пожалуйста, следующую информацию:

  • Версию вашей операционной системы.
  • Тип вашего Ардуино. Если это Mini, LilyPad или другая модель, требующая дополнительных проводов, по возможности добавьте в сообщение фото вашей схемы.
  • Получалось ли у вас до этого успешно прошить плату. Если да, то опишите, что вы делали с платой до того, как она перестала работать, какое программное обеспечение в последнее время вы ставили или удаляли со своего компьютера?
  • Сообщения, появляющиеся при попытке загрузить программу в Ардуино. Для получения сообщений зажмите кнопку Shift при нажатии на кнопку Upload на панели инструментов.

Возникает ошибка "Build folder disappeared or could not be written" (на Mac OS X)

Вы извлекли Arduino.app из образа диска (например, в папку Applications)? Если нет, то вы не сможете загружать примеры.

Не запускается среда Ардуино после обновления Java на компьютерах Mac

Последнее обновление Java от Apple пытается использовать 64-битные версии родных библиотек. Однако, в программном обеспечении Ардуино используется 32-битная версия библиотеки RXTX. При запуске Ардуино возникает примерно такая ошибка:

Uncaught exception in main method: java.lang.UnsatisfiedLinkError: /Applications/arduino-0016/Arduino 16.app/Contents/Resources/Java/librxtxSerial.jnilib: no suitable image found. Did find: /Applications/arduino-0016/Arduino 16.app/Contents/Resources/Java/librxtxSerial.jnilib: no matching architecture in universal wrapper

Для решения этой проблемы, щелкните по приложению Arduino (т.е. Arduino 16.app) в окне Finder, и из меню File выберите Get Info. На панели установите флажок "Open in 32 Bit Mode". После этого среда Ардуино должна запускаться нормально.

При компиляции программы возникает ошибка java.lang.StackOverflowError

Среда разработки Arduino осуществляет предварительную обработку вашего скетча путем манипуляций над кодом с помощью регулярных выражений. Иногда определенные строки текста приводят к сбоям этого процесса. Если вы видите примерно такую ошибку:

java.lang.StackOverflowError
at java.util.Vector.addElement(Unknown Source)
at java.util.Stack.push(Unknown Source)
at com.oroinc.text.regex.Perl5Matcher._pushState(Perl5Matcher.java) 

или:

	at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java)
	at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java)
	at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java)
	at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java)
	at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java)
	at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java)
	at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java) 

то это именно такая ситуация. Проверьте код на наличие необычных последовательностей символов, связанных с "двойными кавычками", "одинарными кавычками", обратным слэшем \, комментариями и пр. Например, к таким проблемам может приводить отсутствие кавычек или, к примеру, такая последовательность '\"' (вместо '"').

Не запускается скетч при питании платы от внешнего источника (на моделях Arduino Diecimila или младше)

Поскольку вывод RX отсоединен, загрузчик Ардуино может принимать помехи, вместо данных, а значит, у него никогда не наступит таймаут и, соответственно, запуск программы не произойдет. Для решения этой проблемы, попробуйте соединить вывод RX с землей через резистор 10 кОм (или соединить выводы RX и TX).

Подвисает среда разработки Ардуино (на Windows) при попытке прошить программу

Эта проблема может возникать из-за конфликта Ардуино с процессом Logitech 'LVPrcSrv.exe'. Откройте Диспетчер задач и найдите его в списке процессов. Если он там есть, то следует завершить процесс перед прошивкой программы. Подробнее здесь.

Не включается Ардуино (зеленый светодиод питания не загорается)

Если вы используете Arduino Diecimila или более старую версию с USB (например, NG), убедитесь, что джампер на плате (небольшая пластмассовая деталь возле разъема USB) установлен правильно. Если плата запитана от внешнего источника питания (подключенного к соответствующему разъему), то джампер должен замыкать два вывода, которые находятся ближе к разъему питания. Если плата запитана от USB, то джампер должен замыкать два вывода, которые находятся ближе к USB-разъему. На этой картинке показано положение джампера в случае питания платы от USB.

(благодарность mrbbp за сообщение и картинку)

Запуск программы на Arduino Diecimila происходит слишком долго (6-8 секунд)

На некоторых платах Arduino Diecimila случайно был прошит загрузчик от Arduino NG. Он работает нормально, только имеет больший таймаут после сброса платы (т.к. в Arduino NG не реализован автоматический сброс, что требует ручной синхронизации процесса прошивки). Распознать загрузчик от NG можно по светодиоду, подключенному к 13 выводу: в Arduino NG после сброса платы он мигает 3 раза, а в Diecimila - 1 раз. Если в вашем Diecimila установлен загрузчик от NG, то перед прошивкой скетча ван нужно физически нажимать расположенную на плате кнопку сброса. Можно также прошить в устройство корректный загрузчик от Diecimila, подробнее об этом см. на странице о загрузчике.

Вылетает ошибка при запуске arduino.exe на Windows

Если при запуске arduino.exe под Windows возникает ошибка, например такая:

Arduino has encountered a problem and needs to close.

то попробуйте запустить Ардуино с помощью файла run.bat. Пожалуйста, будьте терпеливы, т.к. для запуска среды Ардуино требуется некоторое время.

Почему Ардуино не работает на старых версиях Mac OS X?

Если у вас возникает примерно такая ошибка:

Link (dyld) error: 

dyld: /Applications/arduino-0004/Arduino 04.app/Contents/MacOS/Arduino Undefined symbols: 
/Applications/arduino-0004/librxtxSerial.jnilib undefined reference to _printf$LDBL128 expected to be defined in /usr/lib/libSystem.B.dylib 

то вероятно вам нужно обновить систему до Mac OS X 10.3.9 или новее. Системные библиотеки более старых версий не совместимы с Ардуно.

Благодарность Gabe462 за сообщение.

При запуске среды Ардуино возникает ошибка UnsatisfiedLinkError (с сообщением о библиотеке librxtxSerial.jnilib)

Если при запуске Ардуино у вас возникает такая ошибка:

Uncaught exception in main method: java.lang.UnsatisfiedLinkError: Native Library /Users/anu/Desktop/arduino-0002/librxtxSerial.jnilib already loaded in another classloader

то вероятно у вас старая версия библиотеки, которая отвечает за связь. Ищите файлы comm.jar или jcl.jar в папке /System/Library/Frameworks/JavaVM.framework/ или в директориях, перечисленных в переменных окружения CLASSPATH и PATH. (ошибка обнаружена Anurag Sehgal)

Что означает ошибка "Could not find the main class"?

Если при запуске Ардуино возникает такая ошибка:

Java Virtual Machine Launcher: Could not find the main class. Program will exit.

проверьте, правильно ли вы распаковали содержимое .zip-архива Ардуино - в частности, убедитесь, что папка lib находится непосредственно внутри директории Arduino и содержит файл pde.jar.

Как быть с конфликтами cygwin на Windows?

Если на вашей машине уже установлен cygwin, то при попытке скомпилировать скетч в среде Ардуино может возникать такая ошибка:

6 [main] ? (3512) C:\Dev\arduino-0006\tools\avr\bin\avr-gcc.exe: *** fatal error - C:\Dev\arduino-0006\tools\avr\bin\avr-gcc.exe: *** system shared memory version mismatch detected - 0x75BE0084/0x75BE009C.

Вероятнее всего, эта проблема возникает из-за использования несовместимых версий DLL-библиотеки cygwin.

В поиске Windows (Пуск -> Найти) вбейте cygwin1.dll и удалите все найденные файлы, кроме самой последней версии. Самая свежая версия должна находится в папке x:\cygwin\bin, где 'x' - диск, на который устанавливался дистрибутив cygwin. Рекомендуется также перезагрузить компьютер.

Убедитесь также, что cygwin не сидит в процессах при запущенной среде Arduino. Можно также попытаться удалить файл cygwin1.dll из папки Arduino и заменить его файлом cygwin1.dll из существующего дистрибутива cygwin (который, скорей всего, находится в папке c:\cygwin\bin).

Долго открывается среда Ардуино и меню Tools (на Windows)

Если среда Ардуино запускается очень долго или подвисает при попытке открыть меню Tools, то это говорит о конфликте с каким-то другим устройством в системе. При запуске, а также при открытии меню Tools, программное обеспечение Ардуино пытается получить список всех доступных COM-портов в системе. Возможно, что определенный COM-порт, созданный одним из устройств компьютера замедляет этот процесс. Проверьте Диспетчер устройств. Попробуйте отключить в нем все устройства, которые могут создавать в системе COM-порты (например, Bluetooth-адаптеры).

Устройство не отображается в меню Tools | Serial Port

Если вы используете Ардуино с USB, убедитесь, что драйвера на микросхему FTDI установлены корректно (инструкцию по установке см. здесь). Если же вы используете адаптер USB-UART с обычным Ардуино (без USB), проверьте, установлены ли драйвера на этот адаптер.

После этого убедитесь, что плата действительно подключена: меню со списком портов обновляется каждый раз при открытии меню Tools, соответственно, если вы только что отключили плату, то ее не будет в этом списке. 

Проверьте, не запущены ли программы, сканирующие все последовательные порты, напирмер, приложения для синхронизации PDA, драйвера Bluetooth-USB (такие, как BlueSoleil), виртуальные демоны и пр.

На Windows-системах номер COM-порта, присваиваемого Арудино, может оказаться слишком большим. От пользователя zeveland:

"Небольшое примечание для тех, кто не может прошить программу в Ардуино с большим номером COM-порта: попробуйте уменьшить номер порта, ассоциированного с микросхемой FTDI."

"В моей системе куча виртуальных COM-портов от Bluetooth-адаптера, поэтому Ардуино был присвоен порт COM17. IDE не смогла найти Ардуино, поэтому я удалил другие виртуальные порты в Панели управления (под XP) и изменил порт для микросхемы FTDI на COM2. Просто убедитесь, что Ардуино использует назначенный порт и все будет ок."

Если у вас старая версия драйверов FTDI на Mac-компьютере, то придется удалить их и установить последнюю версию. Инструкции по установке см. на этой ветке форума.

При прошивке кода или в программе "Serial Monitor" вылетает ошибка gnu.io.PortInUseException (на Mac-системах)?

Error inside Serial.<init>() 
gnu.io.PortInUseException: Unknown Application 
     at gnu.io.CommPortIdentifier.open(CommPortIdentifier.java:354) 
     at processing.app.Serial.<init>(Serial.java:127) 
     at processing.app.Serial.<init>(Serial.java:72) 

Чаще всего эта ошибка означает, что порт занят другим приложением. Поэтому, проверьте, не запущены ли программы, работающие с последовательными или USB-портами, например приложения синхронизации PDA, менеджеры устройств Bluetooth, определенные брандмауэры и пр. Также имейте ввиду, что некоторые программы (например, Max/MSP) оставляют последовательный порт открытым, даже когда не используют его - поэтому лучше закрыть все утилиты, использующие последовательный порт и полностью выйти из подобных приложений.

Если эта ошибка возникает в среде Processing, либо на Ардуино версии 0004 или раньше, то нужно запустить скрипт macosx_setup.command и перезагрузить компьютер. В Arduino 0004 этот скрипт изменен, и его должны запустить все пользователи (даже те, кто запускал такой же скрипт, идущий вместе с Ардуино версии 0003). Также необходимо удалить содержимое папки /var/spool/uucp.

Возникают проблемы с драйверами USB FTDI

Попробуйте установить последние версии драйверов от FTDI или свяжитесь с их службой поддержки: support1@ftdichip.com.

Не запускается скетч при подаче питания или сбросе Ардуино

Скорей всего это происходит потому, что вы отправляете данные от компьютера к плате сразу после ее включения. Первые несколько секунд после сброса загрузчик (программа, прошитая в микроконтроллере платы) ожидает от компьютера посылки нового скетча для записи в память платы. Если за эти несколько секунд данные так и не поступили, загрузчик завершит свою работу по таймауту и запустит уже загруженную ранее программу. Если же вы непрерывно отправляете данные, то загрузчик не завершит свою работу по таймауту и никогда не запустит загруженный скетч. Поэтому вам нужно либо найти способ "придержать" отправку данных на несколько секунд после включения устройства (например, запрограммировав контроллер отправить какие-нибудь данные компьютеру в блоке setup()), либо прошить свою программу в микроконтроллер поверх загрузчика с помощью внешнего программатора

Прошивка вроде бы прошла успешно, но ничего не работает

Вы неправильно выбрали устройство из меню Tools > Microcontroller. Убедитесь в том, что выбранный вами микроконтроллер соответствует тому, который установлен на вашей плате (ATmega8 или ATmega168) - модель контроллера указана на самой большой микросхеме.

Убедитесь в стабильности питания. Помехи или перебои с питанием могут приводить к ошибкам при загрузке скетча.

Еще одна возможная причина - слишком большой размер скетча для вашего устройства. При загрузке скетча, Arduino 0004 проверяет, хватит ли места в памяти ATmega8 для загружаемой программы. При этом свои расчеты Ардуино ведет исходя из того, что загрузчик в памяти контроллера занимает 1 КБ. Возможно в вашем устройстве прошита старая версия загрузчика объемом 2 КБ вместо 1 КБ, тогда из 8 КБ флеш-памяти микроконтроллера ATmega8 2 КБ уже будут заняты. Соответственно, в этом случае в контроллер загрузится только часть скетча, однако программа этого априори не знает, что и приведет к постоянным сбросам устройства.  

Если у вас есть программатор (для параллельного порта или AVR-ISP), то можно обновить версию загрузчика в микроконтроллере с помощью меню Tools | Burn Bootloader. В противном случае, можно просто подкорректировать настройки среды Ардуино, указав доступный объем памяти программ в переменной upload.maximum_size variable, находящейся внутри конфиг-файла (см. инструкции, где найти этот файл). Указанное там значение 7168 измените на 6144, после чего среда разработки будет корректно предупреждать вас при превышении допустимого объема скетча.

Как можно уменьшить размер прошивки?

Микроконтроллер ATmega168 в Arduino - довольно не дорогая модель, которая имеет всего 16 КБ памяти программ, что на самом деле не очень много (из них 2 КБ уже заняты загрузчиком).

Если в своей программе вы используете вычисления с плавающей точкой, попробуйте переписать код так, чтобы заменить их на целочисленные вычисления - это позволит сэкономить приблизительно 2 КБ памяти. Вначале программы удалите директивы #include всех неиспользуемых библиотек.

Также проверьте, нельзя ли оптимизировать код программы, чтобы сделать его покороче.

Мы постоянно работаем над оптимизацией ядра Ардуино, чтобы сократить место, занимаемое его функциями в общем объеме скомпилированного скетча, и оставить как можно больше места для написания программ.

Не формируется ШИМ-сигнал (аналоговый выход) при вызове функции analogWrite() для любых выводов, кроме 3, 5, 6, 9, 10 и 11

В микроконтроллере Ардуино (ATmega168) аппаратная поддержка ШИМ / analogWrite() реализована только на определенных выводах. Поэтому вызов функции analogWrite() на любых других выводах контроллера приведет к формированию либо высокого уровня сигнала (5 В - при значениях больше 128), либо низкого уровня (0 В - при значениях меньше 128). В более старых версиях Ардуино с микроконтроллером ATmega8 поддержка ШИМ реализована только на выводах 9, 10 и 11.

Почему возникают ошибки о необъявленных функциях или типах?

Среда разработки Ардуино пытается автоматически генерировать прототипы пользовательских функций, благодаря чему в своей программе их можно располагать в произвольном порядке. Тем не менее, процесс генерирования прототипов не совершенен и иногда приводит к возникновению непонятных ошибок. 

Например, если в программе вы объявите свой тип данных, а после этого создадите функцию, использующую этот тип - то при попытке скомпилировать скетч возникнет ошибка. В данном случае ошибка возникает потому, что автоматически генерируемый прототип для этой функции будет расположен ДО объявления типа.

Если вы объявите функцию, возвращающую 16-битный результат (например, типа "unsigned int"), среда не поймет, что это функция и, соответственно, не создаст ее прототип. В этом случае вам придется написать его вручную, или разместить объявление этой функции в коде программы повыше - до того, как она в первый раз вызывается в программе.

При попытке прошить программу возникает ошибка "invalid device signature"

Следующая ошибка:

avrdude: Yikes!  Invalid device signature.
       Double check connections and try again, or use -F to override
       this check.

может означать одно из двух: либо у вас неправильно выбрана плата в меню Tools > Board, либо вы используете неправильную версию программы avrdude. Для загрузки скетчей в Ардуино используется немного измененная версия avrdude. Стандартная версия посылает запросы, идентифицирующие устройство, в формате, непонятном загрузчику Ардуино, что и приводит к возникновению ошибки. Поэтому убедитесь, что вы используете именно ту версию avrdude, которая идет вместе с Ардуино (исходный код).