Используйте платформу Arduino MKR Vidor 4000 для создания проектов IoT и умного дома. Плата может одновременно опрашивать различные датчики, передавать данные по беспроводным технологиям и выводить изображение с камер видеонаблюдения.
На управляющей плате стучит сразу три сердца:
Рассмотрим несколько примеров программирования MKR Vidor 4000 на C++ через Arduino IDE.
Для начала мигнём встроенным светодиодом на микроконтроллер ATSAMD21G18.
пине микроконтроллера ATSAMD21G18. В текущем примере задействуем только один чип платы MKR Vidor 4000 —// Даём имя встроенному светодиоду на 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); }
После прошивки скетча светодиод начнёт мигать раз в секунду.
Встроенный светодиод имеет три кристалла:
В продолжении будем по очереди мигать каждым цветом. В текущем примере уже задействуем второй чип платы MKR Vidor 4000 — NINA-W102.
// Подключаем библиотеки для доступа к 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); }
После прошивки скетча светодиод начнёт мигать по очереди красным, зелёным и синим цветом.
Пришло время опробовать изюминку данной платформы, третий чип MKR Vidor 4000 — ПЛИС (FPGA) Intel Cyclone 10CL016. На самом деле чип уже прошит официальной прошивкой производителя, а нам даются готовые функции для демонстрации работы. В качестве примера выведем лого на HDMI-дисплей.
// Библиотеки для работы с графикой и вывода данных на 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 #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-монитор.
// Библиотека для работы с графикой #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.
void Vidor_GFXbuffer::scroll(int delay) { 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 | NP_SEQ_FLG_INV_LOOP, delay);
На строку:
privateScroll(NP_SEQ_FLG_START | NP_SEQ_FLG_BUF_LOOP, delay);
На плате MKR Vidor 4000 расположен микроконтроллер ATSAMD21G18 c вычислительном ядром ARM Cortex® M0 с тактовой частотой 48 МГц. Контроллер обладает двумя видами памяти:
Изюминкой на плате выступает ПЛИС/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 для создания своих произвольные аппаратных блоков.
За беспроводную передачу данных отвечает чип U-blox NINA-W102 со встроенным чипом ESP32 для обмена данными по воздуху в диапазоне 2,4 ГГц по Wi-Fi и Bluetooth. Для работы с модулем используйте библиотеку WiFiNINA.
Библиотека WiFiNINA работает с платой MKR Vidor 4000 до версии 1.8.5 включительно. Более поздние релизы пока не поддерживаются платформой. Будьте внимательны при установке библиотеки.
Криптографический сопроцессор Microchip ATECC508A интегрирует протокол безопасности ECDH (Elliptic Curve Diffie Hellman) в сверхзащищённый метод, обеспечивающий согласование ключей для шифрования / дешифрования, наряду с ECDSA (алгоритм цифровой подписи эллиптической кривой) для проверки подлинности с подписью для Интернета вещей (IoT), включая домашнюю автоматизацию, промышленные сети, медицинские услуги, аутентификацию аксессуаров и расходных материалов.
Разъём USB Micro предназначен для прошивки и питания платформы. Для подключения к ПК понадобится кабель USB (A — Micro USB).
Кнопка предназначена для ручного сброса прошивки — аналог кнопки
обычного компьютера.Имя светодиода | Назначение |
---|---|
ON | Индикатор питания платформы. При питании платформы от аккумулятора через не горит для экономии ёмкости батареи. |
RGB | Пользовательский RGB-светодиод с общим анодом. Катод красного цвета выведен на пин микроконтроллера ATSAMD21G18. Катод зелёного цвета выведен на пин беспроводного модуля NINA-W102. Катод синего цвета выведен на пин беспроводного модуля NINA-W102. При задании значения низкого уровня светодиоды включаются, при высоком — выключаются. Для управления зелёным и синим цветом в Arduino IDE используйте библиотеку WiFiNINA. |
Порт micro-HDMI предназначен для подключения HDMI-дисплеев к плате Vidor 4000. Для коммуникации понадобится кабель HDMI — Micro-HDMI.
Разъём MIPI предназначен для подключения MIPI-камер на сенсоре OmniVision OV5647 к плате Vidor 4000, например Raspberry Pi Camera (Model D).
Комбинированный понижающий преобразователь напряжения EZ6301QI содержит в себе три отдельных модуля:
В итоге одного преобразователя EZ6301QI достаточно для питания всей логики MKR Vidor 4000.
На плате расположен JST PH-разъём (2 pin) для подключения внешних литий-полимерных (Li-Pol) и литий-ионных (Li-Ion) аккумуляторов. При питании через разъём для аккумулятора светодиодный индикатор Power не горит для экономии расхода энергии.
За состояние батареи отвечает умный контроллер BQ24195L, который:
На плате предусмотрен 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 В. Более высокое напряжение может повредить микроконтроллер!
0
–14
и A0
–A6
0
–8
, 10
, A3
и A4
A0
–A6
DAC/A0
MOSI/8
, MISO/10
и SCK/9
TX/11
и RX/12
2/SCK/BCLK
, 3/WS/LRCLK/FS
и A6/SD/SDATA/SDIN/SDOUT