Как программируют Arduino — Журнал «Код»: программирование без снобизма
Arduino — это программируемый микроконтроллер, который можно использовать в робототехнике, умном доме и вообще запрограммировать его как угодно: чтобы он кормил кота, поливал растения, предупреждал вас о приближении врагов или открывал двери с помощью магнитного ключа. У нас есть подборка 10 интересных вещей, которые можно сделать на этой платформе. Теперь время разобраться, как программисты с ней работают.
Язык Arduino
Если опытный программист посмотрит на код для Arduino, он скажет, что это код на C++. Это недалеко от истины: основная логика Ардуино реализована на C++, а сверху на неё надет фреймворк Wiring, который отвечает за общение с железом.
На это есть несколько причин:
- У С++ слава «слишком сложного языка». Arduino позиционируется как микроконтроллеры и робототехника для начинающих, а начинающим иногда трудно объяснить, что С++ не такой уж сложный для старта.
- В чистом С++ нет удобных команд для AVR-контроллеров, поэтому нужен был инструмент, который возьмёт на себя все сложные функции, а на выходе даст программисту часто используемые команды.
- Разработчики дали программистам просто писать нужные им программы, а все служебные команды, необходимые для правильного оформления кода на С++, взяла на себя специальная среда разработки.
Подготовка и бесконечность
В любой программе для Arduino есть две принципиальные части: подготовительная часть и основной цикл.
В подготовительной части вы говорите железу, чего от вас ожидать: какие порты настроить на вход, какие на выход, что у вас как называется. Например, если у вас датчик подключён ко входу 10, а лампочка к выходу 3, то вы можете обозвать эти входы и выходы как вам удобно, а дальше в коде обращаться не к десятому входу и третьему выходу, а по-человечески: к датчику или лампочке.
Основной цикл — это то, что происходит в функции loop(). Ардуино берёт оттуда команды и выполняет их подряд. Как только команды закончились, он возвращается в начало цикла и повторяет всё. И так до бесконечности.
В основном цикле мы описываем все полезные вещи, которые должен делать контроллер: считывать данные, мигать лампами, включать-выключать моторы, кормить кота и т. д.
Что можно и чего нельзя
Ардуино работает на одноядерном и не шибко шустром процессоре. Его тактовая частота — 16 мегагерц, то есть 16 миллионов процессорных операций в секунду. Это не очень быстро, плюс ядро только одно, и оно исполняет одну команду за другой.
Вот какие ограничения это на нас накладывает.
Нет настоящей многозадачности. Можно симулировать многозадачность с помощью приёма Protothreading, но это скорее костыль.
Нет понятия файлов (без дополнительных примочек, библиотек и железа). На контроллер нельзя ничего сохранить, кроме управляющей им программы. К счастью, есть платы расширения, которые позволяют немножко работать с файлами на SD-карточках.
Аналогично с сетью: без дополнительных плат и библиотек Ардуино не может ни с чем общаться (кроме как включать-выключать электричество на своих выходах).
Полегче со сложной математикой: если вам нужно что-то сложное типа тригонометрических функций, будьте готовы к тому, что Ардуино будет считать их довольно медленно. Для вас это одна строчка кода, а для Ардуино это тысячи операций под капотом. Пощадите.
Отчёты? Ошибки? Только при компиляции. У Ардуино нет встроенных средств сообщить вам, что ему нехорошо. Если он завис, он не покажет окно ошибки: во-первых, у него нет графического интерфейса, во-вторых — экрана. Если хотите систему ошибок или отчётность, пишите её 🙂
Если серьёзно, то перед заливом программы на контроллер компилятор проверит код и найдёт в нём опечатки или проблемы с типами данных. Но на этом всё: если у вас случайно получилась бесконечная петля в коде или при каких-то обстоятельствах вы повесите процессор делением на ноль — жмите перезагрузку и исправляйте код.
И всё же
Ардуино — это кайф: вы с помощью кода можете управлять физическим миром, моторами, лампами и электродеталями. Можно создать умную розетку; можно собрать умный замок для сейфа; можно сделать детектор влажности почвы, который будет включать автоматический полив. И всё это — на довольно понятном, читаемом и компактном языке C++, на который сверху ещё надета удобная библиотека для железа. Прекрасный способ провести выходные.
Какие ещё языки используют для Arduino
С. Как и С++, Си легко можно использовать для программирования микроконтроллеров Arduino. Только если С++ не требует никаких дополнительных программ, то для С вам понадобится WinAVR, чтобы правильно перевести код в язык, понятный контроллерам AVR.
Python. Было бы странно, если бы такому универсальному языку не нашлось применения в робототехнике. Берёте библиотеки PySerial и vPython, прикручиваете их к Python и готово!
Java. Принцип такой же, как в Python: берёте библиотеки для работы с портами и контроллерами и можно начинать программировать.
HTML. Это, конечно, совсем экзотика, но есть проекты, которые заставляют HTML-код работать на Arduino.
А вообще Arduino работает на контроллерах AVR, и прошить их можно любым кодом, который скомпилирован под это железо. Всё, что вам нужно — найти библиотеку для вашего любимого языка, которая преобразует нужные команды в машинный код для AVR.
Главное — алгоритмы
Любой робот — это один большой алгоритм. Чтобы научиться думать как программист и писать свои алгоритмы с нуля, приходите в Практикум.
Уроки Arduino от Jeremy Blum. Первые шаги.||Arduino-diy.com
Всем привет. Я Джереми Блум. Рад представить вам новую серию туториалов по Arduino.
Arduino – это потрясная open-source платформа с микроконтроллером, которую можно использовать для создания электронных проектов. Для автоматизации вещей, в которых есть входы-выходы, прерывания, и т.п. Мы поговорим обо всем этом в этой серии туториалов.
Это должно быть очень увлекательно. Неважно, новичок ли вы, который никогда не связывался с электроникой до этого или вы «ветеран», который плотно работал с микроконтроллерами, но никогда не использовал Arduino. Должен получится отличный цикл гайдов. Первые смогут начать с изучения основ Arduino: как это работает, как устанавливать софт, собирать простые схемы типа мигающих светодиодов и т.
Вещи, которые могут вам понадобится в нашем цикле уроков и для того, чтобы работать с Arduino
- Конечно же, вам понадобится сама плата Arduino.
- Вам понадобится USB-кабель, для того, чтобы программировать Arduino. Так же через него идет питание от вашего компьютера. Если вы хотите использовать Arduino не подключенным к компьютеру, после того, как вы закончили с программированием, вам понадобится блок питания.
- Вам также понадобится (breadboard) (доска для прототипирования, макетная плата, монтажная плата). Брэдборды крайне удобны для сборки прототипов электронных схем. Мы соберем несколько различных схем, которые вы сможете использовать для управления светодиодами, динамиками, моторами и всякими такими вещами.
- Вам понадобятся светодиоды и резисторы (220 Ом, 1 кОм, 10 кОм, 100 кОм) для тестов, которые мы будем проводить.
- Вам может понадобиться динамик или парочка, чтобы вы могли извлекать звук из Arduino.
- Моторы. Мы будем использовать постоянные моторы, сервоприводы и, если хватит времени, шаговые моторы.
- Еще несколько сенсоров по ходу дела. Я буду говорить о них по ходу дела. Но для затравки скажу, что, возможно, мы будем использовать датчики изгиба, сенсоры давления и датчики света.
Что же такое Arduino?
Arduino – это open-source платформа для прототипирования устройств,которые основаны на микроконтроллерах ATmega Atmel. Вы можете программировать их сами по себе через штуковину, называемую ISP-программатор. И программировать их на языке С. Этим способом я сделал несколько проектов в лабораторном классе в универе. И это круто на самом деле. Вы можете сделать много забавных вещей с их помощью.
Но для среднестатистического человек С-код может быть зануден и запутан. И это может создавать трудности при создании интересных устройств, которые позволяют делать микроконтроллеры. Что делает Arduino – это абстрагирует путь, через который вы все это делаете. Вы получаете среду программирования Arduino, которая значительно проще С. Это работает через небольшую программку, прошитую в микропроцессоре. Прошивка Arduino зашита в ATmega чип, который установлен на плату Arduino. И вы программируете на языке Arduino, о котором мы будем говорить на протяжении этой серии уроков. Итак, это Arduino UNO:
Мы будем использовать ее в большинстве туториалов. Но вы можете использовать любую разновидность Arduino. Arduino держит спецификации открытыми. Это означает, что на самом деле не обязательно брать именно Arduino с Arduino-брендом. Они публикуют схемы в открытый доступ. И вы можете собрать свою собственную плату из частей, которые у вас есть или купить их. Вы можете прошивать их через ISP программатор, если захотите. Существует множество способов, как использовать микроконтроллеры Arduino. Мы будем работать с UNO, поскольку его просто достать.
У него есть USB-порт для программирования, гнездо для внешнего питания, регулятор напряжения для него. Вы можете запитать его от батарейки или блока питания, включенного в розетку. Есть кнопка RESET, ISP-программатор. Сам ATmega чип и набор контактов, к которым вы подключаете своих входы и выходы.
Как вам настроить компьютер, чтобы могли программировать свой Arduino
Начните с посещения сайта Arduino, чтобы загрузить оттуда открытую среду программирования Arduino. Это arduino.cc. Кликайте по кнопке Download
Проскрольте вниз. Найдите версию операционки, на которой вы сидите. У меня сейчас Windows.
И загрузите этот файл.
На самом деле вам не нужно ничего устанавливать, поэтому загрузите его на рабочий стол или куда угодно. Куда хотите. Скачайте и подождите, пока он распакуется. Вот и все, вы готовы программировать.
После этого просто запускайте скачанное приложение.
Когда среда Arduino стартует в первый раз, я сразу же сохраняю файл, чтобы мы смогли его использовать.
Я сохраню его на рабочий стол.
Программа Arduino сохраняется в папку с тем же именем, что и скет. Скетч – это то, как называется программа в Arduino. Их называют скетчами.
Следующая вещь, которую надо сделать – это убедиться, что вы работаете с правильной разновидностью Arduino. Идите в Tools-Board. Затем дождитесь, когда выпадет список. У нас Arduino Uno. Поэтому выбираем Uno. Если у вас другой Arduino, убедитесь, что вы правильно его выбрали здесь. Теперь мы готовы программировать наш Arduino.
Простая программа для Arduino
Для начала давайте сделаем очень простую программку для Arduino. Все, что программа будет делать – просто мигать светодиодом, встроенном на плате. У всех Arduino есть светодиод, подключенный к контакту 13, Поэтому вам не понадобится никакой внешней схемы. Мы будем включать и выключать встроенный светодиод.
Это хорошая мысль – начать с комментирования своего кода. На языке Arduino двойной слеш означает однострочный комментарий. А слеш-звездочка – многострочный. Назовем это «первой программой Джереми. Она прекрасна».
Что мы сделаем – объявим константы в начале нашей программы. Давайте сделаем это.
Для тех, кто не программировал раньше: все, что мы сделали – это присвоили integer 13. Integer – это просто число. И это константа. Эта переменная определяет, на каком из контактов находится светодиод Arduino. Это контакт 13.
Все программы на Arduino обязаны иметь два метода. Первый — это void setup. Он выглядит так:
Содержимое должно быть между этими скобками
Вторая часть любой программы Arduino (она может быть пустой, если хотите) – это void loop:
Для чего нужны две эти части. Первая делает, все, что будет запущено один раз – в самом начале, когда Arduino включается. А функция loop отвечает за вещи, которые будут крутиться непрерывно, в бесконечном цикле, пока Arduino включен. И это то, что вы обычно будете хотеть от микроконтроллера: делать что-то бесконечно, пока вы его не выключите.
Функция setup. Давайте будем комментировать происходящее. Мы проинициализируем контакты в качестве выходов. Все контакты на Arduino могут быть использованы и как входы и как выходы. И мы еще поговорим об этом подробнее. Но сейчас для включения и выключения светодиода мы должны убедиться, что контакт с ним установлен как выход. В среде Arduino вы можете использовать это через команду pinMode. pinMode принимает два аргумента. Сам контакт, которые вы хотите настроить, это ledPin и хотите ли вы, чтобы он был входом или выходом. Мы хотим, чтобы он был выходом – OUTPUT. И всегда нужно завершать строку точкой с запятой.
Теперь мы напишем наш цикл. Он очень простой. Все, что он делает – это устанавливает светодиод в HIGH, то есть включает, ждет немного, выключает и снова ждет немного. И он будет повторяться попеременно, выключая/выключая светодоиод.
Для того, чтобы установить цифровой выход используется команда digitalWrite. Опять же, она принимает два аргумента. Первый – это контакт, на который мы хотим повлиять. Нам нужен ledPin. Устанавливаем его в HIGHT и LOW. HIGHT означает включить, LOW – выключить. Мы начинаем с установки HIGHT.
Теперь мы хочем оставаться HIGHT до следующего действия. Поэтом у добавим здесь задержку: delay. Принимаем аргумент задержки в миллисекундах. В секунде 1000 миллисекунд, поэтому напишем здесь 1000. Это оставит светодиод включенным на 1 секунду, пока мы не выполним следующую команду: digitalWrite(ledPin, LOW). Это его выключит. И нам нужно остаться LOW на секунду: delay(1000). Светодиод выключенный на секунду.
В конце он перейдет от последней сделанной вещи к началу цикла и включится снова. Мы получили светодиод, который попеременно включается и выключается, задерживаясь на секунду каждый раз. Это наша первая готовая программа на Arduino! И это все, что она делает.
Теперь я беру USB кабель и подключаю его к компьютеру и к Arduino. Видите, Arduino засветился:
Если вы сидите с Arduino под Windows как и я, у вас может выскочить предупреждение о том, что драйвер Arduino Uno не установлен. Это из-за изменений, которые были сделаны в интерфейсе платы Uno по сравнению с предыдущими версиями Arduino. Если у вас более старая версия Arduino, она должна встать сама по себе. Если у вас Uno, необходимо выполнить следующие действия. Откройте меню «Пуск». Затем «Панель управления». Идем в «Система и безопасность». Кликнем по «Категории». Затем нужно выбрать «Система». Идем в «Менеджер устройств». И вы видите Arduino Uno здесь.
Кликните на нем и выберите «Обновить драйвер». Дальше выбираем «Найти драйвер на компьютере». Драйвер на самом деле был загружен, когда мы скачивали среду Arduino, поэтому нам нужно зайти в эту папку. Она Находится у меня на рабочем столе. И выбираете папку «drivers». Жмем «OK», «Далее». Появляется сообщение «Производитель не может бать установлен». Это нормально. Все равно жмем «Установить». И все, готово! Жмем «Закрыть», закрываем открытые окна. И мы готовы прошивать наш Arduino.
Для прошивки все, что нужно сделать – это нажать кнопку «Upload»:
Это запустит компиляцию и загрузит все на плату Arduino. Убедитесь, что выбран нужный COM-порт. Высветилось «Uploaded».
Теперь посмотрите на вашу плату Arduino. Как видите, светодиод мигает каждую секунду. Поздравляю, вы создали вашу первую программу на Arduino!
Послесловие и видеоурок
Это все технические моменты на этот раз. Мне не хотелось устраивать вам вывих мозга. Я просто рассказал, как настроить систему, чтобы убедиться, что вам удалось завести Arduino Uno или другой микроконтроллер. Я упомянул о брэдбордах, проводах, резисторах, светодиодах. Вы уже можете начинать экспериментировать с ними.
На следующем уроке мы окунемся в использование входов, выходов и более сложные вещи с использованием Arduino.
Полный первый видеоурок от Джереми Блума приведен на видео ниже:
Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!
Arduino работа с массивами
Массивы
Массивы (arrays) — именованный набор однотипных переменных, с доступом к отдельным элементам по их индексу.
Объявление массивов
Ниже приведены несколько корректных вариантов объявления массивов:
Массив может быть объявлен без непосредственной инициализации элементов массива, как в случае массива myInts.
Массив myPins был объявлен без явного задания размера. Компилятор сам посчитает фактическое количество элементов и создаcт в памяти массив необходимого размера.
Размер может быть задан явно, одновременно с инициализацией элементов массива. Обратите внимания, что при создании массива типа char, необходим дополнительный элемент массива для нулевого символа. Подробнее см. строки.
Доступ к элементам массива
Индексация массива начинается с 0. Это значит, что для массива с 10-тью элементами, индекс 9 будет последним:
Присваиваем значение элементу массива:
Возвращаем значение элемента массива:
Массивы и FOR циклы
Чаще всего для перебора элементов цикла используется цикл for, счетчик цикла используется как индекс для доступа к каждому элементу массива. Например, для вывода массива через Serial порт можно использовать следующий код:
Массивы
Массивы (arrays) — именованный набор однотипных переменных, с доступом к отдельным элементам по их индексу.
Объявление массивов
Ниже приведены несколько корректных вариантов объявления массивов:
Массив может быть объявлен без непосредственной инициализации элементов массива, как в случае массива myInts.
Массив myPins был объявлен без явного задания размера. Компилятор сам посчитает фактическое количество элементов и создаcт в памяти массив необходимого размера.
Размер может быть задан явно, одновременно с инициализацией элементов массива. Обратите внимания, что при создании массива типа char, необходим дополнительный элемент массива для нулевого символа. Подробнее см. строки.
Доступ к элементам массива
Индексация массива начинается с 0. Это значит, что для массива с 10-тью элементами, индекс 9 будет последним:
Присваиваем значение элементу массива:
Возвращаем значение элемента массива:
Массивы и FOR циклы
Чаще всего для перебора элементов цикла используется цикл for, счетчик цикла используется как индекс для доступа к каждому элементу массива. Например, для вывода массива через Serial порт можно использовать следующий код:
Массивы
Массив (array) – это совокупность переменных одного типа, к которым обращаются с помощью общего имени и индекса, т.е. номера элемента в массиве. По сути это набор переменных, которые называются одним именем и имеют личные номера. Для объявления массива достаточно указать квадратные скобки после имени переменной, тип данных – любой. Самый важный момент при всём этом – компилятор должен заранее знать, сколько ячеек будет содержаться в массиве, т.к. во время работы программы это количество не может меняться, потому что под массив выделяется память, и он находится в памяти например между двумя другими переменными. Размер массива – величина фиксированная (если это не динамический массив. Но с таким на Ардуино не работают). Указать компилятору размер массива можно двумя способами: явным числом в квадратных скобках, либо при объявлении сразу присвоить в каждую ячейку значение, тогда компилятор сам посчитает их количество. Рассмотрим пример объявления массива разными способами:
Обращение к элементу массива осуществляется точно так же, в квадратных скобках. Важно помнить, что счёт в программировании начинается с нуля, и первый элемент массива имеет номер 0 (ноль):
Выше мы рассмотрели одномерные массивы, в которых элементы определяются просто порядковым номером. Можно задавать и многомерные массивы, в которых элемент будет иметь несколько номеров. Например двумерный массив, он же матрица, он же таблица, каждый элемент имеет номер строки и столбца. Задаётся такой массив вот так:
Очень важно помнить, что при объявлении массива с вручную вписанными данными нужно обязательно указать размер количества ячеек в измерении на 1 меньше размерности массива (для двумерного – обязательно указать размер одного из измерений, для трёхмерного – два, и т.д.).
В рассмотренном выше двумерном массиве myMatrix элемент с адресом 0, 2 (строка 0 столбец 2) имеет значение 12. Обращение к этому элементу например с целью перезаписи будет выглядеть так:
Очень полезным бывает массив строк (массивов букв), позволяющий упорядоченно хранить названия пунктов меню или других подобных вещей. Такой массив должен быть объявлен при помощи адресного оператора * (звёздочка):
Обращение к names[2] поможет вывести слово Stop в монитор порта или на дисплей, например
Но к этому мы ещё вернёмся в будущем.
С элементами массивов можно производить такие же действия, как с обычными переменными, т.е. всю математику, которую мы рассматривали в предыдущем уроке, также не стоит забывать, что массивом может быть почти любой тип данных: целочисленные, дробные, массив структур… Область видимости точно так же применяется к массивам, ведь массив – это обычная переменная.
Видео
Гирлянда на Arduino c переключением эффектов
uint8_t L=1; //Объявляем глобальную переменную L, и присваиваем ей значение
void setup() {
// Конфигурируем цифровые выводы под номерами 3,4,5,6,7 на выход,а 8 вывод на вход.
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, INPUT);
digitalWrite(8, HIGH); //Притягиваем 8 вывод к единице.
}
// Пишем программу которая будет крутиться в бесконечном цикле,
//пока мы не нажмем кнопку Reset, или не подадим питание заново.
void loop()
{
if( L == 1 ) //Если счетчик L равен 1, то выполняем условие.
{
while(true) //Открываем Бесконечный цикл.
{
for ( uint8_t a = 2; a < 8; a++) //Прогоняем цикл, присваиваем перемепнной a значение 2, при условии, если a < 8, увеличиваем a, на единицу.
{if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;};return;} /*Опрашиваем вывод 8 ардуино, если там присутствует лог. 0, то выполняем условие.
Ждем задержку, увеличиваем значение счетчика на единицу, Если счетчик равен 6, то выходим в основной цикл. */
digitalWrite(a, HIGH); // Подаем на вывод имеющий значение переменной а, логическую единицу.
delay(100); //Ожидание 100 миллисекунд.
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;};return;}
digitalWrite(a, LOW); // Подаем на вывод имеющий значение переменной а, логическую единицу.
delay(100);
}
}
}
if( L == 2 )
{
while(true)
{
{for ( uint8_t b = 8; b > 2; b—)
{
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;};return;}
digitalWrite(b, HIGH);
delay(100);
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;};return;}
digitalWrite(b, LOW);
delay(100);
}
}
}
}
if( L == 3 )
{
while(true)
{
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;};return;}
digitalWrite(7, HIGH);
digitalWrite(3, HIGH);
delay(100);
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;};return;}
digitalWrite(7, LOW);
digitalWrite(3, LOW);
delay(100);
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;};return;}
digitalWrite(6, HIGH);
digitalWrite(4, HIGH);
delay(100);
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;};return;}
digitalWrite(6, LOW);
digitalWrite(4, LOW);
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;};return;}
digitalWrite(5, HIGH);
delay(100);
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;};return;}
digitalWrite(5, LOW);
}
}
if( L == 4 )
{
while(true)
{
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
digitalWrite(7, HIGH);
digitalWrite(6, LOW);
digitalWrite(5, HIGH);
digitalWrite(4, LOW);
digitalWrite(3, HIGH);
delay(50);
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
digitalWrite(7, LOW);
digitalWrite(6, HIGH);
digitalWrite(5, LOW);
digitalWrite(4, HIGH);
digitalWrite(3, LOW);
delay(50);
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
digitalWrite(7, HIGH);
digitalWrite(6, LOW);
digitalWrite(5, HIGH);
digitalWrite(4, LOW);
digitalWrite(3, HIGH);
delay(50);
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
digitalWrite(3, LOW);
delay(50);
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
digitalWrite(3, HIGH);
delay(50);
}
}
if( L == 5 )
{
while(true)
{
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
digitalWrite(7, HIGH);
digitalWrite(6, LOW);
digitalWrite(5, LOW);
digitalWrite(4, LOW);
digitalWrite(3, LOW);
delay(50);
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, LOW);
digitalWrite(4, LOW);
digitalWrite(3, LOW);
delay(50);
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, LOW);
digitalWrite(3, LOW);
delay(50);
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
digitalWrite(3, LOW);
delay(50);
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
digitalWrite(3, HIGH);
delay(50);
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
digitalWrite(3, LOW);
delay(50);
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, LOW);
digitalWrite(3, LOW);
delay(50);
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, LOW);
digitalWrite(4, LOW);
digitalWrite(3, LOW);
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
digitalWrite(7, HIGH);
digitalWrite(6, LOW);
digitalWrite(5, LOW);
digitalWrite(4, LOW);
digitalWrite(3, LOW);
delay(50);
if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
digitalWrite(7, LOW);
digitalWrite(6, LOW);
digitalWrite(5, LOW);
digitalWrite(4, LOW);
digitalWrite(3, LOW);
delay(50);
}
}
}
Строим роботов и другие устройства на Arduino.

На протяжении тысячелетий люди усовершенствовали орудия труда, изучали силы природы и подчиняли их себе, использовали их энергию для работы машин, а в прошлом веке создали машины, которые могут управлять другими машинами. Теперь создание устройств, которые взаимодействуют с физическим миром, доступно даже школьнику.
My Cadence для Arduino, дисплей DIY Cadence для велоспорта в помещении
Это официально, мой праздничный взлом официально завершен! На прошлой неделе я запустил и запустил новое приложение под названием My Cadence для iOS и Android. Это простое приложение для отображения частоты вращения педалей — идеальная пара для моего недавнего велотренажера DIY за 400 долларов, который я использовал для занятий Peloton и Apple Fitness +. Однако мой праздничный взлом не был завершен, пока я не перевел My Cadence на третью и последнюю платформу … Arduino! Что вызвало у меня интерес, так это то, что Snowzach опубликовал на HackerNews свой проект Arduino, который отображал данные датчиков Echelon Bike на ESP32.Его проект был блестящим, поскольку в нем была вся логика для сканирования, подключения и чтения данных с велосипеда Echelon. С его кодом в руке я начал форкнуть его и заставить работать с любым датчиком частоты вращения педалей, и в результате получился My Cadence для Arduino!
Верно! То, что вы видите выше, — это данные датчика в реальном времени, считываемые с моего датчика Moofit Cadence на моем спин-байке. Приложение будет автоматически сканировать устройства в течение 10 секунд, а затем автоматически подключиться к датчику, если он обнаружен. После этого отобразится ваша текущая частота вращения педалей и шкала частоты вращения педалей от 0 до 120.Что действительно удивительно, так это то, что эта красивая маленькая плата ESP32 Arduino стоит всего 18 долларов!
Вот что вам понадобится для его запуска:
Требуется оборудование
Во-первых, вам понадобится плата ESP32 с низким энергопотреблением Bluetooth. Я рекомендую плату MakerFocus ESP32 Arduino, а также опциональные батареи и микрокабель USB, если у вас его нет:
Совместимые датчики
Конечно, вам понадобится датчик для вашего велосипеда. Любой из основных линейных датчиков должен работать нормально:
Clone, Build, & Run
Затем просто следуйте простым процедурам настройки и установки в моем проекте GitHub.Это поможет вам настроить Arduino Studio, библиотеки и плату ESP32, а также необходимые дополнительные библиотеки. После этого развернитесь на своем устройстве, и вы отправляетесь в гонки!
Happy Spinning
Надеюсь, теперь есть версия My Cadence, которая подойдет вам и вашему велосипеду. Еще раз спасибо Snowzach и его проекту на GitHub за его вдохновение и код, чтобы это произошло.
Ссылки на сторонние сайты могут содержать партнерские ссылки, которые позволяют вам найти элементы, упомянутые на этом сайте.Хотя этот сайт может зарабатывать минимальные суммы, когда читатель использует ссылки, читатель НИКОГДА не обязан использовать эти ссылки. Спасибо за поддержку!
»Заблуждения об Arduino 2: Arduino« медленный »
Что касается второго поста о заблуждениях Arduino, то распространено распространенное мнение, что Arduino «медленный». Чаще всего я слышу это в контексте реакции на ввод пользователя, работы с несколькими датчиками, использования светодиодных или ЖК-дисплеев или действия как часть контура управления.Люди советуют более быстрые микроконтроллеры, такие как серия ARM Cortex.
Давайте посмотрим на основы здесь:
- ATmega328P на платах Arduino работает на частоте 16 МГц — это 16 миллионов циклов в секунду.
- Инструкции ATmega328P занимают от 1 до 3 тактовых циклов (за исключением инструкций, связанных с подпрограммами, которые занимают 4 или 5 циклов). Среднее значение составляет где-то между 1 и 2 для большинства скомпилированного кода C.
- Тогда мы можем сделать вывод, что ATmega328P может выполнять не менее 8 миллионов инструкций в секунду!
- Трудно напрямую перевести эти инструкции в строки кода C.То, что кажется простым в C, может содержать десятки инструкций, а то, что кажется сложным, можно сделать за одну.
- Мы все еще можем сказать, что ATmega328P разорвет ваш код со скоростью узлов, намного быстрее, чем думает большинство людей.
Так почему люди говорят, что это медленно? Я бы назвал следующие причины:
- Это 16 МГц, а компьютеры и телефоны большинства людей работают в диапазоне 1 ГГц, так что это не так уж много. Однако ATmega328P выполняет совершенно другие задачи.
- Это 8 бит, а большинство современных процессоров 32 или 64 бит.
Это не имеет большого значения для проектов, использующих Arduino (но это будет связано с моим следующим заблуждением!).
- Частое использование delay () в коде Arduino. Delay () заставляет процессор просто работать — он не может делать ничего другого во время работы. Итак, если у вас есть 4 кнопки, которые предназначены для включения 4 соответствующих светодиодов на 2 секунды, система перестает отвечать, если вы используете delay () для 2 секунд.
- Частое использование Serial.print () в большинстве кодов для отладки или отчетов о состоянии. Arduino pre-1.0 используется для блокировки при отправке данных через последовательный порт. Это означало, что вывод 80-символьной строки со скоростью 9600 бит / с (по какой-то причине по умолчанию) занимал бы более 80 мс, в течение которых процессор больше ничего не мог делать! Даже сейчас, когда используются прерывания, вывод строк по-прежнему занимает много времени.
- Slow digitalRead и digitalWrite — эти две функции на порядки (~ 60 циклов) медленнее, чем прямой доступ к порту (~ 1 цикл!).
В результате тяжелый ввод-вывод может выглядеть медленным или скрытым.
- Плохой код — Arduino исключительно прост в использовании без понимания каких-либо основополагающих концепций микроконтроллеров. В результате код иногда бывает просто плохим.
Более быстрый микронный контроллер может замаскировать некоторые из этих проблем, но без понимания некоторых ключевых концепций (обработки прерываний и хорошо структурированных конечных автоматов) вы снова столкнетесь с той же стеной в кратчайшие сроки.
Нельзя сказать, что более быстрые микроконтроллеры иногда не нужны — для чего-то с тяжелой обработкой чисел требуется нечто большее, — но для многих ситуаций Arduino более чем способна в руках хорошего разработчика.
Эта запись была размещена в Arduino, Без категории и помечена как arduino. Добавьте в закладки постоянную ссылку.Умная система освещения велосипеда Arduino
Как сделать умную систему освещения велосипеда Arduino
Этот проект освещения велосипеда Arduino улучшает свет вашего велосипеда и выводит его на новый уровень, так что подсветка велосипеда автоматически уведомляет других, когда вы поворачиваете.
Мы использовали Arduino UNO в качестве основного микроконтроллера (при необходимости используйте Nano или Pro mini для уменьшения размера), акселерометр для определения трех осевых направлений и Neopixel для мигания светодиодов в соответствующем направлении движения.
Описание
- Мигает зеленым в направлении поворота (например, поворот налево или направо)
- Становится красным, когда вы едете вперед.
Используемые компоненты
Компоненты оборудования:
- Микроконтроллер Arduino (например, UNO или Nano, Pro mini)
- Акселерометр (например, Sparkfun MMA845Q)
- Стик Adafruit Neopixel (или вы можете построить его самостоятельно, используя светодиоды ws2812b)
- Резисторы (эл.г 330 Ом)
Программные компоненты:
IDE для Arduino
Вехи
Прочитать основы Arduino (уровень: новичок)
1. Определите диапазон результатов акселерометра
На этом этапе вы должны определить направление X, Y и Z влево и вправо. Обратите внимание на положение акселерометра во время тестирования, так как позже вам придется разместить датчик в том же положении на велосипеде.
Вы можете просто загрузить.ino на Arduino, откройте монитор последовательного порта и обратите внимание на поток чисел по 3 осям (X, Y и Z). Убедитесь, что скорость передачи установлена на 9600, чтобы вы могли видеть фактические результаты.
Эти числа соответствуют X, Y и Z соответственно, поэкспериментируйте с изменением чисел, когда вы поворачиваете направо и налево, и когда вы держите свой велосипед Arduino освещенным прямо.
Это были мои значения, когда я подключил подтягивающий резистор 330 Ом к контактам A4 и A5; вы получите другие значения, если используете другие значения резисторов.
2. Создайте свою собственную схему освещения велосипеда Arduino с помощью адресуемых светодиодов
Одно из преимуществ этих пикселей «WS2812b» состоит в том, что они адресуемы, что дает вам широкий спектр творческих идей освещения. В следующем посте я расскажу, как создать свой собственный пиксельстик с использованием светодиодов ws2812b.
Я выбрал только 2 цвета (зеленый и красный) для моей системы освещения велосипеда Arduino, но вы можете добавить больше цветов в свой узор, смешав значения RGB, как показано здесь.
Проявите творческий подход с этим !!
3. Соедините два кода вместе
Просто соедините коды вместе, определив шаблон для начала для каждого направления.
Аппаратные соединения
Эскиз
Arduino IDE: оператор инкремента и декремента
Оператор инкремента
Оператор инкремента — это арифметический оператор Arduino, который увеличивает целочисленную переменную на единицу.Это полезно в определенных типах петель.
Две возможные структуры оператора приращения:
- Имя_переменной ++: Поскольку знак ‘ ++’ стоит после имени переменной, это операция приращения после .
Это означает, что переменная — первая , используемая в операторе, и увеличивается на после выполнения оператора.
- ++ Имя переменной: Поскольку знак ‘++’ стоит перед именем переменной, это операция приращения с до .Это означает, что переменная увеличивается на перед выполнением инструкции .
Пример, показывающий работу операции приращения post :
Пример, показывающий работу операции приращения до :
Убедитесь, что ваш ребенок достаточно знаком с такими футуристическими технологиями, как ИИ, с помощью практического опыта с использованием наборов ИИ для детей, таких как Quarky. Зарегистрируйтесь сегодня, чтобы воспользоваться специальными предложениями по этому набору AI, которые скоро появятся.
Оператор уменьшения
Оператор декремента используется для уменьшения целочисленной переменной на значение единицы.
Две возможные структуры оператора приращения:
- Имя_переменной — -: Поскольку знак ‘ -‘ стоит после имени переменной, это операция уменьшения после . Это означает, что переменная — первая , используемая в операторе, и уменьшенная на после выполнения оператора.
- — — Имя_переменной: Поскольку знак ‘ -‘ стоит перед именем переменной, это операция декремента до . Это означает, что переменная уменьшается на перед выполнением инструкции .
Пример операции после операции уменьшения
Пример операции уменьшения до :
Интеллектуальная езда на велосипеде с Arduino
Мне нравится кататься на велосипеде регулярно, будь то поездка по городу, поездка на работу, отдых или фитнес.Иногда я думаю об объединении этого с микроконтроллером, таким как Arduino Nano или Raspberry PI.
Очевидное место для этой темы — велосипедный «спидометр» и GPS. Я уверен, что это будет забавное упражнение, и оно откроет множество возможностей для развития концепции, выходящей за рамки того, что предоставляется на коммерческой основе.
Магнитный датчик на эффекте Холла можно купить менее чем за фунт, и он позволит нам измерять скорость вращения колеса и обороты кривошипа, то есть частоту вращения педалей.
Доступен относительно дешевый GPS-навигатор, который можно подключить по последовательным линиям — RX / TX.В этом случае я бы попробовал Neo 6M, который я видел за 7-9 фунтов стерлингов.
Небольшой 2-3-дюймовый OLED-дисплей или ЖК-экран Hitachi 16×2 можно использовать для предварительной информации о кабине. Или же светодиоды и вибромоторы могут обеспечить альтернативную форму обратной связи.
Вот моя версия спидометра со звуковой обратной связью при каждом повороте колеса и пульсирующим светодиодом.
Я подозреваю, что это может нарушать некоторые региональные или местные законы или ограничения, так что лучше изучите эту идею, прежде чем отправиться на тестовую поездку.
Клейкие и водонепроницаемые светодиодные ленты-светильники сравнительно недорого можно купить на Дальнем Востоке. Он может быть обернут вокруг верхней и нижней трубы, задних перьев или даже подседельной трубы — может быть, всех сразу. Недостатком является то, что более дешевые светодиодные ленты работают при напряжении 12 В и могут потреблять значительный ток, а это означает, что вам может потребоваться носить с собой сильноточную батарею на вашем велосипеде.
Ультразвуковой датчик HC-SR04 можно купить за 1–2 фунта стерлингов, он обеспечивает измерение и показание от 2 до 250 см.Идея заключалась в том, чтобы установить датчик либо сбоку, либо назад.
Дальномер, установленный против направления движения, предупреждает об автомобилях, приближающихся за вами и собирающихся обгонять вас, или приближающихся слишком близко. Низкотехнологичной альтернативой было бы крыльевое зеркало.
Я прикрепил эту версию к своему байку и отправился на тестовую поездку — позади меня подошел фургон и последовал за мной 200 футов, но датчик не сработал.