Содержание

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

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

В продолжении будем по очереди мигать каждым цветом. В текущем примере уже задействуем второй чип платы 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 МГц. Контроллер обладает двумя видами памяти:

ПЛИС (FPGA) Cyclone 10LP

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

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

ПЛИС используются там, где софтверных возможностей микроконтроллера недостаточно. Например, для реализации аппаратных интерфейсов 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 Пин ввода-вывода

Распиновка

Пины питания

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

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

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

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

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

ПЛИС/FPGA Cyclone 10CL016

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

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

Ресурсы

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

Библиотеки

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