"Программировать Ардуино, это тоже самое что учить собаку приносить палку"— это не мой афоризм, так написал мне Ник. Он вышел на пенсию, ему больше не надо было ходить на работу в лабораторию в маленьком городке в Пенсильвании, и он разрывался между желаниями постранствовать по стране, воплотить мечту детства — иметь дома свою железную дорогу, или открыть собственный бизнес по производству игрушечной мебели. Как любой американец, Ник очень практичен и, напоровшись на мой сайт (он тогда был англоязычным), быстро посчитал выгоду и решил, что детская мечта самый дешевый вариант, если юзать мой проект. И вот тут я совершил ошибку. Я стал засыпать его примерами и скетчами. Ник очень успешно следовал всем рекомендациям, запускал свои поезда, переключал стрелки. Именно тогда, воодушевленный своими (нашими) успехами он и написал фразу вынесенную в заголовок. Но как только дело дошло до самостоятельного создания скетчей, Ник сдулся и... отправился путешествовать по США.
Я запомнил эту историю, случившуюся в далеком 2016 году, так как она была первой в бесконечной череде совершенно однотипных последующих. Ибо страшное слово ПРОГРАММИРОВАНИЕ имеет настолько дурную коннотацию среди обычных нормальных людей среднего и старшего возраста, что даже если стоит выбор между выращиванием гортензий или кактусов, что совсем, по моему мнению, не мужское занятие, и изучением микросхемы предназначенной для управления электронными устройствами (это так невразумительно объясняется в википедии что такое микроконтроллер в общем и Ардуино в частности), то выбирается первое.
Да я бы и сам никогда в жизни не стал разбирать этот, в большинстве случаев, словесный хлам, который по странному стечению обстоятельств называют документацией или учебниками по программированию, если бы мне по жизни не попались программисты которые любили свое ремесло и не чурались его объяснять простым понятным языком и примерами. А еще никому не хочется возвращаться в школьные годы и УЧИТЬСЯ — такое же отвратительное слово как и программирование. Так как же ЗАСТАВИТЬ (ага, вот попробуй меня заставить что-то сделать, счаз...) моделиста понять зачем ему нужен Ардуино?
Хороший вопрос, как известно, уже половина ответа. Итак вот ответ:
Ардуино это не просто дешево, это очень дешево. А еще и быстро. Не в смысле быстро работает (хотя и это тоже), а быстро дает готовое решение.
Теперь имея на вооружении такую мотивацию попробуем разобраться что такое платформа Ардуино не в виде восторженных описаний типа : "Внутре, смотрите, у нее анализатор и думатель…" © Стругацкие, а что же такое микроконтроллер, как он работает, и зачем он нужен моделистам. Посему зайдем с тылов :).
Древняя музыкальная шкатулка
и программирование Ардуино
Нет более понятного примера для того, что по настоящему означает термин программирование, чем старинный музыкальный ящик. Надо только было завести пружину, нажать рычаг запуска и звучала мелодия. Иголки на цилиндре расположены определенным образом, и если поменять его на другой, то меняется и мелодия. Иными словами цилиндр с иголками это программа, замена цилиндров это смена программы, а изготовление цилиндра с конкретной мелодией это программирование.
Также тупо работают самые простые микроконтроллеры придуманные в конце прошлого века. К счастью Ардуино НАНО (УНО) используют именно такой элементарный микроконтроллер ATmega 328. Когда вы включаете питание (аналог дергания ручки запуска музыкального ящика) запускается виртуальный цилиндр, который будет бесконечно вращаться повторяя снова и снова "мелодию" вашего кода. Так как это не многозадачный компьютер, а маленький чип, то программа только одна (в терминах Ардуино она называется скетч, а у программистов тоже самое называется прошивкой) и она выполняется строка за строкой пока не дойдет до конца, а потом снова начнется выполняться с первой строчки в бесконечном цикле. Надеюсь, после такого вступления, вам уже не так отвратительно и непонятно слово программирование.
Теперь о строках программы (иголках виртуального цилиндра). Тем и знаменита платформа Ардуино, что в ней по прежнему применяется процедурное программирование. Это точно такая штука, как кулинарный рецепт, сравните:
- Насыпьте 10 грамм чая в чашку
- Налейте 200 миллилитров кипятка
- Подождите 4 минуты
и
- Включить светодиод
- Подождать одну секунду
- Выключить светодиод
- Подождать половину секунды
Во втором случае это немного измененный скетч Blink, попробуйте его поменять прямо сейчас и загрузить ваш скетч в Ардуино. Если получилось, то читаем дальше :)
Пины (GPIO) Ардуино и ветвление кода
Продолжая аналогию с музыкальным цилиндром который дергает за струны гребенки, в Ардуино есть контакты которые позволяют ему общаться со внешним миром и издают "звуки". По умному они называются Интерфейс ввода/вывода общего назначения (GPIO), а по народному пины. Но на моем канале не то место, где можно бросаться аббревиатурами, так что проще:
Когда вы пишете digitalWrite(LED_BUILTIN, HIGH) не происходит никакой магии, микроконтроллер "пробрасывает" напряжение питания на пин D13, выступая как простой выключатель . А так как к пину номер 13 параллельно подключен встроенный светодиод , то он и загорается. То же самое digitalWrite(LED_BUILTIN, LOW) — "виртуальный" контакт размыкается и светодиод гаснет. То есть все что может сделать микроконтроллер по вашему коду с пинами в режиме вывода, это либо включить их, либо выключить. Иными словами либо на пине будет напряжение питания (HIGH), либо значение близкое к нулю вольт (LOW). Важно отметить именно про напряжение питания, ATmega 328 уверенно фурычит при напряжениях от 3 до 5.5 вольт, а это значит что именно такое напряжение будет на пине при его высоком уровне.
А как же сенсоры или кнопки, они же наоборот сообщают из внешней среды вашему коду и микроконтроллеру о том, что что то произошло. Тут аналогия с музыкальным ящиком терпит фиаско, так как Ардуино все же лучше. Дело в том, что вы можете перевести любой пин в режим замера внешнего напряжения, или режим входа. И при изменении уровня напряжения от внешнего устройства, заблокировать или наоборот выполнить какой то кусок кода внутри бесконечного цикла. Это и есть ветвление.
Вот так, вкратце, выглядит физика и простая логика Ардуино младшей линейки. Все остальные приемы программирования скетчей опираются именно на операции с состоянием или измерением пинов во времени. Так что любой микроконтроллер это сразу и любые реле времени, и любая изощренная бинарная логика, и контроль внешних воздействий с соответствующей реакцией на них по вашему алгоритму. Как только вы начнете думать об Ардуино, как о множестве очень быстрых переключателей (ну или реле) под вашим контролем с выходами на пины, вместо представления о том, что это компьютер — все значительно упростится.
Я написал этот абзац для моделистов которые уверенно манипулируют сложными релейными схемами и даже применяют TTL чипы с бинарной логикой. Ребятыыы.... Микроконтроллер это тоже самое. Только его установить и запрограммировать проще, быстрее и дешевле, чем все что вы делаете. Сборка множества ваших чипов И, НЕ, ИЛИ и пр. заменяется несколькими строками кода, про релейные логические системы я вообще промолчу. И что для вас будет приятным подарком, вы можете использовать любые пины. Переписать два символа в заголовке скетча гораздо проще, чем перепаивать провода на выходе логических чипов.
Практика
Ну и статья была бы неполной, если бы я не пояснил картинку с сервоприводом и стрелкой. Пост "Как в 2024 году построить макет и не разориться" немного откомментировал товарищ Aver2000 и мы слегка подискутировали. Он хотел готового решения его проблемы — настройки углов 20-и серв которые стоят у него на строящемся макете на чердаке. Я бы просто взял на чердак ноутбук, немного поменял скетч SerialEvent по материалам моего сайта под управление сервой из Терминала, и последовательно обходя стрелки определил их угловые положения.
Но, как и у многих моделистов (и я это понимаю) у него нет никакого желания изучать Проект URB, и использовать гораздо более эффективные конструкции — он опирается на привычные ему методы. Вот бы сделать маленькую коробочку-тестер с Ардуино с батарейкой внутри и кнопками снаружи, и без всяких компьютеров и индикаторов настраивать сервопривод прямо подключая его к Ардуино написал он .
Ну... Вызов принят. Вот не хотел я вас пугать здесь конкретным кодом, но все претензии к Aver2000. Итак нужны три кнопки, выключатель питания, Ардуино НАНО (или УНО), три батарейки AA и несколько проводов с клеммами Dupont . Две кнопки: К НУЛЮ и К 180, однократное нажатие которых поворачивают серву на 10 градусов в противоположных направлениях (можно в скетче изменить этот угол на любой другой). Средняя кнопка принудительно вращает серву в центральное положение — 90 градусов. Вот рецепт настройки который я реализовал через алгоритмы в скетче для этой коробочки:
- Подключаем серву
- Включаем питание (серва принудительно проворачивается до центрального положения)
- Нажимая кнопку К НУЛЮ последовательно, с дискретностью 10 градусов приближаемся к нужному положению остряков стрелки.
- Вспоминаем сколько раз нажали. Умножаем это число на 10, отнимаем от 90 и получаем желаемый угол. Записываем.
- Нажимаем кнопку 90. После этого запоминаем сколько раз нажали К 180 до альтернативного положения остряков.
Умножаем это число на 10 и прибавляем к 90. Записываем. - Выключаем питание, отключаем провода сервопривода и переходим к следующей стрелке.
После чего вытаскиваем плату Ардуино НАНО и используем его в других проектах. Безусловно можно добавить индикатор и сразу показывать углы на экранчике, но цель в том, чтобы вы убедились как элементарно применять Ардуино.
Схема
Скетч
#include <Servo.h>
Servo SRV;
unsigned long millisDenoiseButtons;
int servo_angle = 90;
void setup() {
SRV.attach(12);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
//pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
if (millis() - millisDenoiseButtons >= 600) {
if (digitalRead(2) == LOW) { // К НУЛЮ
servo_angle = servo_angle - 10;
if (servo_angle < 0) servo_angle = 0;
}
if (digitalRead(3) == LOW) { // К 180
servo_angle = servo_angle + 10;
if (servo_angle > 180) servo_angle = 180;
}
millisDenoiseButtons = millis();
}
SRV.write(servo_angle);
}
Я потратил на написание этого скетча 10 минут. Надеюсь вы убедились, что микроконтроллер эта такая универсальная штука, которая делает за вас всю рутину. И поэтому они трудятся в стиральных машинах и кофеварках, управляют двигателем вашего автомобиля, открывают вам двери с домофонами и бесконечное прочее. Причина по которой их прикручивают ко всему к чему можно, что это очень просто и, повторюсь, очень дешево. Так давайте этим пользоваться.