logo
+7 (495) 997-37-74
Москва, ул.Международная, 15




Yotster Alfa — Программирование

Прежде, чем начинать программировать Yotster Alfa, нужно произвести некоторые предварительные действия по установке драйверов и настройке среды программирования Arduino. В этой инструкции мы подробно расскажем о процессе инсталляции драйверов и разберём несколько примеров работы с беспроводной технологией LoRa.

Поддержка Yotster Alfa в среде Arduino IDE

Примечание: здесь предполагается, что вы достаточно опытный пользователь, у вас установлена и настроена среда разработки Arduino IDE и вы умеете создавать и загружать скетчи в контроллер.

Для того, чтобы начать программировать Yotster Alfa, нужно сначала установить в Arduino IDE поддержку микроконтроллера Arduino Zero. Для этого в менеджере плат выберите Arduino SAMD Boards (32-bits ARM Cortex-M0+) последней версии и установите на компьютер.

Далее в Менеджере плат нужно выбрать плату Arduino/Genuino Zero (Native USB Port) и соответствующий USB порт к которому она подключена — и вы можете приступать к программированию контроллера Yotster Alfa.

Примеры программирования

Yotster Alfa состоит из 2-х основных частей: микроконтроллера ATSAMD21G18 и радиочастотного LoRa модуля G-NiceRF LORA1276. В этом руководстве мы уделим внимание обеим этим частям и рзберём примеры работы с ними.

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

ATSAMD21E18 — это мощный 32-битный микроконтроллер, который управляет всем подключённым к нему оборудованием и может обслуживать подключённые к нему проводные и беспроводные интерфейсы. Вы можете воспользоваться его ресурсами для обработки информации и решения своих IoT задач.

Кроме этого, на плате Yotster Alfa присутствует разъём с выведенными на него GPIO пинами микроконтроллера к которым вы можете подключать различные датчики и актуаторы так, как вы это делаете обычно в своих проектах на Ардуино.

Здесь мы разберём простой пример использования микроконтроллера ATSAMD21E18, без радиочастотной LoRa части. Этот пример ничем не будет отличаться от программирования привычных вам плат Ардуино в среде программирования Arduino IDE.

Рассмотрим классический скетч вывода сообщения в Serial и мигания встроенным в плату тестовым светодиодом D13.

/*
  Yotster Alfa Example
  (based on standard example)
  (c)2020 Electromicro
  License: GNU GPL 2.1
 */

#define BUILD_LED 13

void setup() {
  SerialUSB.begin(115200);
  while (!SerialUSB) { ;}
  SerialUSB.println(F("Start Yotster Alfa Example..."));
  pinMode(BUILD_LED, OUTPUT);
}

void loop() {
  digitalWrite(BUILD_LED, HIGH); delay(500);
  digitalWrite(BUILD_LED, LOW);  delay(500);
}

После компиляции и загрузки этого скетча в контроллер Yotster Alfa, вы можете наблюдать в Serial мониторе вывод тестового сообщения и мигание встроенного в плату светодиода. Этот пример иллюстрирует полное тождество работы и приёмов программирования контроллеров Yotster Alfa и привычных Arduino плат.

Единственный момент заключается в том, что вместо привычного Serial используется вывод в SerialUSB. Инструкция

  while (!SerialUSB) { ;}

требуется для того, чтобы создать задержку пока микроконтроллер не инициализирует соответствующую подсистему. Если убрать эту инструкцию, то надпись видно не будет.

Строка

  pinMode(BUILD_LED, OUTPUT);

инициализирует порт к которому подключён встроенный тестовый светодиод. А в цикле loop() осуществляется мигание светодиодом.

void loop() {
  digitalWrite(BUILD_LED, HIGH); delay(500);
  digitalWrite(BUILD_LED, LOW);  delay(500);
}

Аналогичным образом вы можете использовать микроконтроллер платы Yotster Alfa для управления датчиками, актуаторами, индикаторами и прочей периферией. А теперь разберём работу беспроводного LoRa модуля, встроенного в плату Yotster Alfa.

LoRa библиотека

Теперь перейдём к работе с радиочастотной частью платы Yotster Alfa и начнём со знакомства с LoRa библиотекой. Эта библиотека содержит специфические функции для обслуживания LoRa модуля, формирования, посылки и приёма LoRa пакетов, а также некоторые дополнительные функции.

На этой странице есть подробное описание всех функций этой библиотеки. В наших примерах мы постепенно познакомимся с этими функциями и подробно разберём их работу.

Посылка LoRa пакетов

Ниже приведён пример скетча LoRa Sender for Yotster Alfa, который формирует и посылает в эфир LoRa пакеты с данными. В нашем случае это текст «packet: » и номер посылаемого пакета. Вот полный код скетча LoRa Sender:

/*
  LoRa Sender for Yotster Alfa
  (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>

long count = 0;

void setup() {
  SerialUSB.begin(115200);
  while (!SerialUSB) { ;}
  SerialUSB.println("Start Alfa LoRa Sender");

  if (!LoRa.begin(868E6)) {
    SerialUSB.println("Starting LoRa failed!");
    while(1);
  }
}

void loop() {
  SerialUSB.print("Sending packet: "); SerialUSB.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>

Затем, в функции setup(), инициализируем Serial интерфейс для работы на частоте 115200 (не забудьте выставить такую же скорость в Serial Monitor). И выводим надпись о старте нашего скетча. Вместо привычного Serial в данном случае используется SerialUSB — это особенность контроллера Arduino Zero. Также вводится задержка для инициализации SerialUSB.

  SerialUSB.begin(115200);
  while (!SerialUSB) { ;}
  SerialUSB.println("Start Alfa LoRa Sender");

Далее создаём объект LoRa на частоте 868 МГц (868E6). Это стандартная и разрешённая для свободного использования эфирная частота.

  if (!LoRa.begin(868E6)) {
    SerialUSB.println("Starting LoRa failed!");
    while(1);
  }

В случае возникновения каких-либо проблем, выполнение программы останавливается и выводится сообщение об ошибке «Starting LoRa failed!».

void loop() {
  SerialUSB.print("Sending packet: "); SerialUSB.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 Alfa. Так мало строк и такой простой код формирования и посылки LoRa пакета стал возможен благодаря подключённой нами LoRa библиотеке — вся сложность реализации этих функций скрыта от нас в ней.

Далее значение счётчика пакетов увеличивается на единицу.

  count++;

И добавляется пауза в 5 секунд.

  delay(5000);

Содержимое вывода в Serial Monitor скетча LoRa Sender при посылке пакетов:

Вот и весь скетч формирование и посылки LoRa пакетов в эфир. Таким же образом вы можете формировать любое другое содержимое LoRa пакетов и формировать любое расписание посылки их в эфир. Содержимым пакетов могут быть текстовые сообщения, значения переменных, какие-либо кодовые команды и т. п. информация.

Примечание: Обратите внимание: LoRa пакеты не шифруются и любой обладатель LoRa приёмника может принимать ваши пакеты так же легко как и вы сами. Для шифрования содержимого передаваемых пакетов нужно предпринимать специальные действия, но это уже тема отдельной статьи.

На скриншоте ниже представлен результат работы нашего скетча — это LoRa пакет, посылаемый в эфир платой Yotster Alfa. Видна реальная частота сигнала 868 МГц и его временные и энергетические характеристики. Этот сигнал распространяется в эфире и может приниматься LoRa приёмниками, о чём мы поговорим чуть ниже.

Приём LoRa пакетов

Посылать LoRa пакеты мы научились, теперь поговорим об их приёме. Принимать пакеты мы будем при помощи второй платы Yotster Alfa. Для этого давайте напишем и разберём работу скетча LoRa Receiver for Yotster Alfa. Код скетча:

/*
  LoRa Receiver for Yotster Alfa
  (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>

void setup() {
  SerialUSB.begin(115200);
  while (!SerialUSB) { ;}
  SerialUSB.println("Start Alfa LoRa Receiver");

  if (!LoRa.begin(868E6)) {
    SerialUSB.println("Starting LoRa failed!");
    while(1);
  }
}

void loop() {
  int packetSize = LoRa.parsePacket();

  if (packetSize) {
    SerialUSB.print("Received packet: ");

    while (LoRa.available()) {
      SerialUSB.print((char)LoRa.read());
    }
    SerialUSB.println();
  }
}

Скетч аналогичен уже рассмотренному скетчу LoRa Sender, поэтому здесь мы остановимся только на их отличиях. Подключение библиотек и функция setup() остаются прежними, отличия есть только в функции loop().

void loop() {
  int packetSize = LoRa.parsePacket();

  if (packetSize) {
    SerialUSB.print("Received packet: ");

    while (LoRa.available()) {
      SerialUSB.print((char)LoRa.read());
    }
    SerialUSB.println();
  }
}

Функция loop() — это бесконечный цикл и первая строка

  int packetSize = LoRa.parsePacket();

постоянно проверяет функцию LoRa.parsePacket() на наличие пришедшего LoRa пакета. Если пакета нет, то функция возвращает 0 (нуль) или, другими словами, false. Если пакет есть, то функция возвращает его длину в байтах.

Далее, в строке

  if (packetSize)  {

Проверяется длина пакета и, если значение больше нуля (true), то выполняется код чтения пришедшего пакета.

    SerialUSB.print("Received packet: ");

    while (LoRa.available()) {
      SerialUSB.print((char)LoRa.read());
    }
    SerialUSB.println();

В SerialUSB выводится надпись «Received packet: » и затем в цикле выводится и само содержимое принятого пакета

    while (LoRa.available()) {
      Serial.print((char)LoRa.read());
    }

Как видите, приём Lora пакетов ненамного сложнее их посылки, и всё это благодаря LoRa библиотеке, которая берёт на себя львиную долю всей работы.

Вместо простого вывода в Serial содержимого принятого пакета можно его анализировать и использовать любым способом, согласно логике вашего проекта. Расстояние между платами LoRa передатчика и приёмника может составлять до нескольких километров, в зависимости от окружающих условий и рельефа местности.

LoRa библиотека содержит ещё множество примеров различного использования этой технологии, все они достаточно простые и вы можете создавать на их основе свои проекты беспроводной LoRa связи.

Заключение

В этой статье мы рассмотрели начало работы и основные приёмы программирования беспроводного LoRa контроллера Yotster Alfa. Как вы могли убедиться, работа с платой Yotster Alfa не представляет каких-то трудностей и является очень увлекательным занятием.

Ссылки по теме

Обзор LoRa контроллера Yotster Alfa

Спецификации и подключение Yotster Alfa

Пример использования Yotster Alfa

Где купить?

Yotster Alfa в магазине «Electromicro»

Техническая поддержка

Мы внимательно относимся к потребностям наших клиентов и осуществляем техническую поддержку всей выпускаемой продукции. Вы можете написать нам письмо с вашим вопросом или позвонить по телефону и специалист нашей компании проконсультирует вас и поможет решить вашу проблему.

  • Емейл для вопросов по нашей продукции: electromicro@bk.ru
  • Наш телефон: +7 (495) 997-37-74

Аналогичные товары