Среда, 11 часов вечера. Вы только что потратили три часа на работу над своим следующим проектом Arduino, и, НАКОНЕЦ, вы готовы дать Ваш набросок закружился. Вы нажимаете «Загрузить», ладони вспотели от предвкушения, чтобы увидеть, как вся ваша тяжелая работа увенчается успехом. И тогда вы видите ошибку:
Нет такого файла или каталога.
Конечно, это случайная аберрация». Не о чем беспокоиться», — бормочете вы, изголодавшись по полубреду, снова нажимая «Загрузить». И еще раз эти сводящие с ума слова «нет такого файла или каталога» смотрят на вас в ответ с враждебной насмешкой газлайтинга.0003
Ты был здесь?
Если вы пытаетесь запустить скетч Arduino, но постоянно сталкиваетесь с ошибкой «нет такого файла или каталога», не волнуйтесь. На самом деле это довольно распространенная проблема, и есть два простых решения, которые почти всегда работают.
Продолжайте читать. Мы покажем вам, что они из себя представляют.
Сообщения об ошибках могут быть такой головной болью. Однако они служат полезной цели, сообщая нам о том, что пошло не так. На первый взгляд, ошибка «нет такого файла или каталога» особенно раздражает, потому что кажется, что она нарушает это полезное правило. Конечно, есть файл или каталог! Вы только что сделали вещь, и она тут же, спрятанная в каталоге.
Но подождите, давайте посмотрим поближе. Если вы посмотрите на нижнюю часть Arduino IDE, где отображается сообщение об ошибке, вы увидите эту удобную маленькую кнопку с надписью «копировать сообщения об ошибках».
Нажмите на это сейчас. Вы, вероятно, не упадете со стула, узнав, что, нажав эту кнопку, вы просто скопировали сообщение об ошибке из маленького окна в нижней части пользовательского интерфейса последовательного монитора в буфер обмена вашего компьютера.
Эта функция копирования невероятно полезна. Например, вы можете вставить сообщение об ошибке в Google и узнать больше об ошибке. Или вы можете воспользоваться активным сообществом Arduino, попросив помощи на форуме. Однако для этой ситуации мы можем быть немного более простыми. Все, что мы собираемся сделать, это более подробно рассмотреть, что такое сообщение на самом деле говоря. Для этого просто запустите текстовый редактор вашего ПК и вставьте его в пустой экран.
Вот она, надоедливая ошибка во всей своей свежевставленной красоте.
Я разберу это для вас построчно.
Итак, эта штука, «Servo.h.» Это то, что нам нужно исправить, и благодаря строке 2, мы знаем, где их найти. Строка 10. всегда строка 10.
Теперь, когда мы немного лучше знаем, что происходит, давайте приступим к реализации исправления.
Давайте тщательно проанализируем эту проклятую строку 10.
Он говорит «#include
Когда мы проверяем этот код, эта строка сообщает компилятору Arduino IDE: «Эй, чтобы эта программа работала, вам нужно получить этот файл с именем servo.h ».
Допустим, у вас есть машина для изготовления этикеток, и вы хотели использовать ее для печати крутых мотивационных этикеток, например «Успех!» и «Продолжайте пробовать!» и «Смотри, Начос!» Чтобы это произошло, вам сначала нужно загрузить рулон этикеток. Нет рулона этикеток? Ну, тогда производитель этикеток не сработает.
Эскиз, который вы пытаетесь загрузить, похож на производителя этикеток. Файл (в нашем примере это файл с именем «servo.h») представляет собой рулон этикеток.
Таким образом, сообщение об ошибке на самом деле говорит что-то полезное. Он говорит: «Эй, программист, ты сказал, что мне нужен этот другой файл. Ну, я искал его, и его там нет. Что дает?»
Теперь мы знаем, что сообщение об ошибке не является полной чушью, давайте рассмотрим два наиболее распространенных сценария, которые его вызывают.
Этот скетч написан вами. На самом деле это вы написали строку «#include». Первое, что вы должны проверить, это правильное написание и использование заглавных букв. Может вы неправильно написали название библиотеки? Или (как в примере ниже), возможно, вы написали не те буквы.
Таким образом, «servo.h» должен иметь заглавную букву «S». Полностью и с правильной заглавной буквой следует читать «Servo.h». Вы заметите выше, что слово servo меняет цвет, когда оно правильно пишется с заглавной буквы. Это изменение цвета означает, что имя библиотеки «Servo» распознается как «ключевое слово» в среде разработки Arduino IDE.
Имейте в виду, что это может быть не так для всех используемых вами библиотек. Другими словами, изменение цвета не всегда будет означать, что вы используете правильное написание или заглавные буквы, но часто это полезное визуальное напоминание.
О, и, наверное, хорошо бы упомянуть, что каждый в истории программирования Arduino в какой-то момент писал с ошибкой или неправильно писал слово с заглавной буквы. Удивительно, как долго вы можете смотреть на строку кода и пропустить что-то подобное.
Так что не парься.
Это приводит нас к следующему распространенному сценарию ошибки «Нет такого файла или каталога».
Очень часто работа с Arduino включает в себя использование кода, который кто-то разработал и опубликовал в Интернете, а затем его адаптацию к вашему проекту. Это часть того, что делает работу с Arduino такой простой. Одна проблема, которая часто возникает, когда мы делаем это, заключается в том, что мы случайно вводим код без соответствующего файла.
Простой способ проверить, есть ли у вас файл, который ищет скетч, — это перейти в Sketch > Include Library из Arduino IDE. Затем найдите имя этой библиотеки.
К какой бы библиотеке ни обращался оператор #include, вы хотите просмотреть этот большой длинный список в поисках библиотеки с точно таким же именем. Если вы не видите там имя файла, это означает, что библиотека не установлена. Вам нужно будет добавить эту библиотеку, прежде чем скетч скомпилируется без ошибок.
Итак, как добавить эту библиотеку?
Самый простой способ — перейти в Sketch > Include Library > Manage Libraries. Arduino IDE откроет диалоговое окно, в котором вы сможете найти нужную библиотеку.
Убедитесь, что вы вводите именно то слово, которое соответствует строке #include. Как только вы найдете недостающую библиотеку, нажмите «Установить». Arduino IDE сообщит вам, что она устанавливает запрошенную вами библиотеку и соответствующим образом обновляет программное обеспечение.
Затем дважды проверьте, успешно ли установлена библиотека, выбрав Sketch > Include Library. Вы должны увидеть свою новую библиотеку в раскрывающемся списке.
Хорошие новости! Если библиотека есть, теперь вы сможете скомпилировать свой скетч без ошибок.
Хорошо, есть одна маленькая ложка дегтя. Как эти чертовы мушки всегда умудряются так все усложнять?
Вот в чем дело. Не все библиотеки живут в этом удобном всплывающем окне внутри Arduino IDE. Сообщество Arduino бурлит умными идеями, но умность (в отличие от плавленого сыра) не всегда выражается в удобно стандартизированных, индивидуально упакованных кусочках. Есть тонн различных способов найти библиотеки Arduino в Интернете.
Если вы загружаете или копируете программу из Интернета, просто перейдите на страницу, где вы получили эту программу, и внимательно изучите библиотеку, на которую ссылается автор. Например, у них может быть ссылка на GitHub, место, где люди хранят множество библиотек кода.
Где бы вы ее ни нашли, обычно библиотека будет включена в пакет файла .zip. После того, как вы загрузили .zip-файл, запустите Arduino IDE и выберите «Скетч» > «Включить библиотеку» > «Добавить библиотеку .ZIP». Затем перейдите в папку, в которую вы загрузили файл, и выберите его. Предполагая, что в ваш рабочий процесс не вторгаются дополнительные мази, Arduino IDE выведет сообщение «Библиотека добавлена в ваши библиотеки» прямо над темной областью, где появилась исходная ошибка «Нет такого файла или каталога».
Теперь все как обычно! Просто перейдите в Sketch > Include Library, и новая библиотека появится в раскрывающемся списке.
Как однажды сказал француз-дислектик крупному скрипачу: «Виола!»
Теперь вы знаете не один, а два способа добавить новую библиотеку. Какое время быть живым!
Итак, краткое резюме.
Мы рассмотрели два основных сценария, которые вызывают появление ошибки «Нет такого файла или каталога» после компиляции скетча:
Не может быть таких вещей, как бесплатный обед, совпадение или дракон удачи. Но будьте уверены. Ваши файлы и каталоги? Они живы и здоровы.
Это спецификация формата библиотеки Arduino, которая будет использоваться с Arduino IDE 1.5.x и выше.
Этот новый формат библиотеки предназначен для использования в тандеме с Менеджером библиотек , доступным, начиная с Arduino IDE 1.6.2. Диспетчер библиотек позволяет пользователям автоматически загружать и устанавливать библиотеки, необходимые в их проектах, с помощью простого использовать графический интерфейс в Arduino IDE/Ардуино IDE 2.
arduino-clilib
.Доступна дополнительная информация о том, как работает диспетчер библиотек. здесь.
Программное обеспечение для разработкиArduino поддерживает несколько архитектур микроконтроллеров (например, AVR, SAM и т. д.), что означает, что библиотекам может потребоваться работать с несколькими архитектурами. Новый формат библиотеки 1.5 не содержит специальной поддержки кросс-архитектурные библиотеки, но он предоставляет основанный на препроцессоре механизм для библиотек для целевых разделов код для конкретных архитектур.
Наиболее значительным дополнением к формату является возможность добавлять информацию о самой библиотеке через файл свойств с именем library.properties .
Этот файл позволяет диспетчеру библиотек искать и устанавливать библиотеку и ее зависимости простым и автоматизированным способом. способ. Он должен находиться в корне папки библиотеки.
Файл library.properties представляет собой список свойств типа «ключ=значение». Каждое поле в этом файле имеет кодировку UTF-8. Если не указано иное в противном случае ниже все поля обязательны для заполнения . Доступные поля:
имя
значение, начинающееся с Arduino
, больше не допускается
дополнение к указателю менеджера библиотек
поскольку эти имена теперь зарезервированы для официальных библиотек Arduino. Без категории
) допустимые значения: *
) разделенный запятыми список архитектур, поддерживаемых библиотекой. Если библиотека
не содержит кода, специфичного для архитектуры, используйте *
для соответствия всем архитектурам. Это поле используется как один фактор в
определение приоритета, когда несколько библиотек соответствуют директиве #include
, и предоставление предупреждающего сообщения, когда
библиотека скомпилирована для платы с архитектурой, не соответствующей ни одной из перечисленных. arduino-cli lib install
автоматически установит зависимости. С
в имени
библиотеки допускаются пробелы, но не запятые, вы можете ссылаться на библиотеки, содержащие пробелы в
имя без двусмысленности, например: depend=Очень длинное имя библиотеки, Другая библиотека с длинным именем
depend=ArduinoHttpClient (>=1.0.0)
true
, библиотека будет скомпилирована с использованием файла .a (архив). Во-первых, все исходные файлы компилируются в файлы .o как
нормальный. Затем вместо включения всех .o
файлы в команде компоновщика напрямую, все файлы .o сохраняются в файл .a, который затем включается в компоновщик
команда. Требуется структура папок библиотеки формата 1. #include <...>
строк. Это свойство используется с командой «Включить библиотеку» в Arduino.
ИДЕ. Если свойство включает
отсутствует, включаются все файлы заголовков (.h) в корневой исходной папке. ldflags=-lm
Пример:
имя=Веб-сервер версия=1.0.0 автор=Кристиан Магли, Пиппо Плутон сопровождающий = Кристиан Магли предложение = библиотека, которая упрощает кодирование веб-сервера. параграф = поддерживает HTTP1.1, и вы можете выполнять GET и POST. категория=Связь URL-адрес = http://example.com/ архитектуры = авр включает = WebServer.h зависит=ArduinoHttpClient
(доступен в Arduino IDE 2.0.0-beta.3/Arduino CLI 0.7.0)
По умолчанию последняя версия зависимости, указанная в поле depend
library.properties
устанавливается вместе с библиотекой. Указание точной версии
или диапазон версий также поддерживается.
Доступны следующие операторы:
= | равно |
> | больше |
>= | больше или равно |
< | меньше |
<= | меньше или равно |
! | НЕ 1 |
&& | И |
|| | ИЛИ |
( , ) | группа ограничений |
1 Доступен в Arduino IDE 2.0.0-rc7/Arduino CLI 0.22.0
Если библиотека "ArduinoHttpClient" имеет следующие выпуски:
0.1.0
1.0.0
2.0.0
2.1.0
Его версия, установленная как зависимость, будет следующей:
зависит от значения поля | Устанавливает версии |
---|---|
ArduinoHttpClient | 2. 1.0 |
ArduinoHttpClient (= 1.0.0) | 1.0.0 |
ArduinoHttpClient (> 1.0.0) | 2.1.0 |
ArduinoHttpClient (>=1.0.0) | 2.1.0 |
ArduinoHttpClient (<2.0.0) | 1.0.0 |
ArduinoHttpClient (<=2.0.0) | 2.0.0 |
ArduinoHttpClient (!=1.0.0) | 2.1.0 |
ArduinoHttpClient (>1.0.0 && <2.1.0) | 2.0.0 |
ArduinoHttpClient (<1.0.0 || >2.0.0) | 2.1.0 |
ArduinoHttpClient ((>0.1.0 && <2.0.0) || >2.1.0) | 1.0.0 |
Каждая папка имеет определенное назначение (исходники, примеры, документация и т. д.). Папки, не описанные в этой спецификации могут быть добавлены по мере необходимости в будущие версии.
Имя корневой папки библиотеки должно начинаться с основной буквы (A-Z или a-z) или цифры (0-9), за которой следуют основные буквы, цифры, знаки подчеркивания (_), точки (.) и тире (-). Максимальная длина 63 символа.
Для библиотек, предназначенных для использования только с Arduino IDE 1.5.x+, исходный код находится в папке src . Для пример:
Серво/src/Servo.h Серво/src/Servo.cpp
Исходный код найден в 9Папка 0005 src и все ее подпапки скомпилированы и связаны в эскизе пользователя. Только
Папка src добавлена в путь поиска include (как при компиляции скетча, так и библиотеки). Когда пользователь импортирует
библиотеку в свой скетч (из меню «Sketch > Include Library» Arduino IDE или в веб-редакторе Arduino).
кнопка «Включить»), поведение по умолчанию (настраивается через
library. properties включает поле
) для #include
заявление, которое будет добавлено для
все файлы заголовков (.h) в каталоге src/ (но не его подпапки). В результате эти заголовочные файлы образуют нечто вроде
фактический интерфейс к вашей библиотеке; в общем, единственными заголовочными файлами в корневой папке src/ должны быть те, которые вы
хотите выставить эскиз пользователя и планируете поддерживать совместимость с будущими версиями библиотеки. Место
внутренние файлы заголовков в подпапке папки src/.
Для обратной совместимости с Arduino IDE 1.0.x автор библиотеки может поместить исходный код в корневую папку, вместо папки под названием источник . В этом случае применяется формат библиотеки 1.0 и выполняется поиск исходного кода. из корневой папки библиотеки и папки утилиты , например:
Сервопривод/Сервопривод.h Серво/Серво.cpp Серво/утилита/ServoTimers.h Серво/утилита/ServoTimers.cpp
Это позволит компилировать существующие библиотеки формата 1. 0 под Arduino IDE 1.5.x+ и наоборот. Если библиотека нужно только запустить на Arduino IDE 1.5.x+, мы рекомендуем размещать весь исходный код в папке src/. Если библиотека требует рекурсивной компиляции вложенных исходных папок, ее код должен находиться в папке src/ (поскольку в Arduino IDE 1.0.x нет поддерживают рекурсивную компиляцию, обратная совместимость в любом случае невозможна).
Макет | корень скомпилирован | источник скомпилировано | утилита скомпилированная |
---|---|---|---|
рекурсивный | нет | рекурсивно | нет |
плоский | да | нет | да |
предварительно скомпилированное поле
в library.properties включает поддержку использования
предварительно скомпилированные библиотеки. Для этого необходимо предоставить файлы .a (архив) или .so (общий объект), которые скомпилированы для
конкретная архитектура процессора. Целевая архитектура файлов указывается именами папок.
Двоичные файлы должны располагаться по адресу src/{build.mcu}
, где {build.mcu}
— это имя архитектуры целевого файла.
был составлен для. Пример: cortex-m3
для Arduino Due.
Имена файлов скомпилированных двоичных файлов должны начинаться с lib
(например, libFoo.a
).
(доступен в Arduino IDE 1.8.12/arduino-builder 1.5.2/Arduino CLI 0.8.0) Конфигурация ABI с плавающей запятой
Микроконтроллеры ядра ARM можно настроить с помощью флагов компилятора. Дополнительный уровень подпапки может использоваться для предоставления файлов
скомпилировано для конкретной конфигурации с плавающей запятой: src/{build.mcu}/{build.fpu}-{build.float-abi}
, где {build.fpu}
— это значение флага компилятора -mfpu
, а {build. float-abi}
— это значение -mfloat-abi
.
флаг компилятора. (доступен в Arduino IDE 1.8.13/arduino-builder 1.5.3/Arduino CLI 0.11.0) Если с плавающей запятой
флаги конфигурации используются, но папка, соответствующая этой конфигурации, не найдена, src/{build.mcu}
используется как
отступать.
Ниже приведен пример структуры папок библиотеки src
, которая обеспечивает:
= полный режим
). -mfloat-abi=softfp -mfpu=fpv4-sp-d16
Конфигурация ABI с плавающей запятой.Сервопривод/src/Servo.h Серво/src/Servo.cpp Сервопривод/src/cortex-m0plus/libServo.a Серво/src/cortex-m4/libServo.a Сервопривод/src/cortex-m4/fpv4-sp-d16-softfp/libServo.a
Примеры библиотеки должны быть помещены в папку examples . Обратите внимание, что примеров имя папки должно быть написано именно так (со строчными буквами).
Серво/примеры/...
Скетчи, содержащиеся в папке примеров, будут отображаться в меню «Примеры» Arduino IDE и Arduino Web. Редактор.
Дополнительная информация:
Папка extras может использоваться разработчиком для размещения документации или других элементов, которые будут включены в библиотеку. Помните, что файлы, помещенные в эту папку, увеличат размер библиотеки, поэтому размещение PDF-файла размером 20 МБ в библиотеке что весит несколько килобайт, может быть не такой уж хорошей идеей.
Содержимое папки extras полностью игнорируется программой разработки Arduino; вы можете положить что угодно внутри.
Список ключевых слов для библиотеки может быть указан в файле с именем keywords.txt, расположенном в корне библиотеки папка. Когда ключевое слово любой установленной библиотеки используется в скетче, Arduino IDE окрашивает его.
Сервопривод/keywords.txt
Пример файла keywords.txt:
# Карта раскраски синтаксиса для ExampleLibrary # Типы данных (KEYWORD1) Тест KEYWORD1 # Методы и функции (KEYWORD2) KEYWORD2 # Экземпляры (KEYWORD2) # Константы (LITERAL1)
Этот файл заставит Arduino IDE выделить Test
в качестве типа данных и doSomething
в качестве метода/функции.
keywords.txt состоит из четырех полей, разделенных одной истинной табуляцией (не пробелами):
KEYWORD KEYWORD_TOKENTYPE REFERENCE_LINK RSYNTAXTEXTAREA_TOKENTYPE
Разрешается оставлять поле пустым.
KEYWORD_TOKENTYPE
KEYWORD_TOKENTYPE | Использовать для | Свойство темы |
---|---|---|
КЛЮЧЕВОЕ СЛОВО1 | типов данных | редактор.data_type.style |
КЛЮЧЕВОЕ СЛОВО2 | функций | редактор.функция.стиль |
КЛЮЧЕВОЕ СЛОВО3 | структур | редактор.функция.стиль |
ЛИТЕРАЛ1 | констант | editor.reserved_word_2.style |
БУКВАЛЬНЫЙ2 | ? | редактор. функция.стиль |
REFERENCE_LINK
В этом поле указывается страница справки по языку Arduino, которую следует открыть через Arduino.
Щелкните правой кнопкой мыши IDE > Найти в справочнике или Справка > Найти в справочнике , когда курсор находится на этом ключевом слове. В целом
нет смысла определять REFERENCE_LINK
для ключевых слов сторонних библиотек, поскольку они вряд ли
быть в справочнике по языку Arduino.
RSYNTAXTEXTAREA_TOKENTYPE
В Arduino IDE 1.6.5 и новее это поле переопределяет KEYWORD_TOKENTYPE
. В предыдущих версиях IDE Поле RSYNTAXTEXTAREA_TOKENTYPE
игнорируется и вместо него используется KEYWORD_TOKENTYPE
.
RSYNTAXTEXTAREA_TOKENTYPE | Свойство темы | KEYWORD_TOKENTYPE эквивалент |
---|---|---|
RESERVED_WORD | editor. reserved_word.style | КЛЮЧЕВОЕ СЛОВО3 |
RESERVED_WORD_2 | editor.reserved_word_2.style | БУКВАЛЬНЫЙ1 |
ТИП_ДАННЫХ | редактор.data_type.style | КЛЮЧЕВОЕ СЛОВО1 |
ПРЕПРОЦЕССОР | редактор.препроцессор.стиль | КЛЮЧЕВОЕ СЛОВО3 |
LITERAL_BOOLEAN | редактор.literal_boolean.style | БУКВАЛЬНЫЙ1 |
Обычно Arduino IDE обрабатывает содержимое папки библиотеки как доступное только для чтения. Это сделано для того, чтобы пользователи не случайное изменение эскизов примеров. В процессе разработки библиотеки вы можете захотеть отредактировать примеры скетчей в место с помощью Arduino IDE. В Arduino IDE 1.6.6 и новее поведение только для чтения можно отключить, добавив файл с именем .development в корень папки библиотеки. Файл library.properties должен также присутствовать. Индексатор Менеджера библиотек будет не собирайте выпуски, содержащие файл .development, поэтому не отправляйте этот файл в удаленный репозиторий.
Гипотетическая библиотека с именем "Servo", соответствующая спецификации, приведена ниже:
Серво/ Сервопривод/библиотека.свойства Серво/ключевые слова.txt Серво/источник/ Серво/src/Servo.h Серво/src/Servo.cpp Серво/src/ServoTimers.h Серво/примеры/ Серво/примеры/Sweep/Sweep.ino Серво/примеры/Pot/Pot.ino Серво/доп./ Сервопривод/дополнения/Servo_Connectors.pdf
Библиотеки, помещенные в подпапку библиотек
папки Sketchbook (также известная как «каталог пользователя»), будут доступны для
все платы, которые могут включать в себя несколько различных процессорных архитектур. Чтобы предоставить код для конкретной архитектуры или
оптимизаций, авторы библиотек могут использовать ARDUINO_ARCH_XXX
макрос препроцессора ( #define
), где XXX — имя
архитектуру (определяемую названием
папка архитектуры платформы платы). Например, ARDUINO_ARCH_AVR
будет определено при компиляции для плат на базе AVR.
Пример:
#если определено (ARDUINO_ARCH_AVR) // код, специфичный для AVR #elif определено (ARDUINO_ARCH_SAM) // код, специфичный для SAM #еще // общий код, не зависящий от платформы #endif
В качестве альтернативы, если библиотека работает только на определенных архитектурах, вы можете предоставить явное сообщение об ошибке (вместо допуская сбой компиляции трудным для понимания способом):
#если определено (ARDUINO_ARCH_AVR) // код, специфичный для AVR #elif определено (ARDUINO_ARCH_SAM) // код, специфичный для SAM #еще #error «Эта библиотека поддерживает только платы с процессором AVR или SAM».