Разработка устройства на Arduino.

Опубликовано 28.10.2013 12:04:00


Казалось бы, вот стоит у нас задача поуправлять реле модулем, как известно он управляется цифровым выводом. Так в чем проблема? К примеру, на плате Arduino UNO у нас их аж целых  14, так лепи к какому хочешь. Ну вот и начнем по порядку. Пусть будет D0. С одной стороны верно, работать то будет. Но вот одним вечером мы решаем, что теперь нам хочется управлять нашей релюшкой дистанционно, возьмем к примеру блютуз. Вот тут и возникает проблема, ведь он работает по интерфейсу UART, а это цифровые пины 0 и 1.  Теперь придется переподключать. Если собрано на беспаечной макетке, то особых проблем быть не может, но вот если мы уже что-то куда-то подпаяли, то начинается веселая жизнь)

В связи с этим, перед началом разработки, было бы очень хорошо понимать какие выводы у нас приоритетные т.е. могут быть задействованы для передачи данных, управления сервоприводами и т.д, а какие просто пустышки способные выполнять только основные функции цифровых либо аналоговых пинов.

 

 

В данной статье произведем разбор полетов для Arduino UNO. Она имеет на своем борту 14 цифровых входов/выходов и 6 аналоговых входов. Начнем наш рассказ, пожалуй, с пинов отвечающих за интерфейсы.

 

1. Интерфейсы

На мой взгляд, в категорию "неприкасаемых, пока есть другие свободные" следует, в первую очередь, отнести выводы отвечающие за интерфейсы.

Раз уж заговорили про UNO, то и рассмотрим на примере контроллера который установлен в нем - ATmega328. 

ATmega328 имеет 3 интерфейса:

 

UART

D0 - RX (Прием данных)

D1 - TX  (Отправка данных)

 

SPI

D13 - CSK (Выход тактирования данных)

D12 - MISO  (Вход данных для последовательного программирования)

D11 - MOSI  (Выход данных для последовательного программирования)

 

I2C

A4 - SDA (последовательная линия данных)

A5 - SCL  (последовательная линия тактирования)

 

Вот уже 5 цифровых из 14ти и 2 аналоговых из 6ти можно зарезервировать на самый крайний случай.


 

2. Цифровые выводы с поддержкой ШИМ (PWM)

Далее я бы присмотрелся к цифровым входам/выходам которые имеют поддержку ШИМ. На понятии ШИМ останавливаться не будем, более подробно можно почитать здесь. Скажем вкратце, что с помощью ШИМ'а мы сможем регулировать яркость светодиодов, задавать скорости вращения двигателей, управлять сервоприводами с помощью стандартной библиотеки servo.h (правда для управления сервами используется не совсем ШИМ).

 

Цифровые пины с поддержкой ШИМ Atmega328:

D3, D5, D6, D9, D10, D11 (D11 задействует интерфейс SPI).

 

Казалось бы все, да нет). Дам вам еще один совет.

Для рассмотрения в статье, я специально за пример взял контроллер Atmega328 в DIP корпусе. Как мы знаем, у меги 328ой имеются два младших брата, также поддерживаемых средой Arduino IDE - это Atmega168 и Atmega8. ATmega168 не намного дешевле ATmega328 и отличается только количеством памяти.  А вот ATmega8 намного дешевле 328, её и можно будет и вставлять в готовый проект (если конечно хватит памяти). Однако расплатой за более низкую цену, помимо маленького объема памяти, является еще и урезанное количество цировых выводов с поддержкой ШИМ.

 

Цифровые пины с поддержкой ШИМ Atmega8:

D9, D10. D11 (D11 задействует интерфейс SPI).


 

3. Выводы поддерживающие прерывания

Важное дополнение было написано в комментариях.

twsdwf: "Я бы не стал называть "пустышками" выводы D2 и D3 на atmega328. На них можно вешать внешние аппаратные прерывания".

Так что если вы собираетесь использовать в проекте прерывания, то выводы D2 и D3 также можно сразу кидать в резерв.


 

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


 

Иллюстрация вышеописанного


 

Полезная информация

Кстати хочется упомянуть еще одну очень полезную штуку. Все аналоговые входы могут работать как цифровые выходы. Инициализация и работа абсолютно одинаковая с обычными цифровыми выводами. Необходимо просто в коде задавать порты A0...A5  как  14...19.

К примеру для того чтобы поморгать светодиодом c аналогового входа А0:

void setup() {               
pinMode(14, OUTPUT);  // инициализируем аналоговый вход как цифровой
}
void loop() {
  digitalWrite(14, HIGH);   // зажигаем светодиод
  delay(1000);              // ждем секунду
  digitalWrite(14, LOW);    // выключаем светодиод
  delay(1000);              // ждем секунду
}


А как же комментарии?