Прежде, чем начинать программировать Yotster Vicino, нужно произвести некоторые предварительные действия по установке драйверов и настройке среды программирования Arduino IDE. В этой инструкции мы подробно расскажем о процессе инсталляции драйверов и разберём несколько примеров работы с беспроводной технологией LoRa.
Драйвера для операционной системы
Примечание: в этой инструкции мы использовали операционную систему Windows 7 64-bit, если у вас другая операционная система, то внешний вид интерфейса и действия могут немного отличаться.
На странице в разделе «Driver Installation» есть инструкция по инсталляции драйверов для различных операционных систем, в том числе и для Windows. Вам нужно скачать и установить драйвер.
После установки драйвера и подключения к компьютеру платы Yotster Vicino, вы должны увидеть в диспетчере устройств нечто подобное (номер порта у вас скорее всего будет другим).
Ядро поддержки микроконтроллера
Примечание: для работы с Yotster Vicino версия среды разработки Arduino IDE должна быть 1.6.7 или выше. Мы будем использовать версию 1.8.5, как хорошо себя зарекомендовавшую.
Установка ядра поддержки микроконтроллера ATSAMD21E18 в среде разработки Arduino IDE состоит из нескольких шагов, ниже мы подробно разберём их.
Шаг 1. Если у вас ещё не установлены стандартные драйвера Arduino SAMD Boards package версии 1.6.2 или выше, то вам нужно установить их обычным образом в Менеджере плат среды Arduino IDE.
Шаг 2. Затем вам нужно установить ядро поддержки микроконтроллера ATSAMD21E18, для этого сначала нужно в настройках (Файл/Настройки/Дополнительные ссылки для Менеджера плат) добавить путь
https://www.mattairtech.com/software/arduino/package_MattairTech_index.json
и перезагрузить среду разработки. Далее в Менеджере плат нужно установить пакет MattairTech SAM D|L|C Core for Arduino package стандартным образом.
Шаг 3. После этого в Менеджере плат вы сможете выбрать плату MattairTech MT-D21E, она имеет много дополнительных настроек, их можно оставить в том виде, в котором они находятся по умолчанию. Далее вам останется только выбрать нужный порт и вы можете приступать к программированию контроллера Yotster Vicino.
Что мы будем программировать
Yotster Vicino состоит из 3-х основных частей: микроконтроллера ATSAMD21E18, радиочастотного LoRa модуля G-NiceRF LORA1276 и микросхемы EEPROM памяти M24LR64-R с интерфейсами доступа I2C/NFC/RFID.
В этом руководстве мы уделим основное внимание двум первым частям — микроконтроллеру ATSAMD21E18 и радиочастотному LoRa модулю. А с программированием NFC взаимодействия вы можете ознакомиться в разделе Пример работы с NFC этой документации.
Примечание. Здесь предполагается, что вы уже знакомы с работой в Arduino IDE и умеете создавать скетчи и загружать их в микроконтроллер.
Микроконтроллер ATSAMD21E18
ATSAMD21E18 — это современный мощный 32-битный микроконтроллер, который управляет всем подключённым к нему оборудованием и может обслуживать подключённые к нему проводные и беспроводные интерфейсы. Вы можете воспользоваться его ресурсами для обработки информации и решения своих IoT задач.
Кроме этого, на плате Yotster Vicino присутствует разъём с выведенными на него GPIO пинами микроконтроллера (см. раздел Спецификации этой документации), к которым вы можете подключать различные датчики и актуаторы так, как вы это делаете обычно в своих проектах на Ардуино.
Сначала мы разберём простой пример использования микроконтроллера ATSAMD21E18, без радиочастотной LoRa части. Этот пример ничем не будет отличаться от программирования привычных вам плат Ардуино в среде программирования Arduino IDE.
Рассмотрим классический скетч вывода сообщения в Serial.
/* Yotster Vicino Serial print Example */ void setup() { Serial.begin(115200); while (!Serial) { ;} Serial.println(F("Start Yotster Vicino Example...")); } void loop() { }
После компиляции и загрузки этого скетча в контроллер Yotster Vicino, вы можете наблюдать в Serial мониторе вывод сообщения. Этот пример иллюстрирует полное тождество работы и приёмов программирования контроллеров Yotster Vicino и привычных вам Arduino плат.
Инструкция
while (!Serial) { ;}
потребовалась для того, чтобы создать задержку пока микроконтроллер ATSAMD21E18 не инициализирует соответствующую подсистему. Если убрать эту инструкцию, то надпись видно не будет.
Аналогичным образом вы можете использовать микроконтроллер платы Yotster Vicino для управления датчиками, актуаторами, индикаторами и прочей периферией, но использовать таким образом плату Yotster Vicino не очень продуктивно, основное её достоинство — это беспроводной LoRa модуль, о программировании которого мы поговорим дальше.
LoRa библиотека
Теперь перейдём к работе с радиочастотной частью платы Yotster Vicino и начнём мы со знакомства с LoRa библиотекой. Эта библиотека содержит специфические функции для обслуживания LoRa модуля, формирования, посылки и приёма LoRa пакетов, а также некоторые дополнительные функции.
На этой странице есть подробное описание всех функций этой библиотеки. В наших примерах мы постепенно познакомимся с этими функциями и подробно разберём их работу.
Посылка LoRa пакетов
Программирование беспроводной LoRa связи мы начнём с примера посылки пакетов в эфир, а в следующем примере разберём приём этих пакетов другим модулем Yotster Vicino.
Ниже приведён пример скетча LoRa Sender, который формирует и посылает в эфир LoRa пакеты с данными. В нашем случае это текст «packet: » и номер посылаемого пакета. Вот полный код скетча LoRa Sender для платы Yotster Vicino:
/* LoRa Sender for Yotster Vicino (based on standard example of LoRa Library) (c)2020 Electromicro License: GNU GPL 2.1 A simple example of sender LoRa packets. */ #include <SPI.h> #include <LoRa.h> #define LORA_SS_PIN 23 long count = 0; void setup() { Serial.begin(115200); while (!Serial) { ;} Serial.println("Start LoRa Sender"); LoRa.setPins(LORA_SS_PIN, LORA_DEFAULT_RESET_PIN, LORA_DEFAULT_DIO0_PIN); if (!LoRa.begin(868E6)) { Serial.println("Starting LoRa failed!"); while(1); } } void loop() { Serial.print("Sending packet: "); Serial.println(count); // Send packet LoRa.beginPacket(); LoRa.print("packet: "); LoRa.print(count); LoRa.endPacket(); count++; delay(5000); }
Разберём подробнее его работу. В начале мы подключаем необходимые библиотеки SPI.h для обеспечения работы по SPI интерфейсу и LoRa.h для поддержки специфических LoRa функций.
#include <SPI.h> #include <LoRa.h>
Далее нам нужно определить номер пина выбора LoRa модуля на шине SPI. В случае платы Yotster Vicino этот пин подключён на вывод PA23 (D23) микроконтроллера ATSAMD21E18 (см. подробности в разделе Спецификации этой документации).
#define LORA_SS_PIN 23
Затем, в функции setup(), инициализируем Serial интерфейс для работы на частоте 115200 (не забудьте выставить такую же скорость в Serial Monitor). И выводим надпись о старте нашего скетча.
Serial.begin(115200); while (!Serial) { ;} Serial.println("Start LoRa Sender");
Потом определяем пины управления LoRa модулем. Используются два стандартных для LoRa библиотеки пина и один, определённый нами чуть выше пин LORA_SS_PIN.
LoRa.setPins(LORA_SS_PIN, LORA_DEFAULT_RESET_PIN, LORA_DEFAULT_DIO0_PIN);
И инициализируем LoRa объект на частоте 868 МГц (868E6). Это стандартная и разрешённая для свободного использования эфирная частота.
if (!LoRa.begin(868E6)) { Serial.println("Starting LoRa failed!"); while(1); }
В случае возникновения каких-либо проблем, выполнение программы останавливается и выводится сообщение об ошибке «Starting LoRa failed!».
void loop() { Serial.print("Sending packet: "); Serial.println(count); // Send packet LoRa.beginPacket(); LoRa.print("packet: "); LoRa.print(count); LoRa.endPacket(); count++; delay(5000); }
Далее, в функции loop(), формируется LoRa пакет, содержащий текст «packet: » и номер посылаемого пакета. Пакеты посылаются каждые 5 секунд и каждый раз номер пакета увеличивается на единицу.
Разберём подробнее процесс формирования и посылки LoRa пакета. Инструкция
LoRa.beginPacket();
начинает процесс формирования LoRa пакета (пока ещё никуда не посылая его), а методы
LoRa.print("packet: "); LoRa.print(count);
формируют данные, которые будут передаваться в пакете. И затем инструкция
LoRa.endPacket();
завершает формирование пакета и посылает его в эфир. Эти три строчки и есть вся работа с радиочастотной LoRa частью модуля Yotster Vicino. Так мало строк и такой простой код формирования и посылки LoRa пакета стал возможен благодаря подключённой нами LoRa библиотеке — вся сложность реализации этих функций скрыта в ней от нас.
Далее значение счётчика пакетов увеличивается на единицу.
count++;
И добавляется пауза в 5 секунд.
delay(5000);
Содержимое вывода в Serial Monitor скетча LoRa Sender при посылке пакетов:
Вот, собственно, и весь скетч формирование и посылки LoRa пакетов в эфир. Таким же образом вы можете формировать любое другое содержимое LoRa пакетов и формировать любое расписание посылки их в эфир. Содержимым пакетов могут быть текстовые сообщения, значения переменных, какие-либо кодовые команды и т. п. информация.
Примечание. Обратите внимание: LoRa пакеты не шифруются и любой обладатель LoRa приёмника может принимать ваши пакеты так же легко как и вы сами. Для шифрования содержимого передаваемых пакетов нужно предпринимать специальные действия, но это уже тема отдельной статьи.
А что же происходит на самом деле во время работы нашего скетча? На скриншоте представлен результат его работы — это LoRa пакет, посылаемый в эфир платой Yotster Vicino. Видна реальная частота сигнала 868 МГц и его временные и энергетические характеристики. Этот сигнал распространяется в эфире и может приниматься LoRa приёмниками, о чём мы поговорим чуть ниже.
Приём LoRa пакетов
Посылать LoRa пакеты мы научились, теперь поговорим об их приёме. Принимать пакеты мы будем при помощи второй платы Yotster Vicino. Для этого давайте напишем и разберём работу скетча LoRa Receiver. Код скетча:
/* LoRa Receiver for Yotster Vicino (based on standard example of LoRa Library) (c)2020 Electromicro License: GNU GPL 2.1 A simple example of receiver LoRa packets. */ #include <SPI.h> #include <LoRa.h> #define LORA_SS_PIN 23 void setup() { Serial.begin(115200); while (!Serial) { ;} Serial.println("Start LoRa Receiver"); LoRa.setPins(LORA_SS_PIN, LORA_DEFAULT_RESET_PIN, LORA_DEFAULT_DIO0_PIN); if (!LoRa.begin(868E6)) { Serial.println("Starting LoRa failed!"); while(1); } } void loop() { int packetSize = LoRa.parsePacket(); if (packetSize) { Serial.print("Received packet: "); while (LoRa.available()) { Serial.print((char)LoRa.read()); } Serial.println(); } }
Скетч аналогичен уже рассмотренному скетчу LoRa Sender, поэтому здесь мы остановимся только на их отличиях. Подключение библиотек, определение пинов LoRa модуля и функция setup() остаются прежними, отличия есть только в функции loop().
void loop() { int packetSize = LoRa.parsePacket(); if (packetSize) { Serial.print("Received packet: "); while (LoRa.available()) { Serial.print((char)LoRa.read()); } Serial.println(); } }
Функция loop() — это бесконечный цикл и первая строка
int packetSize = LoRa.parsePacket();
постоянно проверяет функцию LoRa.parsePacket() на наличие пришедшего LoRa пакета. Если пакета нет, то функция возвращает 0 (нуль) или, другими словами, false. Если пакет есть, то функция возвращает его длину в байтах.
Далее, в строке
if (packetSize) {
Проверяется длина пакета и, если значение больше нуля (true), то выполняется код чтения пришедшего пакета.
Serial.print("Received packet: "); while (LoRa.available()) { Serial.print((char)LoRa.read()); } Serial.println();
В Serial выводится надпись «Received packet: » и затем в цикле выводится и само содержимое принятого пакета
while (LoRa.available()) { Serial.print((char)LoRa.read()); }
Вот и всё! Как видите, приём Lora пакетов не намного сложнее их посылки, и всё это благодаря LoRa библиотеке, которая берёт на себя львиную долю всей работы.
Вместо простого вывода в Serial содержимого принятого пакета можно его анализировать и использовать любым способом, согласно логике вашего проекта. Расстояние между платами LoRa передатчика и приёмника может составлять до нескольких километров, в зависимости от окружающих условий и рельефа местности.
LoRa библиотека содержит ещё множество примеров различного использования этой технологии, все они достаточно простые и вы можете создавать на их основе свои проекты беспроводной LoRa связи.
Заключение
В этой статье мы рассмотрели начало работы и основные приёмы программирования беспроводного LoRa контроллера Yotster Vicino. Как вы могли убедиться, работа с платой Yotster Vicino не представляет каких-то трудностей и является простым, увлекательным и очень полезным занятием!
Ссылки по теме
Обзор LoRa контроллера Yotster Vicino
Спецификации и подключение Yotster Vicino
Пример использования Yotster Vicino
Где купить?
Yotster Vicino в магазине «Electromicro»
Техническая поддержка
Мы внимательно относимся к потребностям наших клиентов и осуществляем техническую поддержку всей выпускаемой продукции. Вы можете написать нам письмо с вашим вопросом или позвонить по телефону и специалист нашей компании проконсультирует вас и поможет решить вашу проблему.
- Емейл для вопросов по нашей продукции: electromicro@bk.ru
- Наш телефон: +7 (495) 997-37-74