Arduino MKR Vidor 4000: распиновка, схема подключения и программирование

Используйте платформу Arduino MKR Vidor 4000 для создания проектов IoT и умного дома. Плата может одновременно опрашивать различные датчики, передавать данные по беспроводным технологиям и выводить изображение с камер видеонаблюдения.

На управляющей плате стучит сразу три сердца:

Подключение и настройка

  1. Подключите плату к компьютеру по USB. Для коммуникации используйте кабель USB (A — Micro USB).
  2. По умолчанию среда программирования настроена только на AVR-платы. Для работы с платформой MKR Vidor 4000 добавьте в менеджере плат поддержку платформ SAMD Boards.
  3. Выберите плату MKR Vidor 4000 в IDE: Инструменты Плата Arduino SAMD Boards Arduino MKR Vidor 4000
  4. Выберите COM-порт в IDE: Инструменты Порт COMx, где x — номер текущего порта.
  5. Установите дополнительные библиотеки через менеджер библиотек:
    1. WiFiNINA (Не старше версии 1.8.5)
  6. По завершении можно смело переходить к примерам работы.

Примеры работы

Рассмотрим несколько примеров программирования MKR Vidor 4000 на C++ через Arduino IDE.

Маячок

Для начала мигнём встроенным светодиодом на 32 пине микроконтроллера ATSAMD21G18. В текущем примере задействуем только один чип платы MKR Vidor 4000 — микроконтроллер ATSAMD21G18.

Код для Arduino

Blink.ino
// Даём имя встроенному светодиоду на 32 пине
constexpr uint8_t LED_ARDUINO_PIN = 32;
 
void setup() {
  // Настраиваем пин со светодиодом в режим выхода
  pinMode(LED_ARDUINO_PIN, OUTPUT);
}
 
void loop() {
  // Зажигаем светодиод
  digitalWrite(LED_ARDUINO_PIN, HIGH);
  // Ждём пол секунды
  delay(500);
  // Гасим светодиод 
  digitalWrite(LED_ARDUINO_PIN, LOW);
  // Ждём пол секунды
  delay(500);
}

После прошивки скетча светодиод начнёт мигать раз в секунду.

Маячок RGB

Встроенный светодиод имеет три кристалла:

  • Red на 32 пине микроконтроллера ATSAMD21G18.
  • Green на 26 пине модуля NINA-W102.
  • Blue на 25 пине модуля NINA-W102.

В продолжении будем по очереди мигать каждым цветом. В текущем примере уже задействуем второй чип платы MKR Vidor 4000 — NINA-W102.

Код для Arduino

BlinRGB.ino
// Подключаем библиотеки для доступа к NINA-W102
#include <WiFiNINA.h>
#include <utility/wifi_drv.h>
 
// Даём имя встроенному светодиоду на 32 пине МК ATSAMD21G18
constexpr uint8_t LEDR_ATSAMD21G18_PIN = 32;
// Даём имена встроенным светодиодам на 25 и 26 пинах модуля NINA-W102
constexpr uint8_t LEDG_NINAW102_PIN = 26;
constexpr uint8_t LEDB_NINAW102_PIN = 25;
 
void setup() {
  // Настраиваем пины со светодиодом в режим выхода
  pinMode(LEDR_ATSAMD21G18_PIN, OUTPUT);
  WiFiDrv::pinMode(LEDG_NINAW102_PIN, OUTPUT);
  WiFiDrv::pinMode(LEDB_NINAW102_PIN, OUTPUT);
  // Гасим все светодиоды
  digitalWrite(LEDR_ATSAMD21G18_PIN, HIGH);
  WiFiDrv::digitalWrite(LEDG_NINAW102_PIN, HIGH);
  WiFiDrv::digitalWrite(LEDB_NINAW102_PIN, HIGH);
}
 
void loop() {
  // Зажигаем красный светодиод
  digitalWrite(LEDR_ATSAMD21G18_PIN, LOW);
  // Ждём пол секунды
  delay(500);
  // Гасим красный светодиод 
  digitalWrite(LEDR_ATSAMD21G18_PIN, HIGH);
  // Ждём пол секунды
  delay(500);
   // Зажигаем зелёный светодиод
  WiFiDrv::digitalWrite(LEDG_NINAW102_PIN, LOW);
  // Ждём пол секунды
  delay(500);
  // Гасим зелёный светодиод 
  WiFiDrv::digitalWrite(LEDG_NINAW102_PIN, HIGH);
  // Ждём пол секунды
  delay(500);
   // Зажигаем синий светодиод
  WiFiDrv::digitalWrite(LEDB_NINAW102_PIN, LOW);
  // Ждём пол секунды
  delay(500);
  // Гасим синий светодиод 
  WiFiDrv::digitalWrite(LEDB_NINAW102_PIN, HIGH);
  // Ждём пол секунды
  delay(500);
}

После прошивки скетча светодиод начнёт мигать по очереди красным, зелёным и синим цветом.

Вывод лого на HDMI-дисплей

Пришло время опробовать изюминку данной платформы, третий чип MKR Vidor 4000 — ПЛИС (FPGA) Intel Cyclone 10CL016. На самом деле чип уже прошит официальной прошивкой производителя, а нам даются готовые функции для демонстрации работы. В качестве примера выведем лого на HDMI-дисплей.

Что понадобится

Схема устройства

Код для Arduino

DrawLogo.ino
// Библиотеки для работы с графикой и вывода данных на HDMI
#include "VidorGraphics.h"
#include "Vidor_GFX.h"
 
// Создаём буфер для вывода данных
Vidor_GFX  vdgfx;
 
void setup() {
  // Открываем Serial-порт для мониторинга данных в консоли
  Serial.begin(9600);
  // Ожидаем открытия Serial-порта
  // Закомментируйте строку ниже, если не нужна отладка
  while (!Serial) {}
  // Инициализируем FPGA
  if (!FPGA.begin()) {
    Serial.println("Initialization failed!");
    while (1) {}
  } else {
    Serial.println("Initialization successfully!");
  }
  // Ждём пару секунд
  delay(2000);
  // Закрашиваем всю область буфера белым фоном
  vdgfx.fillRect(0,0,640,480,vdgfx.White());
  // Рисуем лого Arduino
  vdgfx.fillCircle(225,225,100 ,vdgfx.lightBlue());
  vdgfx.fillCircle(415,225,100 ,vdgfx.lightBlue());
  vdgfx.fillCircle(225,225,90 ,vdgfx.White());
  vdgfx.fillCircle(415,225,90 ,vdgfx.White());
  vdgfx.fillRect(175,220,100,10 ,vdgfx.lightBlue());
  vdgfx.fillRect(365,220,100,10 ,vdgfx.lightBlue());
  vdgfx.fillRect(410,175,10,100 ,vdgfx.lightBlue());
 
  // Пишем текстовую строку
  vdgfx.text.setCursor(150,375);
  vdgfx.text.setAlpha(255);
  vdgfx.text.setSize(3);
  vdgfx.text.setColor(vdgfx.lightBlue());
  vdgfx.println("ARDUINO");
  vdgfx.text.setCursor(480,145);
  vdgfx.text.setSize(1);
  vdgfx.println("TM");
}
 
void loop() {
 
}

После прошивки на HDMI-мониторе отобразится приветственное лого.

Захват изображения с камеры на HDMI-дисплей

Что понадобится

Схема устройства

Код для Arduino

CameraVideoCapture.ino
// Библиотеки для работы с графикой и вывода данных на HDMI
#include "VidorGraphics.h"
#include "VidorCamera.h"
 
// Создаём объект для работы с камерой
VidorCamera vcam;
 
void setup() {
  // Открываем Serial-порт для мониторинга данных в консоли
  Serial.begin(9600);
  // Ожидаем открытия Serial-порта
  // Закомментируйте строку ниже, если не нужна отладка
  while (!Serial) {}
 
  // Инициализируем FPGA
  if (!FPGA.begin()) {
    Serial.println("Initialization failed!");
    while (1) {}
  } else {
    Serial.println("Initialization successfully!");
  }
 
  // Инициализируем камеру
  if (!vcam.begin()) {
    Serial.println("Camera failed");
    while (1) {}
  } else {
    Serial.println("Camera successfully!");
  }
 
  // Ожидаем пару секунд
  delay(2000);
  Serial.println("Power On");
 
}
 
void loop() {
  // Если в консоли пришла команда STOP,
  // то останавливаем захват изображения
  String res = Serial.readStringUntil('\n');
  if (res.indexOf("STOP") > 0) {
    vcam.end();
  }
}

После прошивки изображение с камеры начнёт транслироваться на HDMI-монитор.

Бегущая строка WS2812

Что понадобится

Схема устройства

Код для Arduino

PrintTextWS2812.ino
// Библиотека для работы с графикой
#include "VidorGraphics.h"
// Библиотека для светодиодов WS2812
#include "Vidor_NeoPixel.h"
 
// Создаём объект np класса Vidor_NeoPixel для работы с матрицей WS2812
Vidor_NeoPixel    np(8*8, A6);
// Создаём объект vdgfx класса Vidor_GFX для работы с матрицей WS2812
Vidor_GFX         vdgfx(np);
// Создаём объект matrix класса Vidor_GFXbuffer для работы с матрицей WS2812
Vidor_GFXbuffer   matrix(np, vdgfx, 64, 8, true);
 
void setup() {
  // Открываем Serial-порт для мониторинга данных в консоли
  Serial.begin(9600);
  // Ожидаем открытия Serial-порта
  // Закомментируйте строку ниже, если не нужна отладка
  while (!Serial) {}
 
  // Инициализируем FPGA
  if (!FPGA.begin()) {
    Serial.println("Initialization failed!");
    while (1) {}
  } else {
    Serial.println("Initialization successfully!");
  }
 
  // Инициализируем матрицу
  np.begin();
  matrix.begin();
 
  // Очищаем матрицу
  for (int i = 0; i < 64; i++) {
    // Clear matrix
    np.setPixelColor(i, 0, 0, 0, 0);
  }
  np.show();
  // Печатаем в буфер слово «Амперка»
  vdgfx.text.setColor(vdgfx.Red());
  vdgfx.text.setCursor(0, 6);
  vdgfx.setFont(0);
  vdgfx.text.setSize(1);
  vdgfx.print("A");
  np.show();
  vdgfx.text.setColor(vdgfx.Blue());
  vdgfx.print("m");
  np.show();
  matrix.scroll(100);
  vdgfx.text.setColor(vdgfx.Green());
  vdgfx.print("p");
  np.show();
  matrix.scroll(100);
   vdgfx.text.setColor(vdgfx.Yellow());
  vdgfx.print("e");
  np.show();
  matrix.scroll(100);
  vdgfx.text.setColor(vdgfx.Purple());
  vdgfx.print("r");
  np.show();
  matrix.scroll(100);
  vdgfx.text.setColor(vdgfx.Brown());
  vdgfx.print("k");
  np.show();
  matrix.scroll(100);
  vdgfx.text.setColor(vdgfx.White());
  vdgfx.print("a");
  // Выводим изображение из буфера на матрицу
  np.show();
  // Скроллим изображение в виде бегущей строки
  // Если строка «бежит» в неверном направлении,
  // необходимо сделать фикс в библиотеке Vidor_GFX. Подробности:
  // http://wiki.amperka.ru/products:arduino-mkr-vidor-4000
  matrix.scroll(100);
}
 
void loop()  {
 
}

После прошивки на матрице WS2812 побежит радужная строка с надписью «Амперка».

Если строка «бежит» в неверном направлении, необходимо сделать фикс в библиотеке Vidor_GFX.

Смена направления бегущей строки

  1. Откройте текстовым редактором файл библиотеки: C: Users Name User Documents Arduino libraries VidorGraphics src Vidor_GFX.cpp
  2. Найдите функцию:
    void Vidor_GFXbuffer::scroll(int delay) {
      privateScroll(NP_SEQ_FLG_START | NP_SEQ_FLG_BUF_LOOP | NP_SEQ_FLG_INV_LOOP, delay);
    }
  3. Замените строку:
    privateScroll(NP_SEQ_FLG_START | NP_SEQ_FLG_BUF_LOOP | NP_SEQ_FLG_INV_LOOP, delay);

    На строку:

    privateScroll(NP_SEQ_FLG_START | NP_SEQ_FLG_BUF_LOOP, delay);
  4. Сохраните изменения.

Элементы платы

Микроконтроллер ATSAMD21G18

На плате MKR Vidor 4000 расположен микроконтроллер ATSAMD21G18 c вычислительном ядром ARM Cortex® M0 с тактовой частотой 48 МГц. Контроллер обладает двумя видами памяти:

  • 256 КБ Flash-памяти, которая предназначена для хранение программ и сопутствующих статичных ресурсов. Flash-память энергонезависимая: при выключении питания, данные не сотрутся.
  • 32 КБ RAM-памяти, которая предназначена для хранения временных данных, например переменных программы. RAM-память энергозависимая: при выключении питания, все данные сотрутся.

ПЛИС (FPGA) Cyclone 10LP

Изюминкой на плате выступает ПЛИС/FPGA (программируемая логическая интегральная схема) — Intel Cyclone 10CL016 с тактовой частотой до 200 МГц. Чип содержит:

  • 15408 логических элементов
  • 56 аппаратных умножителей
  • 504 КБ RAM-памяти.

Для штатной работы ПЛИС на плате распаяны дополнительный чипы памяти:

ПЛИС используются там, где софтверных возможностей микроконтроллера недостаточно. Например, для реализации аппаратных интерфейсов UART, QSPI, I²C, I²S, захвата с MIPI-камеры и транслирования видео через HDMI.

По умолчанию на плате MKR Vidor 4000 чип Cyclone 10LP прошит штатной прошивкой, функции которой доступны через микроконтроллер микроконтроллер ATSAMD21G18 и библиотеки Vidor Libraries.

MKR Vidor 4000 задумывался как удобная отправная точка для вашего первого путешествия в мир программируемых логических интегральных схем. Однако если вы уже общались с ПЛИС и не боитесь трудностей, можете воспользоваться программой Intel Quartus для создания своих произвольные аппаратных блоков.

Беспроводной модуль NINA-W102

За беспроводную передачу данных отвечает чип U-blox NINA-W102 со встроенным чипом ESP32 для обмена данными по воздуху в диапазоне 2,4 ГГц по Wi-Fi и Bluetooth. Для работы с модулем используйте библиотеку WiFiNINA.

Библиотека WiFiNINA работает с платой MKR Vidor 4000 до версии 1.8.5 включительно. Более поздние релизы пока не поддерживаются платформой. Будьте внимательны при установке библиотеки.

Крипточип ATECC508A

Криптографический сопроцессор Microchip ATECC508A интегрирует протокол безопасности ECDH (Elliptic Curve Diffie Hellman) в сверхзащищённый метод, обеспечивающий согласование ключей для шифрования / дешифрования, наряду с ECDSA (алгоритм цифровой подписи эллиптической кривой) для проверки подлинности с подписью для Интернета вещей (IoT), включая домашнюю автоматизацию, промышленные сети, медицинские услуги, аутентификацию аксессуаров и расходных материалов.

Порт micro-USB

Разъём USB Micro предназначен для прошивки и питания платформы. Для подключения к ПК понадобится кабель USB (A — Micro USB).

Кнопка сброса

Кнопка предназначена для ручного сброса прошивки — аналог кнопки RESET обычного компьютера.

Светодиодная индикация

Имя светодиода Назначение
ON Индикатор питания платформы. При питании платформы от аккумулятора через не горит для экономии ёмкости батареи.
RGB Пользовательский RGB-светодиод с общим анодом.
Катод красного цвета выведен на 32 пин микроконтроллера ATSAMD21G18.
Катод зелёного цвета выведен на пин 26 беспроводного модуля NINA-W102.
Катод синего цвета выведен на пин 25 беспроводного модуля NINA-W102.
При задании значения низкого уровня светодиоды включаются, при высоком — выключаются. Для управления зелёным и синим цветом в Arduino IDE используйте библиотеку WiFiNINA.

Порт micro-HDMI

Порт micro-HDMI предназначен для подключения HDMI-дисплеев к плате Vidor 4000. Для коммуникации понадобится кабель HDMI — Micro-HDMI.

Разъём MIPI-камеры

Разъём MIPI предназначен для подключения MIPI-камер на сенсоре OmniVision OV5647 к плате Vidor 4000, например Raspberry Pi Camera (Model D).

Понижающий преобразователь EZ6301QI

Комбинированный понижающий преобразователь напряжения EZ6301QI содержит в себе три отдельных модуля:

  1. Импульсный DC-DC-преобразователь с настроенным выходом 3,3 В. Максимальный выходной ток 1,5 А.
  2. Линейный LDO-преобразователь с настроенным выходом 2,5 В. Максимальный выходной ток 300 мА.
  3. Линейный LDO-преобразователь с настроенным выходом 1,2 В. Максимальный выходной ток 300 мА.

В итоге одного преобразователя EZ6301QI достаточно для питания всей логики MKR Vidor 4000.

Разъём аккумулятора

На плате расположен JST PH-разъём (2 pin) для подключения внешних литий-полимерных (Li-Pol) и литий-ионных (Li-Ion) аккумуляторов. При питании через разъём для аккумулятора светодиодный индикатор Power не горит для экономии расхода энергии.

Контроллер заряда BQ24195L

За состояние батареи отвечает умный контроллер BQ24195L, который:

  • Отслеживает напряжение и ток батареи в режиме источника энергии.
  • Контролирует напряжение и ток батареи в режиме зарядки.

Разъём I²C интерфейса

На плате предусмотрен JST SH-разъём (5 pin) для подключения дополнительных модулей по интерфейсу I²C с распиновкой:

Имя контакта Назначение
5V Питание модуля (+)
GND Питание модуля (−)
SDA Пин данных шины I²C
SCL Пин тактирования шины I²C
7 Пин ввода-вывода

Распиновка

Пины питания

  • 5V: Выходной пин. На вывод поступает напряжение 5 В при подключении платы через USB-порт. При питании платформы через пин VIN или разъём для внешнего аккумулятора на пине может быть напряжение в диапазоне от нуля до входного.
  • VIN: Входной пин для подключения внешнего источника напряжения в диапазоне от 5 до 6 вольт.
  • VCC: Выходной пин от преобразователя напряжения с выходом 3,3 вольта и максимальных током 1,5 А. В любом варианте питания платформы на пине будет присутствовать 3,3 вольта.
  • GND: Вывод земли.
  • AREF: Входной пин для подключения внешнего опорного напряжения АЦП, относительно которого происходят аналоговые измерения при использовании функции analogReference() с параметром EXTERNAL.

Пина ввода/вывода

В отличие от большинства плат Arduino, родным напряжением MKR Vidor 4000 является 3,3 В, а не 5 В. Выходы для логической единицы выдают 3,3 В, а в режиме входа ожидают принимать не более 3,3 В. Более высокое напряжение может повредить микроконтроллер!

  • Пины общего назначения: 22 пина: 014 и A0A6
    Логический уровень единицы — 3,3 В, нуля — 0 В. Максимальный ток выхода — 7 мА.
  • ШИМ: 12 пинов: 08, 10, A3 и A4
    Позволяет выводить аналоговые значения в виде ШИМ-сигнала из цифровых значений. По умолчанию разрядность ШИМ установлена в 10 бит, которую можно изменить на 8, 10 и 12 бит с помощью функции analogWriteResolution().
  • АЦП: 7 пинов; A0A6
    Позволяет представить аналоговое напряжение в виде цифровом виде. По умолчанию разрядность АЦП установлена в 10 бит, которую можно изменить на 8, 10 и 12 бит с помощью функции analogReadResolution(). Диапазон входного напряжения от 0 до 3,3 В, при подаче большего напряжения микроконтроллер может выйти из строя.
  • ЦАП: пин DAC/A0
    Позволяет выводить аналоговое напряжение из цифровых значений. Вывод может использоваться для создания аудио-выхода — для этого используйте библиотеку AudioZero.
  • I²C: пины SDA/11 и SCL/12
    Для общения платформы c платами расширения и сенсорами по интерфейсу I²C.
  • SPI: пины MOSI/8, MISO/10 и SCK/9
    Для общения платформы c платами расширения и сенсорами по интерфейсу SPI.
  • Serial/UART: пины TX/11 и RX/12
    Для общения платформы c платами расширения и сенсорами по интерфейсу UART.
  • I²S: пины 2/SCK/BCLK, 3/WS/LRCLK/FS и A6/SD/SDATA/SDIN/SDOUT
    Для общения платформы c платами расширения и сенсорами по интерфейсу I²S.

Принципиальная схема

Габаритный чертёж

Характеристики

  • Модель: Arduino MKR Vidor 40000 (SKU ABX00022)
  • Чипы и периферийные устройства:
    • Микроконтроллер ATSAMD21G18
    • ПЛИС/FPGA Cyclone 10CL016
    • Беспроводной модуль NINA-W102
    • Крипто чип ATECC508A
    • RGB-светодиод
  • Входное напряжение питания:
    • Через USB: 5 В
    • Через пин Vin: 5 В
    • Через JST-разъём: 3,7–4,2 В
  • Напряжение логических уровней: 3,3 В
  • Контакты ввода-вывода: 22
  • Контакты с АЦП: 7
  • Разрядность АЦП: 8/10/12 бит (по умолчанию 10 бит)
  • Контакты с ЦАП: 1
  • Разрядность ЦАП: 10 бит
  • Контакты с ШИМ: 12
  • Разрядность ШИМ: 8/10/12 бит (по умолчанию 8 бит)
  • Аппаратные интерфейсы:
    • 1× UART
    • 1× I²C
    • 1× SPI
    • 1× I²S
  • Дополнительные интерфейсы: MIPI, micro-HDMI, MiniPCI-E
  • Габариты: 83×25 мм

ПЛИС/FPGA Cyclone 10CL016

  • Модуль: Intel Cyclone 10CL016
  • Логических элементов: 15408
  • Аппаратных умножителей: 56
  • SDRAM-память: 504 КБ
  • Тактовая частота: 48–200 МГц
  • Внешняя Flash-память: W25Q16DV на 2 МБ
  • Внешняя SDRAM-память: AS4C4M16SA на 8 МБ

Микроконтроллер ATSAMD21G18

  • Модель: Microchip ATSAMD21G18
  • Ядро: 32-битный ARM Cortex M0+
  • Тактовая частота: 48 МГц
  • Flash-память: 256 КБ
  • RAM-память: 32 КБ

Беспроводной модуль NINA-W102

  • Модель: U-blox NINA-W102
  • Процессор: 2× Tensilica Xtensa LX6 (ESP32)
  • Тактовая частота: до 240 МГц
  • Flash-память: 2 МБ
  • ROM-память: 448 КБ
  • SRAM-память: 520 КБ
  • Частотный диапазон связи: 2,4 ГГц
  • Стандарт Wi-Fi: 802.11b/g/n
  • Стандарт Bluetooth: BLE v4.2 BR/EDR
  • Встроенная антенна: планарная F-образная (PIFA)

Ресурсы

Полезные статьи

Библиотеки

Документация