Уроки Arduino
Продолжаем серию уроков “Arduino для начинающих”. Сегодня подключаем к ардуино кнопку и светодиод (при нажатой кнопке светодиод будет гореть, при отжатой — не гореть).
Урок №2. Подмигни светодиом, или изучаем работу с портами.
Для начала стоит разобраться с выводами.
Казалось бы, вот стоит у нас задача поуправлять реле модулем, как известно он управляется цифровым выводом. Так в чем проблема? К примеру, на плате Arduino UNO у нас их аж целых 14, так лепи к какому хочешь. Ну вот и начнем по порядку. Пусть будет D0. С одной стороны верно, работать то будет. Но вот одним вечером мы решаем, что теперь нам хочется управлять нашей релюшкой дистанционно, возьмем к примеру блютуз. Вот тут и возникает проблема, ведь он работает по интерфейсу UART, а это цифровые пины 0 и 1. Теперь придется переподключать. Если собрано на беспаечной макетке, то особых проблем быть не может, но вот если мы уже что-то куда-то подпаяли, то начинается веселая жизнь)
В связи с этим, перед началом разработки, было бы очень хорошо понимать какие выводы у нас приоритетные т.е. могут быть задействованы для передачи данных, управления сервоприводами и т.д, а какие просто пустышки способные выполнять только основные функции цифровых либо аналоговых пинов.
2.1 Интерфейсы
На мой взгляд, в категорию "неприкасаемых, пока есть другие свободные" следует, в первую очередь, отнести выводы отвечающие за интерфейсы.
Раз уж заговорили про UNO, то и рассмотрим на примере контроллера который установлен в нем - ATmega328.
ATmega328 имеет 3 интерфейса:
UART
D0 - RX (Прием данных)
D1 - TX (Отправка данных)
SPI
D13 - CSK (Выход тактирования данных)
D12 - MISO (Вход данных для последовательного программирования)
D11 - MOSI (Выход данных для последовательного программирования)
I2C
A4 - SDA (последовательная линия данных)
A5 - SCL (последовательная линия тактирования)
2.2. Цифровые выводы с поддержкой ШИМ (PWM)
Далее я бы присмотрелся к цифровым входам/выходам которые имеют поддержку ШИМ. На понятии ШИМ останавливаться не будем, более подробно можно почитать здесь. Скажем вкратце, что с помощью ШИМ'а мы сможем регулировать яркость светодиодов, задавать скорости вращения двигателей, управлять сервоприводами с помощью стандартной библиотеки servo.h (правда для управления сервами используется не совсем ШИМ).
Цифровые пины с поддержкой ШИМ Atmega328:
D3, D5, D6, D9, D10, D11 (D11 задействует интерфейс SPI).
Казалось бы все, да нет). Дам вам еще один совет.
Для рассмотрения в статье, я специально за пример взял контроллер Atmega328 в DIP корпусе. Как мы знаем, у меги 328ой имеются два младших брата, также поддерживаемых средой Arduino IDE - это Atmega168 иAtmega8. ATmega168 не намного дешевле ATmega328 и отличается только количеством памяти. А вот ATmega8 намного дешевле 328, её и можно будет и вставлять в готовый проект (если конечно хватит памяти). Однако расплатой за более низкую цену, помимо маленького объема памяти, является еще и урезанное количество цировых выводов с поддержкой ШИМ.
2.3. Выводы поддерживающие прерывания
Если вы собираетесь использовать в проекте прерывания, то выводы D2 и D3 также можно сразу кидать в резерв.
2.4. Итог: Рекомендуемая последовательность
Как мы видим, пустышками остается очень мало пинов.
Ну что, составим таблицу рекомендуемой последовательности:
Пустышки. Используем в первую очередь:
D4, D7, D8, A0, A1. A2. A3
ШИМ выводы, если в конечном проекте планируется переход на Atmega 8:
D5, D6
ШИМ выводы, если в конечном проекте планируется переход на Atmega 328:
D5, D6, D9, D10
Прерывания
D2, D3
Выводы интерфейсов. Пускаем в ход по крайней необходимости:
D0, D1, D11, D12, D13, A4, A5
Рисунок 2. Используемость выводов.
Кстати хочется упомянуть еще одну очень полезную штуку. Все аналоговые входы могут работать как цифровые выходы. Инициализация и работа абсолютно одинаковая с обычными цифровыми выводами. Необходимо просто в коде задавать порты A0...A5 как 14...19.
2.5 Теперь рассмотрим программу Blink (на сленге ардуино программа называется скетч)
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH); // Включаем 1
delay(1000); // ждем 1 секунду (1000 милисекунд)
digitalWrite(13, LOW); // Включаем 1
delay(1000); // ждем 0 секунду (1000 милисекунд)
}
Вставьте этот код в среду ардуино и нажмите вгрузить. Вы увидите мигающий светодиод впаянный в плату.
Любой скетч для Arduino должен содержать 3 раздела
- Обьявление переменных, подключение библиотек, установка констант (они указываются до фунуции setup)
- Функция setup (void setup). Здесь происходит начальная установка переменных, инициализация устройств и тп.
- Функция loop (void loop). Команды находящиеся здесь выполняются в бесконечном цикле
И так. В функции Setup строкой pinMode(13, OUTPUT); мы устанавливаем 13 порт как порт вывода. Тоесть мы можем включить на нем 1 или 0, а диод на плате припаянный к 13 порту включится или выключится в зависимости от того что мы установили.
В функции loop в цикле мы меняем состояние порта
digitalWrite(13, HIGH); // Включаем 1
delay(1000); // ждем 1 секунду (1000 милисекунд)
digitalWrite(13, LOW); // Включаем 0
delay(1000); // ждем 1 секунду (1000 милисекунд)
Коротенькая программа но мы уже можем видеть мигающий диод на плате. Давайте рассмотрим возможности дальше.
Существуют различные варианты подключения светодиода к плате, но я бы рекомендовал подключать + светодиода (длинная лапка) к порту Arduino, а минус к GND или минусу питания.
Кроме того чтобы не сжечь порт, светодиод подключаеться через сопротивление в 2.2кОм.
Рисунок 3. Схема подключения светодиода
Рисунок 4. Подключение нескольких светодиодов.
Подключив к своему порту светодиод исправьте pinMode(13, OUTPUT); (где 13 это номер порта, Output режим выхода), на номер своего порта. А также digitalWrite(13, HIGH); ( где 13 номер порта, HIGH высокий уровень или единица ) и digitalWrite(13, LOW); (LOW низкий уровень или 0).
Теперь мигает ваш светодиод подключенный к плате. Хотите управлять миганием? Давайте подключим кнопку. Это наш первый элемент управления но: Это одна из базовых схем, которая неоднократно пригодиться вам в будущем и может использоваться для управления роботом на Arduino. В вашем будущем роботе по нажатию кнопки могут происходить самые разные действия.
Рисунок 5. Подключение кнопки и светодиода.
Почему кнопка так подключена? Потому что любая кнопка может быть замкнута (1) или разомкнута (0), но в с лучае с разомкнутой она замкнута с другой ножкой кнопки. Так как если в режиме не нажатой кнопки порт может выдать паразитные включения, то этот контакт мы через сопротивление садим на землю (GND). А при нажатии она даст сигнал +5v на порт Ардуино.
Не забываем про резисторы перед кнопкой и перед диодом, чтобы не устроить короткое замыкание и не сжечь плату.
int button = 2; // устанавливаем переменную Button где 2 это порт подключения кнопки
int led = 8; // устанавливаем переменную led где 8 это порт подключения светодиода
void setup() {
pinMode(led, OUTPUT); //устанавливаем порт диода как выход
pinMode(button, INPUT); // устанавливаем порт кнопки как вход
}
void loop(){
if (digitalRead(button) == HIGH) { // если с кнопки пришло +5v… тоесть 1 или HIGH
digitalWrite(led, HIGH); // включаем диод
}
else { // иначе
digitalWrite(led, LOW); // выключяаем диод
}
}
Всего полчаса потраченного времени и вы узнали как управлять Arduino. В следующих уроках мы разберем более сложные, но и более интересные вещи.