Как увеличить количество цифровых выводов Arduino с помощью расширителя портов. Arduino Shields – платы расширения для ардуино Зачем нужны шилды arduino

Всем хороши недорогие платы Arduino, но так часто для проекта не хватает буквально одного-двух свободных портов! А иногда портов хватает, но не хочется тянуть к другой части конструкции пучок проводов. Допустим, на передней панели устройства надо разместить несколько кнопок и светодиодов. Надежнее и проще соединить их с основной платой всего двумя проводами шины данных, а не шлейфом или жгутом, не так ли?

Для таких ситуаций предназначены различные расширители (экспандеры) портов Arduino.

Обычно выводы микроконтроллера реализуют несколько различных функций, поэтому расширители бывают разные:

  1. Расширитель стандартных портов ввода-вывода GPIO
  2. Расширитель выходов ШИМ
  3. Расширители аналоговых входов – мультиплексоры и внешние АЦП

Отдельно стоит упомянуть цифро-аналоговые преобразователи (ЦАП) и расширители адресного пространства шины I2C. Эти устройства не дублируют функции портов напрямую, но расширяют возможности микроконтроллеров.

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

Выбираем модуль расширителя для Arduino

Самый популярный и недорогой модуль изготовлен на микросхеме PCF8574 (рис. 1)

Рис. 1. Популярный модуль расширителя портов PCF8574

Достоинства:
  • Низкая цена.
  • Модули можно соединять цепочкой, просто вставляя штекеры одного модуля в гнезда предыдущего. Не забудьте установить перемычками разные адреса модулей!
Недостатки:
  • Нельзя вставить прямо в макетную плату (рекомендую перепаять разъем портов на обратную сторону).
  • Всего восемь портов в одном модуле.

Если вы настроены на более серьезные проекты, закажите на Aliexpress 16-разрядный модуль на PCF8575 . Настоятельно рекомендую именно модуль, изображенный на рис. 2.

Рис. 2. Модуль расширителя портов PCF8575

Достоинства:
  • Вдвое больше портов.
  • Встроенный источник питания на 3.3 вольта, можно питать другие модули.
  • Встроенное согласование логических уровней для шины I2C при разном напряжении питания.
  • Удобный формат для макетной платы.
Недостатки:
  • Выше цена.

Принцип работы расширителя портов GPIO PCF8574/PCF8575

Обмен данными происходит по шине I2C. Для подключения к плате Arduino требуется лишь четыре провода, включая питание. Адрес расширителя задается тремя перемычками на входах A0…A2, поэтому к шине можно одновременно подключить восемь одинаковых микросхем и получить максимум 8*8=64 дополнительных порта с PCF8574 или 8*16=128 с микросхемой PCF8575.

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

Выходы микросхемы одновременно являются входами, и никакого служебного регистра, определяющего назначение вывода, нет. Есть только регистр-защелка, в который записывают выходной байт. Как такое возможно?

Порты работают по схеме, аналогичной открытому коллектору и оснащены внутренними подтягивающими резисторами. Если в выход записан логический ноль, то открывается выходной транзистор, который принудительно тянет вывод «на землю». Чтение из такого порта всегда будет возвращать ноль.

Будьте осторожны – при подаче прямого напряжения питания на вывод с низким уровнем или при превышении допустимого тока 50 мА вы испортите микросхему!

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

Чтобы одновременно использовать часть портов как входы, а часть как выходы, перед каждой записью байта данных в экспандер необходимо при помощи операции «логическое ИЛИ» накладывать маску из единиц на те разряды, которые соответствуют входам. Вот и все)))

Генерация прерывания

Расширители портов PCF857* генерируют импульс прерывания низкого уровня на выходе INT при любом изменении входного сигнала на любом входе микросхемы. Это удобно, если расширитель обслуживает кнопочную панель. Но вы должны сами определить в обработчике прерывания, какая кнопка была нажата или отпущена. Генератор прерывания оснащен фильтром подавления дребезга контактов.

Пример 1. Использование модуля PCF8574

Соберем простую схему из четырех светодиодов, модуля PCF8574 и платы Arduino (рис. 3 и 4). При такой схеме включения нам даже не требуются гасящие резисторы для светодиодов. Ток протекает через светодиод и встроенный резистор, подключенный к шине питания.

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

Рис. 4. Макет схемы с модулем PCF8574

Скопируйте и запишите в плату Arduino скетч 1:

// Адрес модуля на шине (A0, A1, A2 = 0) int address = 0x38; // Данные, прочитанные из модуля uint8_t dataReceive; // Данные для записи в модуль uint8_t dataSend; void setup() { Wire.begin(); Serial.begin(9600); // Высокий уровень во все порты PCF8574 dataSend = B11111111; pcf8574_write(dataSend); } void loop() { // Читаем байт из модуля dataReceive = pcf8574_read(); // Выводим в монитор в двоичном формате Serial.println(dataReceive, BIN); // Сдвигаем биты влево на полубайт dataSend = dataReceive << 4; // Накладываем битовую маску dataSend |= B00001111; // Записываем байт в модуль pcf8574_write(dataSend); delay(500); } // Процедура записи байта в модуль void pcf8574_write(uint8_t dt) { Wire.beginTransmission(address); Wire.write(dt); Wire.endTransmission(); } // Процедура чтения байта из модуля int8_t pcf8574_read() { Wire.beginTransmission(address); Wire.endTransmission(); Wire.requestFrom(address, 1); return (Wire.read()); }

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

Уровни на выводах порта считываются каждые 500 мс и результат считывания выводится в монитор. Если вы соединяете один из входов P0…P3 с общим проводом, в его разряде появляется ноль. Затем считанное значение сдвигается влево на четыре бита, результат выводится в порт и гаснет один из светодиодов. Например, если прочитан ноль на выводе P0, то погаснет светодиод, подключенный к выводу P4.

Обратите внимание, что мы должны перед каждой записью в расширитель наложить битовую маску из единиц на все разряды, которые должны быть входами: dataSend |= B00001111;

Подпрограммы работы с шиной I2C предельно упрощены, никакие ошибки не обрабатываются.

Совет: для поиска и проверки адреса модуля на шине I2C можно использовать . Он выводит в терминал адреса всех устройств, которые отвечают на запрос шины.

Пример 2. Использование модуля PCF8575

Особенность модуля PCF8575 состоит в том, что у него 16 портов, поэтому в него всегда записывают по два байта и читают по два байта . Это правило надо соблюдать, даже если второй байт не нужен.

Немного изменим схему. Светодиоды подключим к портам P10…P13, а соединять перемычкой с общим проводом будем порты P00…P03 (рис. 5 и 6).

Рис. 5. Схема подключения модуля PCF8575

Рис. 6. Макет схемы с модулем PCF8575

В скетче 2 сначала записываются единицы во все порты, затем каждые 500 мс читается их состояние. Процедура чтения возвращает 16-разрядное слово, которое разделяется на байты. Содержимое младшего байта (выводы P00…P07) копируется в старший байт и выгружается обратно в модуль. Если соединить с общим проводом один из выводов P00…P03, то погаснет один из светодиодов, подключенных к P10…P13.

// Библиотека для работы с I2C #include // Адрес модуля на шине по умолчанию int address = 0x20; // Данные, прочитанные из модуля uint8_t hi, lo; uint16_t dataReceive; uint8_t dataHighByte; // Старший байт (P10...P17) uint8_t dataLowByte; // Младший байт (P00...P07) void setup() { Wire.begin(); Serial.begin(9600); // Высокий уровень во все порты PCF8575 dataHighByte = B11111111; dataLowByte = B11111111; pcf8575_write(dataLowByte, dataHighByte); } void loop() { // Читаем байт из модуля dataReceive = pcf8575_read(); // Выводим в монитор в двоичном формате Serial.println(dataReceive, BIN); // Выделяем младший байт из длинного слова dataLowByte = lowByte(dataReceive); // Копируем младший байт в старший байт dataHighByte = dataLowByte; // Накладываем маску на младший байт dataLowByte |= B11111111; // Записываем новые данные в модуль, два байта pcf8575_write(dataLowByte, dataHighByte); delay(500); } // Процедура записи байта в модуль void pcf8575_write(uint8_t dtl, int8_t dth) { Wire.beginTransmission(address); Wire.write(dtl); // Записываем младший байт (P00...P07) Wire.write(dth); // Записываем старший байт (P10...P17) Wire.endTransmission(); } // Процедура чтения байта из модуля int16_t pcf8575_read() { Wire.beginTransmission(address); Wire.endTransmission(); Wire.requestFrom(address, 2); lo = Wire.read(); // Читаем младший байт (P00...P07) hi = Wire.read(); // Читаем старший байт (P10...P17) return (word(hi, lo)); // Возвращаем длинное слово }

Библиотека Arduino для PCF8574/PCF8575

Библиотеку можно скачать на GitHub . Но, как вы могли видеть, работа с расширителями портов очень проста и можно легко обойтись без специальной библиотеки.

Тринадцать цифровых линий и шесть аналоговых входов – это все, что может предложить Arduino в качестве средств ввода/вывода. Но в некоторых случаях (особенно в проектах с большим количеством периферийных устройств) такого набора линий портов недостаточно.



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


Возможно, вы знаете, что 6 аналоговых контактов также могут использоваться как цифровые линии ввода/вывода таким образом:


Аналоговый вход 0 = линия 14
Аналоговый вход 1 = линия 15
Аналоговый вход 2 = линия 16
Аналоговый вход 3 = линия 17
Аналоговый вход 4 = линия 18
Аналоговый вход 5 = линия 19

То есть на самом деле мы можем ссылаться на аналоговый вход 5 как на цифровую линию следующим образом: digitalWrite(19,HIGH). Такая команда запишет логическую единицу в порт 19, то есть аналоговую линию 5.


Технически мы можем использовать линии последовательного порта TX/RX. Но в некоторых случаях это сделать крайне затруднительно, особенно когда в коде используются функции типа Serial.begin(), нужные для работы последовательного порта. Таким образом, общее количество контактов, доступных для пользователя, все же будет 17. Но разве можно с семнадцатью выводами управлять большим количеством светодиодов или сервомоторов? В этом случае лучше воспользоваться специальными внешними микросхемами. Зачастую в этих целях используют сдвиговый регистр вроде 74HC595. Но он требует три дополнительных линии для управления и не позволяет одновременно «расширить» все линии. Дисплейные драйверы, такие как MAX7219 тоже фактически «расширяют» количество контактов. Но MAX7219 является дорогостоящей микросхемой. Поэтому дешевле и рациональнее взять микросхему расширителя портов MCP23017. Эта микросхема рассчитана на 16 линий, имеет широкий диапазон рабочего напряжения от 1.8 до 5.5 В и управляется по интерфейсу I2C.


MCP23017 будет использовать 2 контакта Arduino и даст 16 линий ввода/вывода. Так что технически вы можете использовать 8 штук MCP23017 для расширения одного 16-контактного Arduino до 16 x 8 = 128 контактов. Arduino имеет библиотеку для шины I2C под названием Wire.h, поэтому взаимодействие с MCP23017 будет очень простым. Ниже приведена схема подключения Arduino и MCP23017.




#include "Wire.h" void setup() { Wire.begin(); // активируем шину I2C // устанавливаем линии на выход Wire.beginTransmission(0x20); Wire.write(0x00); // регистр IODIRA Wire.write(0x00); // устанавливаем все линии порта A на выход Wire.endTransmission(); } void loop() { Wire.beginTransmission(0x20); Wire.write(0x12); // адресный банк A Wire.write((byte)0xAA); // отправляемое значение - все линии в лог. 1 Wire.endTransmission(); delay(500); Wire.beginTransmission(0x20); Wire.write(0x12); // адресный банк A Wire.write((byte)0x55); // отправляемое значение - все линии в лог. 1 Wire.endTransmission(); delay(500); }

Описание Expander Shield

Expander Shield – оригинальный дополнительный модуль, предназначенный для увеличения количества портов ввода/вывода микроконтроллеров на базе платформы Arduino, а также других микроконтроллеров, используя расширители портов с SPI или I2C интерфейсом.


Основным элементами дополнительного модуля Expander Shield являются две микросхемы MCP23S17 или MCP23017 (два 16-разрядных расширителя портов ввода/вывода с SPI или I2C интерфейсом, соответственно), позволяющие добавить четыре 8-битных порта ввода/вывода, то есть 32 дополнительных "ноги".

Комплектация

Модуль Expander Shield поставляется либо в собраном виде в варианте для шин SPI или I2C (с соответствующими микросхемами), либо в виде набора для сборки без микросхем, которые могут быть приобретены отдельно.

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

Expander Shield SPI 1100 р. 850 р. В корзину

форме заказа .

ExpanderShield на шину SPI (с микросхемами MCP23S17).

Expander Shield I2C 1100 р. 850 р. В корзину

Внимание! У Вас отключено выполнение JavaScript. Нормальная работа системы заказа и корзины невозможна. Если по каким-то причинам Вы не можете включить JavaScript, просто перечислите заказываемые товары в форме заказа .

ExpanderShield на шину I2C (с микросхемами MCP23017).

Технические характеристики

Приведем наиболее важные функциональные особенности модуля Expander Shield.

  • удобный переключатель режима работы модуля в зависимости от типа установленных в данный момент микросхем расширителей портов;
  • для каждой из двух применяемых микросхем 16-разрядных расширителей портов ввода/вывода с помощью перемычек задается трехбитный адрес на шине, что позволяет размещать на одной шине до 8 таких микросхем;
  • возможность выбора с помощью перемычки номера соответствующего выхода микроконтроллера Freeduino/Arduino (digital pin 8, 9 или 10) для сигнала CS шины SPI;
  • в модуле применены "проходные" разъемы, позволяющие состыковывать несколько модулей без сдвига относительно платы Arduino;
  • сигналы микросхем выведены на четыре разъема PBD-10R с дополнительными контактами "земля" и +5В;
  • возможность выбора отдельного или совместного аппаратного сброса (кнопкой RESET) микросхем 16-разрядных расширителей портов ввода/вывода и микроконтроллера Freeduino/Arduino с помощью перемычек;
  • дополнительный разъем JPIC с выводами прерываний (INTA, INTB), аппаратного сброса (RST) и выбора микросхемы (CS);

Прочие характеристики модуля определяются в первую очередь характеристиками микросхем MCP23S17/MCP23017, техническое описание которых доступно в документации производителя.

Кроме того, перед началом работы с дополнительным модулем Expander Shield рекомендуем ознакомиться с его принципиальной электрической схемой.

Режимы работы

Режим работы Expander Shield выбирается с помощью DIP-переключателя и перемычек.

Выбор интерфейса и управление подтяжкой шины I2C

С помощью DIP переключателя выбирается либо режим SPI (включением контактной группы 1-4) для микросхем MCP23S17, либо режим I2C (включением контактной группы 5-6) для микросхем MCP23017. Также, в режиме I2C с помощью 7 и 8 контактной группы при необходимости шина I2C подтягивается через токоограничивающие сопротивления к шине питания +5В. Как правило, подтягивающие резисторы должны быть подключены если на шине I2C только одно устройство. Если устройств несколько, то резисторы подключаются только у одного из устройств.

Одновременное включение шины SPI и I2C, а также шины SPI и 7, 8 контактной группы не допускается .

Комбинированный режим работы, когда одна из двух микросхем в одном модуле Expander Shield работает по SPI интерфейсу (MCP23S17), а другая по I2C интерфейсу (MCP23017) невозможен.

Если требуется организовать работу одновременно по SPI и I2C интерфейсу необходимо использовать два (несколько) дополнительных модулей Expander Shield, с соотвтетствующим положением переключателей.

Выбор номера вывода для управления сигналом CS шины SPI

Для шины SPI необходимо выбрать вывод микроконтроллера Freeduino/Arduino, используемый в качестве сигнала CS. Обычно используется вывод 10, что соответствует крайнему левому положению перемычки на разъеме SS1. Переставляя перемычку на одно из двух других положений, возможен выбор 9 и 8 вывода соответственно.

Выбор адреса микросхем на шине

Младшие три бита адреса микросхем MCP23S17/MCP23017 выбираются с помощью перемычек на разъемах IC1_addr/IC2_addr притягиванием битов 0, 1, 2 к "земле" (Gnd) или +5В (5V).

Адрес каждой микросхемы должен быть уникальным.

Таким образом, на одной шине можно разместить до 8 микросхем (объединив, например, 4 штуки Expander Shield).

Выбор режима работы аппаратного сброса (кнопкой RESET)

Возможна организация одного из ряда режимов работы кнопки RESET

  • Кнопка RESET сбрасывает Freeduino/Arduino и микросхемы MCP23S17/MCP23017
  • Кнопка RESET сбрасывает только Freeduino/Arduino
  • Кнопка RESET сбрасывает только микросхемы MCP23S17/MCP23017

Соответствующие положения перемычек на разъеме JRS (слева направо) показаны ниже.

Библиотека MCP23xxx

Для упрощения работы с этим, и рядом других модулей, разработана библиотека MCP23xxx, предоставляющая простой интерфейс к функционалу микросхем серии MCP23xxx. Библиотека доступна для свободного скачивания: Библиотека совместима с ПО Arduino версии 1.0.5 (также предполагается совместимость и с более поздними версиями).

Фактически, это набор из двух библиотек: MCP23xxx и LiquidCrystal_MCP23x17.

Более подробно установка библиотек описана в разделе подключение библиотек . Структура каталогов папки libraries после установки должна стать такой:

/libraries/LiquidCrystal_MCP23x17
/libraries/MCP23xxx

В библиотеке MCP23xxx реализованы шаблоны классов, организующие работу с расширителями портов MCP23017, MCP23S17, MCP23008 и MCP23S08. Библиотека LiquidCrystal_MCP23x17 - это модифицированная стандартная библиотека LiquidCrystal, поддерживающая русский язык, и работающая через расширитель портов.

К библиотеке прилагаются примеры, поясняющие работу с ней. Также доступна для скачивания предыдущая версия библиотеки:

Рассмотрим пример работы с модулем для шины I2C:

//В примере считывается состояние выводов 1-го чипа, и такие же значения выставляются на 2-м

//Для I2C версии подключаем Wire.h:
#include
//подключаем библиотеку
#include

//Создаем два объекта класса CMCP23017, но не инициализируем, т.к. шина I2C не готова
CMCP23017 mcp23_1;
CMCP23017 mcp23_2;

void setup()
{
//Инициализируем шину I2C ...
Wire.begin () ;
//... и объекты MCP23* с адресами 0 и 1
mcp23_1.init (0 ) ;
mcp23_2.init (1 ) ;

//Все выводы 1-го чипа нужно сделать входами, а 2-го - выходами
//Это можно сделать в цикле
for (int i= 0 ; i< 16 ; i++ ) {
mcp23_1.pinMode (i, INPUT) ;
mcp23_2.pinMode (i, OUTPUT) ;
}
//или за один раз, вызовом метод pinMode16
//mcp23_1.pinMode16(0x0ffff);
//mcp23_2.pinMode16(0x00000);
}

void loop()
{
//Прочесть все входы 1-го чипа, и выставить то же самое на 2-м можно в цикле
for (int i= 0 ; i< 16 ; i++ ) {
mcp23_2.digitalWrite (i, mcp23_1.digitalRead (i) ) ;
}
//или за раз, используя методы digitalRead16 и digitalWrite16
//mcp23_2.digitalWrite16(mcp23_1.digitalRead16());
}

→ Как расширить количество аналоговых входов и выходов на вашем Arduino?

Как расширить количество аналоговых входов и выходов на вашем Arduino?

Мультиплексор или демультиплексор позволит вам расширить количество входов и выходов на вашем Arduino.
Микросхема 4051 является 8-канальным аналоговым мультиплексор / демультиплексором, таким образом:
* Если вы используете 4051 как мультиплексор: Вы можете выбрать любой из 8 различных входов и прочитать его состояние в контролер.
* Если вы используете 4051 как демультиплексор вы можете выбрать любой из 8 различных выходов и записать туда нужное вам значение.

Кроме того, 4051 может работать с аналоговыми значения, в вашем Arduino, вы можете использовать аналоговые сигналы с напряжением 0-5В и подключить микросхему к аналоговым входам на Arduino.

Чтобы выбрать нужный вход микросхемы а также режимы работы чтение или запись, мы должны использовать три управляющих сигнала (S0 , S1 и S2). Каждый из этих контактов должен быть подключён к одному из цифровых выходов Arduino. Каждый выход имеет номер (S0 = 1; S1 = 2; S2 = 4) и, если установить на одном из этих выходов высокий логический уровень то, число контактных представляет будет передано 4051.

Например:
* Если на входах микросхемы S0 и S1 установить лог“1» а на S2 лог“0» то выбран вход y3 микросхемы, это выглядит так (1 +2 +0 = 3).
* Если на входах микросхемы S0 и S2 установить лог“1» а на S1 лог“0» то выбран вход y5 микросхемы, это выглядит так (1 +0 +4 = 5).

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

* Z ----- общий сигнал ввода или вывода (соединенный с входом/выходом Arduino)
* E ----- вход разрешения (активный лог «0 ») (подключен к земле (GND ))
* Vee --- отрицательное напряжение питания (подключен к земле (GND ))
* GND --- общий минус (0 V)
* S0-S2 - выбор входов (подключены к трем цифровым выводам Arduino)
* y0-Y7 - независимые входы/выходы
* Vcc --- положительное напряжение питания (5 В)



Левое изображение выше, например, как использовать 9 мультиплексор читать 64 аналоговых входов только с одним аналоговым входом Arduino.
Правое изображение выше пример того, как использовать два 4051 (один настроенный как демультиплексор и одного в качестве мультиплексора) в матрице 8x8 для проверки 64 кнопок или других цифровых входов только с одного цифрового входа на Arduino (со второй установки вы может просто две кнопки в то же время, в противном случае вы должны использовать первый (слева) установки).

Пример кода:

// Пример для использования 4051 аналоговый мультиплексор / демультиплексор
// by david c.

int led = 13 ; // Настраиваем на 13 ноге светодиод
int r0 = 0 ; // значение выбрать вывод на 4051 (S0 )
int r1 = 0 ; // значение выбрать вывод на 4051 (S1 )
int r2 = 0 ; // значение выбрать вывод на 4051 (S2 )
int row = 0 ; // storeing the bin code
int count = 0 ; // щётчик
int bin = { 000, 1, 10, 11, 100, 101, 110, 111 } ; // Массив двоичных числ определяющих номер выбранного входа/выхода микросхемы 4051, с 1 по 8.
void setup () { // ИНИЦИАЛИЗАЦИЯ
pinMode (2 , OUTPUT) ; // s0 выход
pinMode (3 , OUTPUT) ; // s1 выход
pinMode (4 , OUTPUT) ; // s2 выход
digitalWrite (led , HIGH) ; //зажечь светодиод
beginSerial (9600 ) ; // скорость обмена по UART
}

void loop () {
for (count = 0 ; count ≤ 7 ; count ++) { // цикл перебора элементов массива с 1 по 8
row = bin [ count ] ;
r0 = row & 0x01 ;
r1 = (row >> 1) & 0x01 ; //
r2 = (row >> 2) & 0x01 ; //
digitalWrite (2 , r0) ;
digitalWrite (3 , r1) ;
digitalWrite (4 , r2) ;
Serial.println (bin );
delay (1000 ) ;

Одним из ключевых преимуществ платформы Arduino является популярность. Популярную платформу активно поддерживают производители электронных устройств, выпускающие специальные версии различных плат, расширяющих базовую функциональность контроллера. Такие платы, совершенно логично называемые платами расширения (другое название: arduino shield, шилд), служат для выполнения самых разнообразных задач и могут существенно упростить жизнь ардуинщика. В этой статье мы узнаем, что такое плата расширения Arduino и как ее можно использовать для работы с разнообразными устройствами Arduino: двигателями (шилды драйверов двигателей), LCD-экранами (шилды LCD), SD-картами (data logger), датчиками (sensor shield) и множеством других.

Давайте сперва разберемся в терминах. Плата расширения Ардуино – это законченное устройство, предназначенное для выполнения определенных функций и подключаемое к основному контроллеру с помощью стандартных разъемов. Другое популярное название платы расширения – англоязычное Arduino shield или просто шилд. На плате расширения установлены все необходимые электронные компоненты, а взаимодействие с микроконтроллером и другими элементами основной платы происходят через стандартные пины ардуино. Чаще всего питание на шилд тоже подается с основной платы arduino, хотя во многих случаях есть возможность запитки с других источников. В любом шилде остаются несколько свободных пинов, которые вы можете использовать по своему усмотрению, подключив к ним любые другие компоненты.

Англоязычное слово Shield переводится как щит, экран, ширма. В нашем контексте его следует понимать как нечто, покрывающее плату контроллера, создающего дополнительный слой устройства, ширму, за которой скрываются различные элементы.

Зачем нужны шилды arduino?

Все очень просто: 1) для того, чтобы мы экономили время, и 2) кто-то смог заработать на этом. Зачем тратить время, проектируя, размещая, припаивая и отлаживая то, что можно взять уже в собранном варианте, сразу начав использовать? Хорошо продуманные и собранные на качественном оборудовании платы расширения, как правило, более надежны и занимают меньше места в конечном устройстве. Это не значит, что нужно полностью отказываться от самостоятельной сборки и не нужно разбираться в принципе действия тех или иных элементов. Ведь настоящий инженер всегда старается понять, как работает то, что он использует. Но мы сможем делать более сложные устройства, если не будем каждый раз изобретать велосипед, а сосредоточим свое внимание на том, что до нас еще мало кто решал.

Естественно, за возможности приходится платить. Практически всегда стоимость конечного шилда будет выше цены отдельных комплектующих, всегда можно сделать аналогичный вариант подешевле. Но тут уже решать вам, насколько критично для вас потраченные время или деньги. С учетом посильной помощи китайской промышленности, стоимость плат постоянно снижается, поэтому чаще всего выбор делается в пользу использования готовых устройств.

Наиболее популярным примерами шилдов являются платы расширения для работы с датчиками, двигателями, LCD-экранами, SD-картами, сетевые и GPS-шилды, шилды со встроенными реле для подключения к нагрузке.

Подключение Arduino Shields

Для подключения шилда нужно просто аккуратно «надеть» его на основную плату. Обычно контакты шилда типа гребенки (папа) легко вставляются в разъемы платы ардуино. В некоторых случаях требуется аккуратно подправить штырки, если сама плата спаяна неаккуратно. Тут главное действовать аккуратно и не прилагаться излишней силы.

Как правило, шилд предназначен для вполне конкретной версии контроллера, хотя, например, многие шилды для Arduino Uno вполне нормально работают с платами Arduino Mega. Распиновка контактов на меге выполнена так, что первые 14 цифровых контактов и контакты с противоположной стороны платы совпадают с расположением контактов на UNO, поэтому в нее легко становится шилд от ардуино.

Программирование Arduino Shield

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

Чтение или запись сигналов шилдов производится тоже обычным методом: с помощью функций , и других, привычных любому ардуинщику команд. В некоторых случаях возможны коллизии, когда вы привыкли к оной схеме соединения, а производитель выбрал другую (например, вы подтягивали кнопку к земле, а на шилде – к питанию). Тут нужно быть просто внимательным.

Как правило, эта плата расширения идет в наборах ардуино и поэтому именно с ней ардуинщики встречаются чаще всего. Шилд достаточно прост – его основная задача предоставить более удобные варианты подключения к плате Arduino. Это осуществляется за счет дополнительных разъемов питания и земли, выведенных на плату к каждому из аналоговых и цифровых пинов. Также на плате можно найти разъемы для подключения внешнего источника питания (для переключения нужно установить перемычки), светодиод и кнопка перезапуска. Варианты шилда и примеры использования можно найти на иллюстрациях.




Существует несколько версий сенсорной платы расширения. Все они отличаются количеством и видом разъемов. Наиболее популярными сегодня являются версии Sensor Shield v4 и v5.

Данный шилд ардуино очень важен в робототехнических проектах, т.к. позволяет подключать к плате Arduino сразу обычный и серво двигатели. Основная задача шилда – обеспечить управление устройствами потребляющими достаточно высокий для обычной платы ардуино ток. Дополнительным возможностями платы является функция управления мощностью мотора (с помощью ШИМ) и изменения направления вращения. Существует множество разновидностей плат motor shield. Общим для всех них является наличие в схеме мощного транзистора, через который подключается внешняя нагрузка, теплоотводящих элементов (как правило, радиатора), схемы для подключения внешнего питания, разъемов для подключения двигателей и пины для подключения к ардуино.



Организация работы с сетью – одна из самых важных задач в современных проектах. Для подключения к локальной сети через Ethernet существует соответствующая плата расширения.




Платы расширения для прототипирования

Эти платы достаточно просты – на них расположены контактные площадки для монтажа элементов, выведена кнопка сброса и есть возможность подключения внешнего питания. Предназначение данных шилдов – повысить компактность устройства, когда все необходимые компоненты располагаются сразу над основной платой.





Arduino LCD shield и tft shield

Данный тип шилдов используется для работы с LCD-экранами в ардуино. Как известно, подключение даже самого простого 2-строчного текстового экрана далеко не тривиальная задача: требуется правильно подключить сразу 6 контактов экрана, не считая питания. Гораздо проще вставить готовый модуль в плату ардуино и просто загрузить соответствующий скетч. В популярном LCD Keypad Shield на плату сразу заведены от 4 до 8 кнопок, что позволяет срзау организовать и внешний интерфейс для пользователя устройства. TFT Shield также помогает



Arduino Data Logger Shield

Еще одна задача, которую достаточно трудно реализовывать самостоятельно в своих изделиях – это сохранение данных, полученных с датчиков, с привязкой по времени. Готовый шилд позволяет не только сохранить данные и получать время со встроенных часов, но и подключить датчики в удобном виде путем пайки или на монтажной плате.




Краткое резюме

В этой статье мы с вами рассмотрели только небольшую часть огромного ассортимента всевозможных устройств, расширяющих функциональность ардуино. Платы расширения позволяют сосредоточиться на самом главном – логике вашей программы. Создатели шилдов предусмотрели правильный и надежный монтаж, необходимый режим питания. Все, что вам остается, это найти нужную плату, используя заветное английское слово shield, подключить ее к ардуино и загрузить скетч. Обычно любое программирование шилда заключается в выполнении простых действий по переименованию внутренних переменных уже готовой программы. В итоге мы получаем удобство в использовании и подключении, а также быстроту сборки готовых устройств или прототипов.

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