Offline
Зарегистрирован: 10.06.2020
Добрый день, друзья.
Появилась очень неприятная проблема. Я купил плату Arduino Pro Mini, купил программатор CP2102. Скачал драйвер под него поставил на ПК. Попытался залить базовый скетч на блинк, он благополучно загрузился, светодиод начал мигать с нужной частотой.
Далее следующий шаг был проверить сервомашинки SG90. Залил базовый скетч для проверки отсюда https://www.arduino.cc/en/Tutorial/Sweep.
Скетч к сожалению не залился, написал странную ошибку.
exit status 1
Ошибка компиляции для платы Arduino Pro or Pro Mini.
После этого я пытаюсь залить хотя бы блинк, но он теперь на любые команды выдает такую ошибку. Даже на простую программу вывода в порт «Hello world» выдает такую ошибку.
Лог ошибки ниже:
Arduino: 1.8.12 (Windows 10), Плата:"Arduino Pro or Pro Mini, ATmega328P (5V, 16 MHz)" C:Users226Documentsarduino-latest-windowsarduino-1.8.12arduino-builder -dump-prefs -logger=machine -hardware C:Users226Documentsarduino-latest-windowsarduino-1.8.12hardware -tools C:Users226Documentsarduino-latest-windowsarduino-1.8.12tools-builder -tools C:Users226Documentsarduino-latest-windowsarduino-1.8.12hardwaretoolsavr -built-in-libraries C:Users226Documentsarduino-latest-windowsarduino-1.8.12libraries -libraries C:Users226DocumentsArduinolibraries -fqbn=arduino:avr:pro:cpu=16MHzatmega328 -vid-pid=10C4_EA60 -ide-version=10812 -build-path C:Users226AppDataLocalTemparduino_build_552640 -warnings=none -build-cache C:Users226AppDataLocalTemparduino_cache_238580 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=C:Users226Documentsarduino-latest-windowsarduino-1.8.12hardwaretoolsavr -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:Users226Documentsarduino-latest-windowsarduino-1.8.12hardwaretoolsavr -prefs=runtime.tools.avrdude.path=C:Users226Documentsarduino-latest-windowsarduino-1.8.12hardwaretoolsavr -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:Users226Documentsarduino-latest-windowsarduino-1.8.12hardwaretoolsavr -prefs=runtime.tools.avr-gcc.path=C:Users226Documentsarduino-latest-windowsarduino-1.8.12hardwaretoolsavr -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino5.path=C:Users226Documentsarduino-latest-windowsarduino-1.8.12hardwaretoolsavr -verbose C:Users226Documentsarduino-latest-windowsarduino-1.8.12examples1.BasicsBlinkBlink.ino C:Users226Documentsarduino-latest-windowsarduino-1.8.12arduino-builder -compile -logger=machine -hardware C:Users226Documentsarduino-latest-windowsarduino-1.8.12hardware -tools C:Users226Documentsarduino-latest-windowsarduino-1.8.12tools-builder -tools C:Users226Documentsarduino-latest-windowsarduino-1.8.12hardwaretoolsavr -built-in-libraries C:Users226Documentsarduino-latest-windowsarduino-1.8.12libraries -libraries C:Users226DocumentsArduinolibraries -fqbn=arduino:avr:pro:cpu=16MHzatmega328 -vid-pid=10C4_EA60 -ide-version=10812 -build-path C:Users226AppDataLocalTemparduino_build_552640 -warnings=none -build-cache C:Users226AppDataLocalTemparduino_cache_238580 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=C:Users226Documentsarduino-latest-windowsarduino-1.8.12hardwaretoolsavr -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:Users226Documentsarduino-latest-windowsarduino-1.8.12hardwaretoolsavr -prefs=runtime.tools.avrdude.path=C:Users226Documentsarduino-latest-windowsarduino-1.8.12hardwaretoolsavr -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:Users226Documentsarduino-latest-windowsarduino-1.8.12hardwaretoolsavr -prefs=runtime.tools.avr-gcc.path=C:Users226Documentsarduino-latest-windowsarduino-1.8.12hardwaretoolsavr -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino5.path=C:Users226Documentsarduino-latest-windowsarduino-1.8.12hardwaretoolsavr -verbose C:Users226Documentsarduino-latest-windowsarduino-1.8.12examples1.BasicsBlinkBlink.ino Using board 'pro' from platform in folder: C:Users226Documentsarduino-latest-windowsarduino-1.8.12hardwarearduinoavr Using core 'arduino' from platform in folder: C:Users226Documentsarduino-latest-windowsarduino-1.8.12hardwarearduinoavr Detecting libraries used... "C:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10812 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\cores\arduino" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\variants\eightanaloginputs" "C:\Users\226\AppData\Local\Temp\arduino_build_552640\sketch\Blink.ino.cpp" -o nul Alternatives for Servo.h: [[email protected]] ResolveLibrary(Servo.h) -> candidates: [[email protected]] "C:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10812 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\cores\arduino" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\variants\eightanaloginputs" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\libraries\Servo\src" "C:\Users\226\AppData\Local\Temp\arduino_build_552640\sketch\Blink.ino.cpp" -o nul "C:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10812 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\cores\arduino" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\variants\eightanaloginputs" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\libraries\Servo\src" "C:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\libraries\Servo\src\avr\Servo.cpp" -o nul "C:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10812 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\cores\arduino" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\variants\eightanaloginputs" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\libraries\Servo\src" "C:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\libraries\Servo\src\mbed\Servo.cpp" -o nul "C:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10812 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\cores\arduino" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\variants\eightanaloginputs" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\libraries\Servo\src" "C:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\libraries\Servo\src\megaavr\Servo.cpp" -o nul "C:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10812 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\cores\arduino" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\variants\eightanaloginputs" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\libraries\Servo\src" "C:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\libraries\Servo\src\nrf52\Servo.cpp" -o nul "C:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10812 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\cores\arduino" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\variants\eightanaloginputs" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\libraries\Servo\src" "C:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\libraries\Servo\src\sam\Servo.cpp" -o nul "C:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10812 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\cores\arduino" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\variants\eightanaloginputs" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\libraries\Servo\src" "C:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\libraries\Servo\src\samd\Servo.cpp" -o nul "C:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10812 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\cores\arduino" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\variants\eightanaloginputs" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\libraries\Servo\src" "C:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\libraries\Servo\src\stm32f4\Servo.cpp" -o nul Generating function prototypes... "C:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10812 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\cores\arduino" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\variants\eightanaloginputs" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\libraries\Servo\src" "C:\Users\226\AppData\Local\Temp\arduino_build_552640\sketch\Blink.ino.cpp" -o "C:\Users\226\AppData\Local\Temp\arduino_build_552640\preproc\ctags_target_for_gcc_minus_e.cpp" "C:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\tools-builder\ctags\5.8-arduino11/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "C:\Users\226\AppData\Local\Temp\arduino_build_552640\preproc\ctags_target_for_gcc_minus_e.cpp" Компиляция скетча... "C:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10812 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\cores\arduino" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\hardware\arduino\avr\variants\eightanaloginputs" "-IC:\Users\226\Documents\arduino-latest-windows\arduino-1.8.12\libraries\Servo\src" "C:\Users\226\AppData\Local\Temp\arduino_build_552640\sketch\Blink.ino.cpp" -o "C:\Users\226\AppData\Local\Temp\arduino_build_552640\sketch\Blink.ino.cpp.o" C:Users226Documentsarduino-latest-windowsarduino-1.8.12examples1.BasicsBlinkTest servo.ino: In function 'void setup()': C:Users226Documentsarduino-latest-windowsarduino-1.8.12examples1.BasicsBlinkTest servo.ino:17:6: error: redefinition of 'void setup()' void setup() { ^~~~~ C:Users226Documentsarduino-latest-windowsarduino-1.8.12examples1.BasicsBlinkBlink.ino:26:6: note: 'void setup()' previously defined here void setup() { ^~~~~ C:Users226Documentsarduino-latest-windowsarduino-1.8.12examples1.BasicsBlinkTest servo.ino: In function 'void loop()': C:Users226Documentsarduino-latest-windowsarduino-1.8.12examples1.BasicsBlinkTest servo.ino:21:6: error: redefinition of 'void loop()' void loop() { ^~~~ C:Users226Documentsarduino-latest-windowsarduino-1.8.12examples1.BasicsBlinkBlink.ino:32:6: note: 'void loop()' previously defined here void loop() { ^~~~ Используем библиотеку Servo версии 1.1.6 из папки: C:Users226Documentsarduino-latest-windowsarduino-1.8.12librariesServo exit status 1 Ошибка компиляции для платы Arduino Pro or Pro Mini.
Работаю через портативну версию IDE Arduino, скриншот настроек приложу.
Буду очень рад помощи, я понятия не имею в чем проблема.
Первая прошивка
Итак, разобрались со средой разработки, теперь можно загрузить прошивку. Рекомендую загрузить пустую прошивку, чтобы убедиться, что все драйвера установились и плата вообще прошивается. Также лучше делать это с новой или заведомо рабочей платой.
1. Плата подключается к компьютеру по USB, на ней должны замигать светодиоды. Если этого не произошло:
- Неисправен USB кабель.
- Неисправен USB порт компьютера.
- Неисправен USB порт Arduino.
- Попробуйте другой компьютер, чтобы исключить часть проблем из списка.
- Попробуйте другую плату, чтобы исключить часть проблем из списка.
- На плате Arduino сгорел диод по питанию USB.
- Плата Arduino сгорела полностью из-за неправильного подключения питания или короткого замыкания
2. Компьютер издаст характерный сигнал подключения нового оборудования, а при первом подключении появится окошко “Установка нового оборудования”. Если этого не произошло:
- См. предыдущий список неисправностей.
- Кабель должен быть data-кабелем, а не “зарядным”.
- Кабель желательно втыкать напрямую в компьютер, а не через USB-хаб.
- Не установлены драйверы для Arduino.
3. В списке портов (Arduino IDE/Инструменты/Порт) появится новый порт, отличный от COM1. Если этого не произошло:
- См. предыдущий список неисправностей.
- Некорректно установлен драйвер CH341.
- Если список портов вообще неактивен – драйвер Arduino установлен некорректно, вернитесь к установке
- Возникла системная ошибка, обратитесь к знакомому компьютерщику
4. Выбираем свою плату. Если это Arduino Nano, выбираем в ИнструментыПлатаArduino Nano. Если другая – выбираем другую. Нажимаем стрелочку в левом верхнем углу (загрузить прошивку). Да, загружаем пустую прошивку.
- [Для Arduino Nano] В микроконтроллер китайских нанок зашит “старый” загрузчик, поэтому выбираем ИнструментыПроцессорATmega328p (Old Bootloader). Некоторые китайцы зашивают в свои платы новый загрузчик, поэтому если прошивка не загрузилась (загрузка идёт минуту и вылетает ошибка avrdude: stk500_getsync()) – попробуйте сменить пункт Процессор на ATmega328p.
Если появилась надпись “Загрузка завершена” – значит всё в порядке и можно прошивать другие скетчи. В любом случае на вашем пути встретятся другие два варианта событий, происходящих после нажатия на кнопку “Загрузка” – это ошибка компиляции и ошибка загрузки. Вот их давайте рассмотрим более подробно.
Ошибки компиляции
Возникает на этапе компиляции прошивки. Ошибки компиляции вызваны проблемами в коде прошивки.
- В некоторых случаях ошибка возникает при наличии кириллицы (русских букв) в пути к папке со скетчем. Решение: завести для скетчей отдельную папочку в корне диска с английским названием.
- В чёрном окошке в самом низу Arduino IDE можно прочитать полный текст ошибки и понять, куда копать.
- В скачанных с интернета готовых скетчах часто возникает ошибка с описанием название_файла.h no such file or directory. Это означает, что в скетче используется библиотека <название файла>, и нужно положить её в Program Files/Arduino/libraries/. Ко всем моим проектам всегда идёт папочка с использованными библиотеками, которые нужно установить. Также библиотеки всегда можно поискать в гугле по название файла.
- При использовании каких-то особых библиотек, методов или функций, ошибкой может стать неправильно выбранная плата в “Инструменты/плата“. Пример: прошивки с библиотекой Mouse.h или Keyboard.h компилируются только для Leonardo и Micro.
- Если прошивку пишете вы, то любые синтаксические ошибки в коде будут подсвечены, а снизу в чёрном окошке можно прочитать более детальное описание, в чём собственно косяк. Обычно указывается строка, в которой сделана ошибка, также эта строка подсвечивается красным.
- Иногда причиной ошибки бывает слишком старая, или слишком новая версия Arduino IDE. Читайте комментарии разработчика скетча
- Ошибка недостаточно свободного места возникает по вполне понятным причинам. Возможно поможет урок по оптимизации кода.
Частые ошибки в коде, приводящие к ошибке компиляции
- expected ‘,’ or ‘;’ – пропущена запятая или точка запятой на предыдущей строке
- stray ‘320’ in program – русские символы в коде
- expected unqualified-id before numeric constant – имя переменной не может начинаться с цифры
- … was not declared in this scope – переменная или функция используется, но не объявлена. Компилятор не может её найти
- redefinition of … – повторное объявление функции или переменной
- storage size of … isn’t known – массив задан без указания размера
Ошибки загрузки
Возникают на этапе, когда программа успешно скомпилирована и производится загрузка в плату по кабелю. Ошибка может возникать как по причине неисправностей железа, так и из-за настроек программы и драйверов.
- USB кабель, которым подключается Arduino, должен быть Data-кабелем, а не кабелем только для зарядки. Нужным нам кабелем подключаются к компьютеру плееры и смартфоны.
- Причиной ошибки загрузки являются не установленные/криво установленные драйвера CH340, если у вас китайская NANO.
- Также будет ошибка avrdude: ser_open(): can’t open device, если не выбран COM порт, к которому подключена Arduino. Если кроме COM1 других портов нет – читай два пункта выше, либо попробуй другой USB порт, или вообще другой компьютер.
- Большинство проблем при загрузке, вызванных “зависанием” ардуины или загрузчика, лечатся полным отключением ардуины от питания. Потом вставляем USB и по новой прошиваем.
- Причиной ошибки загрузки может быть неправильно выбранная плата в “Инструменты/Плата”, а также неправильно выбранный процессор в “Инструменты/Процессор”. Также в свежих версиях IDE нужно выбирать ATmega328P (Old Bootloader) для китайских плат NANO.
- Если у вас открыт монитор COM порта в другом окне Arduino IDE или плата общается через СОМ порт с другой программой (Ambibox, HWmonitor, SerialPortPlotter и т.д.), то вы получите ошибку загрузки, потому что порт занят. Отключитесь от порта или закройте другие окна и программы.
- Если у вас задействованы пины RX или TX – отключите от них всё! По этим пинам Arduino общается с компьютером, в том числе для загрузки прошивки.
- Если в описании ошибки встречается bootloader is not responding и not in sync, а все предыдущие пункты этого списка проверены – с вероятностью 95% сдох загрузчик. Второй неприятный исход – загрузчик “слетел”, и его можно прошить заново.
Предупреждения
Помимо ошибок, по причине которых проект вообще не загрузится в плату и не будет работать, есть ещё предупреждения, которые выводятся оранжевым текстом в чёрной области лога ошибок. Предупреждения могут появиться даже тогда, когда выше лога ошибок появилась надпись “Загрузка завершена“. Это означает, что в прошивке нет критических ошибок, она скомпилировалась и загрузилась в плату. Что же тогда означают предупреждения? Чаще всего можно увидеть такие:
- # Pragma message… – это просто сообщения, оставленные разработчиком проекта или библиотеки. Чаще всего номер версии и прочая информация.
- Недостаточно памяти, программа может работать нестабильно – Чуть выше этого предупреждения обычно идёт информация о задействованной памяти. Память устройства можно добивать до 99%, ничего страшного не случится. Это флэш память и во время работы она не изменяется. А вот динамическую память желательно забивать не более 85-90%, иначе реально могут быть непонятные глюки в работе, так как память постоянно “бурлит” во время работы. НО. Это зависит от скетча и в первую очередь от количества локальных переменных. Можно написать такой код, который будет стабильно работать при 99% занятой SRAM памяти. Так что ещё раз: это всего лишь предупреждение, а не ошибка.
FAQ
Завершая раздел Введение в Arduino поговорим о вопросах, которые очень часто возникают у новичков:
- Ардуину можно прошить только один раз? Нет, несколько десятков тысяч раз, всё упирается в ресурс Flash памяти. А он довольно большой.
- Как стереть/нужно ли стирать старую прошивку при загрузке новой? Память автоматически очищается при прошивке, старая прошивка автоматически удаляется.
- Можно ли записать две прошивки, чтобы они работали вместе? Нет, при прошивке удаляются абсолютно все старые данные. Из двух прошивок нужно сделать одну, причём так, чтобы не было конфликтов. Подробнее в этом уроке.
- Можно ли “вытащить” прошивку с уже прошитой Ардуины? Теоретически можно, но только в виде нечитаемого машинного кода, в который преобразуется прошивка на С++ при компиляции, т.е. вам это НИКАК не поможет, если вы не имеете диплом по низкоуровневому программированию. Подробнее в этом уроке.
- Зачем это нужно? Например есть у нас прошитый девайс, и мы хотим его “клонировать”. В этом случае да, есть вариант сделать дамп прошивки и загрузить его в другую плату на таком же микроконтроллере.
- Если есть желание почитать код – увы, прошивка считывается в виде бинарного машинного кода, превратить который обратно в читаемый Си-подобный код обычному человеку не под силу.
- Вытащить прошивку, выражаясь более научно – сделать дамп прошивки, можно при помощи ISP программатора, об этом можно почитать здесь.
- Снять дамп прошивки можно только в том случае, если разработчик не ограничил такую возможность, например записав лок-биты, запрещающие считывание Flash памяти, или вообще отключив SPI шину. Если же разработчик – вы, и есть желание максимально защитить своё устройство от копирования – гуглите про лок-биты и отключение SPI
Видео
Полезные страницы
- Набор GyverKIT – большой стартовый набор Arduino моей разработки, продаётся в России
- Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress у проверенных продавцов
- Подборка библиотек для Arduino, самых интересных и полезных, официальных и не очень
- Полная документация по языку Ардуино, все встроенные функции и макросы, все доступные типы данных
- Сборник полезных алгоритмов для написания скетчей: структура кода, таймеры, фильтры, парсинг данных
- Видео уроки по программированию Arduino с канала “Заметки Ардуинщика” – одни из самых подробных в рунете
- Поддержать автора за работу над уроками
- Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту ([email protected])
-
Приветствую! возникает ошибка компиляции при весьма странных обстоятельствах.
Если комментирую или удаляю вывод в сериал, код не компилится.Сталкивался ли кто с подобной мистикой?
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>#define OLED_MOSI 8
#define OLED_CLK 9
#define OLED_DC 11
#define OLED_CS 10
#define OLED_RESET 2
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
String price;
String Display_text = «loading»;
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // инициализация дисплея по интерфейсу I2C, адрес 0x3C
Serial.begin(115200);
}
/*————————————————*/
void loop() {
display.clearDisplay(); // очистка дисплея
display.setTextColor(WHITE); // установка цвета текста
display.setTextSize(1); // задаем шрифт
display.setCursor(0, 0); // установка курсора в позицию X = 0; Y = 0
display.print («BTC/USDT — BTC/USD — «); // записываем в буфер памяти дисплея нашу фразу
display.display(); // и её выводим на экранif(Serial.available()){
String phrase=«»;
String Var=«»;
while (!Serial.available()) delay(20);
delay(400);
while (Serial.available())
Var = Var + (char)(Serial.read());
price = Var.substring(Var.indexOf(«{«)+1,Var.indexOf(«}»));
int SZ = price.length();
Serial.print(«size: «);
Serial.println(SZ);
if(SZ == 4){
char Format_price[5] = {price[0], ‘,’ ,price[1], price[2], price[3]};
phrase = String(phrase + Format_price+«$»);
}
else if(SZ == 5){
char Format_price[7] = {price[0], price[1], ‘,’, price[2], price[3], price[4], ‘$’};
phrase = String(phrase + Format_price);
}
Display_text = phrase;
Serial.println(Display_text);
}
display.setTextSize(2);
display.print (Display_text);
display.display();display.startscrollleft(0x00, 0x0F);
delay(4250);
//display.stopscroll();}
/*————————————————*/Последнее редактирование модератором: 26 июл 2019
-
Показать как код вставлять?
-
exit status 1
@3a4em, включите подробный вывод при компиляции/загрузке, это можно сделать в настройках IDE
-
C:Program FilesWindowsAppsArduinoLLC.ArduinoIDE_1.8.21.0_x86__mdqgnx93n4wtthardwarearduinoavrcoresarduinoHardwareSerial.cpp: In member function ‘availableForWrite’:
C:Program FilesWindowsAppsArduinoLLC.ArduinoIDE_1.8.21.0_x86__mdqgnx93n4wtthardwarearduinoavrcoresarduinoHardwareSerial.cpp:203:1: internal compiler error: Segmentation fault
}
^
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.
lto-wrapper.exe: fatal error: C:Program FilesWindowsAppsArduinoLLC.ArduinoIDE_1.8.21.0_x86__mdqgnx93n4wtthardwaretoolsavr/bin/avr-gcc returned 1 exit status
compilation terminated.
c:/program files/windowsapps/arduinollc.arduinoide_1.8.21.0_x86__mdqgnx93n4wtt/hardware/tools/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/bin/ld.exe: error: lto-wrapper failed
collect2.exe: error: ld returned 1 exit status
Несколько библиотек найдено для «Wire.h»
Используется: C:Program FilesWindowsAppsArduinoLLC.ArduinoIDE_1.8.21.0_x86__mdqgnx93n4wtthardwarearduinoavrlibrariesWire
Не используется: C:UsersUserVBGTDocumentsArduinolibrariesWire
Используем библиотеку SPI версии 1.0 из папки: C:Program FilesWindowsAppsArduinoLLC.ArduinoIDE_1.8.21.0_x86__mdqgnx93n4wtthardwarearduinoavrlibrariesSPI
Используем библиотеку Wire версии 1.0 из папки: C:Program FilesWindowsAppsArduinoLLC.ArduinoIDE_1.8.21.0_x86__mdqgnx93n4wtthardwarearduinoavrlibrariesWire
Используем библиотеку Adafruit_GFX_Library версии 1.5.0 из папки: C:UsersUserVBGTDocumentsArduinolibrariesAdafruit_GFX_Library
Используем библиотеку Adafruit_SSD1306-master версии 1.2.9 из папки: C:UsersUserVBGTDocumentsArduinolibrariesAdafruit_SSD1306-master
exit status 1
Ошибка компиляции для платы Arduino Pro or Pro Mini. -
Не выполнена инициализация. Попробуйте добавить = «»
-
С этой переменной проблем нет.Спасибо, оставлю закладку на крайний случай. Что-то сломать, чтобы что-то починить — так себе перспектива на мой взгляд. По большому счету моя проблема не критична именно в этом случае, но смущает то, что так быть явно не должно и в другой раз будет тяжко найти проблемную строку, тк явной ошибки в коде нет(. В любом случае всем спасибо
-
Не сломать, а отключить сложную опцию в реализации которой допущен баг в компиляторе/линкере.
Одна из самых неприятных ошибок — это ошибка компиляции для платы Аrduino Nano, с которой вам придется столкнуться не раз.
Содержание
- Синтаксические ошибки
- Ошибки компиляции плат Arduino uno
- Ошибка exit status 1 при компиляции для плат uno, mega и nano
- Ошибки библиотек
- Ошибки компилятора Ардуино
- Основные ошибки
- Ошибка: «avrdude: stk500_recv(): programmer is not responding»
- Ошибка: «a function-definition is not allowed here before ‘{‘ token»
- Ошибка: «No such file or directory / exit status 1»
- Ошибка: «expected initializer before ‘}’ token / expected ‘;’ before ‘}’ token»
- Ошибка: «… was not declared in this scope»
Синтаксические ошибки
Ардуино – одна из наиболее комфортных сред для начинающих инженеров, в особенности программистов, ведь им не приходится проектировать свои системы управления и делать множество других действий.
Сразу же при покупке они получают готовый набор библиотек на С99 и возможность, по необходимости, подтянуть необходимые модули в опен-соурс источниках.
Но и здесь не избежать множества проблем, с которыми знаком каждый программист, и одна из самых неприятных – ошибка компиляции для платы Аrduino nano, с которой вам придется столкнуться не раз. Что же эта строчка означает, какие у неё причины появления, и главное – как быстро решить данную проблему?
Для начала стоит немного окунуться в теорию, чтобы вы понимали причину возникновения данной строчки с текстом и не грешили лишний раз, что Ардуино уно не видит компьютер.
Как несложно догадаться, компиляция – приведение кода на языке Си к виду машинного (двоичного) и преобразование множественных функций в простые операции, чтобы те смогли выполняться через встроенные операнды процессора. Выглядит всё достаточно просто, но сам процесс компиляции происходит значительно сложнее, и поэтому ошибка во время проведения оной может возникать по десяткам причин.
Все мы уже привыкли к тому, что код никогда не запускается с первого раза, и при попытке запустить его в интерпретаторе вылезает десяток ошибок, которые приходится оперативно править. Компилятор действует схожим образом, за исключением того, что причины ошибок указываются далеко не всегда. Именно поэтому рекомендуется протестировать код сначала в среде разработки, и лишь затем уже приступать к его компиляции в исполняемые файлы под Ардуино.
Мы узнали, к чему приводит данный процесс, давайте разберёмся, как он происходит:
- Первое, что делает компилятор – подгружает все инклуднутые файлы, а также меняет объявленные дефайны на значения, которое для них указано. Это необходимо затем, чтобы не нужно было по нескольку раз проходиться синтаксическим парсером в пределах одного кода. Также, в зависимости от среды, компилятор может подставлять функции на место их объявления или делать это уже после прохода синтаксическим парсером. В случае с С99, используется второй вариант реализации, но это и не столь важно.
- Далее он проверяет первичный синтаксис. Этот процесс проводится в изначальном компилируемом файле, и своеобразный парсер ищет, были ли описаны приведенные функции ранее, подключены ли необходимые библиотеки и прочее. Также проверяется правильность приведения типов данных к определенным значениям. Не стоит забывать, что в С99 используется строгая явная типизация, и вы не можете засунуть в строку, объявленную integer, какие-то буквенные значения. Если такое замечается, сразу вылетает ошибка.
- В зависимости от среды разработки, иногда предоставляется возможность последний раз протестировать код, который сейчас будет компилироваться, с запуском интерпретатора соответственно.
- Последним идет стек из различных действий приведения функций, базовых операнд и прочего к двоичному коду, что может занять какое-то время. Также вся структура файлов переносится в исполняемые exe-шники, а затем происходит завершение компиляции.
Как можно увидеть, процесс не так прост, как его рисуют, и на любом этапе может возникнуть какая-то ошибка, которая приведет к остановке компиляции. Проблема в том, что, в отличие от первых трех этапов, баги на последнем – зачастую неявные, но всё ещё не связанные с алгоритмом и логикой программы. Соответственно, их исправление и зачистка занимают значительно больше времени.
А вот синтаксические ошибки – самая частая причина, почему на exit status 1 происходит ошибка компиляции для платы Аrduino nano. Зачастую процесс дебагинга в этом случае предельно простой.
Вам высвечивают ошибку и строчку, а также подсказку от оператора EXCEPTION, что конкретно не понравилось парсеру. Будь то запятая или не закрытые скобки функции, проблема загрузки в плату Аrduino возникнет в любом случае.
Решение предельно простое и логичное – найти и исправить непонравившийся машине синтаксис. Зачастую такие сообщения вылезают пачками, как на этапе тестирования, так и компилирования, поэтому вы можете таким образом «застопорить» разработку не один раз.
Не стоит этого страшиться – этот процесс вполне нормален. Все претензии выводятся на английском, например, часто можно увидеть такое: was not declared in this scope. Что это за ошибка arduino – на самом деле ответ уже скрыт в сообщении. Функция или переменная просто не были задекларированы в области видимости.
Ошибки компиляции плат Arduino uno
Другая частая оплошность пользователя, которая порождает вопросы вроде, что делать, если Аrduino не видит порт, заключается в том, что вы попросту забываете настроить среду разработки. IDE Ардуино создана под все виды плат, но, как мы указывали, на каждом контроллере помещается лишь ограниченное количество библиотек, и их наполнение может быть различным.
Соответственно, если в меню среды вы выбрали компиляцию не под тот МК, то вполне вероятно, что вызываемая вами функция или метод просто не будет найдена в постоянной памяти, вернув ошибку. Стандартно, в настройках указана плата Ардуино уно, поэтому не забывайте её менять. И обратная ситуация может стать причиной, по которой возникает проблема загрузки в плату на Аrduino uno.
Ошибка exit status 1 при компиляции для плат uno, mega и nano
И самое частое сообщение, для пользователей уно, которое выскакивает в среде разработки – exit 1. И оно же самое дискомфортное для отладки приложения, ведь тут необходимо учесть чуть ли не ядро системы, чтобы понять, где же кроется злополучный баг.
В документации указано, что это сообщение указывает на то, что не запускается ide Аrduino в нужной конфигурации, но на деле есть ещё десяток случаев, при которых вы увидите данное сообщение. Однако, действительно, не забывайте проверять разрядность системы, IDE и просматривать, какие библиотеки вам доступны для обращения на текущий момент.
Ошибки библиотек
Если произошла ошибка при компиляции скетча Ардуино, но не выводилось ни одно из вышеописанных сообщений, то можете смело искать баг в библиотеках МК. Это наиболее неприятное занятие для большинства программистов, ведь приходится лазить в чужом коде, но без этого никак.
Ведь банально причина может быть в устаревшем синтаксисе скачанного плагина и, чтобы он заработал, необходимо переписать его практически с нуля. Это единственный выход из сложившейся ситуации. Но бывают и более банальные ситуации, когда вы подключили библиотеку, функции из которой затем ни разу не вызвали, или просто перепутали название.
Ошибки компилятора Ардуино
Ранее упоминался финальный стек действий, при прогонке кода через компилятор, и в этот момент могут произойти наиболее страшные ошибки – баги самого IDE. Здесь конкретного решения быть не может. Вам никто не запрещает залезть в ядро системы и проверить там всё самостоятельно, но куда эффективнее будет откатиться до предыдущей версии программы или, наоборот, обновиться.
Основные ошибки
Ошибка: «avrdude: stk500_recv(): programmer is not responding»
Смотрим какая у нас плата? Какой порт используем? Сообщаем ардуино о правильной плате и порте. Возможно, что используете Nano, а указана Mega. Возможно, что указали неверный порт. Всё это приводит к сообщению: «programmer is not responding».
Решение:
В Arduino IDE в меню «Сервис» выбираем плату. В меню «Сервис → Последовательный порт» выбираем порт.
Ошибка: «a function-definition is not allowed here before ‘{‘ token»
Забыли в коде программы (скетча) закрыть фигурную скобку }.
Решение:
Обычно в Ардуино IDE строка с ошибкой подсвечивается.
Ошибка: «No such file or directory / exit status 1»
Подключаемая библиотека отсутствует в папке libraries.
Решение:
Скачать нужную библиотеку и скопировать её в папку программы — как пример — C:Program FilesArduinolibraries. В случае наличия библиотеки — заменить файлы в папке.
Ошибка: «expected initializer before ‘}’ token / expected ‘;’ before ‘}’ token»
Забыли открыть фигурную скобку {, если видим «initializer before». Ошибка «expected ‘;’ before ‘}’ token» — забыли поставить точку с запятой в конце командной строки.
Решение:
Обычно в Ардуино IDE строка с ошибкой подсвечивается.
Ошибка: «… was not declared in this scope»
Arduino IDE видит в коде выражения или символы, которые не являются служебными или не были объявлены переменными.
Решение:
Проверить код на использование неизвестных выражений или лишних символов.
13-12-2020, 16:31
6 комментариев
Даже опытные программисты-«ардуинщики» могут столкнуться с ошибками компиляции. Исправить их не сложно, а вот найти порой не так просто. Мы решили рассказать сегодня в деталях, какие системные ошибки чаще возникают на различных платах Ардуино, как их исправить и по возможности избежать.
Для начала рассмотрим базовые, так называемые синтаксические ошибки. Они встречаются чаще всего у новичков, но и опытные электронщики с ними точно знакомы не понаслышке. Искать их обычно супер-просто – в Arduino IDE некорректный синтаксис выделяется построчно (таким образом значительно легче отыскать неточность в кодах). Обычно это: отсутствие скобки в конце команды, пропуск этой самой служебной команды или слова, нехватка важных функций, неправильное их написание и т.д.
Для быстрого поиска ошибки советуем рассмотреть строку-подсказку. Ничего не помогло? Тогда для вас наша подборка наиболее распространенных синтаксических ошибок:
С синтаксисом все понятно – вставляем пропущенные символы, убираем лишние знаки, возвращаем функции по умолчанию.
Напомним, в среде разработки Ардуино IDE можно заливать скетчи для различных микроконтроллеров. По умолчанию обычно указана плата Genuino Uno. Если вы работаете с Mega, следует выбрать именно эту платформу (меню «Сервис»), иначе вас ожидает неприятное предупреждение: “programmer is not responding”.
Ошибка компиляции для платы Arduino Uno чаще всего возникает из-за проблем, связанных с библиотеками, например, неправильно подключили, не то ПО инсталлировали. В этом случае вы увидите напоминание “fatal error: … No such file or directory” (библиотека не перенесена в папку libraries) или “redefinition of void setup”.
Обозначенная на скриншоте ERROR означает, что программирование завершилось некорректно (расшифровываем: внутренние проблемы с компилятором, не обновили версию IDE, сбой в библиотеке, неправильный выбор разрядности операционной системы и др.).
Важно! Не забывайте использовать подсказки приложения – они очень помогают. Включаем тут: Файл -> Настройки -> «Показать подробный вывод во время компиляции».
Что делать, если произошла ошибка при загрузке скетча Arduino Nano. Тут могут быть те же причины, что мы описали выше. Особых отличий в компиляции плат нет, главное, их правильный выбор первоначально. Однако часто пользователи настраивают не те показатели скорости порта: 9600 вместо необходимых 57600 либо не имеют соответствующих драйверов на устройствах – все это нужно проверить и исправить!