3.1.md
ПЕРВАЯ ПРОГРАММА ПО УПРАВЛЕНИЮ КОНТРОЛЛЕРОМ
###ЗАСТАВИМ СВЕТИТЬСЯ СВЕТОДИОДЫ
«РУДИРОН» — программно-аппаратный комплекс. Его использование требует знания основ языка С++ и основ электроники, а лучше и понимание основ работы цифровых микросхем.
В рамках данных уроков мы не будем изучать язык программирования С++, так как это отдельный пласт знаний, требующий отдельного изучения. Мы сконцентрируемся на использовании языка С++ для управления контроллером «РУДИРОН» на базе микроконтроллером российской фирмы «Миландр».
НАПОМИНАНИЕ: при использовании внешнего питания сначала подключаем внешнее питание, а потом USB-кабель для связи или программирования. При выключении все делаем наоборот: сначала вытаскиваем USB-кабель, а затем внешнее питание. Не соблюдение данного правила может привести к выходу из строя платы Рудирон.
##СТРУКТУРА ПРОГРАММЫ НА ЯЗЫКЕ С++ И ЕЕ РЕАЛИЗАЦИЯ
Пустая программа для «Рудирон» пишется также как и для Ардуино:
#include "Arduino.h" void setup()
{
}
void loop()
{
}
Обязательная в С++ функция main() создаётся автоматически внутри библиотеки «Рудирон»
Если вы не знаете, что такое функция, то воспринимайте ее как набор команд языка, объединенных под определенным именем. Функции позволяют писать более компактный код при большом количестве повторяющихся команд.
Две обязательные функции в любой программе для контроллера «РУДИРОН»:
- Функция setup() вызывается только один раз при старте контроллера (подаче напряжения питания). Именно в ней мы будем писать код, который произведет настройку внутренних устройств контроллера.
- Функция loop() — циклическая, выполняется бесконечное количество раз пока на контроллер подается напряжение питания.
Если бы мы хотели написать простую программу для компьютера, выводящую на экран сообщение — Hello, World!, то исходный код выглядел бы так:
#include <iostream> int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
Какая простая и очаровательная программа, да еще и текст выводит на экран! Однако, все так просто, потому что программа будет запущена на компьютере, где операционная система выполнит множество своих команд, чтобы вывести сообщение на экран.
В контроллерах нет операционной системы, нет экрана (хотя его можно подключить, но это тоже требует множества команд), нет клавиатуры, экрана, мышки и т.д.. Контроллеры имеют как правило ограниченный набор средств взаимодействия с человеком. Поэтому создание программы в таком случае идет иначе.
Для создания программы для любого микроконтроллера необходимо:
1 Изучить устройство контроллера.
2 Изучить устройство микроконтроллера (это микропроцессор с множеством внутренних устройств) – это сердце и одновременно мозг устройства.
3 Определить какие есть элементы для подачи сигналов микроконтроллеру и какие средства визуализации (светодиоды, экран и т.д.).
4 Определить какие внутренние устройства микроконтроллера нам нужны для решения задачи.
5 Изучить какие команды (функции) есть для программного взаимодействия с внутренними устройствами микроконтроллера, внешними элементами контроллера.
6 Написать программу, обеспечивающую взаимодействие всех элементов контроллера для решения поставленной задачи.
7 Сгенерировать исполняемый файл для микроконтроллера контроллера «РУДИРОН».
8 Записать в микроконтроллер исполняемый файл с помощью программатора.
9 Проверить правильность работы разработанного устройства.
Кажется, все сложно и запутанно! Не удивительно, так как мы с вами создаем программно-аппаратное устройство. А это требует понимания электроники, цифровой техники и программирования. На самом деле мы с вами шаг за шагом и не спеша все это освоим!
НАЧИНАЕМ ДЕЙСТВОВАТЬ
1 Изучаем контроллер
Для любого устройства производитель предоставляет документацию. Вот и для контроллера «РУДИРОН» можно воспользоваться техническим описанием (отдельный документ, прилагаемый к контроллеру). Скачать руководство к контроллеру можно на сайте www.РУДИРОН.рф.
Рассмотрим внешний вид контроллера. Мы видим множество разнообразных разъемов и надписей. Не пугаемся и идем дальше.
На плате установлены 2 светодиода. Они обозначены на плате как L1 и L2 (выделены красным). Есть кнопки, они обозначены как B1, B2 и B3 (выделены зеленым), разъемы питания и т.д.
2 Изучаем микроконтроллер
Микроконтроллер сложное устройство. Он представляет собой микропроцессор с множеством дополнительных устройств, что превращает его по сути в микрокомпьютер. Не такой мощный как настольные компьютеры и ноутбуки.
Невозможно сразу прочесть и понять тысячи страниц технического текста, описывающие микроконтроллер. Поэтому для облегчения работы с контроллером мы написали программное обеспечение, которое позволит вам легко с ним общаться без необходимости глубокого изучения всего микроконтроллера.
На первых порах нам необходима таблица с номерами выводов контроллера «РУДИРОН». Она длинная и будет приведена полностью в конце этого учебника или вы можете скачать ее с сайта www.РУДИРОН.рф. Сейчас мы рассмотрим кусочек этой таблицы.
Таблицы портов ввода-выводов пишутся для всех микроконтроллеров. Причина создания таких таблиц в том, что один вывод микросхемы микроконтроллера может выполнять множество функций. В один момент времени доступна только одна функция для вывода и зависит от начальной настройки в программе.
###Описание портов ввода-вывода (GPIO)
Номер | Альтернативное обозначение | Порт | ШИМ | Внешнее прерывание |
0 | —- | F3 | —- | —- |
1 | —- | F2 | —- | —- |
2 | —- | F1 | —- | —- |
3 | —- | F0 | —- | —- |
4 | —- | A1 | —- | —- |
5 | L1 | A2 | + | —- |
6 | —- | A3 | —- | —- |
7 | L2 | A4 | + | —- |
Посмотрим, как таблица соотносится с реальным положением элементов на плате контроллера.
В таблице описания портов ввода-вывода в столбце «Номер» можно увидеть за какими номерами закреплены светодиоды L1 – 5 (А2), L2 – 7 (А4). Номера задали разработчики «РУДИРОН» для вашего удобства, чтобы не искать названия А2 и А4 (это названия выводов самого микроконтроллера). Так будет легче писать программу.
3 Определяем какие есть элементы для подачи визуальной информации для человека. Это светодиоды L1 и L2.
4 Внутреннее устройство микроконтроллера, которое взаимодействует с подключенными светодиодами это порты ввода и вывода GPIO. Звучит очень страшно). На самом деле порт ввода вывода сейчас можете рассматривать как выключатель для лампочки. Перевели выключатель в положение TRUE (включить) на лампу (светодиод) поступает электрический ток и мы видим свечение. Переводим выключатель в положение FALSE (выключить) ток перестает течь через лампу (светодиод) и мы сидим в темноте.
Схема подключения светодиодов:
Теперь мы понимаем, что нам на следующем шаге нужны команды, которые могут работать с GPIO.
5 Какие у нас есть команды (функции) для работы с портами ввода и вывода GPIO?
• Установка режима работы вывода порта на вывод электрического тока или на ввод — pinMode («Номер порта», «Режим ввод или вывод»); • Включение или выключение порта — digitalWrite («Номер порта», «Включить или выключить»);
Команды (функции) для управления большинством внутренних устройств микроконтроллера мы изучим постепенно в ходе написания программ и сборки простых устройств.
6 Написание программы
Задача — заставить светиться светодиоды на плате контроллера. Переводим на технический язык — программа подачи напряжения 3.3 вольта на два номера контроллера (5 и 7) к которым подключены светодиоды L1 и L2. При подаче напряжения светодиоды будут светиться, при снятии напряжения гаснуть.
Рассмотрим пример программы (включение 2-х встроенных светодиодов):
#include "Arduino.h" void setup()
{
pinMode(LED_BUILTIN_1, OUTPUT); pinMode(LED_BUILTIN_2, OUTPUT);
}
void loop()
{
digitalWrite(LED_BUILTIN_1, true); digitalWrite(LED_BUILTIN_2, true);
}
Изучим детально текст программы:
- Выводам 5 и 7 присвоены осознанные имена LED_BUILTIN_1 и LED_BUILTIN_2.
Данный прием очень часто используется при написании программ и считается хорошим стилем написания программного обеспечения и не только на языке С++.
- Любой порт GPIO контроллера может работать на ввод либо вывод (выдача напряжения 3.3 вольта или нет).
Функция ** pinMode** настраивает вывод на нужный режим. Так как для «зажигания» светодиода необходимо на него с выхода контроллера подать напряжение 3.3 вольта, то необходимо установить режим выхода OUTPUT
digitalWrite(LED_BUILTIN_1, OUTPUT);
digitalWrite(LED_BUILTIN_2, OUTPUT);
Так как у нас установлено на плате контроллера два светодиода LED_1 и LED_2, то необходимо вызвать функцию для каждого из них.
- После настройки порта на его вывод необходимо дать команду подачи напряжения 3.3 вольта, чтобы светодиод засветился. Для этого используем команду (функцию) digitalWrite.
digitalWrite(LED_BUILTIN_1, true);
digitalWrite(LED_BUILTIN_2, true);
Очень часто разработчики создают заранее имена выводам портов. Вот и в нашем случае вы можете не создавать свои имена, а воспользоваться LED_BUILTIN_1 и LED_BUILTIN_2, к которым подключены светодиоды на плате L1 и L2. Поэтому вам остается запомнить такие имена и использовать их в своих программах.
7 Генерируем исполняемый файл для контроллера «РУДИРОН». Напишем программу в файле sketch.cpp
8 Прошиваем исполняемый файл в контроллер через встроенный программатор. Современные программы состоят не из одного файла с текстом программы как sketch.cpp. Любая программа включает в себя множество других программ. Но чтобы эти программы попали в один исполняемый файл для микроконтроллера необходимо их все собрать в одном месте в исполняемом файле. Для этого необходимо текст программы sketch.cpp перевести в машинный код микроконтроллера и дополнить его кодом из других файлов. Этот процесс называется Сборкой проекта.
В папке проекта находится настроенный файл CMakeLists.txt для правильной сборки проекта.
Для запуска сборки выбираем в верхнем меню «Terminal – Run Task».
Появится меню с вариантами действий с проектом. Мы выбираем «Выпуск: собрать»
В случае отсутствия ошибок в программе и правильно настроенной системе сборки мы получим такой экран:
В нижнее окно терминала будет выведена маленькая текстовая таблица с указанием сколько в процентах будет занято памяти FLASH (аналог жесткого диска с которого запускает программу компьютер) и RAM (это оперативная память как у компьютера) нашей программой.
Итогом такой сборки будет исполняемый файл для микроконтроллера Sketch.hex в директории build.
Теперь необходимо этот файл загрузить в контроллер «РУДИРОН». Если точнее, то записать в FLASH память микроконтроллера.
Перед загрузкой необходимо установить перемычки в положения, выделенные красным цветом и подключить контроллер к компьютеру через USB кабель.
Затем достаточно из Visual Studio Code вызвать знакомый нам пункт меню «Terminal-Run Task» и выбрать меню «Загрузить в флеш-память».
Если все сделано правильно, то получаем окно успешной загрузки.
9 Сразу после загрузки флеш-памяти программа начинает исполняться. Так что нет необходимости отдельно запускать программу на контроллере. Посмотрим, что там с нашими двумя светодиодами:
Второй способ загрузки отличается от первого только использованием отдельного модуля «Rudiron Tasks» на левой панели VS Code. Данный модуль не является частью исходной системы VS Code и устанавливается при установке дистрибутива ПО ПАК Рудирон. Определить его наличие/отсутствие можно по наличию ярлыку на левой панели **VS Code.
Перед загрузкой необходимо установить перемычки в положения, выделенные красным цветом и подключить контроллер к компьютеру через USB кабель.
Нажимаем ЛКМ на значке модуля «Rudiron Tasks». При активации модуля становится доступен интерфейс управления компиляцией и загрузкой.
ПРИМЕЧАНИЕ Плата Рудирон (с правильно установленными перемычками – см. картинку выше) должна быть уже подключена через USB-кабель к компьютеру.
1 Выберите виртуальный COM-порт к которому подключена плата Рудирон (если подключение платы произошло ранее перехода в модуль, то порт определится автоматически, если нет, то перейдите на любой другой раздел меню (например, проводник/explorer VS Code, затем подключите Рудирон и перейдите обратно в модуль)
2 Определите скорость загрузки. По умолчанию устанавливается 9600, данной скорости вполне достаточно для загрузки кода в Рудирон
3 Установите дополнительные настройки (если необходимо, по умолчанию данные параметры включены): установите галочки у параметров «Скомпилировать перед записью», «Очистить память перед записью» и «Запустить после записи».
4 Нажмите кнопку «Записать». При установленных выше параметрах (3) произойдет компиляция, очистка памяти Рудирона, запись в память и запуск программы. Нажатие кнопки «Запустить» вызовет запуск ранее загруженной программы, нажатие кнопки «Очистить» приведет к очистке памяти Рудирона от ранее загруженной программы.
ПРИМЕЧАНИЕ Нажатие любой из вышеперечисленных кнопок требует нахождения Рудирона в режиме ожидания загрузки программы.
Первая программа написана, собрана и загружена в контроллер. И она работает!
ПРИМЕЧАНИЕ Если Вы хотите выполнять программу при последующих включениях «Рудирона», то не забудьте переставить перемычку из положения «Режим программирования» обратно в «Режим выполнения». Если этого не сделать, то программа при включении «Рудирона» выполняться не будет.
Дальше все будет идти намного быстрее. Вы наберетесь опыта и процесс создания своих устройств будет интересным и увлекательным.
ВЫВОДЫ
Мы научились писать программы, собирать их в среде программирования и загружать результат нашей успешной работы в контроллер.
СПИСОК КОНТРОЛЬНЫХ ВОПРОСОВ
- Из чего состоит пустая программа для «Рудирон»?
- Для чего нужна таблица описания портов ввода-вывода (GPIO)?
- Сколько доступных для управления пользователем кнопок есть на плате?
- Сколько доступных для управления пользователем светодиодов есть на плате?
- Что обозначают названия LED_BUILTIN_1 и LED_BUILTIN_2,?
- Какую перемычку и в какое положение надо переставить на плате для перевода ее в «Режим программирования»?
- Какую перемычку и в какое положение надо переставить на плате для перевода ее в «Режим выполнения»?
- Что будет результатом выполнения нашей программы?
- Что произойдет, если перемычка находится в «Режиме программирования», питание отключили, а затем заново включили?
- Что произойдет, если перемычка находится в «Режиме выполнения», плату подключили к компьютеру и попытались загрузить программу в контроллер?
СПИСОК ДОПОЛНИТЕЛЬНЫХ ЗАДАЧ
- Использовать для написания программы среду Arduino IDE.
- Включить только левый светодиод.
- Включить только правый светодиод.
ЭЛЕМЕНТЫ КОНТРОЛЯ И ПРОВЕДЕНИЯ СОРЕВНОВАНИЙ
- Проведение тестирования по контрольным вопросам. Критерии: кто быстрее и допустил меньшее количество ошибок.
- Написание одного из трех вариантов (2 светодиода, левый или правый светодиод) программы и загрузка этого варианта в контроллер. Критерии: Правильно написанная программа согласно выданного задания, работающий контроллер и наименьшее количество времени затраченног о на эти работы