Методические указания по проведению вводного занятия “Программирование на языке Си в среде Arduino IDE”.
Государственный Дарвиновский музей. ЦМИТ Бионик-лаб.г . Москва 2016 год.
Рассматривается общая структура программы на языке Си в среде Arduino IDE на примере программы мигающий светодиодом на 13 выводе платы Arduino NANO (UNO). Рассматривается логика работы типичной программы на языке Си на примере программы управляющей портами микроконтроллера. Приведены принципиальные электрические схемы и фотографии прототипов экспериментальной установки. Рассчитано на детей 10+ и взрослых делающих первые шаги в освоении программирования микроконтроллеров. Требуется знание основ электроники.
Цель занятия:
- Изучение общей структуры программы на языке Си в среде Arduino IDE.
- Изучение функций setup и loop.
- Изучение функций pinMode, digitalWrite, delay.
Оборудование и пособия:
- Компьютер с Linux или Windows,
- IDE Arduino
- Плата Arduino NANO (UNO)
- USB mini (A-B) кабель
- Макетная плата BreadBoard 400 pin
- Светодиоды
- Резисторы 100 Ом
- Монтажные провода
- Принципиальная электрическая схема платы Arduino NANO
План занятия:
- Теоретическая часть.
- Программирование.
- Выполнение экспериментов.
Теоретическая часть.
Что такое Ардуино?
Платы Arduino NANO, UNO, MINI, PRO и т.п. содержат микроконтроллер (МК) ATMEGA 328 производства ATMEL или аналогичный МК. Проект Arduino создан для образовательных целей и служит вспомогательным средством для лёгкого обучения студентов программированию микроконтроллеров.
Рис. 1. Плата Arduino NANO.
Микроконтроллер ATMEGA 328 относится к семейству AVR микроконтроллеров. Все микроконтроллеры семейства AVR имеют один набор Ассемблерных команд, за мелким исключением, и схожий набор встроенных модулей. Поэтому, любой микроконтроллер AVR может быть запрограммирован на языке Си в среде Ардуино.
На плате Arduino NANO установлено 4 светодиода. Один из светодиодов - индикатор питания.
На принципиальной электрической схеме (см. рис. 2) Arduino NANO видно, что другой светодиод маркированный буквой L подключен к выводу D13 GPIO разъема платы. В свою очередь, D13 подключен к порту PB5 микроконтроллера.
Еще два светодиода подключены к линиям RX и TX (линии передачи данных) микроконтроллера. Поэтому эти светодиоды мигают во время загрузки программ в микроконтроллер. RX подключен к D0 GPIO и к порту PD0, TX подключен к D1 GPIO и к порту PD1 (зависит от модели платы).
МК ATMEGA 328 17-й ножкой соединён с анодом светодиода L через резистор 1 кОм. Катод светодиода соединён с общим проводом. Общий провод на платах Arduino соединён с минусом шины питания. Постоянный электрический ток имеет направление, ток течёт от + к - источника электрического тока (питания). Светодиоды пропускают ток только в одном направлении от анода к катоду. Если соединить катод светодиода с плюсом питания, а анод с минусом, ток через светодиод не пойдёт и светодиод гореть не будет. Светодиоды, кроме того, не могут ограничивать протекающий через них ток, поэтому их подключают в схему через ограничительный резистор. У светодиодов имеется ещё одна немаловажная характеристика - это прямое падение напряжения. Прямое падение напряжения светодиода - это напряжение, падающее на светодиоде когда через светодиод протекает рабочий ток. В силу нелинейности вольтамперной характеристики светодиода, на светодиоде падает напряжение близкое к паспортному в широком диапазоне значений протекающего тока. Проще говоря, Вы можете менять ток на порядок, а напряжение на светодиоде будет меняться на милливольты.
Рассчитаем рабочий ток через светодиод L в схеме рис. 2.
Дано:
Рабочее напряжение на микроконтроллере 5 Вольт.
Напряжение высокого уровня на портах ввода/вывода микроконтроллера 4,2 Вольта.
Прямое падение напряжения жёлтого светодиода примерно 2 Вольта (зависит от партии).
Токоограничительный резистор сопротивлением 1 кОм = 1000 Ом
Решение:
Напряжение на резисторе
U = 4,2 - 2 = 2,2 В
Ток через резистор и светодиод, по закону Ома:
I = UR = 2,21000= 0,0022 А = 2,2 мА
Предельно допустимый ток одного порта микроконтроллера 20 мА (милли Ампер).
У микроконтроллера несколько ножек являются портами Ввода / Вывода. Чтобы мы могли в своей программе, по желанию управлять напряжением на порту Ввода / Вывода необходимо этот порт настроить как выход (Output). Далее можно будет записывать в регистр (ячейку памяти) этого порта 1 и на соответствующей ножке микроконтроллера будет появляться напряжение высокого уровня (4,2 Вольта). Если мы запишем в регистр порта 0, на соответствующей ножке микроконтроллера появится напряжение низкого уровня (0,7 Вольта).
Если к выбранному нами порту подключен светодиод, как показано на рис. 2, то при подаче напряжения высокого уровня из микроконтроллера в порт светодиод будет гореть, при подаче напряжения низкого уровня светодиод гореть не будет.
Программирование
Писать программу будем в среде разработки программ Arduino IDE на языке программирования C++.
Обращаться к портам в нашей первой программе будем по номеру, установленному для каждого порта в порядке от 0 до 19. На плате Arduino NANO имеются обозначения RX0, TX1, D0 - D13 и A0 - A7. Портам 0 -13 соответствуют ножки которые обозначены на плате как RX0, TX1, D2 - D13, портам 14 -19 соответствуют ножки которые обозначены на плате как A0 - A5. Кроме того, в среде Arduino IDE имеется константа LED_BUILTIN = 13. LED_BUILTIN можно использовать для обозначения порта D13, к которому на плате припаян светодиод.
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, LOW);
delay(450);
digitalWrite(LED_BUILTIN, HIGH);
delay(50);
}
Скетч. 1 Программа Blink, мигающая светодиодом на плате Arduino UNO или Arduino NANO.
Программу Blink скетч 1 мы взяли в примерах в среде программирования Arduino IDE. Примеры можно открыть в меню Файл / Примеры. Пример Blink находится в Файл / Примеры / Базовые (Basics).
В программе из примера 1 есть ключевое слово, несколько функций (команд) и несколько констант.
Структура программы в Arduino.
Однострочный комментарий в программе на C++ начинается с символов //.
Начало многострочного комментария /*.
Конец многострочного комментария */.
В верхней части программы, обычно, подключают библиотеки, объявляют переменные и константы и присваивают им начальные значения.
В языке C++ главная функция, с которой начинается выполнение программы - функция main(). В Arduino IDE функция main() не используется. В Arduino IDE начинается выполнение программы с функции setup(), а после её выполнения запускается функция loop().
Функция loop() в Arduino содержит главный цикл программы для микроконтроллера. Если не принимать специальных мер, то команды записанные в теле функции loop() будут повторяться бесконечно. Также, программист может создать бесконечный цикл в теле функции setup(), тогда дело до функции loop() не дойдёт совсем.
В Arduino IDE накладывается следующее ограничение на структуру вашей программы: В программе обязательно должны присутствовать функции setup() и loop().
Разберёмся как работает программа Blink скетч 1:
В этой программе в функции setup() функция
pinMode(LED_BUILTIN, OUTPUT) настраивает вывод D13 платы Ардуино как выход. LED_BUILTIN=13.
В функции loop() функция digitalWrite(LED_BUILTIN, LOW)
устанавливает на выводе D13 логический 0. Светодиод LD1 не горит. Функция
digitalWrite(LED_BUILTIN, HIGH)
устанавливает на выводе D13 логическую 1. Светодиод LD1 горит.
Микроконтроллер ATMega328 установленный на плате Ардуино работает очень быстро. Он выполняет 1 ассемблерную команду за 1 такт тактового генератора. Тактовая частота микроконтроллера ATMega328 на плате Ардуино 16 МГц. Значит период 1 такта 0,0000000625 сек (1/16000000). Именно за это время выполняется каждая ассемблерная команда. Если с такой скоростью переключать светодиод мы мерцаний не заметим. Поэтому в программе пример 1 добавлены функции delay(), которые выполняют задержку. После включения светодиода задержка выполнения программы 450 миллисекунд., а после включения 50 миллисекунд.
Подытожим в функции loop(), в цикле, то есть непрерывно повторяясь, светодиод LD1 выключен 450 миллисекунд и включается на 50 миллисекунд.
Выполнение экспериментов.
Изучение структуры программы Blink.
Подключите плату Arduino NANO к компьютеру.
Настройте среду Arduino IDE. Меню Инструменты/Плата и Инструменты/Порт.
Откройте пример программы Blink. Меню Файл/Примеры/Basics/Blink
Скомпилируйте и загрузите программу Blink в МК, нажав кнопку стрелка вправо в среде Arduino IDE.
Поэкспериментируйте с временем задержки в функциях delay().
Попробуйте изменить параметр OUTPUT и HIGH на 1.
Попробуйте изменить параметр LOW на 0.
Попробуйте изменить параметр LED_BUILTIN на 13.
Попробуйте заменить функцию pinMode(LED_BUILTIN, OUTPUT); на выражение DDRB = 0b00100000;
Попробуйте заменить функцию digitalWrite(LED_BUILTIN, HIGH); на выражение PORTB = 0b00100000; а digitalWrite(LED_BUILTIN, LOW); на выражение PORTB = 0b00000000;
Изучите принципиальную электрическую схему Рис. 2 и объясните, почему такие замены в программе Blink допустимы.
Для справки:
В программе числа, у которых первые два символа 0b (0B) - это двоичные числа. У восьми битных двоичных чисел после символов 0b следуют 8 двоичных цифр (0 или 1). Чтобы перевести двоичное число в десятичное необходимо каждую двоичную цифру двоичного числа умножить на её вес, а затем сложить все произведения.
Например, переведите двоичное число 0b10010101 в десятичное. Решение:
0b10010101 = 1*128 + 0*64 + 0*32 + 1*16 + 0*8 + 1*4 + 0*2 +1*1 = 149
Контрольные вопросы.
Почему светодиод не горит при подаче на него напряжения низкого уровня (0,7 Вольт)?
При подаче на катод светодиода напряжения высокого уровня (4,2 Вольта) светодиод будет гореть?
Что произойдёт с микроконтроллером и светодиодом если подключить светодиод к микроконтроллеру без токоограничивающего резистора и запустить на микроконтроллере программу скетч 1?
Литература.
Сайт https://arduino.cc
Сайт https://adior.ru/index.php/robototekhnika