Записки начинающего роболюба. 2. Контроллеры, среды программирования semionenkov's blog / 28.09.2015 Руководящая и направляющая идея этих "Записок" - изучить основы робототехники, создавая собственную модель автономного робота, который может двигаться и работать с датчиками. Сначала, естественно, надо понять всю эту кухню. Начнём с контроллеров и средств их программирования.Микроконтроллер (далее для простоты просто контроллер) это небольшой компьютер, у которого есть память, куда можно загрузить программу для исполнения, процессор, исполняющий программу, а также набор портов ввода-вывода, с помощью которых контроллер ("управитель") может управлять внешними устройствами (запускать моторы, мигать светодиодами и вообще работать с любым совместимым устройством) и получать извне инофрмацию с датчиков, например, о столкновении с другим объектом или о раcстоянии до препятствия.На самом высоком уровне программа выглядит примерно так: Цикл считать данные с датчиков отдать команды внешним устройствам паузаКонец циклаПрограмма для контроллера готовится на внешнем (инструментальном) компьютере и загружается по USB. В принципе, контроллер может пользоваться и питанием по USB, но, естественно, если мы не хотим быть привязанными к компьютеру, на борту робота нужен автономный источник питания. Вот, собственно, и вся теория, осталось только собрать нужную нам конструкцию с набором устройств ввода и вывода, запрограммировать поведение робота, загрузить программу и - вперёд.У контроллера Ардуино Уно (UNO - базовый контроллер Ардуино в настоящее время) есть 14 цифровых портов ввода-вывода и 6 аналоговых портов, которые работают только на ввод. Порты нумеруются с нуля, 0-13 и 0-5, соответственно. Цифровые порты не являются одинаково универсальными, некоторые из них изначально зарезервированы под определённые функции (0, 1), остальные могут использоваться по усмотрению разработчика. Цифровые порты 2-13 не одинаковы: лишь для части из них есть возможность посылать внешним устройствам сигналы специально вида, те самые, которые необходимы для управления моторами. Разработчику нужно, определившись с набором устройств ввода и вывода, продумать раскладку устройств по портам, и, руководствуясь этой раскладкой, подсоединять устройства к контроллеру и писать программу, обращающуюся к определённым портам.Внимания, с моей точки зрения, заслуживают несколько инструментов. Следующие черты выбираемого программного обеспечения представляются наиболее существенными для определения критерия выбора: Возможность визуального программирования, т.е. программирования в стиле Скретч или Блокли. Доступ к коду на языке С. Русификация. Возможность работать без локальной установки (работа с вебприложением). Что кому важно - каждый для себя решает. А выбор таков:1. Среда программирования Ардуино. Это - "родное" программное обеспечение Ардуино, поэтому без него обойтись в конечном счёте нельзя: вопрос только в том, потребуется ли среда Ардуино явно, или используемая программа заимствовала какие-то компоненты Ардуино, скрыв их под своим интерфейсом. Из отмеченных выше 4-х пунктов, галочку можно поставить только на второй ("С"). Но с учётом того, что это самодостаточный и из первых рук инструмент программирования на популярном языке программирования - это совсем не мало.2. Графическое расширение интерфейса среды программирования Ардуино Ардублок (Ardublock). За одну дополнительную установку поверх среды Ардуино мы получаем среду визуального программирования и русификацию. Подробнее можно почитать в блоге Юрия Винницкого. Отзывы практиков, работающих с младшими школьниками - самые хорошие. 3. MRT За исключением вебдоступа, здесь есть все упомянутые черты, плюс нет необходимости ставить среду Ардуино (что нужно уже спрятано внутри). На тему MRT можно посмотреть блог Сергея Косаченко.Моё первое впечатление было самым благоприятным: симпатичный интерфейс, создающий ассоциацию с профессиональной средой программирования и все упомянутые достоинства, но... Приглядевшись, я понял, что процедур на уровне визуального языка нет. Для меня - гигантский минус, поскольку горизонт использования визуального программирования слишком сужается. Ещё одна вещь меня насторожила: при установке упоминались лицензии каких-то коммерческих фирм. Не исследовал вопрос скрупулёзно, "но осадочек остался". Словом, я всерьёз этот инструмент не рассматриваю, но допускаю, что у него будет свой круг пользователей, особенно с учетом того, что он продвигается с конструктором HUNA TOP.4. БлоклиДуино (BlocklyDuino). БлоклиДуино оформлен как вебприложение, то есть доступен по сети, как, например, и Игры Блокли (локальная установка, скорее всего, есть, но пока не проверил). БлоклиДуино (пока) не русифицирован. Язык программирования - Блокли, расширенный специальными модулями для управления устройствами Ардуино. Хоть Блокли, строго говоря, и не является полноценным языком программирования (локальных переменных в процедурах нет), но он весьма развит по управляющим конструкциям и вспомогательным процедурам и хорошо подходит для начального этапа обучения программированию (если не зацикливаться на русификации). С помощью БлоклиДуино можно создать код на С, который потом можно откомпилировать и загрузить в контроллер через среду Ардуино. Утверждается, однако, есть возможность запустить загрузчик на инструментальном компьютере и грузить программу непосредственно с интерфейса БлоклиДуино. Словом, более подробные, по мере изучения, заметки о БлоклиДуино весьма вероятны: из трех сред с возможностью визуального программирования эта приглянулась более других. Внимательный читатель, безусловно, обратил внимание на отсутствие в списке СкретчДуино. Я с большим уважением и симпатией отношусь к этому отечественному проекту, получившему заслуженную известность и распространение в стране и за рубежом, желаю ему всяческих успехов, прежде всего - в деле удешевления комплекта, но СкретчДуино, как я понимаю, ориентирован не на автономную работу на борту робота, а для работы в режиме интерпретации команд с инструментального компьютера. Я эту схему работы просто исключил из рассмотрения, по крайней мере, на старте. Для "Записок" будет использоваться среда Ардуино, естественный общий знаменатель средств программирования Ардуино, с языком С. Со времён чуть ли не Ады Лавлейс (а с Кернигана-Ритчи точно), практически все руководства по языкам программирования начинаются с примера "Hello, World!". На Ардуино "Привет!" принято исполнять с помощью светодиода. Почему светодиода? Да просто потому, что на плате Уно (как и на многих других платах Ардуино) светодиод встроен в плату и подключён к цифровому порту 13 - естественно, грех не начать работу с устройствами вывода именно с него, не отвлекаясь на создание конструкции и концентрируясь именно на программировании. Цель приводимого примера, собственно, не обучение программированию и не обучению языку (это за скобками), а показ структуры программы для Ардуино и техники обращения к портам Ардуино (инициализация порта, включение и выключение устройства, подключённого к порту), в данном случае - к цифровому порту вывода.Обратите внимание на структуру: Блок описания Процедура инициализации Основная процедура (рабочий цикл) Вспомогательные процедуры Такая структура и должна поддерживаться программистом Ардуино. Имена процедур setup() и loop() фиксированы, а вспомогательные процедуры, естественно, именуются разработчиком произвольно. Отметим, что в тексте используются не только переменные (константы) и процедуры, описанные нами, но и встроенные в среду программирования Ардуино. Все детали, опять же, оставляем за скобками. Азбука Морзе нагружает программу, чтобы был повод показать вспомогательные процедуры в структуре программы./* Программа "Мигающий светодиод" Сигнал SOS */ // 1. Описание устройств ввода-вывода и другие важные константы // Описание портов, с которыми работает программа// К порту 13 на большинстве плат Ардуино подключен светодиод.// назовем этот порт LEDconst int LED = 13; // эта константа будет использоваться в качестве параметра встроенных процедур работы с // портами для ссылки на порт 13// параметры азбуки Морзе const int DOT = 333; // длительность точки в миллисекундах const int DASH = DOT * 3; // длительность тире в миллисекундах const int PAUSE = DOT; // длительность паузы между знаками// 2. setup() - стартовая процедура, задающая начальные установки void setup() { // инициализировать порт LED в качестве порта вывода pinMode(LED, OUTPUT); // pinMode() - встроенная процедура, OUTPUT - встроенная константа }// 3. loop() - рабочий цикл. Исполняется после процедуры setup()void loop() { // SOS dot(); dot(); dot(); delay(PAUSE * 2); // пауза между буквами = PAUSE * 3, последний знак включает в себя PAUSE, поэтому 2 dash(); dash(); dash(); delay(PAUSE * 2); dot(); dot(); dot(); delay(PAUSE * 6); // PAUSE * 7 - пауза между словами}// 4. Процедуры управления устройствами и другие вспомогательные процедурыvoid dot() { digitalWrite(LED, HIGH); // запись HIGH включает устройство на порту LED delay(DOT); // пауза в программе (во время которой устройство LED включено) digitalWrite(LED, LOW); // запись LOW выключает устройство на порту LED delay(PAUSE); // пауза после знака (между знаками)}void dash() { digitalWrite(LED, HIGH); delay(DASH); digitalWrite(LED, LOW); delay(PAUSE); }Установка и настройка среды Ардуино описаны, например, на Амперке.Когда среда Ардуино установлена и запущена, Уно подключен к компьютеру, осталось скопировать приведённую программу в окно среды программирования Ардуино, откомпилировать её, загрузить (прошить) в Уно и наблюдать работу.Дальше нас ждут моторы. ArduBlock Blockly. BlocklyDuino Scratchduino arduino АрдуБлок Ардуино Блокли БлоклиДуино датчик контроллер микроконтроллер программирование робот робототехника сенсор