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




uniSensors LoRa — Программирование

Программирование беспроводного контроллера uniSensors LoRa — дело несложное и не вызывает каких-то проблем, даже если вы не являетесь профессиональным программистом. В этой статье мы подробно рассмотрим весь процесс написания скетчей для uniSensors LoRa.

Составные части uniSensors LoRa

Контроллер uniSensors LoRa состоит из двух основных частей: микроконтроллера ATmega328P (такой же как и в Arduino Pro Mini) и радиочастотного LoRa модуля на чипе SX1276. Поэтому и программирование разделяется на две части — программирование микроконтроллера ATmega328P (это делается также, как и программирование Arduino Pro Mini) и программирование беспроводного LoRa модуля (это делается при помощи LoRa библиотеки).

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

К выводам микроконтроллера ATmega328P на плате uniSensors LoRa подключаются различные датчики и актуаторы так, как вы это обычно делаете в своих Ардуино-проектах, а в Arduino IDE вы пишите привычный вам код. Если вы на этом остановитесь, то у вас получится аналог контроллера Arduino Pro Mini с присущими ему возможностями.

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

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

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

Сборка uniSensors LoRa

Для начала работы с платой uniSensors LoRa нужно подсоединить к её IPEX разъёму антенну на 868 МГц и подключить к контроллеру переходник USB-UART, а сам переходник подсоединить к компьютеру.

Подключение USB-UART переходника к контроллеру uniSensors LoRa производится 5-ю проводниками по следующей схеме:

ПереходникКонтроллер

DTRDTR

RXTX

TXRX

VCC3.3V

GNDGND

Переходник должен быть 3,3-вольтовым или иметь возможность переключения на работу с напряжением 3,3 В.

Внимание! Будьте внимательны при подключении USB-UART переходника к контроллеру uniSensors LoRa и убедитесь, что он работает именно с напряжением 3,3 В, а не 5 В, иначе плата uniSensors LoRa может выйти из строя.

Arduino IDE

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

Примечание: все действия, упомянутые в статье, проводились в операционной системе Windows 7 64-bit, если у вас другая операционная система, то действия и внешний вид интерфейса могут немного отличаться.

Версия Arduino IDE роли не играет, все примеры из этой статьи будут работать в любой из последних версий Arduino, начиная с версии 1.6.5 и выше.

Для настройки Arduino IDE для работы с uniSensors LoRa вам нужно выбрать в списке плат Arduino Pro Mini ATmega328P (3.3V 8 MHz) и порт, к которому подключён ваш USB-UART переходник. Это все настройки, которые вам нужно сделать, после этого вы уже можете начать программировать uniSensors LoRa.

Для работы с беспроводной частью контроллера вам понадобится ещё подключить LoRa библиотеку. Загрузите эту библиотеку на компьютер и установите стандартным способом. После установки библиотеки не забудьте перезагрузить среду разработки Arduino IDE.

Программирование ATmega328P

Для начала давайте разберём пример использования одного микроконтроллера ATmega328P, без радиочастотной LoRa части. Этот пример ничем не будет отличаться от программирования стандартной платы Arduino Pro Mini.

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

/*
  uniSensors LoRa Serial print example
*/

void setup() {
  Serial.begin(115200);
  Serial.println(F("Start uniSensors LoRa!"));
}

void loop() {

}

После компиляции и загрузки этого скетча в контроллер uniSensors LoRa, вы можете увидеть в Serial мониторе вывод тестового сообщения:

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

Но использовать таким образом плату uniSensors LoRa не очень продуктивно, основное её достоинство — это беспроводной LoRa модуль, о программировании которого мы поговорим далее.

LoRa библиотека

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

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

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

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

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

/*
  uniSensors LoRa Sender
  (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_POWER_PIN A1

#define LORA_SS_PIN    7
#define LORA_RESET_PIN 6
#define LORA_DIO0_PIN  5

long count = 0;

void setup() {
  Serial.begin(115200);
  Serial.println("Start uniSensors LoRa Sender");

  pinMode(LORA_POWER_PIN, OUTPUT);
  digitalWrite(LORA_POWER_PIN, LOW);

  LoRa.setPins(LORA_SS_PIN, LORA_RESET_PIN, LORA_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 для обеспечения работы по SPI интерфейсу и LoRa для поддержки специфических LoRa функций.

#include <SPI.h>
#include <LoRa.h>

Далее задаём вывод управления подачей питания на LoRa модуль, это пин A1.

#define LORA_POWER_PIN A1

Выводы подключения интерфейса SPI для LoRa модуля.

#define LORA_SS_PIN    7
#define LORA_RESET_PIN 6
#define LORA_DIO0_PIN  5

И объявляем переменную для подсчёта количества посланных в эфир LoRa пакетов.

long count = 0;

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

  Serial.begin(115200);
  Serial.println("Start uniSensors LoRa Sender");

Далее выставляем низкий потенциал на управляющем пине подачи напряжения на LoRa модуль.

  pinMode(LORA_POWER_PIN, OUTPUT);
  digitalWrite(LORA_POWER_PIN, LOW);

Устанавливаем ранее обозначенные выводы для работы LoRa модуля по интерфейсу SPI.

  LoRa.setPins(LORA_SS_PIN, LORA_RESET_PIN, LORA_DIO0_PIN);

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

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

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

Далее, в функции loop(), формируется LoRa пакет, содержащий текст «packet: » и номер посылаемого пакета. Пакеты посылаются каждые 5 секунд и каждый раз номер пакета увеличивается на единицу.

void loop()  {
  Serial.print("Sending packet: "); Serial.println(count);

  // Send packet
  LoRa.beginPacket();
    LoRa.print("packet: "); LoRa.print(count);
  LoRa.endPacket();

  count++;

  delay(5000);
}
Разберём подробнее процесс формирования и посылки LoRa пакета. Инструкция
  LoRa.beginPacket();

начинает процесс формирования LoRa пакета (пока ещё не посылая его), а методы

  LoRa.print("packet: "); LoRa.print(count);

формируют данные, которые будут передаваться в пакете. Затем инструкция

  LoRa.endPacket();

завершает формирование пакета и посылает его в эфир. Эти три строки и есть вся работа с радиочастотной LoRa частью модуля uniSensors LoRa. Такой простой код формирования и посылки LoRa пакета стал возможен благодаря подключённой нами LoRa библиотеке — весь механизм реализации этих функций скрыт в ней от нас.

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

  count++;

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

  delay(5000);

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

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

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

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

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

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

/*
  uniSensors LoRa Receiver
  (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_POWER_PIN A1

#define LORA_SS_PIN    7
#define LORA_RESET_PIN 6
#define LORA_DIO0_PIN  5

void setup() {
  Serial.begin(115200);
  Serial.println("Start uniSensors LoRa Receiver");

  pinMode(LORA_POWER_PIN, OUTPUT);
  digitalWrite(LORA_POWER_PIN, LOW);

  LoRa.setPins(LORA_SS_PIN, LORA_RESET_PIN, LORA_DIO0_PIN);

  if (!LoRa.begin(868E6)) {
    Serial.println("Starting uniSensors 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();
  }
}

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

Файлы для скачивания

Библиотека для работы с датчиком Si7021

Библиотека для работы с EEPROM памятью

Библиотека для работы с криптомикросхемой ATSHA204

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

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

Спецификации и подключение uniSensors LoRa

Пример работы с uniSensors LoRa

Где купить?

uniSensors LoRa в магазине «Electromicro»

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

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

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

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