Arduino UNO распиновка выводов
Большинство моделей Ардуино, включая самую популярную Arduino UNO R3, оснащены 8-битным микроконтроллером AVR ATmega328P. Дорожки на печатной плате соединяют выводы микроконтроллера с гребенкой контактов. Благодаря этому мы можем подключить к Arduino внешние устройства, такие как Arduino Shield, светодиоды, транзисторы, датчики, потенциометры и другие.
Контакты Arduino UNO R3 включают в себя 14 цифровых контактов, 6 аналоговых контактов, разъемы питания, разъем USB и разъем для дополнительного внешнего программатора USB-ASP. Полная схема распиновки платы Arduino UNO R3 показана на следующем рисунке:
RoboCraft
Думаю, ни для кого не секрет, что первоначально программу в микроконтроллер заливают при помощи специального устройства — программатора. Конечно, ардуинщикам обычно не нужно об этом беспокоиться — у них есть bootloader (загрузчик), заранее прошитый в микроконтроллер, и прошивку он забирает по UART через COM-порт или через USB. Но чтобы прошить этот загрузчик или другую прошивку в «чистый» МК, нужен программатор.
Но в этой статье мы не будем рассматривать сборку и пайку программатора с нуля, а воспользуемся возможностями Arduino. Дело в том, что на большинстве плат Arduino до версии Uno есть микросхема FT232RL
компании FTDI. Эта микросхема представляет собой конвертор UART->USB, предоставляя операционной системе виртуальный COM-порт, работающий через USB. Но в данном случае нам нужна другая её возможность — управление отдельными выводам микросхемы, именуемое режимом bit-bang, которое позволяет «завернуть» произвольный протокол в USB. Задача состоит в том, завернуть в USB протокол прошивки МК.
Микроконтроллеры AVR, используемые в Arduino, прошиваются по уже знакомому нам протоколу SPI через разъём для внутрисхемного программирования — ISP
(
I
n-
S
ystem
P
rogramming). Он так называется потому, что позволяет прошивать МК прямо в конечном устройстве. Вот как выглядит этот разъём на плате CraftDuino:
MISO, MOSI, SCK, RESET — это всё линии шины SPI, только вместо SS — RESET.
Но нам ещё нужен доступ выводам FT232RL, через которые будет осуществляться прошивка, и разработчики Arduino позаботились об этом, сделав разъём X3
(икс-три):
Если на вашей плате только контактные площадки для X3, нужно будет припаять кусок PLS-гребёнки самим.
Пины этого разъёма имеют следующее назначение для ISP-программатора:
- 1 (CTS) — MISO
- 2 (DSR) — SCK
- 3 (DCD) — MOSI
- 4 (RI) — RESET
А у CraftDuino вместо X3 есть стандартный разъём RS232, тоже соединённый с FT232RL, из которого нам нужны те же 4 вывода:
- 1 (CD) — MOSI
- 6 (DSR) — SCK
- 8 (CTS) — MISO
- 9 (RI) — RESET
Пораскинув мозгами, сделаем кабель для нашего импровизированного ISP-программатора:
С одного конца кабеля — разъёмы для Arduino X3/CraftDuino UART, и для питания:
А с другого конца — стандартный разъём ISP:
Обычно для прошивки AVR используется популярная утилита avrdude
, которая поддерживает множество различных программаторов и моделей МК, её использует даже среда Arduino IDE для заливки скетча. Для этой утилиты есть патч, позволяющий прошивать МК через микросхему FT232RL, используя режим bit-bang. Нашлись добрые люди, которые уже пропатчили Windows-версию
avrdude
для работы с bit-bang-программатором на базе этой микросхемы, а я сделал то же и для Linux:
- Патченая версия 5.3.1 для Windows.
- Версия 5.10, deb-пакет для Linux i386 и amd64 (x86_64).
- Архив с исходными кодами версии 5.10, библиотекой libftd2xx-1.0.4 с официального сайта FTDI и правлеными Makefile.in
и
avrdude.conf
, чтобы всё это собиралось, корректно устанавливалось и работало. Проверял только на Ubuntu 11.04 (i386 и amd64).
Собственно, deb-пакеты собраны из выложенного тут патченого дистрибутива, но для параноиков есть другой вариант — пропатчить и собрать avrdude самолично, про это читайте тут. Только в avrdude.conf
нужно добавить следующие строчки, а не то, что написано в статье по ссылке:
programmer id = «ftbb»; desc = «FT232R Synchronous BitBang»; type = ft245r; miso = 3; # CTS X3(1) sck = 5; # DSR X3(2) mosi = 6; # DCD X3(3) reset = 7; # RI X3(4) ;
Если вы работаете в Linux, придётся сделать ещё несколько действий (FTDI нас любит):
- Убить драйвер ftdi_sio
, который мешает
avrdude
открыть COM-порт FTDI: sudo rmmod ftdi_sioЕсли хотите, можете занести этот модуль ядра в чёрный список, внеся в /etc/modprobe.d/blacklist.conf
строчку:
blacklist ftdi_sio
Только имейте ввиду, что для работы с виртуальным портом /dev/ttyUSB0и т.п. (нужно Arduino IDE) этот модуль должен быть запущен. Это можно делать командой
sudo modprobe ftdi_sio - По умолчанию, система при попытке avrdude открыть виртуальный COM-порт FTDI покажет ему кукиш, а он вам — не слишком информативное сообщение об ошибке. Нужно дать себе права на полный доступ к виртуальным COM-портам, создав в /etc/udev/rules.d/
файлик с именем
80-ftdi.rules
следующего содержания: SYSFS{idVendor}==»0403″, SYSFS{idProduct}==»6001″, MODE=»660″, GROUP=»ftdi-user»USB Vendor ID и Product ID можно для верности уточнить командой lsusb
, если Arduino подключена к компу:
… Bus 005 Device 012: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC …
Потом нужно создать группу ftdi-userи добавить себя в неё:
sudo addgroup ftdi-user sudo usermod -a -G ftdi-user <�������������
��ле чего нужно перелогиниться.Ну и, чтобы служба udev
узнала про изменения, нужно либо перезагрузить комп, либо вызвать
sudo udevadm trigger
В статье про программирование AVR на C товарищ noonv уже описал, как пользоваться avrdude
, а я опишу лишь заливку загрузчика на Arduino Diecimila с ATmega168:
- Устанавливаем необходимые для быстрой прошивки загрузчика fuse-биты: кварц > 8 МГц, встроенный делитель на 8 выключен: avrdude -c ftbb -P ft0 -p m8 -B 9600 -U hfuse:w:0xdd:m -U lfuse:w:0xff:m
- Заливаем загрузчик: avrdude -c ftbb -P ft0 -p ATMega168 -B 19200 -U flash:w:ATmegaBOOT_168_diecimila.hex
Но консоль не всегда лучше гуя, особенно для задания fuse-битов, и есть гораздо более удобный и надёжный способ — воспользоваться программой SinaProg, разработанной иранскими программистами. Их сайт давно сдох, зато программа живёт и здравствует и по сей день. О её настройке подробно написано у Di Halt’а, ну а мы не будем терять времени и возьмём готовую настроенную сборку с пропатченным avrdude (в сборке Di Halt’а ошибка в одном из конфигов). Версии под Linux, увы, не существует.
В секции Hex file
выбирается hex-файл, который нужно залить или считать. Записывать и считывать можно как память программ (Flash), так и энергонезависимую (EEPROM). В секции
Device
нужно указать конкретный МК, в секции
Programmer
— программатор (у нас это ftbb), порт (FTDI0) и скорость порта (9600).
Ну и то, ради чего стоит пользоваться этой программой — секция Fuses
. В раскрывающемся списке можно выбрать предопределённые конфигурации fuse-битов, которые задаются в Fuse.txt. Но самое главное открывается нашему взору по нажатию кнопки
Advanced
:
Здесь можно набивать fuse-байты вручную, а можно нажимать на кнопки «C» рядом со значением байтов и выставлять фьюзы тыканием галочек с описаниями. Для заливки загрузчика сначала нажмём кнопку Read
, чтобы считать текущие значения fuse, а затем настроим
Low fuse
: частота кварца — более 8 МГц, время старта МК — 65 мс, делитель на 8 выключен:
После настройки жмём кнопку Write
и ждём появления надписи «Writing Fuses… OK».
Теперь можно в главном окне в секции Hex file
выбирать файл загрузчика
ATmegaBOOT_168_diecimila.hex
и в секции
Flash
жать кнопку
Program
. Если в процессе будут возникать ошибки, то над индикатором прогресса есть кнопка «>», открывающая сбоку в окне лог работы
avrdude
.
А давайте-ка прошьём какой-нибудь другой МК — например, ATtiny13
.
Поставим МК на макетку, подсоединим к ней все линии разъёма ISP от нашего bit-bang-программатора, прицепим светодиод через резистор на 500 Ом к 3-й ножке (DB4
) и подтянем
RESET
к питанию резистором на 10 кОм:
Пишем в любимом текстовом редакторе простой код простой мигалки светодиодом в файл blink.c
:
#include #include enum { LED_BIT = 1 << PORTB4 }; int main() { DDRB |= LED_BIT; while (1) { PORTB |= LED_BIT; _delay_ms(500); PORTB &= ~LED_BIT; _delay_ms(500); } }
Компилируем:
avr-gcc -DF_CPU=1200000 -Os -mmcu=attiny13 blink.c -o blink.out
Делаем hex-файл прошивки:
avr-objcopy -O ihex blink.out blink.hex
Заливаем на МК:
avrdude -c ftbb -P ft0 -p attiny13 -B 9600 -U flash:w:blink.hex
Загрузка пошла:
:~/tmp$ avrdude -c ftbb -P ft0 -p attiny13 -B 9600 -U flash:w:blink.hex avrdude: BitBang OK avrdude: pin assign miso 3 sck 5 mosi 6 reset 7 avrdude: drain OK ft245r: bitclk 4800 -> ft baud 2400 avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude: Device signature = 0x1e9007 avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed To disable this feature, specify the -D option. avrdude: erasing chip ft245r: bitclk 4800 -> ft baud 2400 avrdude: reading input file «blink.hex» avrdude: input file blink.hex auto detected as Intel Hex avrdude: writing flash (78 bytes): Writing | ################################################## | 100% 0.64s avrdude: 78 bytes of flash written avrdude: verifying flash memory against blink.hex: avrdude: load data flash data from input file blink.hex: avrdude: input file blink.hex auto detected as Intel Hex avrdude: input file blink.hex contains 78 bytes avrdude: reading on-chip flash data: Reading | ################################################## | 100% 0.50s avrdude: verifying … avrdude: 78 bytes of flash verified avrdude: safemode: Fuses OK avrdude done. Thank you.
Перевтыкаем Arduino в USB и наблюдаем мигание светодиода при условии, что нет ошибок подключения (:
Вот так, путём нехитрых манипуляций руками и мозгами, можно сделать себе USB ISP-программатор, так что не нужно париться с отсутствием LPT на современных компах и COM-порта почти на любом ноутбуке — уж USB-то есть везде.
Arduino — питание платы
Как подключить Arduino к питанию. Как и любое другое электронное устройство, для работы платы Ардуино необходимо подключить питающее напряжение. Питание к Arduino UNO R3 может подаваться тремя способами.
- Первый способ — использовать разъем питания Arduino 5,5 мм/2,1 мм (круглый). В данном случае выходное напряжение должно быть в диапазоне от 7В до 12В.
- Второй способ — подать на вывод «VIN» напряжение от внешнего источника в диапазоне от 7В до 12В. Это может быть лабораторный блок питания или два литий-ионных аккумулятора формата 18650, соединенных последовательно. Вывод «VIN» подключен к выпрямительному диоду, что предотвращает повреждение в случае подключения напряжения с обратной полярностью.
- Третий способ — также питание можно подать через разъем USB типа B — как при подключении Ардуино к компьютеру, так и при питании от зарядного устройства для смартфона. Необходимо иметь в виду, что USB компьютера обеспечивает максимальный ток до 500 мА.
Мощность блока питания следует подобрать в соответствии с энергопотреблением разрабатываемого устройства. Независимо от выбранного источника питания, схема должна соединяться с землей (GND). На плате Ардуино есть пять контактов «GND», которые гальванически связаны друг с другом.
Также на плате есть контакт «RESET», который после короткого замыкания на землю, например, с помощью кнопки на плате, вызывает временное отключение питания и перезапуск Arduino.
На Arduino можно подать внешний источник опорного напряжения через вывод «IOREF».
Набор для Arduino
Cтартовый набор Keyestudio Super с платой V4.0 для Arduino…
Подробнее
5Скетч для управления сдвиговым регистром по интерфейсу SPI
Напишем скетч, реализующий «бегущую волну», последовательно зажигая светодиоды, подключённые к выходам сдвигового регистра.
#include const int pinSelect = 8; // пин выбора регистра
void setup() {
SPI.begin(); // инициализация интерфейса SPI pinMode(pinSelect, OUTPUT); // digitalWrite(pinSelect, LOW); // выбор ведомого устройств (регистра) SPI.transfer(0); // очищаем содержимое регистра digitalWrite(pinSelect, HIGH); // конец передачи Serial.begin(9600);
}void loop() {
for (int i=0; i}
Сначала подключим библиотеку SPI и инициализируем интерфейс SPI. Определим пин 8 как пин выбора ведомого устройства SS. Очистим сдвиговый регистр, послав в него значение «0». Инициализируем последовательный порт.
Чтобы зажечь определённый светодиод с помощью сдвигового регистра, нужно подать на его вход 8-разрядное число. Например, чтобы загорелся первый светодиод – подаём двоичное число 00000001, чтобы второй – 00000010, чтобы третий – 00000100, и т.д. Эти двоичные числа при переводе в десятичную систему счисления образуют такую последовательность: 1, 2, 4, 8, 16, 32, 64, 128 и являются степенями двойки от 0 до 7.
Соответственно, в цикле loop() по количеству светодиодов делаем пересчёт от 0 до 7. Функция pow(основание, степень) возводит 2 в степень счётчика цикла. Микроконтроллеры не очень точно работают с числами типа «double», поэтому для преобразования результата в целое число используем функцию округления round(). И передаём получившееся число в сдвиговый регистр. Для наглядности в монитор последовательного порта выводятся значения, которые получаются при этой операции: единичка «бежит» по разрядам – светодиоды загораются волной.
Числа, посылаемые в сдвиговый регистр 74HC595
Arduino — аналоговые контакты
У Arduino UNO 6 аналоговых входов («A0» — «A5»). Эти входы соединены через мультиплексор с входом аналого-цифрового преобразователя (АЦП) микроконтроллера ATmega328.
АЦП преобразовывает входной аналоговый сигнал в диапазоне 0В-5В в цифровую форму. Разрешение АЦП в Ардуино составляет 10 бит. Это означает, что количество уровней напряжения на входе преобразователя равно 1023 с разрешением 4,89 мВ. Разрешение можно расширить с помощью опорного напряжения ниже 5В, которое подается на вывод «AREF».
Частота дискретизации преобразователя АЦП составляет примерно 9600 Гц. АЦП будет безупречно обрабатывать данные пока сигнал будет ниже половины частоты дискретизации АЦП, т.е. не более 4800Гц.
Типичные приложения с использованием АЦП Arduino: аналоговые датчики, потенциометры, а также управление голосом через микрофон (VoIP).
Плата Arduino Mega 2560
Устройство Arduino Mega 2560 собрано на микроконтроллере ATmega 2560 (datasheet), является обновлённой версией Arduino Mega.
Для осуществления преобразования USB–UART-интерфейсов используется новый микроконтроллер ATmega 16U2 ( либо ATmega 8U2 для версий плат R1 или R2).
Состав платы следующий:
- количество цифровых входов/выходов составляет 54 (15 из них можно использовать в роли выходов-ШИМ);
- число аналоговых входов – 16;
- реализация последовательных интерфейсов производится посредством 4 аппаратных приёмопередатчиков UART;
- 16 МГц – кварцевый резонатор;
- USB-разъём;
- питающий разъём;
- внутрисхемное программирование осуществляется через ICSP-разъём;
- кнопка для сброса.
В устройстве Mega 2560 R2-версии добавлен специальный резистор, подтягивающий HWB-линию 8U2 к земле, что позволяет значительно упростить переход Arduino в DFU-режим, а также обновление прошивки. Версия R3 незначительно отличается от предыдущих. Изменения в устройстве следующие:
- добавлены четыре вывода – SCL, SDA, IOREF (для осуществления совместимости по напряжению различных расширительных плат) и ещё один резервный вывод, пока не используемый;
- повышена помехоустойчивость по цепи сброса;
- увеличен объём памяти;
- ATmega8U2 заменён на микроконтроллер ATmega16U2.
Выводы Arduino Mega 2560R3 предназначаются для следующего:
- Имеющиеся цифровые пины могут служить входом-выходом. Напряжение на них – 5 вольт. Каждый пин обладает подтягивающим резистором.
- Аналоговые входы не оснащены подтягивающими резисторами. Работа основана на применении функции analog Read.
- Количество выводов ШИМ составляет 15. Это цифровые выводы №2 – №13, №44 – №46. Использование ШИМ производится через функцию analog Write.
- Последовательный интерфейс: выводы Serial: №0 (rx), №1 (tx); выводы Serial1: №19 (rx), №18 (tx); выводы Serial2: №17 (rx), №16 (tx); выводы Serial3: №15 (rx), №14 (tx).
- Интерфейс SPI оборудован выводами №53 (SS), №51 (MOSI), №50 (MISO), №52 (SCK).
- Вывод №13 – встроенный светодиод.
- Пины для осуществления связи с подключаемыми устройствами: №20 (SDA), №21 (SCL).
- Для внешних прерываний (низкий уровень сигнала, другие изменения сигнала) используются выводы №2 , №3, №18, №19, №20, №21.
- Вывод AREF задействуется командой analog Reference и предназначается для регулирования опорного напряжения аналоговых входных пинов.
- Вывод Reset. Предназначен для формирования незначительного уровня (LOW), что приводит к перезагрузке устройства (кнопка сброса).
Arduino — цифровые контакты
У Arduino Uno 14 цифровых контактов («D0» — «D13»), которые можно настроить как входы или выходы. Один из этих контактов «D13» подключен к встроенному светодиоду.
Максимальный ток (нагрузка) каждого цифрового контакта составляет 20 мА. Цифровые выводы работают с логическими состояниями: низкое состояние означает лог.0, а высокое состояние — лог.1. Если цифровые контакты Ардуино настроены как выходы, то низкое напряжение равно 0 В, а высокое равно 5 В.
Если же цифровые контакты сконфигурированы как входы, принимающие сигналы от внешних устройств, то логические уровни будут другие. Ардуино интерпретирует входное напряжение в диапазоне 0,0В — 0,8В как низкое состояние («0»), а в диапазоне 2,0В до 5,0В как высокое состояние («1»). Диапазон 0,8В — 2,0В означает запрещенное состояние, в котором нет права на изменение логического состояния.
Плата Arduino Mini
Является одной из самых простых и удобных устройств Arduino.
Используется микроконтроллер ATmega 168 с рабочим напряжением на 5 вольт с частотой в 16 МГц. Максимальное напряжение питания в моделях составляет 9 вольт. Значение максимального тока на выводах составляет 40 mA.
Плата содержит:
- 14 цифровых выводов (из них 6 могут быть использованы в качестве ШИМ-выходов), могут применяться в качестве как входа, так и выхода;
- 8 аналоговых входов (4 из них оснащены выводами);
- 16 МГц – кварцевый генератор.
Пины устройства Arduino Mini имеют следующее предназначение:
- Два вывода, посредством которых осуществляется питание платы «плюс»: RAW, VCC.
- Вывод контакта «минус» – пин GND.
- Выводы под номерами 3, 5, 6, 9, 10, 11 используются для ШИМ при применении функции analog Write.
- К выводам №0, №1 можно подключать другие устройства.
- Аналоговые входы №0 – №3 с выводами.
- Аналоговые входы №4 – №7 не имеют выводов и требуют пайки при необходимости.
- Вывод AREF, который предназначен для изменения верхнего напряжения.
- Вывод Reset – перезагрузка микроконтроллера.
Расположение выводов в различных версиях arduino mini могут различаться.
Arduino — цифровые выводы с функцией генерации сигналов ШИМ
В дополнение к своей стандартной функциональности некоторые цифровые контакты используются для генерации сигнала ШИМ. Выходы ШИМ в Arduino: «D3», «D5», «D6», D9», «D10» и «D11». По умолчанию частота ШИМ Arduino составляет 490 Гц.
Величина скважности определяет, в течение какой части периода на цифровом выводе находиться низкое состояние. Например, если скважность ШИМ-сигнала составляет 40%, то при пиковом напряжении 5В среднее значение напряжения такого сигнала будет равно 2В. Соответственно, чем больше значение коэффициента заполнения, тем выше среднее значение сигнала ШИМ.
Популярными приложениями, использующие ШИМ-сигнал, являются регуляторы скорости электродвигателя, регуляторы яркости светодиодного освещения, музыкальные синтезаторы.
Плата Arduino Micro
Arduino Micro представляет собой устройство, основа которого построена на микроконтроллере ATmega 32u4, имеющем встроенный USB-контроллер. Это решение упрощает подключение платы к компьютеру, так как в системе устройство будет определяться как обычная клавиатура, мышь либо COM-порт. Состав устройства следующий:
- количество входов/выходов – 20 (имеется возможность 7 из них использовать как ШИМ-выходы, а 12 – в роли входов аналогового типа); резонатор кварцевый, настроенный на 16 МГц;
- micro-USB-разъём;
- ICSP-разъём, предназначенный для проведения внутреннего программирования;
- кнопка для сброса.
Все цифровые выводы изделия могут работать в качестве как входов, так и выходов благодаря наличию функций digital Read, pin Mode, digital Write. Напряжение на выводах составляет 5 вольт. Максимальная величина потребляемого или отдаваемого тока с одного вывода составляет 40 мА. Выводы сопрягаются с внутренними резисторами, которые по умолчанию находятся в отключенном состоянии. Они имеют номиналы в 20 кОм – 50 кОм. Отдельные выводы arduino micro, кроме основных, способны выполнять и ряд дополнительных функций:
- В последовательном интерфейсе выводы №0 (RX), №1 (TX) применяются для приёма (RX), а также передачи (TX) необходимых данных через встроенный аппаратный приёмопередатчик. Функция актуальна для arduino micro класса Serial. В других случаях связь осуществляется через соединение USB (CDC).
- Интерфейс TWI включает выводы микроконтроллера №2 (SDA) и №3 (SCL). Позволяют использовать данные библиотеки Wire.
- Выводы под номерами 0, 1, 2, 3 могут быть использованы в роли источников возникающих прерываний. К таковым относятся низкий уровень сигнала; прерывания по фронту, по спаду, при изменении уровня сигнала.
- Выводы под номерами 3, 5, 6, 9, 10, 11,13 при использовании функции analog Write способны выводить аналоговый ШИМ-сигнал в 8 бит.
- К SPI-интерфейсу относятся выводы на разъёме ICSP. Они не соединяются с цифровыми выводами на плате.
- Дополнительный вывод RX LED/SS, который соединён со светодиодом. Последний индицирует процесс по передаче данных с использованием USB. Этот вывод может быть использован при работе с интерфейсом SPI для вывода SS.
- Вывод №13 – светодиод, который включается при отправке данных HIGH и выключается при значениях LOW.
- Выводы A0 – A5 (отмечены на плате) и A6 – A11 (соответствуют цифровым выводам за номерами 4, 6, 8, 9, 10,12) являются аналоговыми.
- Вывод AREF позволяет изменять верхнее значение аналогового напряжения на вышеуказанных выводах. При этом используется функция analog Reference.
- С помощью вывода Reset формируется низкий уровень (LOW) и происходит перезагрузка микроконтроллера (кнопка сброса).
Arduino — коммуникационные контакты — интерфейс UART
Ардуино использует несколько интерфейсов для связи с внешними устройствами. Одним из них является протокол UART (Universal Asynchronous Receiver-Transmitter — универсальный асинхронный приемник-передатчик). Это последовательный протокол, реализованный с помощью цифровых выводов:
- «D0» («RX» — приемник, который получает сигнал от внешнего устройства)
- «D1» («TX» — передатчик, который отправляет сигнал на внешнее устройство)
UART обеспечивает связь с внешними модулями, а также с компьютером, к которому он подключается через USB разъем.
Arduino — коммуникационные контакты — интерфейс SPI
Другим интерфейсом, является SPI (Serial Peripheral Interface — последовательный периферийный интерфейс ). Это последовательный протокол, который позволяет микроконтроллеру обмениваться данными с одним или несколькими устройствами. Данный протокол обеспечивает синхронную связь с другим микроконтроллером в топологии Master — Slave.
В Arduino UNO R3 шина SPI имеет следующие контакты:
- SS (Slave Select) — пин «D10» — выбор адреса ведомого устройства, с которым должен связаться микроконтроллер
- SCK (Serial Clock) — пин «D13» — тактовый сигнал, синхронизирующий передачу данных в обе стороны
- MISO (Master Input Slave Output) — пин «D12» — линия отправки информации от ведомых устройств к ведущему устройству
- MOSI (Master Output Slave Input) — пин «D11» — линия, которая отправляет информацию от ведущего устройства к ведомым устройствам
Подключение SPI к Ардуино
Плата Arduino уже содержит специальные выводы для подключения интерфейса SPI. Эти же выводы повторены в отельном разъеме ICSP. На этом разъеме отсутствует SS – изначально предусмотрено, что микроконтроллер Ардуино будет выступать в роли ведущего устройства. Если нужно использовать его в качестве ведомого, можно использовать любой цифровой вывод в качестве SS.
На данной иллюстрации представлен вариант подключения OLDE-экрана по SPI к ардуино.
Для каждой модели Ардуино существую свои выводы для SPI. Эти выводы:
- Uno: MOSI соответствует вывод 11 или ICSP-4, MISO – 12 или ICSP-1, SCK – 13 или ICSP-3, SS (slave) – 10.
- Mega1280 или Mega2560: MOSI – 51 или ICSP-4, MISO – 50 или ICSP-1, SCK – 52 или ICSP-3, SS (slave) – 53.
- Leonardo: MOSI – ICSP-4, MISO –ICSP-1, SCK –ICSP-3.
- Due: MOSI – ICSP-4, MISO –ICSP-1, SCK –ICSP-3, SS (master) – 4, 10, 52.
Последний контроллер Arduino Due расширяет возможности пользователя и позволяет реализовать больше задач, чем на остальных микроконтроллерах. Например, можно автоматически управлять ведомым устройством и автоматически выбирать различные конфигурации (тактовая частота, режим и другие).
Arduino — коммуникационные контакты — интерфейс I2C
Ардуино также имеет шину I2C, которая обеспечивает связь между двумя компонентами. Для платы UNO R3 связь по I2C реализована с помощью двух контактов:
- SDA (Data Series) — пин «A4» для передачи данных по шине I2C
- SCL (Serial Clock) — пин «A5» тактового сигнала, синхронизирующий передачу данных по шине I2C в обе стороны
Каждое внешнее устройство, которое обменивается данными с Arduino через шину I2C, имеет свой уникальный адрес, например, 0x23. К одной шине одновременно может быть подключено до 255 устройств.
3Стандартная библиотека для работы по интерфейсу SPI
Для Arduino написана специальная библиотека, которая реализует протокол SPI. Она устанавливается вместе со средой разработки Arduino IDE. Подключается она так: в начале программы добавляем #include SPI.h.
Чтобы начать работу по протоколу SPI, нужно задать настройки и затем инициализировать протокол с помощью процедуры SPI.beginTransaction(). Можно выполнить это одной инструкцией: SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0))
Это значит, что мы инициализируем протокол SPI на частоте 14 МГц, передача данных идёт, начиная с MSB (наиболее значимого бита), в режиме SPI_MODE0.
После инициализации выбираем ведомое устройство, переводя соответствующий пин SS в состояние LOW. Затем передаём ведомому устройству данные командой SPI.transfer(). После передачи возвращаем SS в состояние HIGH.
Временная диаграмма работы интерфейса SPI
Работа с протоколом завершается командой SPI.endTransaction().
Желательно минимизировать время выполнения передачи между инструкциями SPI.beginTransaction() и SPI.endTransaction(), чтобы не возникло накладок, если другое устройство попробует инициализировать передачу данных, используя другие настройки.
Если вы планируете в своём скетче использовать стандартные пины Arduino, можно не описывать их в начале программы, т.к. они уже определены в самой библиотеке и имеют следующие имена:
#define PIN_SPI_SS (10) #define PIN_SPI_MOSI (11) #define PIN_SPI_MISO (12) #define PIN_SPI_SCK (13)
Данные пины определены в файле pins_arduino.h , который находится по пути %programfiles%\arduino-(версия)\hardware\arduino\avr\variants\ (если вы устанавливали программу в стандартное расположение). То есть, например, чтобы опустить пин выбора ведомого в состояние «0», можно написать:
digitalWrite(PIN_SPI_SS, LOW);
Arduino — контакты прерывания
В микроконтроллерах, таких как ATmega238P, встроенных в Arduino, мы можем инициировать процедуру внешнего прерывания. Внешнее прерывание — системное прерывание, которое инициируется автоматически с уровня взаимодействующего устройства или вручную с уровня пользователя по причине внешних сигналов.
Простейшим примером использования прерывания является подсчет количества импульсов и определение частоты от внешнего источника сигнала.
В Arduino UNO R3 за прерывания отвечают следующие контакты:
- «INT0» — пин «D2»
- «INT1» — пин «D3»
Активацию и деактивацию каждого из прерываний можно настроить индивидуально в программе: запуск как по спадающему, так и по нарастающему фронту, а также по низкому и высокому состоянию.
Arduino — разъем ICSP на UNO R3
ICSP (In-Circuit Serial Programming — внутрисхемное последовательное программирование) — 6-контактный разъем, позволяющий подключить внешний программатор USB-ASP. Это решение реализовано для пользователей, предпочитающих «традиционное» программирование на языках Си и Ассемблер и желающих сэкономить дополнительно 5кБ памяти микроконтроллера, которую занимает загрузчик Ардуино.
Контакты ICSP выполняют следующие функции:
- SCK (Serial Clock) — тактовый сигнал, синхронизирующий передачу данных между памятью микроконтроллера и компьютером
- MISO (Master Input Slave Output) — линия, которая отправляет информацию от ведомых устройств на ведущее устройство (компьютер)
- MOSI (Master Output Slave Input) — линия, которая отправляет информацию с ведущего устройства (компьютера) на ведомые устройства
- VCC — линия вспомогательного питания 5В
- GND — земля вспомогательного питания
- RESET — сброс микроконтроллера
Выбор платы и порта
Откройте Arduino IDE. Из меню Инструменты>Плата выбирается Arduino/Genuino Mega or Mega 2560.
Выберите процессор/микроконтроллер платы, обычно это ATmega2560. Из меню Инструменты>Процессор выбирается ATmega2560 (Mega 2560).
Выберите последовательное устройство платы в меню Инструменты>Порт. Скорее всего, это COM3 (Arduino/Genuino Mega or Mega 2560) или выше (COM1 и COM2 обычно зарезервированы). Чтобы узнать, вы можете отключить свою плату и повторно открыть меню; запись, которая исчезает, должна быть Arduino или Genuino Mega. Подсоедините плату и выберите этот последовательный порт.
Если у вас модель Arduino Mega 2560 CH340G, то лучше использовать программатор Arduino as ISP.
Имеется возможность не использовать загрузчик и запрограммировать микроконтроллер через выводы ICSP (внутрисхемное программирование).