cart

Продуктов в корзине: 0

Поиск товаров

Новинки



Продолжаем серию уроков “Arduino для начинающих”. Сегодня подключаем к ардуино кнопку и светодиод (при нажатой кнопке светодиод будет гореть, при отжатой — не гореть). 

<<<Урок №1. Подготовка

Урок   №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

Рисунок  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

Рисунок 3. Схема подключения светодиода

5

Рисунок 4. Подключение нескольких светодиодов.

Подключив к своему порту светодиод исправьте pinMode(13, OUTPUT); (где 13 это номер порта, Output режим выхода), на номер своего порта. А также digitalWrite(13, HIGH);    ( где 13 номер порта, HIGH высокий уровень или единица )  и digitalWrite(13, LOW);    (LOW низкий уровень или 0).

Теперь мигает ваш светодиод подключенный к плате. Хотите управлять миганием? Давайте подключим кнопку. Это наш первый элемент управления но: Это одна из базовых схем, которая неоднократно пригодиться вам в будущем и может использоваться для управления роботом на Arduino. В вашем будущем роботе по нажатию кнопки могут происходить самые разные действия.

4

Рисунок 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.  В следующих уроках мы разберем более сложные, но и более интересные вещи.

Добавить комментарий


Защитный код
Обновить

Комментарии  

0 #4 Super User 22.03.2016 09:28
спасибо поправил
Цитировать
0 #3 Максим 20.03.2016 22:36
пробелы в переменных.
Цитировать
0 #2 Super User 19.03.2016 19:39
дак этот код и стоит у нас )
Цитировать
0 #1 Максим 18.03.2016 23:55
вот нормальный код для мигания с кнопки, поправьте, если вставлять код со статьи, непосвященному будет повесится проще!
int button = 2;
int led = 8;
void setup() {
pinMode(led, OUTPUT);
pinMode(button, INPUT);
}

void loop() {
if (digitalRead(button) == HIGH) {
digitalWrite(led, HIGH);
}
else{
digitalWrite(led, LOW);
}
}
Цитировать
Go to top