Arduino:Знакомство с Arduino/Исправление проблем с Arduino

Материал из Онлайн справочника
Перейти к навигации Перейти к поиску

{{#setlogo:ArduinoCommunityLogo.png}}

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Содержание

Исправление проблем с Arduino[1]

Почему у меня не получается загрузить на Arduino свои программы?

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

IDE Arduino

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

Драйверы

Драйверы – это средства, с помощью которых ПО, установленное на вашем компьютере (т.е. IDE Arduino), «общается» с оборудованием, подключенным к вашему компьютеру (т.е. с платой Arduino). В случае Arduino драйверы отвечают за создание виртуального последовательного порта (или виртуального COM-порта). У плат Arduino Uno и Mega 2560 (у которых последовательная передача данных трансформируется в USB-сигнал при помощи контроллера ATmega8U2) для этого используются стандартные драйверы (USB CDC), идущие в комплекте с ОС. У других плат Arduino (где преобразование последовательного сигнала в USB-сигнал осуществляется при помощи FDTI-чипа) для этого используются FDTI-драйверы.

Самый простой способ проверить, правильные ли драйверы установлены для вашей платы – это открыть в IDE Arduino меню Инструменты > Порт (Tools > Serial Port). Причем это надо сделать два раза: первый – когда Arduino будет подключена к компьютеру, и второй – когда не будет. Затем нужно сравнить результаты. Когда Arduino не будет подключена к компьютеру, в меню «Порт» должны появиться дополнительные пункты, имеющие отношение к отключенной Arduino. Какое название будет присвоено последовательному порту Arduino – не важно.

  • Если вы используете Uno или Mega 2560, то на Windows (особенно на 64-битной версии) вам, возможно, придется зайти в «Менеджер устройств» и обновить драйверы. Просто кликните по девайсу правой кнопкой мыши (плата должна быть подключена к компьютеру), а затем снова укажите Windows соответствующий файл с расширением *.inf. Он должен находиться в директории IDE Arduino в папке drivers (но не в подпапке FTDI USB Drivers).
  • Если, устанавливая на Windows XP драйверы к Uno или Mega 2560, вы получаете ошибку The system cannot find the file specified («Система не может найти указанный файл»), попробуйте это решение (т.е. добавьте ключ RunOnce в "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion").
  • На Linux платы Uno и Mega 2560 отображаются как /dev/ttyACM0. Однако стандартной версией библиотеки RXTX, которую Arduino использует для последовательной передачи данных, это не поддерживается. Впрочем, Linux-версия IDE Arduino содержит пропатченную версию RXTX-библиотеки, которая умеет искать эти /dev/ttyACM* девайсы. Кроме того, есть еще пакет для Ubuntu (для 11.04), в котором тоже есть поддержка этих девайсов. Если же, однако, вы используете RXTX-пакет из своего дистрибутива, то для того, чтобы в IDE Arduino появился нужный последовательный порт, вам, возможно, придется сделать симлинк от /dev/ttyACM0 к /dev/ttyUSB0 (к примеру).

Запустите:

sudo usermod -a -G tty yourUserName
sudo usermod -a -G dialout yourUserName

Чтобы изменения вступили в силу, разлогиньтесь и снова залогиньтесь.

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

  • Если, когда вы работаете на Windows, IDE Arduino не запускается или тормозит, или если у нее медленно открывается меню «Инструменты», то вам, возможно, надо будет отключить в «Менеджере устройств» последовательные Bluetooth-порты или другие сетевые порты. Дело в том, что IDE Arduino при запуске и открытии меню «Инструменты» сканирует все последовательные (COM) порты на вашем компьютере, и это иногда влечет за собой большие задержки и даже вылеты программы.
  • Убедитесь, что у вас не запущены другие программы для сканирования последовательных портов – вроде ПО для мобильных USB-модемов, синхронизирующих приложений для КПК, драйверов Bluetooth-USB, виртуальных эмуляторов и т.д.
  • Убедитесь, что ваш фаервол не блокирует доступ к последовательному порту. Среди таких фаерволов числится, например, ZoneAlarm.
  • Вам нужно будет выйти из Processing, vvvv и т.д., если вы используете их для чтения данных при USB- или последовательной передаче данных на плату Arduino.
  • На Linux можно попробовать запустить IDE Arduino через root – хотя бы временно, чтобы посмотреть, доступны ли для загрузки какие-нибудь обновления с фиксами.

Физическое соединение

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

Автоматический сброс

  • Если ваша плата не поддерживает автоматический сброс, то его необходимо делать вручную за пару секунд до загрузки кода (автоматический сброс поддерживают модели Diecimila, Duemilanove и Nano, а также LilyPad, Pro и Pro Mini с 6-контактной гребенкой).
  • Впрочем, имейте в виду, что на некоторые Diecimila был случайно записан неправильный загрузчик, и вам перед загрузкой придется нажимать на кнопку сброса вручную (см. вопрос о долгой загрузке Diecimila ниже).
  • Кроме того, на некоторых компьютерах кнопку сброса, возможно нужно будет нажать после того, как вы нажмете кнопку загрузки в IDE Arduino. Попробуйте разные интервалы – до 10 секунд и более.
  • Если вы получили ошибку [VP 1] Device is not responding correctly, попробуйте загрузиться снова, т.е. сбросьте плату и еще раз нажмите в IDE Arduino кнопку загрузки.

Загрузчик

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

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

  • Какая у вас операционная система?
  • Какая у вас модель Arduino? Если это Mini, LilyPad или другая плата, требующая дополнительной проводки, если возможно, приложите фото всей этой системы.
  • Проблемы с загрузкой были всегда? Или появились спустя какое-то время после нормальной работы? Если да, то что вы делали с платой перед тем, когда она перестала работать? Какое ПО вы недавно устанавливали или удаляли с компьютера?
  • Какие сообщения отображаются, когда вы пытаетесь загрузить код с включенным «подробным выводом»? Чтобы увидеть их, кликая на кнопку загрузки, зажмите клавишу  ⇧ Shift .

Почему у меня выскакивает ошибка «Build folder disappeared or could not be written» (на Mac OS X)?

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

Почему IDE Arduino не запускается после обновления Java на Mac?

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

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. Теперь IDE Arduino должна запуститься нормально.

Почему при попытке скомпилировать программу мне выдает ошибку 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 может успешно функционировать от питания, идущего через USB-порт компьютера, к которому она подключена, однако тут есть два фактора. Во-первых, это зависит от количества и типа опциональных Shield-модулей, подключенных к Arduino, а во-вторых, от того, сколько тока может дать USB-порт компьютера (этот показатель варьируется в зависимости от производителя и модели компьютера).

Если вы обнаружите, что вашей Arduino нужно дополнительное питание, или вам понадобится, чтобы она функционировала без подключения к USB-порту компьютера, или при использовании Arduino с портом, который не дает питания, то вам понадобится блок питания, обеспечивающий напряжение от 7 до 12 В (Вольт) и достаточную силу тока. Для этих целей подойдут, например, адаптеры, умеющие конвертировать переменный ток в постоянный – они используются, как правило, для потребительской электроники, и их можно часто встретить в розничных магазинах. Однако нужно убедиться, что покупаемый адаптер имеет правильный коннектор, подходящий к разъему питания на Arduino: коннектор должен быть круглым, его внешний диаметр – 5,5 мм, а диаметр внутреннего отверстия-контакта – 2,1 мм. При этом отрицательное напряжение (или «земля») будет на внешнем контакте коннектора, а положительное – в контакте на внутреннем отверстии.

Для большинства случаев достаточно, как правило, силы тока в 1 ампер, однако некоторым Shield-модулям (или «небоскребу» из Shield-модулей) может потребоваться больше. То есть вам надо будет сложить силу тока, требуемую для питания всех подключенных к плате Shield-модулей, и купить адаптер, который сможет это совокупное питание обеспечивать (если адаптер будет давать больше, то никаких вредных побочных эффектов не будет). Также нужно помнить, что встроенный 5-вольтовый регулятор не сможет обеспечивать бесконечное количество тока (если не хотите перегреть плату, то лучше не превышать отметку в 800 миллиампер). Следовательно, если вашему проекту нужно больше, то необходимые 5 вольт (или вставьте сюда другое количество вольт, необходимых для вашего проекта) можно давать избирательно, питая различные устройства при помощи соответствующего количества адаптеров/регуляторов, а затем подключив из «земли» к одному контакту и тем самым заставив эти устройства работать вместе.

Почему мой скетч не запускается, когда плата питается от внешнего источника? (касается Arduino Diecimilia или еще более ранних моделей)

Из-за того, что RX-контакт не подключен, загрузчик на плате, возможно, будет видеть, что на плату идут мусорные данные. Следовательно, загрузчик будет работать вечно, а не те 6-8 секунд, что ему положены, а ваш скетч никогда не запустится. Попробуйте привязать RX-контакт к «земле» через 10000-омовый резистор или подключить RX-контакт напрямую к TX-контакту.

Почему IDE Arduino зависает, когда я пытаюсь загрузить программу (на Windows)?

Возможно, из-за конфликта с процессом Logitech – «LVPrcSrv.exe». Откройте диспетчер задач, и если этот процесс запущен, удалите его перед тем, как будете загружать скетч на Arduino.

Плата не включается (не загорается зеленый светодиод, отвечающий за питание) – что делать?

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

Usbjumper.jpg

Почему Arduino Diecimila так долго (6-8 секунд) запускает мой скетч?

На некоторые Arduino Diecimila был случайно записан загрузчик Arduino NG. Впрочем, он должен работать нормально, однако при сбросе платы скетч загружается дольше обычного (у NG нет автоматического сброса, поэтому синхронизацию процесса загрузки нужно делать вручную). Чтобы узнать, какой загрузчик стоит на Arduino, выполните сброс платы – если светодиод на 13-ом контакте моргнул 3 раза, это NG-загрузчик, а если 1 раз – это Diecimila-загрузчик. Таким образом, если у вас Diecimila с загрузчиком от NG, вам перед загрузкой скетча, возможно, понадобится сделать ручной сброс платы. Впрочем, есть и другой вариант – записать на Diecimila правильный загрузчик (читайте об этом тут).

Что делать, если при запуске arduino.exe на Windows выдает ошибку?

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

Arduino has encountered a problem and needs to close.

...вам нужно запустить Arduino при помощи файла run.bat. И проявите терпение – IDE Arduino может понадобиться некоторое время для запуска.

Почему Arduino не запускается на старых версиях 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 за подсказку.

Что делать, если при запуске Arduino выдает ошибку UnsatisfiedLinkError (о родной библиотеке librxtxSerial.jnilib)?

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

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/ или в папках, которые указаны в переменных PATH и CLASSPATH, находящихся в файлах IDE Arduino.

За подсказку спасибо Анурагу Сегалу (Anurag Sehgal).

Что насчет ошибки «Could not find the main class»?

Если при запуске Arduino выдает вот такую ошибку...

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

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

Что можно сделать, если у Arduino возникают конфликты с 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.

This problem is probably due to using incompatible versions of the cygwin DLL.

Search for cygwin1.dll using the Windows Start->Find/Search facility and delete all but the most recent version. The most recent version *should* reside in x:\cygwin\bin, where 'x' is the drive on which you have installed the cygwin distribution. Rebooting is also suggested if you are unable to find another cygwin DLL.

Если выдало, то перед использованием Arduino убедитесь, что у вас не запущен Cygwin. Если это не помогает, можно попробовать удалить cygwin.dll из папки Arduino и заменить его на сygwin.dll, находящийся в папке Cygwin (возможно, по маршруту c:\cygwin\bin).

За подсказку спасибо karlcswanson.

Почему так долго открываются IDE Arduino и меню «Инструменты» (на Windows)?

Если IDE Arduino долго запускается или зависает при попытке открыть меню «Инструменты», то здесь может быть конфликт с другим устройством в вашей системе. Среда разработки Arduino, будучи запущенной или когда вы пытаетесь открыть меню «Инструменты», пытается составить список всех COM-портов на вашем компьютере. Возможно, этот процесс замедляется каким-то COM-портом, созданным одним из девайсов на вашем компьютере.

Загляните в «Менеджер устройств». Попробуйте отключить устройства с COM-портами (например, Bluetooth-устройства).

Почему моя плата не отображается в меню Инструменты > Порт (Tools > Serial Port)?

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

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

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

На Windows причина может быть в том, что в названии COM-порта присутствует слишком большая цифра. Как пишет пользователь zeveland:

«Небольшая подсказка для тех, у кого не получается загрузить скетч на USB-плату с большим номером COM-порта. Попробуйте снизить номер COM-порта, назначенного для FTDI-чипа. У меня много виртуальных COM-портов, настроенных на Bluetooth-устройства, поэтому плате был присвоен порт COM17. В итоге IDE Arduino не сумела найти плату, поэтому я удалил все виртуальные порты в «Панели управления» (на XP) и снизил номер для FTDI-чипа до COM2. Далее осталось лишь перенастроить Arduino на новый порт».

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

Что делать, если при загрузке кода или использовании «Монитора порта» (на Mac) выдает ошибку gnu.io.PortInUseException?

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- и UART-портам – вроде синхронизирующих приложений для КПК, приложений для управления Bluetooth-устройствами, некоторых фаерволов и т.д. Также имейте в виду, что некоторые программы (например, Max/MSP) держат UART-порт открытым, даже не используя его, поэтому вам, возможно, надо будет закрыть все патчи, использующие UART-порты, а то и вовсе закрыть программу.

Если эта ошибка появляется на Arduino 0004 (или ранее) или на Processing, вам надо будет запустить macos_setup.command, а затем перезапустить компьютер. Arduino 004 содержит модифицированную версию этого скрипта, и его должны запустить все пользователи (даже те, кто запускал этот скрипт, когда он выходил с Arduino 0003). Кроме того, возможно, потребуется удалить содержимое папки /var/spool/uucp.

У меня проблемы с драйверами USB FTDI

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

Почему мой скетч не запускается, когда я включаю питание или делаю сброс на Arduino?

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

Почему мой скетч загрузился нормально, но не работает?

Вы выбрали неправильный пункт в меню Инструменты > Плата (Tools > Board). Убедитесь, что выбранная плата соответствует той, что вы пользуетесь в данный момент.

Проверьте, нет ли помех от блока питания – из-за них микроконтроллер может потерять загруженный на него скетч.

Кроме того, скетч может быть слишком велик для платы. Когда вы загружаете скетч, Arduino 0004 проверяет, не слишком ли он велик для ATmega8, однако его расчеты основываются на том, что загрузчик занимает в программной flash-памяти микроконтроллера (она составляет 8 Кб) всего 1 Кб. Однако на ваше устройство, возможно, записана старая версия загрузчика, объем которой составляет не 1 кб, а 2 Кб. Таким образом, если размер вашего скетча слишком велик, загрузится лишь его часть, но загрузчик об этом знать не будет, поэтому плата войдет в «мертвую петлю» – будет постоянно сбрасываться, тормозить, сбрасываться и т.д.

Если вы используете программатор (либо AVR-ISP, либо для параллельного порта), можно попробовать записать на плату самую последнюю версию загрузчика – при помощи меню Инструменты > Записать Загрузчик (Tools > Burn Bootloader). Кроме того, вы можете объяснить IDE Arduino, что в памяти стало меньше места для загрузки скетчей, отредактировав переменную upload.maximum_size в файле с настройками (как его найти – читайте тут). Поменяйте 7168 на 6144, и теперь IDE Arduino всегда предупредит вас, если скетч будет слишком велик.

Как мне уменьшить размер скетча?

Одно из главных преимуществ микроконтроллера ATmega168, которым оснащена плата Arduino, в том, что он очень дешев. Однако он может работать лишь с 16 Кб программного кода, что не очень много (причем 2 Кб из «общей кассы» отходят загрузчику).

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

Еще один вариант – попробуйте сделать вашу программу «полаконичней». Поищите способ решить ту же задачу, но более коротким путем.

Кроме того, разработчики заявляют, что постоянно работают над уменьшением размера ядра Arduino, тем самым позволяя делать более «вместительные» скетчи.

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

Микроконтроллер на плате Arduino (ATmega168) поддерживает ШИМ/AnalogWrite() не на всех контактах. Вызов функции analogWrite() на любых контактах, кроме перечисленных выше, даст HIGH (5 вольт) для значений выше 128 и LOW (0 вольт) для значений меньше 128. На старых версиях Arduino, оснащенных ATmega8, ШИМ поддерживается только на 9, 10 и 11 контактах.

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

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

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

Причина в том, что автоматически сгенерированный прототип для этой функции будет расположен в скетче до объявления нового типа данных.

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

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

Если вы получили ошибку...

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

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

См.также

Внешние ссылки