Прощай Arduino IDE, да здравствует PlatformIO ! — DRIVE2
Эта запись предназначена для тех,чьи проекты уже давно вышли за рамки банального Blinka.И давайте сначала расставим все точки над i.Что такое Ардуино.
НЕТ!На самом деле это не те, привычные многим на вид платкина микроконтроллерах AVR !И нет, это не среда разработки, которая к слову,достаточно МОЩНАЯ, но мало функциональная с точки зрения удобства использования,и рассчитанная больше для начинающих.
И для многих будет удивлением, что Arduino IDE,понимает и свой язык “wiring/processing”,который своего рода упрощённый Си,так же понимает полноценный Си ++, ассемблер, ООП,практически всё, что необходимо даже профессиональному программисту, она понимает.
Но увы, она не на столько функциональна и удобна,как более профессиональные среди разработки.И так, что же означает “Ардуино”:А всё просто… Это инфраструктура…Нельзя взять просто микроконтроллер Атмега328
и назвать его Ардуино…
(из вики)Arduino — торговая марка аппаратно-программных средствдля построения простых систем автоматики и робототехники, ориентированная на непрофессиональных пользователей.
Программная часть состоит из бесплатной программной оболочки (IDE) для написания программ, их компиляции и программирования аппаратуры.
Аппаратная часть представляет собой набор смонтированных печатных плат, продающихся как официальным производителем,так и сторонними производителями.Полностью открытая архитектура системы позволяет
свободно копировать или дополнять линейку продукции Arduino.
А соответственно,исходя из всего вышенаписанного,это не даёт права одним (особенно любителям ARM),осуждать других (любителям AVR и Arduino)за то, что они выбрали “не ту торговую марку” для своих проектов.
Если человеку хватает, знаний написатьморгалку-ногодрыгалку от нажатия кнопки и большего ему не надо,то это его право и все осуждальщики идут лесом.
Если человек вырос в более серьёзные проекты,ему этого хватает, но он не собирается никуда переходить,его всё устраивает, то опять же это его дело и его право…А вот если человеку его знаний не хватает, для реализации необходимого функционала,но он лениться учиться и развиваться далее, вот за это можно и…
нет, не осудить, а направить ну путь правильный.
Arduino IDE, это отличная стартовая площадка,но именно стартовая.На ней можно и оставаться и делать очень, очень серьёзные проекты,но когда это уже превращается практически в работу,то вопрос удобства “встаёт ребром”И человек начнёт понимать,
что есть куда удобней срЕды разработки.
И вот он, как раз настал момент,когда можно попробовать писать код для любимых микроконтроллеров,почти любых, “по взрослому”
На ютубе, Алекс Морозов на своём канале
Выпустил хороший ролик, как безболезненноперейти на более взрослую среду разработки
Visual Studio Code + PlatformIO (скачать).
У него на канале кстати очень много интересных уроков
по программированию микроконтроллеров.
И да, тем кто не хочет застревать на одном уровнеи пусть даже не хочет никуда переходить с Ардуино ИДЕ,начните изучать чистый С++ и ООПи вы поймёте, на сколько можно сделать более удобным,красивым и правильным свой код,расширить функционал своих программ,да и просто выйти на другой уровень программирования.
Уроков по СИ++ и ООП в сети валом, на любой вкус и цвет.
Платформа Arduino как система программирования для микроконтроллеров AVR завоевала заслуженную популярность. Платы Arduino стали очень дешевы (не фирменные конечно, а те, которые делают китайцы и продают на ebay, aliexpress и dx.com), примеров кода очень много, среда программирования и язык хорошо описаны, для большинства электронных устройств и микросхем написаны готовые библиотеки. Однако профессионалы и радиолюбители, которые уже имеют минимальный опыт работы с микроконтроллерами, часто говорят про Arduino с отвращением, и предпочитают использовать традиционные инструменты разработки (avr-libc + gcc, WinAVR, AVR Studio, IAR). Почему?Если Вы относитесь к абсолютным новичкам, которые ничего (или почти ничего) не понимают в схемотехнике, и совсем не умеют программировать (но очень хотят научиться), то вариантов для Вас нет – Arduino подойдет лучше всего. Если Вы продвинутый радиолюбитель, то из Arduino ничего полезного для себя не получите, Вы и так знаете что делать и как превратить микроконтроллер в рабочее устройство. Но если сомневаетесь в выборе, что для Вас лучше, то нужно изучить вопрос поподробнее – в чем преимущество каждого метода программирования?Для того, чтобы понять, в чем тут дело, давайте бросим общий взгляд на принципы программирования в Arduino и на обычном GCC (язык C). Условно назовем программирование на Arduino как AVR Arduino, и традиционное программирование как AVR GCC. Для тестов возьмем обычную Arduino-совместимую плату metaboard [1] (микроконтроллер ATmega328P), попробуем написать для неё код AVR Arduino и код AVR GCC, и подробно разберем, в чем разница.В качестве примера разберем традиционный HelloWorld для микроконтроллеров – мигание светодиодом. Сравнивать обе системы будем по следующим параметрам, которые особо важны для новичков:• Среда программирования• Обзор языка, как построена программа• Как прошивать программу в память микроконтроллера платы• Отладка программы• Цена железа• Эффективность кода, дополнительные возможности[Среда программирования]Закачка и установка среды программирования AVR Arduino никаких вопросов не вызывает. Закачиваете инсталлятор, запускаете, получаете готовую среду разработки. Дистрибутив Arduino IDE 1.0.6 на момент написания статьи 141107 занимал 52.6 мегабайта.Оболочка среды разработки написана на Java, поэтому может работать на большинстве известных компьютерных систем – Windows, Linux, Mac OS. Это еще один плюс для Arduino IDE.
Основа языка программирования модуля Arduino — это язык Си (скорее Си++). Ещё точнее, этот диалект языка называется Processing/Wiring. Хорошее обозрение языка вы найдёте в приложении. А мне хочется больше рассказать не о языке, а о программировании.
Программа — это некий набор команд, которые понимает процессор, процессор вашего компьютера или процессор микроконтроллера модуля Arduino, не суть важно. Процессор читает команды и выполняет их. Любые команды, которые понимает процессор — это двоичные числа.
Это только двоичные числа и ничто иное. Выполняя арифметические операции, для которых процессор некогда и предназначался, процессор оперирует с числами. Двоичными числами. И получается, что и команды, и то, к чему они относятся, это только двоичные числа. Вот так.
Но как же процессор разбирается в этой «куче» двоичных чисел?
Во-первых, все эти двоичные числа записываются в последовательные ячейки оперативной памяти, имеющие адреса. Когда вы загружаете программу, и она начинает работать, процессор получает первый адрес программы, где обязательно должна быть записана команда.
Те команды, которые требуют от процессора операций с числами, имеют «опознавательные знаки», например, что в следующих двух ячейках памяти два числа, которые нужно сложить. А счётчик, назовём его счётчиком команд, где записан адрес следующей команды, в данном случае увеличивает адрес так, что в программе по этому адресу будет следующая команда.
При неправильной работе программы или сбоях процессор может ошибиться, и тогда, прочитав вместо команды число, процессор делает совсем не то, что должен делать, а программа «зависает».
Читайте также:Охрана автомобиля с оповещением по радиоканалу
Таким образом, любая программа — это последовательность двоичных чисел. А программирование — это умение правильно записывать правильные последовательности двоичных чисел. Достаточно давно для записи программ стали использовать специальные средства, которые называются языками программирования.
Однако любая программа в первую очередь требует от вас ясного понимания того, что должна делать программа, и для чего она нужна. Чем яснее вы это понимаете, тем легче создать программу.
Небольшие программы, хотя трудно сказать, какие программы небольшие, а какие нет, можно рассматривать целиком. Более сложные программы лучше разбить на части, которые можно рассматривать как самостоятельные программы.
Так их лучше создать, легче отладить и проверить.
Я не готов спорить, но считаю, что программу удобнее начинать с описания на обычном языке. И в этом смысле я считаю, что программирование не следует путать с написанием кода программы. Когда программа описана обычными словами, вам легче определить, например, какой язык программирования выбрать для создания кода программы.
Ближе всего к записи программы с помощью двоичных чисел, язык ассемблер. Для него характерно соответствие команд языка двоичным командам, понятным процессору.
Но кодирование программ на ассемблере требует больших усилий и ближе к искусству, чем к формальным операциям. Более универсальны и легче в применении языки высокого уровня, как Бэйсик или Си.
И давно для записи программ в общем виде используют графический язык, а в последнее время появились и «переводчики» с этого языка на язык процессоров.
Кроме языков программирования общего применения, всегда существовала некоторая специализация языков программирования, и существовали специализированные языки. К последним я бы отнёс и язык программирования модуля Arduino.
Всё, что нужно сказать модулю, чтобы он сделал что-то нужное нам, организовано в удобный набор команд. Но вначале о том, что нам нужно от Arduino?
Модуль можно использовать в разных качествах — это и сердце (или голова) робота, это и основа прибора, это и удобный конструктор для освоения работы с микроконтроллерами и т.д.
Выше мы уже использовали простые программы для проверки подключения модуля к компьютеру. Кому-то они могут показаться слишком простыми, а поэтому не интересными, но любые сложные программы состоят из более простых фрагментов, похожих на те, с которыми мы уже знакомились.
Давайте посмотрим, о чём нам может рассказать самая простая программа «Помигать светодиодом».
int ledPin = 13;
void setup()
{
pinMode (ledPin, OUTPUT);
}
void loop()
{
digitalWrite (ledPin, HIGH);
delay (1000);
digitalWrite (ledPin, LOW);
delay (1000);
}
Вначале вспомним, что такое светодиод. В сущности это обычный диод, у которого, благодаря его конструкции, при протекании тока в прямом направлении начинает светиться переход. То есть, чтобы светодиод светился, нужно чтобы через него протекал ток, а, значит, к светодиоду следует приложить напряжение.
А чтобы ток не превысил допустимого значения, последовательно со светодиодом следует включить резистор, который называют токоограничительным (см. Приложение А, цифровой выход). Напряжение к светодиоду прикладывает микроконтроллер, составляющий основу модуля Arduino.
У микроконтроллера, кроме процессора, выполняющего наши команды, есть один или несколько портов ввода-вывода.
Не вдаваясь в рассмотрение конкретного устройства порта, скажем так — когда вывод порта работает на выход, его можно представить как выход цифровой микросхемы с двумя состояниями, включено и выключено (есть напряжение на выходе, нет напряжения на выходе).
Но этот же вывод порта может работать и как вход. В этом случае его можно представить, например, как вход цифровой микросхемы – на вход подаётся логический уровень, высокий или низкий (см. Приложение А, цифровой ввод).
Но процессор работает очень быстро. Мы не успеем заметить мигания. Чтобы заметить это мигание, нам нужно добавить паузы. То есть:
Включить выходной вывод порта. Пауза 1 секунда.
Выключить вывод порта.
Пауза 1 секунда.
Это наша программа. Процессор прочитает первую команду и включит вывод, светодиод загорится. Затем процессор сделает паузу в работе и выключить вывод, светодиод погаснет. Но он только один раз мигнул.
Повторение какого-либо процесса или набора команд называется в программировании циклом. Используются разные виды циклов. Есть цикл, который выполняется заданное число раз. Это цикл for.
Есть циклы, которые выполняются до тех пор, пока не будет выполнено некоторое условие, которое является частью языковой конструкции цикла.
А если условие не будет выполнено никогда, то цикл выполняется бесконечное число раз. Это бесконечный цикл.
Я не думаю, что микроконтроллеры используются с программами того вида, который приведён выше. То есть, один раз выполнено несколько команд и больше контроллер не работает. Как правило, он работает постоянно, как только на него подаётся питающее напряжение. А, значит, микроконтроллер должен работать в бесконечном цикле.
Именно об этом говорит функция void loop(), loop — это петля, замкнутый цикл. Условия прекращения работы цикла нет, а, следовательно, нет условия его завершения.
Кроме того, мы должны сообщить модулю Arduino, какой вывод порта и как мы хотим использовать, для выхода (OUTPUT) или для входа (INPUT). Этой цели служит функция void setup(), которая для языка Arduino является обязательной, даже если она не используется, и команда pinMode(), для задания режима работы вывода.
void setup()
{
pinMode (ledPin, OUTPUT);
}
И ещё, языковая конструкция использует переменные для определения номера вывода:
int ledPin = 13;
Использование переменных удобно. Решив, что вы будете использовать не вывод 13, а 12, вы внесёте изменение только в одной строке. Особенно сильно это сказывается в больших программах.
Имя переменной можно выбирать по своему усмотрению, но, как правило, оно должно быть только символьным, и часто количество символов ограничивается.
Если вы неверно зададите имя переменной, думаю, компилятор вас поправит.
Функция digitalWrite (ledPin, HIGH) устанавливает заданный вывод в состояние с высоким уровнем, то есть включает вывод.
А delay (1000), как вы уже поняли, означает паузу в 1000 миллисекунд или 1 секунду.
Осталось понять, что означают такие приставки, как int, void. Любые значения, любые переменные размещаются в памяти, как и команды программы. В ячейки памяти записываются числа зачастую из 8 битов. Это байт. Но байт — это числа от 0 до 255.
Для записи больших чисел нужно два байта или больше, то есть, две или больше ячеек памяти. Чтобы процессору было ясно, как отыскать число, разные типы чисел имеют разные названия. Так число по имени byte, займёт одну ячейку, int (integer, целое) больше.
Кроме того, функции, используемые в языках программирования, тоже возвращают числа. Чтобы определить, какой тип числа должна вернуть функция, перед функцией записывают этот тип возвращаемого числа.
Но некоторые функции могут не возвращать числа, такие функции предваряют записью void (см. Приложение А, переменные).
Вот, сколько интересного может рассказать даже самая простая программа.
Обо всём этом вы, надеюсь, прочитаете в приложении. А сейчас проделаем простые эксперименты, используя только то, что мы уже знаем из возможностей языка. Первое, заменим переменную типа int, которая занимает много места в памяти, на byte — одно место, одна ячейка памяти. Посмотрим, что у нас получится.
byte ledPin = 13;
void setup()
{
pinMode (ledPin, OUTPUT);
}
void loop()
{
digitalWrite (ledPin, HIGH);
delay (1000);
digitalWrite (ledPin, LOW);
delay (1000);
}
После компиляции и загрузки программы в модуль мы не заметим изменений в работе программы. Хорошо. Тогда изменим программу так, чтобы заметить изменения в её работе.
Для этого мы заменим число в функции delay (1000) переменной, назвав её my_del. Эта переменная должна быть целым числом, то есть, int.
Читайте также:Микрофоны импортные
int my_del = 5000;
delay(my_del);
Не забывайте заканчивать каждую команду точкой с запятой. Внесите изменения в программу, скомпилируйте её и загрузите в модуль. Затем поменяйте переменную и повторите компиляцию и загрузку:
byte my_del = 5000;
Разница, уверен, получится ощутимая.
Проделаем ещё один эксперимент с изменением длительности пауз. Уменьшение длительности пауз выполним, скажем, пять раз. Сделаем паузу в 2 секунды, а затем будем увеличивать тоже пять раз. И вновь сделаем паузу в 2 секунды. Цикл, выполняемый заданное количество раз, называется циклом for и записывается он так:
Для тех, кто не в танке или мое знакомство с Ардуино (про Ардуино вообще и про робота в частности). Часть 1
На Паркфлаере иногда проскакивают статьи про Ардуино, но они рассчитаны на тех, кто уже хоть немного, но знает, что это такое. Я же хочу рассказать о своем опыте тем, кто вообще не в курсе, что же это за зверь – Ардуино.
Заранее прошу экспертов-ардуинщиков простить меня за возможные неточности и вольности в тексте. Просто хочу, чтобы моя писанина была понятна тем, кто пока не в танке (в смысле, не в теме).
Как водится, все началось совершенно случайно – у сына скоро должно было случиться 13-летие, в результате чего остро возникла проблема поиска подарка.
Всевозможные гаджеты уже имеются, книг – полный шкаф… Модели? Мы с сыном – моделисты со стажем и уже владеем целым авиапарком, где даже кордовая модель есть, о которой я здесь как-то рассказывал:
Кордовая учебная модель самолета.+125
30 июля 2015 года в 22:56 | Александр Шаргаев Химки
Статья http://www.parkflyer.ru/blogs/view_entry/12141/
Теперь, надеюсь, вы понимаете, насколько трудно мне было подобрать подарок…Ну так что подарить-то? Естественно, хочется, чтобы было и интересно, и, главное, полезно. Давно присматривался здесь на сайте к вкладке «Электроника/роботы», где разглядывал картинки тележек на колесах с забавно торчащими во все стороны датчиками и проводами. Я по наивности думал, что это так, игрушка – собрал из деталек робота и запускаешь его по комнате. Ну да, продаются запчасти и дополнительные датчики. Ну и что? Ну, собрал робота, покатал, прикупил датчик, поставил, еще покатал, другой датчик, снова покатал… А дальше?Но все-таки, на всякий случай, решил немного поинтересоваться темой. Чисто внешне понравился вот этот робот:
В комментариях задал наводящий (в смысле, чайницкий) вопрос: типа, эту штуковину нужно просто собрать и запустить? Или еще нужен какой-то процессор, который придется прошивать (вот чего совсем не хотелось бы, дело-то весьма специфическое, да ведь еще и программатор потребуется…). Мгновенно откликнулся Евгений Песенько из Минска (пользуясь случаем, хочу его еще раз поблагодарить) – для начала, говорит, почитай-ка ты матчасть, а именно сходи на сайт http://arduino.ru/. Начал я читать… И с первых же строк настроение мое полезло вверх – это же чертовски интересная штуковина, это именно то, что нужно!Что же это за зверь такой – Ардуино? Оказывается, это семейство плат с уже установленным микроконтроллером. На платах имеются входы, к которым можно подключать огромное количество всевозможных датчиков, выходы, которые могут управлять светодиодами, электромоторами, сервами, жк-экранами, …, да почти, чем угодно! Есть даже выходы ШИМ! Не в курсе, что это? Если начнете изучать Ардуино, быстро узнаете! Также, что очень удобно, на платах имеется стабилизированное питание для подключаемых датчиков. Но, что самое главное, для программирования микроконтроллера, установленного на плате, не нужен программатор! Подключаете плату через USB-разъем к компьютеру и вперед!Программы для Ардуино (которые, кстати, называются скетчами) пишутся в специальном текстовом редакторе, который можно свободно и бесплатно скачать с вышеуказанного сайта. В данном редакторе можно также проверить скетч на ошибки, открыть мониторинг последовательной шины (ой, я уже начал умничать, пардон… говоря по простому, в режиме реального времени посмотреть, что делается на входах/выходах). Язык программирования – несколько упрощенный С++. Для тех, кто хоть немного знаком с программированием, никаких проблем не будет. Ну да, есть свои особенности у языка, но не более того. К тому же в сети имеется некоторое количество литературы и огромное количество примеров, если что, можно изучить все с нуля. Также, что радует, в свободном доступе есть библиотеки для работы с сервами, экранами и много-много еще с чем. А вообще, на платах Ардуино народ собирает не только и не столько роботов. Там и умные дома, и хитрые системы полива, и автопилоты для коптеров, и ЧПУ, и всякие управления через WI-FI/GSM, и… Чего только не делают! Оказывается, это целая неизведанная мной интереснейшая область, где, мягко говоря, есть, чем заняться!В общем, стало понятно, что в качестве подарка пацану робот Ардуино – то, что нужно. Здесь присутствует и работа руками, и головой. Причем работа головой в итоге должна привести к изучению языка программирования, а это очень полезная вещь даже не для профессионального программиста – программирование очень хорошо и полезно нагружает мозги.Но прежде, чем заказывать данный набор, сначала попробовал разобраться, из чего он состоит, и что для чего там нужно. В этом мне очень помог Дмитрий Растеряев из Невиномысска (ему еще раз огромное спасибо!). Кое что из этого набора мне пока не требовалось, всевозможные сервы у меня уже и так есть, к тому же мне, как авиамоделисту, не понравилось крепление ультразвукового датчика – вся нагрузка идет на ось сервы. Задел, и ось отломил… Вдобавок, у нас подразумевалась самостоятельная работа руками – изготовление всевозможных кронштейнов. Поэтому принял решение приобретать компоненты по отдельности.В итоге, были заказаны:Шасси:
4WD Smart Car Chassis 4 Wheel Drive Double Level K-002 For Arduino
Товар http://www.parkflyer.ru/ru/product/1567183/
Плата ARDUINO Uno, имеющая на борту 6 аналоговых входов и 14 цифровых входов/выходов (6 из которых могут использоваться как выходы ШИМ):
Arduino-Compatible R3 UNO ATmega16U2 AVR USB Board
Товар http://www.parkflyer.ru/ru/product/1563276/
Плата расширения, с помощью которой удобно подключать датчики, сервы и прочие интересные штуковины. Она просто вставляется сверху в плату Ардуино. Кстати, всякие такие доп.платы называют шилдами:
Рекомендуемое напряжение питания платы ARDUINO Uno 7-12В, поэтому был выбран вот такой контейнер для батареек:
DIY 12V 8-Slot / 8 x AA Battery Double Deck / Back To Back Holder Case Box With Leads
Товар http://www.parkflyer.ru/ru/product/1971593/
Пока шла посылка (примерно месяц), плотно изучал тему, ведь мне впоследствии это все нужно будет доходчиво объяснять сыну. Еще раз убедился в правильности выбора подарка – интересно просто невозможно! Мне, во всяком случае…Но вот наступил волнующий момент – будущий юный роботостроитель и программист распаковывает свой подарок.
Увидев там какие-то игрушечные колесики с недоумением смотрит на меня: ты чего, меня за детский садик что ли держишь? Недоумение сменилось несколько озадаченным видом, когда в коробке обнаружил красивые разноцветные платы. А это еще что такое? Это ультразвуковой датчик. А зачем?Начали потихоньку осваивать.
Читайте также:Изготовление и ввод в эксплуатацию электронных систем
Сначала помигали светодиодом (кстати, максимальный ток выхода Ардуино 40мА, поэтому нужны токоограничительные резисторы). Помигали двойными вспышками поочередно двумя светодиодами, якобы полицейская мигалка. Ага, вижу, появился интерес… На макетной плате установили восемь светодиодов и сын с азартом начал программировать всякие-разные бегущие огни.
Очень удобно: в программе сделал изменение, нажал мышкой на стрелку, залил скетч и сразу все работает! И никаких тебе блоков питания – для подобных вещей достаточно подключения по USB.Немного поняли, что к чему, теперь пришла пора заняться непосредственно роботом. Сначала взялись за шасси. Прикрутили мотор-редукторы к нижней пластине, надели на оси колеса.
Кстати, не совсем ясно, как должны держаться колеса на осях. Думали, снимаются колпачки с колес, колеса крепятся к осям саморезами и колпачки ставятся обратно, закрывая саморезы. Но колпачки снять не удалось и колеса держатся только за счет усилия посадки на оси. Посадка не очень плотная, поэтому иногда некоторые колеса начинают слезать с осей.
Приклеить? Наверное, но, в случае необходимости замены мотор-редуктора, колесо с оси уже не снимешь… Может, кто имел дело с этими колесами? Как крепили?Из обнаруженного в закромах пластика сделали ложемент для контейнера питания. Выпиливали детали, грели феном, гнули, склеивали – как и предполагалось, работа руками присутствовала в полной мере.
К платформе ложемент приклеили на двухсторонний скоч. В качестве источника тока использовали вот такие аккумуляторы:
Аккумулятор с низким саморазрядом Turnigy AA LSD 2400mAh NiMH, готов к использованию
Товар http://www.parkflyer.ru/ru/product/1530502/
Чтобы было все «по взрослому», на «первом этаже» посредством уголка все из того же пластика установили гнездо для подключения аккумуляторов, тумблер включения питания и винтовую колодку. Как оказалось – очень удобно:На «втором этаже» с помощью выпиленных из ДВП деталек закрепили плату Ардуино и надели на нее шилды – плату управления моторами и плату расширения. На мотор-шилде имеется кнопка включения, разъемы питания и моторов. Направление вращения моторов изменяется подачей сигнала высокого/низкого уровней на входы 4 и 7 шилда, а скорость вращения регулируется скважностью ШИМ-сигнала на входах 5 и 6. К плате расширения удобно подключать всякие штуковины. Т.к. шилды «одеваются» сверху на Ардуино-плату, никакие провода между ними не нужны, что очень удобно. Получился вот такой бутерброд:Знаний у нас пока немного, поэтому сначала составили простейшую программу: столько-то секунд проехать прямо, затем повернуть направо, снова прямо, развернуться и т.д. Активируем в программе выходы, какие моторы когда, в какую сторону и с какой скоростью включать/выключать, заливаем скетч, ставим робота на пол, включаем тумблер питания… Ура!!! Все нормально, едет, поворачивает, все как в программе. Посмотрели, что и как, подобрали скорости движения, разворота. Пора переходить к следующему этапу – научить робота «видеть» дорогу перед собой.Здесь пригодился заказанный датчик дистанции HC-SR04, похожий на два глаза и который подключается по четырем проводам: два – питание, а также вход Trig и выход Echo. При подаче напряжения датчик не начинает безудержно измерять все вокруг, он ждет импульса 10мс на свой вход Trig. Получив таким образом команду на определение дистанции, датчик одним «глазом» отправляет перед собой пачку из 8 импульсов частотой 40кГц. Импульсы, дойдя до препятствия, отражаются и возвращаются обратно, где их улавливает второй «глаз». Исходя из времени задержки отраженного сигнала, датчик выдает импульс определенной длительности на выход Echo. Диапазон измеряемых расстояний – от 2 до 450 см. Для крепления датчика сделали кронштейн, чтобы сервой можно было поворачивать его в разные стороны. Но об этом поподробнее в следующий раз… Ну что ж, попробуем… Сначала для отладки режима работы дальномера решили просто позажигать светодиод при приближении предмета на определенную дистанцию. Быстренько набросали скетч только для датчика, моторы там вообще не упоминались. Как оказалось, это был очень правильный подход, который позволил быстро разобраться с одной возникшей проблемой.Все получилось, приближаем книгу – светодиод загорается, удаляем – гаснет. Поиграли в скетче с дистанцией – все хорошо, момент переключения светодиода изменяется. Теперь этот коротенький скетч вставляем в текст основной программы и вносим другие необходимые изменения. Ставим робота на пол, включаем, поехал и… Врезался в стену! Что такое? Добавляем в скетч возможность подключения контрольного светодиода, включаем: при приближении робота к препятствию светодиод не загорается – датчик не видит! Где-то накосячили и его спалили? Да не должны, вроде… Снова заливаем скетч только для зажигания светодиода, все нормально, работает. Заливаем, где с моторами – никак. Ага, это уже определенный результат! В основном скетче отключаем моторы – все в порядке! Значит, кусок программы для работы дальномера написан правильно, кусок для моторов – тоже, а вместе – никак. Тут же напрашивается вывод – работающие моторы кидают в цепи питания сильные помехи и, либо датчик, либо основная плата начинают «газовать».Вставляем в колодку, которая на нижней «палубе», электролитический конденсатор на 2200мФ, включаем… Очередное ура! Едет, видит, поворачивает. Отсюда сделали для себя важный вывод: торопиться не нужно, любое новое устройство, подключаемое к роботу, нужно сначала отладить в отдельной программе, а затем уже вживлять ее в основной скетч. Если бы мы подключали дальномер сразу, неизвестно, сколько времени бы потратили, пока разобрались, что к чему…Чтобы знать, какое напряжение «на борту», но больше, наверное, для красоты, на контейнер питания установили маленький цифровой вольтметр. Вообще, это вполне можно было сделать и через Ардуино, но мы решили не форсировать события. Ведь три семисегментных индикатора для работы требуют уже динамической индикации. Как говорится, не все сразу!Вот что у нас получилось на данный момент:
Ну, пока все. Ближайшими этапами развития робота мы наметили следующие мероприятия: 1. Измерение освещенности фотодатчиком и автоматическое включение «наружного света».2. При приближении к препятствию робот должен остановиться, покрутить «головой» и выбрать наиболее свободный путь.3. Вообще, мы уже столько всего напридумывали, что теперь нам надолго будет, чем заняться… Присутствует одна проблема, может, спецы по роботам подскажут? Ультразвуковой датчик видит только достаточно твердые препятствия, а, к примеру, мягкую мебель не видит совсем. Есть мысли по периметру установить инфракрасные свето/фотодиоды. Как думаете, это поможет? В общем, тема Ардуино оказалось весьма интересной и познавательной. Это целая область, где можно без особых усилий создавать весьма сложные устройства. Также Ардуино может сильно помочь, например, авиамоделистам – какую-нибудь навороченную систему уборки/выпуска шасси со всякими открывающимися и закрывающимися створками, сложный алгоритм работы БАНО или механизации тут реализовать достаточно просто. Тем более в семействе Ардуино есть достаточно миниатюрная платка Nano, не сильно уступающая по своим возможностям старшим братьям. Так что, все в ваших руках! И мозгах…Я не выкладывал здесь скетчи по двум причинам: во-первых, хотел просто рассказать, что такое Ардуино, без подробностей. Во-вторых, примеров в Интернете навалом, поэтому загружать текст ни к чему. Но, если вдруг кому понадобится, выложу без проблем. Видео тоже не стал выкладывать – не интересно, робот ведет себя пока еще достаточно «тупо». Вот когда научится «вертеть башкой» и искать дорогу, не натыкаться на диван и кота, вот тогда… В общем, если интересно, расскажу что и как. Вот только новогодние праздники закончились и времени стало сильно поменьше…Удачи!