Стандартная Arduino/CraftDuino имеет 20 цифровых пинов (6 из них — ещё и аналоговые входы), что бывает недостаточно для решения некоторых задач: тот же LCD-дисплей требует минимум 6 пинов. Для подключения нескольких устройств, не требующих двунаправленной передачи данных, вполне подойдут сдвиговые регистры.
В предыдущих статьях про вывод и ввод через сдвиговые регистры мы уже рассмотрели самое простое их применение, а именно управление светодиодами путём посылки байта и считывание состояний кнопок. Для того, чтобы заставить работать тот же LCD-дисплей через регистр, придётся применить парочку архитектурных программерских трюков.
При наличии некоторого опыта в C++ это не покажется сложным (:
Начнём с того, что авторы библиотек Arduino старались сильно не заморачиваться насчёт расширяемости функционала, и не получится просто сказать объекту LCD «подключись через сдвиговый регистр». Так что придётся немножко поработать руками и мозгами за них: доработать библиотеки напильником. Заодно упростим себе работу со SPI. Ну что ж, приступим.
С первого взгляда не очень-то понятно, а как, чёрт возьми, заставить работать тот же LCD через сдвиговый регистр? Что записывать в регистр, какие его выводы должны менять состояние и как? Очевидно, что для начала нужно как-то предоставить возможность управлять отдельными выводами регистра так же, как и обычными пинами Arduino.
Вспомним, как подключается LCD, а затем заглянем в исходный код библиотеки LiquidCrystal и увидим, что там чуть ли не в каждой функции дёргаются пины, к которым подключен LCD, вызовами функции digitalWrite(), а режимы этих пинов устанавливаются через pinMode(). Логично будет написать такие же функции и для сдвиговых регистров.
Немного забегая вперёд, скажу, что я уже написал класс SPI_Bus для удобной работы с устройствами по SPI (его я опишу позже), и в него нужно только добавить поддержку управления выводами.
В целях унификации определим интерфейс «контроллера линии»:
class LineDriver
{
public:
virtual void lineConfig(uint8_t pin, uint8_t mode) = 0;
virtual void lineWrite(uint8_t pin, uint8_t value) = 0;
virtual uint8_t lineRead(uint8_t pin) = 0;
};
Этот интерфейс содержит объявления функций lineConfig(), lineWrite() и lineRead() — это аналоги pinMode(), digitalWrite() и digitalRead(). Всю работу с нужными пинами библиотека LCD должна будет делать через интерфейс LineDriver. Для начала создадим драйвер по умолчанию, который будет просто вызывать стандартные функции:
class DefaultLineDriver: public LineDriver
{
public:
virtual void lineConfig(uint8_t pin, uint8_t mode)
{
pinMode(pin, mode);
}
virtual void lineWrite(uint8_t pin, uint8_t value)
{
digitalWrite(pin, value);
}
virtual uint8_t lineRead(uint8_t pin)
{
return digitalRead(pin);
}
static DefaultLineDriver* getInstance()
{
return &g_instance;
}
private:
static DefaultLineDriver g_instance; // один глобальный экземпляр драйвера
};
Теперь добавим в класс LiquidCrystal указатель на экземпляр LineDriver и изменим конструкторы класса и функцию init() так, чтобы они принимали соответствующий аргумент:
// LiquidCrystalExt.h
class LiquidCrystal: public Print
{
…
public:
LiquidCrystal(uint8_t rs, uint8_t enable,
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
LineDriver *line_driver = 0, uint8_t backlight = 0xFF);
…
protected:
void init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable,
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
LineDriver *line_driver = 0, uint8_t backlight = 0xFF);
…
LineDriver *_pins;
…
};
// LiquidCrystalExt.cpp
LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t enable,
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
LineDriver *line_driver, uint8_t backlight)
{
init(1, rs, 0xFF, enable, d0, d1, d2, d3, 0, 0, 0, 0, backlight, line_driver);
}
void LiquidCrystal::init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable,
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
uint8_t backlight, LineDriver *line_driver)
{
_pins = line_driver;
if (!_pins)
_pins = DefaultLineDriver::getInstance();
…
}
По умолчанию аргумент line_driver будет равным нулю и его можно не указывать при объявлении объекта LCD-дисплея — тогда будет использоваться драйвер по умолчанию (DefaultLineDriver) и дисплей будет работать, как обычно, через пины Arduino. Теперь добавим поддержку интерфейса LineDriver в класс для работы с SPI:
class SPI_Bus: public LineDriver
{
public:
…
virtual void lineConfig(uint8_t pin, uint8_t mode)
{
/* Оставляем метод пустым, т.к. возможность управления состоянием выводов
* зависит от конкретного устройства.
*/
}
virtual void lineWrite(uint8_t line_num, uint8_t value)
{
/* Каждому байту соответствует 8 «линий данных» (виртуальных пинов).
* Проверяем, не превышает ли номер линии максимальный.
*/
if (line_num < m_bandwidth * 8)
{
/* Рассчитываем номер байта в буфере и номер бита в байте */
const uint8_t byte_index = line_num / 8,
bit_index = line_num % 8;
/* Сначала стираем нужный бит в буфере */
m_buffer[byte_index] &= ~(1 > bit_index) & 1 ? HIGH : LOW;
}
…
};
Как можно заметить из приведённого кода, в классе SPI_Bus данные буферизуются: если из регистра ничего не считывать, а только управлять отдельными его выводами через функционал LineDriver, то регистр будет поддерживать уровни напряжений на выводах до тех пор, пока вы не установите новые. Это как раз то, что нужно для управления устройствами — менять состояния отдельных выводов, не трогая при этом другие. Всё, теперь можно работать со сдвиговыми регистрами, как с наборами пинов:
/* Допустим, у нас есть один сдвиговый регистр с 8 выходами,
* защёлка которого (SS) подключена к 10му пину Arduino.
*/
SPI_Bus shift_register(_8bit, 10);
/* Аналог digitalWrite(3), только вместо 3-го пина Arduino
* мы управляем 3-м выходом сдвигового регистра.
*/
shift_register.lineWrite(3, LOW);
Так как сделано это через реализацию интерфейса LineDriver, мы можем передавать указатель на объект сдвигового регистра в конструктор объекта LCD:
SPI_Bus shift_register(_8bit, 10);
/* А LCD-дисплей подключен к сдвиговому регистру:
* RS ⇨ выход QA (0)
* E ⇨ QB (1)
* DB4-DB7 ⇨ QC-QF (2-5)
*/
LiquidCrystal lcd(0, 1, 2, 3, 4, 5, &shift_register);
Теперь при работе с LCD будут меняться уровни не на пинах Arduino, а на выходах сдвигового регистра. Одна строка кода для подключения регистра, и один дополнительный аргумент для объекта LiquidCrystal — и можно управлять дисплеем по 3м проводам SPI. При этом ещё два выхода регистра остались свободными, и мы можем их использовать, как обычные пины.
Но мы не ограничимся одним лишь LCD — есть же ещё сервоприводы. Я проделал аналогичные манипуляции с библиотекой Servo, и теперь точно так же можно управлять сервоприводами через сдвиговый регистр:
SPI_Bus shift_register(_8bit, 10);
Servo servo(&shift_register);
/* А дальше всё делается, как обычно */
void setup()
{
servo.attach(6); // вывод QG регистра
}
А что насчёт ввода? Ранее я писал о чтении состояний кнопок через сдвиговый регистр. Теперь, с библиотекой SPI_Bus, это можно сделать так:
SPI_Bus shift_register(_8bit, 10);
void setup()
{
/* Говорим регистру, чтобы дёргал защёлку до чтения по SPI */
shift_register.setSelectionPolicy(SPI_Bus::SELECT_BEFORE);
}
void loop()
{
uint8_t states = shift_register.read8bits(); // считываем состояния
}
А теперь пора использовать наши сдвиговые регистры на полную катушку — подключим к Arduino сразу несколько устройств всего по 5 проводам: LCD-дисплей, 4 сервопривода, RGB-светодиод, несколько кнопок и dip-переключатель на 3 позиции. Схема подключения:
Вся логика запитана от +5 В Craftduino, а сервы — напрямую от +5 В блока питания. Сама Craftduino запитана от +12 В провода БП.
Тут нужно быть поосторожнее с нагрузкой: если она будет слишком велика, то стабилизатор на Craftduino будет перегреваться из-за слишком высокого входного напряжения.
В этой схеме подавать +12 В вполне допустимо, т.к. компоненты, запитанные от крафтины, не особо жадные.
Общий вид:
Здесь я сделал пару хитростей для уменьшения количества проводов. Во-первых, сделал breakout-платы для 74HC595 (в корпусах SSOP), которые легко соединяются каскадно, используя общие линии SPI и питание: Во-вторых, сделал для сигнальных линий сервоприводов 4-жильный шлейф: Просто взял 4 жилы от старого шлейфа для привода гибких дисков (флопарей), припаял к ним 4 пина гребёнки PLS и залепил всё это поликапролактоном (ПКЛ) — последний для этих целей рулит не по-детски (: Ну, и в-третьих, припаял к LCD-дисплею легендарный транзистор КТ315 с килоомным резистором на базе — для управления подсветкой, подстроечный резистор на 10 кОм — для настройки контрастности, а также 9-жильный шлейф (4 линии данных DB7-DB4, Enable, RS, подсветка, +5V, GND): Можете рассмотреть некоторые части системы отдельно. Вот сдвиговые регистры 74HC595, к которым подключены LCD, сервы и RGB-светодиод: Регистр 74HC165 c подключенными кнопками и dip-переключателем: Заметьте, кнопки и dip-переключатель подключены к «земле» резисторами на 1 кОм — я это сделал лишь потому, что провода ещё больше загромоздили бы плату. Так как к питанию они подключены через резисторы на 10 кОм, получается, что входы 74HC165 подключены к резистивным делителям напряжения с коэффициентом 10:1, но так как при нажатии кнопки делитель выдаёт напряжение около 0.5 В, это не вызывает никаких проблем — такое напряжение является логическим нулём, так как меньше необходимого порога. Можете убедиться, к Craftduino идёт всего 5 сигнальных проводов: Ну и повторюсь — питается это всё от обычного компьютерного блока питания — оттуда берётся +12 В на вход Craftduino, +5 В для питания серв и «земля»: Суть эксперимента такова: пусть при щёлкании dip-переключателем включается/выключается подсветка LCD и загораются/гаснут два значка на нём, при нажатии и удержании кнопок вращаются сервоприводы, и параллельно ещё меняются цвета RGB-светодиода. Для этого примера потребуются библиотеки LineDriver, SPI_Bus, ServoExt и LiquidCrystalExt, ссылки на которые приведены в конце статьи.
/* Включаем все необходимые библиотеки */
#include
#include
#include
#include
#include
enum
{
SERVOS_AMOUNT = 4, // количество серв
SERVOS_FIRST_PIN = 9, // вывод сдвигового регистра для первой сервы
SERVO_ROTATE_STEP = 2, // насколько поворачивать серву, когда нажата кнопка
SYMBOL_HEIGHT = 8, // высота символа LCD
SYM_DANGER = 0, // код символа «череп и кости»
SYM_LIGHTNING = 1, // код символа «молния»
RED_LINE = 2, // номер вывода регистра для красного канала светодиода
GREEN_LINE = 0, // и зелёного
BLUE_LINE = 1, // и синего
SWITCH1 = 1
Подключение внешних устройств к Arduino
Для подключения какого-либо внешнего устройство к Arduinoили Arduino-совместимой плате требуется выполнить простую инструкцию из двух этапов.
ЭТАП I. ПОИСК ИНФОРМАЦИИ
В первую очередь, требуется определить по какому протоколу общается устройство с Arduino. Это могут быть, как и собственные протоколы устройств, так и стандартные, например, SPI, I2C, UART. Для этого требуется найти datasheetустройства (к примеру, тут http://www.alldatasheet.com/), либо описание, собственно, устройства, так как часто на модули, разработанные сторонними компаниями, даташитов нет или они не полные. Так же поможет запрос в гугл «Arduinoподключение , после которого можно найти не только схему подключения, но и библиотеку для работы с Arduino.
Помимо устройств с цифровыми выводами, существуют также, устройства с аналоговым выводом (к примеру, терморезисторы). В таком случае можно применить алгоритм выше, но при этом стоит внимательно изучить datasheet, поскольку выход с аналогового устройства может иметь некоторую погрешность, которую надо будет поправить программно.
Отдельным пунктом надо отметить исполнительные устройства: моторчики, шаговые двигатели, релейные модули и т.п.
Их надо ВСЕГДА подключать через вспомогательное устройство и ни в коем случае не напрямую к порту Arduino, поскольку никаких ограничений по току в них нет, и любой сбой в нормальном режиме работы устройства (к примеру, застревание двигателя) может вызывать ток, достаточный для того, чтобы сжечь не только порт, но и сам микроконтроллер.
Предположим, что первый этап выполнен. Протокол (или то, что устройство аналоговое) определён, принцип работы понятен, или найдена библиотека. Далее действия различаются для аналоговых, цифровых и исполнительных устройств.
ЭТАП II. ПОДКЛЮЧЕНИЕ (ЦИФРОВЫЕ УСТРОЙСТВА)
При подключении цифровых устройств могут возникнуть следующие проблемы:
- Разность уровня сигнала
- Высоковольтные шумы
- Затухание сигнала на больших расстояниях
Для решения первой проблемы можно использовать стандартные устройства, типа двухсторонних преобразователей уровней (в случае если устройства работают на двух распространённых напряжениях 5 и 3.3В). Примеры таких устройств тут
Если разница в уровне более значительна, то понадобится использовать оптопару. При этом надо будет проверить, нет ли ограничения по частоте устройства, поскольку отпопара имеет свойство срезать высокочастотные сигналы.
Базовая схема подключения оптопары представлена на рисунке ниже.
Для устранения высоковольтных шумов, которые могут возникнуть при большом расстоянии до устройства (или наличии рядом высоковольтных устройств, создающих шум) опять же поможет оптопара. Даже если в соединительном кабеле произойдут скачки, то в крайнем случае пострадает оптопара, а не порт контроллера.
Для борьбы с затуханием сигнала подойдут усилители, например 5В и 12В (опять же, смотрим на предельную частоту работы), или использование дополнительных контроллеров на разных сторонах и передача сигнала по протоколам, которые хорошо противостоят затуханию, а именно RS232 (не UART!), RS485, Ethernet и, с появлением недорогих модулей ESP8266, можно даже использовать интернет и отказаться от проводов.
ЭТАП II. ПОДКЛЮЧЕНИЕ (АНАЛОГОВЫЕ УСТРОЙСТВА)
Подключение аналоговых устройств выполняется через аналоговые входы Arduino. Стоит отметить, что это именно входы. В базовых версиях Arduinoнет аналоговых выходов, но некоторый подобный функционал позволяет реализовать PWM (в частности восьмибитный звук), а также использование внешних ЦАП (цифро-аналоговых преобразователей)
В данном случае могут возникнуть следующие проблемы:
- Согласование уровней сигналов
- Наводки
Универсальным решением является использование токовой петли. Суть решения заключается в преобразовании сигнала (в качестве которого обычно выступает напряжение) в ток и передача тока. После этого на другом конце петли происходит обратное преобразование тока в напряжение.
ЭТАП II. ПОДКЛЮЧЕНИЕ (ИСПОЛНИТЕЛЬНЫЕ УСТРОЙСТВА)
Отличие исполнительных устройств от двух категорий выше, заключается в том, что при взаимодействии с внешней средой могут возникнуть любые соотношения между входными и выходными характеристиками.
Важно не допускать прямого соединения микроконтроллера и исполнительного устройства, так как в результате работы последнего могут возникнуть токи, которые микроконтроллер просто не выдержит.
К примеру, это может случиться, если напрямую подключить моторчик на 5 вольт и зажать ему вал, чтобы он не мог вращаться.
Тогда достаточно быстро ток сожжёт выход Arduino, к которому подключен (и хорошо, если сам вход).
Для подключения подобного класса устройств используются драйверы, MOSFET-транзисторы, полупроводниковые мосты, а также реле (которые сами относятся к данному классу устройств, поэтому для их подключения тоже требуется использовать промежуточное звено в виде оптопары).
В общем случае положительный канал от источника питания подключается напрямую к источнику напряжения, а отрицательный — к устройству коммутации. В частности, для управления RGBлентой используется следующая схема:
Аналогично подключаются шаговые двигатели и прочие исполнительные механизмы.
РЕЗЮМЕ
К Arduinoможно подключить практически всё, что как-либо управляется или просто питается от электричества. Главное — выбрать правильную схему подключения и использовать соответствующие команды для управления.
Arduino Uno: распиновка, схема подключения и программирование
Arduino Uno — флагманская платформа для разработки на базе микроконтроллера ATmega328P.
На Arduino Uno предусмотрено всё необходимое для удобной работы с микроконтроллером: 14 цифровых входов/выходов (6 из них могут использоваться в качестве ШИМ-выходов), 6 аналоговых входов, кварцевый резонатор на 16 МГц, разъём USB, разъём питания, разъём для внутрисхемного программирования (ICSP) и кнопка сброса.
Для работы с платой Arduino Uno в операционной системе Windows скачайте и установите на компьютер интегрированную среду разработки Arduino — Arduino IDE.
Сердцем платформы Arduino Uno является 8-битный микроконтроллер семейства AVR — ATmega328P.
Микроконтроллер ATmega16U2 обеспечивает связь микроконтроллера ATmega328P с USB-портом компьютера. При подключении к ПК Arduino Uno определяется как виртуальный COM-порт. Прошивка микросхемы 16U2 использует стандартные драйвера USB-COM, поэтому установка внешних драйверов не требуется.
- VIN: Напряжение от внешнего источника питания (не связано с 5 В от USB или другим стабилизированным напряжением). Через этот вывод можно как подавать внешнее питание, так и потреблять ток, если к устройству подключён внешний адаптер.
- 5V: На вывод поступает напряжение 5 В от стабилизатора платы. Данный стабилизатор обеспечивает питание микроконтроллера ATmega328. Запитывать устройство через вывод 5V не рекомендуется — в этом случае не используется стабилизатор напряжения, что может привести к выходу платы из строя.
- 3.3V: 3,3 В от стабилизатора платы. Максимальный ток вывода — 50 мА.
- IOREF: Вывод предоставляет платам расширения информацию о рабочем напряжении микроконтроллера. В зависимости от напряжения, плата расширения может переключиться на соответствующий источник питания либо задействовать преобразователи уровней, что позволит ей работать как с 5 В, так и с 3,3 В устройствами.
- Цифровые входы/выходы: пины 0–13
Логический уровень единицы — 5 В, нуля — 0 В. Максимальный ток выхода — 40 мА. К контактам подключены подтягивающие резисторы, которые по умолчанию выключены, но могут быть включены программно. - ШИМ: пины 3,5,6,9,10 и 11
Позволяют выводить 8-битные аналоговые значения в виде ШИМ-сигнала. - АЦП: пины A0–A5
6 аналоговых входов, каждый из которых может представить аналоговое напряжение в виде 10-битного числа (1024 значений). Разрядность АЦП — 10 бит. - TWI/I²C: пины SDA и SCL
Для общения с периферией по синхронному протоколу, через 2 провода. Для работы — используйте библиотеку Wire. - SPI: пины 10(SS), 11(MOSI), 12(MISO), 13(SCK).
Через эти пины осуществляется связь по интерфейсу SPI. Для работы — используйте библиотеку SPI. - UART: пины 0(RX) и 1(TX)
Эти выводы соединены с соответствующими выводами микроконтроллера ATmega16U2, выполняющей роль преобразователя USB-UART. Используется для коммуникации платы Arduino с компьютером или другими устройствами через класс Serial.
RX и TX | Мигают при обмене данными между Arduino Uno и ПК. |
L | Светодиод вывода 13. При отправке значения HIGH светодиод включается, при отправке LOW – выключается. |
ON | Индикатор питания на плате. |
Разъём USB Type-B предназначен для прошивки платформы Arduino Uno с помощью компьютера.
Разъём для подключения внешнего питания от 7 В до 12 В.
ICSP-разъём предназначен для внутрисхемного программирования микроконтроллера ATmega328P.
С использованием библиотеки SPI данные выводы могут осуществлять связь с платами расширения по интерфейсу SPI. Линии SPI выведены на 6-контактный разъём, а также продублированы на цифровых пинах 10(SS), 11(MOSI), 12(MISO) и 13(SCK).
ICSP-разъём предназначен для внутрисхемного программирования микроконтроллера ATmega16U2.
- Микроконтроллер: ATmega328
- Напряжение логических уровней: 5 В
- Входное напряжение питания: 7–12 В
- Портов ввода-вывода общего назначения: 20
- Максимальный ток с пина ввода-вывода: 40 мА
- Максимальный выходной ток пина 3.3V: 50 мА
- Максимальный выходной ток пина 5V: 800 мА
- Портов с поддержкой ШИМ: 6
- Портов, подключённых к АЦП: 6
Плата Arduino Uno – описание, схема, распиновка
Arduino Uno – плата от компании Arduino, построенная на микроконтроллере ATmega 328.
Плата имеет на борту 6 аналоговых входов, 14 цифровых выводов общего назначения (могут являться как входами, так и выходами), кварцевый генератор на 16 МГц, два разъема: силовой и USB, разъем ISCP для внутрисхемного программирования и кнопку горячей перезагрузки устройства. Для стабильной работы плату необходимо подключить к питанию либо через встроенный USB Разъем, либо подключив разъем питания к источнику от 7 до 12В. Через переходник питания плата также может работать и от батареи формата Крона.
Основное отличие платы от предыдущих – для взаимодействия по USB Arduino Uno использует отдельный микроконтроллер ATmega8U2. Прошлые версии Arduino использовали для этого микросхему программатора FTDI.
Несложно догадаться, что благодаря своему итальянскому происхождению, слова “Arduino” и “Uno” взяты именно из этого языка. Компания назвалась “Arduino” в честь короля Италии 11 века Ардуина, а Уно переводится с итальянского как “первый”.
- Печатная плата Arduino Uno является Open-Hardware, поэтому все ее характеристики доступны в открытом доступе.
- Длина и ширина платы составляют 69 мм x 53 мм.
- Силовой и USB разъемы выступают за границы печатной платы на 2 мм.
Расстояние между выводами соответствует стандарту 2.54 мм, однако расстояние между 7 и 8 контактами составляет 4 мм.
Плата Arduino Uno имеет на борту 3 способа подключения питания: через USB, через внешний разъем питания и через разъем Vin, выведенный на одну из гребенок сбоку. Платформа имеет на борту встроенный стабилизатор, позволяющий не только автоматически выбирать источник питания, но и выравнивать ток до стабильных 5 вольт, необходимых контроллеру для работы.
Внешнее питание можно подавать как напрямую от USB порта компьютера, так и от любого AC/DC блока питания через разъем питания или USB.
На плате предусмотрено несколько выводов, позволяющих запитывать от нее подключенные датчики, сенсоры и актуаторы. Все эти выводы помечены:
- Vin – вход питания, используется для получения питания от внешнего источника. Через данных вывод происходит только подача питания на плату, получить оттуда питание для внешних устройств невозможно. На вход Vin рекомендуется подавать напряжение в диапазоне от 7В до 20В, во избежании перегрева и сгорания встроенного стабилизатора.
- 5V – источник пятивольтового напряжения для питания внешних устройств. При получении питания платой из любых других источников (USB, разъем питания или Vin) на этом контакте вы всегда сможете получить стабильное напряжение 5 вольт. Его можно вывести на макетную плату или подать напрямую на необходимое устройство.
- 3V3 – источник 3.3 вольтового напряжения для питания внешних устройств. Работает по такому-же принципу, что и контакт 5V. С данной ножки также можно вывести напряжение на макетную плату, либо подать на необходимый датчик/сенсор напрямую.
- GND – контакт для подключения земли. Необходим для создания замкнутой цепи при подключении к контактам Vin, 5V или 3V3. Во всех случаях ножку GND необходимо выводить как минус, иначе цепь не будет замкнута и питание (что внешнее, что внутреннее) не подасться.
Платформа Arduino Uno имеет на борту микроконтроллер ATmega328, который обладает Flash, SRAM и EEPROM памятью.
- FLASH – 32kB, из которых 0.5kB используется для хранения загрузчика
- SRAM (ОЗУ) – 2kB
- EEPROM – 1kB (доступна с помощью библиотеки EEPROM)
На плате выведены 14 цифровых пинов (контактов), любой из которых может работать как на вывод информации, так и на ввод. Для этого в коде программ применяются специальные функции:
Функция pinMode служит для задания режима работы контакта, будет-ли он работать на выход или на вход. В данной функции задается номер контакта, которым мы в дальнейшем собираемся управлять.
- Функция считывает текущее значение с заданного контакта – его значение может быть HIGH или LOW.
- Функция передает определенное значение на заданный контакт – оно может быть HIGH или LOW.
- Все выводы обладают пятивольтовой логикой, то есть выдают логическую единицу как напряжение 5В.
- Каждый вывод платы имеет нагрузочный резистор номиналом 20-50 кОм и может пропускать до 40 мА, но по умолчанию все они отключены.
- Также, на контактных площадках Arduino Uno выведены специальные интерфейсы подключения различных цифровых устройств:
Arduino Uno имеет на своей платформе 6 аналоговых входов с разрешением 10 Бит на каждый вход. Данное разрешение говорит нам о том, что сигнал, приходящий на него, можно оцифровать в диапазоне от 0 до 1024 условных значений.
Считывать значения с данных контактов можно функцией analogRead(), а передавать значения – функцией analogWrite().
Так как Arduino Uno обладает пятивольтовой логикой, то и значение будет находиться в диапазоне от 0 до 5 вольт, однако при помощи функции analogReference() можно изменять верхний предел.
Данные выводы используются для обмена данными по протоколу UART. Контакт RX используется для получения данных, а контакт TX – для их отправки. Эти выводы подключены к соответствующим контактам последовательной шины схемы ATmega8U2 USB-to-TTL, выступающей в данном контексте в роли программатора.
Данные контакты могут конфигурироваться на вызов различных прерываний, когда программа останавливает выполнение основного кода и производит выполнение кода прерывания.
Вызов прерывания может быть задан по-разному:
- на младшем значении
- на переднем или заднем фронте
- при изменении значения
Более подробно прерывания описаны в отдельной статье нашей Вики.
С помощью данных контактов происходит подключение периферии, работающей через интерфейс SPI. Для работы с данным интерфейсом в среде Arduino IDE предусмотрена отдельная библиотека с одноименным названием.
При помощи данных контактов к Arduino можно подключать внешние цифровые устройства, умеющие общаться по протоколу I2C. Для реализации интерфейса в среде Arduino IDE присутствует библиотека Wire.
Для проверки вашего кода по ходу его написания, самый удобный способ индикации – встроенный светодиод. Подав значение HIGH на 13 контакт, он загорается на плате красным цветом, тем самым показывая, что условие вашей программы выполнилось (или наоборот, что-то пошло не так). 13 контакт удобно использовать в коде программы для проверки ошибок и отладки.
Кстати, хотим заметить, что последовательно к 13-ому контакту подключен резистор на 220 Ом, поэтому не стоит использовать его для вывода питания ваших устройств.
Помимо всех вышеперечисленных, на платформе Uno имеется еще 2 дополнительных контакта.
AREF
Данный контакт отвечает за определение опорного напряжения аналоговых входов платформы. Используется только с функцией analogReference().
RESET
Данный контакт необходим для аппаратной перезагрузки микроконтроллера. При подаче сигнала низкого уровня (LOW) на контакт Reset, происходит перезагрузка устройства.
Данный контакт обычно соединен с аппаратной кнопкой перезагрузки, установленной на плате.
Для осуществления связи с внешними устройствами (компьютером и другими микроконтроллерами) на плате существует несколько дополнительных устройств.
На контактах 0 (RX) и 1 (TX) контроллер ATmega328 поддерживает UART – последовательный интерфейс передачи данных.
ATmega8U2, выполняющий на плате роль программатора, транслирует этот интерфейс через USB, позволяя платформе общаться с компьютером через стандартный COM-порт.
Прошивка, установленная в контроллер ATmega8U2, имеет на борту стандартные драйверы USB-COM, поэтому для подключения не потребуется никаких дополнительных драйверов.
Внимание! На платах китайского производства, вместо контроллера ATmega8U2 используется другой программатор – CH340G, который не распознается Windows в автоматическом режиме. Для него необходимо установить дополнительный драйвер, о чем подробно написано в нашем блоге – Установка драйверов микросхемы CH340G для Arduino.
При помощи мониторинга последовательной шины, называемого Serial Monitor, среда Arduino IDE посылает и получает данные от Arduino. При обмене данными на плате видно мигание светодиодов RX и TX. При использовании UART-интерфейса через контакты 0 и 1, светодиоды не мигают.
Плата может взаимодействовать по UART-интерфейсу не только через аппаратным, но и через программным способом. Для этого в среде Arduino IDE предусмотрена библиотека SoftwareSerial.
Также, на плате предусмотрены выводы основных интерфейсов взаимодействия с периферией: SPI и I2C (TWI).
Платформа Arduino Uno, как и все другие Arduino-совместимые платформы, программируется в среде Arduino IDE. Для работы с ней в настройках программы необходимо выбрать нужную платформу. Это можно сделать в верхнем меню -> Tools -> Boards -> Arduino UNO.
Выбор микроконтроллера зависит от того, какой стоит именно на вашей плате. Обычно это ATmega328.
Плата как правило поставляется уже прошитая необходимым загрузчиком и должна определяться системой в автоматическом режиме (за исключением плат на основе программатора CH340G). Связь микроконтроллера с компьютером осуществляется стандартным протоколом STK500.
Помимо обычного подключения, на плате также размещен разъем ISCP для внутрисхемного программирования, позволяющий перезаписать загрузчик или загрузить прошивку в контроллер в обход стандартного программатора.
Обычно, в микроконтроллерах перед загрузкой кода предусмотрен вход платы в специальный режим загрузки, однако Arduino Uno избавлена от данного действия для упрощения загрузки в нее программ.
Стандартно, перед загрузкой каждый микроконтроллер получает сигнал DTR (digital reset), но в данной плате вывод DTR подключен к микроконтроллеру ATmega8U2 через 100 нФ конденсатор и программатор сам управляет процессом загрузки новой прошивки в контроллер.
Таким образом, загрузка прошивки происходит моментально после нажания кнопки Upload в среде Arduino IDE.
Эта функция имеет еще одно интересное применение. Каждый раз при подключении платформы к компьютеру с OC Windows, MacOS или Linux, происходит автоматическая перезагрузка платы и в следующие полсекунды на плате работает загрузчик. Таким образом, для избежания получения некорректных данных, во время загрузки прошивок происходит задержка первых нескольких байтов информации.
Arduino Uno поддерживает отключение автоматической перезагрузки. Для этого необходимо разорвать линию RESET-EN. Еще один способ отключения автоматической перезагрузки – подключение между линиями RESET-EN и линией питания 5V резистора номиналом 110 Ом.
Для защиты USB порта компьютера от обратных токов, короткого замыкания и сверхнагрузки, на платформе Arduino Uno встроен автоматический самовостанавливающийся предохранитель. При прохождении тока питания более 500 мА через USB порт, предохранитель автоматически срабатывает и размыкает цепь питания до тех пор, пока значения тока не вернуться к нормальным.