- Необходими материали
- Свързване на Raspberry Pi с LoRa
- Свързване на Arduino с LoRa
- pyLoRa за Raspberry Pi
- Конфигуриране на модула Raspberry Pi за LoRa
- Програмиране на Raspberry Pi за LoRa
- Arduino код за LoRa за комуникация с Raspberry Pi
- Тестване на LoRa комуникация между Raspberry Pi и Arduino
LoRa става все по-популярен с появата на IoT, Connected Cars, M2M, Industry 4.0 и т.н. Поради способността си да комуникира на дълги разстояния с много по-малко мощност, за предпочитане е да се използва от дизайнерите за изпращане / получаване на данни от захранвана от батерията Thing. Вече обсъдихме основите на LoRa и как да използваме LoRa с Arduino. Въпреки че първоначално технологията е предназначена за LoRa Node да комуникира с LoRa шлюз, има много сценарии, в които LoRa Node трябва да комуникира с друг LoRa Node за обмен на информация на дълги разстояния. И така, в този урок ще научим как да използваме LoRa модул SX1278 с Raspberry piза комуникация с друг SX1278, свързан с микроконтролер като Arduino. Този метод може да бъде полезен на много места, тъй като Arduino може да действа като сървър за извличане на данни от сензори и изпращането им на Pi на голямо разстояние чрез LoRa и след това Pi, действащ като клиент, може да получи тази информация и да я качи в може, тъй като има достъп до интернет. Звучи интересно нали? И така, нека започнем.
Необходими материали
- SX1278 433MHz LoRa модул - 2 бр
- 433MHz LoRa антена - 2Nos
- Arduino UNO- или друга версия
- Raspberry Pi 3
Предполага се, че вашият Raspberry Pi вече е флаширан с операционна система и е в състояние да се свърже с интернет. Ако не, следвайте урока Първи стъпки с Raspberry Pi, преди да продължите. Тук използваме инсталираната от Rasbian Jessie Raspberry Pi 3.
Предупреждение: Винаги използвайте модула си SX1278 LoRa с антени 433 MHz; в противен случай модулът може да се повреди.
Свързване на Raspberry Pi с LoRa
Преди да влезем в софтуерните пакети, нека подготвим хардуера. В SX1278 е 16-пинов Lora модул, който комуникира, използвайки SPI на 3.3V логика. Raspberry pi също работи на 3.3V логическо ниво и също има вграден SPI порт и 3.3V регулатор. Така че можем директно да свържем модула LoRa с Raspberry Pi. Таблицата на връзките е показана по-долуRaspberry Pi | Lora - Модул SX1278 |
3.3V | 3.3V |
Земя | Земя |
GPIO 10 | МОСИ |
GPIO 9 | MISO |
GPIO 11 | SCK |
GPIO 8 | Nss / Активиране |
GPIO 4 | DIO 0 |
GPIO 17 | DIO 1 |
GPIO 18 | DIO 2 |
GPIO 27 | DIO 3 |
GPIO 22 | RST |
Можете също да използвате схемата по-долу за справка. Имайте предвид, че електрическата схема е създадена с помощта на модула RFM9x, който е много подобен на модула SX1278, поради което външният вид може да се различава в изображението по-долу.
Връзките са доста прави, единственият проблем, с който може да се сблъскате, е, че SX1278 не е съвместим с макет, поради което трябва да използвате свързващи проводници директно, за да направите връзките, или да използвате две малки макети, както е показано по-долу. Също така малко хора предлагат да захранват модула LoRa с отделна 3.3V захранваща шина, тъй като Pi може да не е в състояние да подаде достатъчно ток. Въпреки това Lora като модул с ниска мощност трябва да работи върху 3.3V релсата на Pi, тествах същото и установих, че работи без проблем. Но все пак го приемайте с щипка сол. Настройката ми за връзка на LoRa с Raspberry pi изглежда по-долу по следния начин
Свързване на Arduino с LoRa
Връзката за модула Arduino остава същата като тази, която използвахме в предишния ни урок. Единствената разлика ще бъде, вместо да използваме библиотеката от Sandeep Mistry, ще използваме библиотеката Rspreal, базирана на Radio head, която ще обсъдим по-късно в този проект. Веригата е дадена по-долу
Отново можете да използвате 3.3V щифт на Arduino Uno или да използвате отделен 3.3V регулатор. В този проект съм използвал бордовия регулатор на напрежението. Таблицата на връзките с щифтове е дадена по-долу, за да ви помогне да направите лесно връзките.
LoRa SX1278 Модул | Arduino UNO Board |
3.3V | 3.3V |
Gnd | Gnd |
En / Nss | D10 |
G0 / DIO0 | D2 |
SCK | D13 |
MISO | D12 |
МОСИ | D11 |
RST | D9 |
Тъй като модулът не се побира в макет, използвах свързващите проводници директно за свързване. След като свържете връзката, настройката на Arduino LoRa ще изглежда по следния начин
pyLoRa за Raspberry Pi
Има много пакети на python, които можете да използвате с LoRa. Също често Raspberry Pi се използва като LoRaWAN за получаване на данни от множество LoRa възли. Но в този проект нашата цел е да осъществим Peer to Peer комуникация между два модула Raspberry Pi или между Raspberry Pi и Arduino. И така, реших да използвам пакета pyLoRa. Той разполага с rpsreal LoRa Arduino и rpsreal LoRa Raspberry pi модули, които могат да се използват в средата Arduino и Raspberry Pi. Засега нека се съсредоточим върху средата на Raspberry Pi.
Конфигуриране на модула Raspberry Pi за LoRa
Както беше казано по-рано, LoRa модулът работи с SPI комуникация, така че трябва да активираме SPI на Pi и след това да инсталираме пакета pylora . Следвайте стъпките по-долу, за да направите същото, след като отворите терминалния прозорец на Pi. Отново използвам шпакловка, за да се свържа с моя Pi, можете да използвате удобния си метод.
Стъпка 1: Влезте в прозореца за конфигуриране, като използвате следната команда. За да получите прозореца отдолу
sudo raspi-config
Стъпка 2: Придвижете се до опциите за взаимодействие и активирайте SPI, както е показано на изображението по-долу. Трябва да активираме интерфейса SPI, тъй като както обсъждахме LCD и PI комуникират чрез протокол SPI
Стъпка 3: Запазете промените и се върнете в прозореца на терминала. Уверете се, че pip и python са актуализирани и след това инсталирайте пакета RPi.GPIO , като използвате следната команда.
pip инсталирайте RPi.GPIO
Този клас пакети ще ни помогне да контролираме GPIO щифта на Pi. При успешна инсталация екранът ви ще изглежда така
Стъпка 4: По същия начин продължете с инсталирането на пакета spidev , като използвате следната команда. Spidev е свързване на python за Linux, което може да се използва за осъществяване на SPI комуникация на Raspberry Pi.
pip инсталирайте spidev
Ако инсталацията е успешна, терминалът трябва да изглежда по следния начин.
Стъпка 5: След това позволява да инсталирате пакета pyLoRa, като използвате следната команда pip. Този пакет инсталира моделите на радио, свързани с LoRa.
pip инсталирайте pyLoRa
Ако инсталацията е успешна, ще видите следния екран.
Пакетът PyLoRa също поддържа криптирана комуникация, която може да се използва безпроблемно с Arduino и Raspberry Pi. Това ще подобри сигурността на данните във вашата комуникация. Но след тази стъпка трябва да инсталирате отделен пакет, който аз не правя, тъй като криптирането не е в обхвата на този урок. Можете да следвате горните връзки към github за повече подробности.
След тази стъпка можете да добавите информация за пътя на пакета към pi и да опитате с програмата python, дадена в края. Но не успях да добавя пътя успешно и затова трябваше да изтегля ръчно библиотека и да използвам същата директно за моите програми. Затова трябваше да продължа със следните стъпки
Стъпка 6: Изтеглете и инсталирайте пакета python-rpi.gpio и spidev, като използвате командата по-долу.
sudo apt-get инсталирате python-rpi.gpio python3-rpi.gpio sudo apt-get инсталирате python-spidev python3-spidev
Терминалният прозорец трябва да показва нещо подобно след двете инсталации.
Стъпка 7: Също така инсталирайте git и след това го използвайте за клониране на директорията на python за нашата Raspberry Pi. Можете да направите това, като използвате следните команди.
sudo apt-get install git sudo git clone
След като тази стъпка приключи, трябва да намерите поддиректория SX127x в домашната папка на Raspberry Pi. Това ще съдържа всички необходими файлове, свързани с библиотеката.
Програмиране на Raspberry Pi за LoRa
При равнопоставена LoRa комуникация модулът, който предава информацията, се нарича сървър, а модулът, който получава информацията, се нарича клиент. В повечето случаи Arduino ще се използва в полето със сензор за измерване на данни, а Pi ще се използва за получаване на тези данни. И така, реших да използвам Raspberry Pi като клиент и Arduino като сървър в този урок. В пълна програма клиент Raspberry Pi може да се намери в дъното на тази страница. Тук ще се опитам да обясня важните редове в програмата.
Внимание: Уверете се, че програмният файл е в същата директория, в която се намира папката на библиотеката SX127x. Можете да копирате тази папка и да я използвате навсякъде, ако искате да пренесете проекта.
Програмата е доста проста, трябва да настроим модула LoRa да работи в 433Mhz и след това да слушаме за входящи пакети. Ако получим нещо, просто ги отпечатваме на конзолата. Както винаги започваме програмата, като импортираме необходимите библиотеки на python.
от време импортиране сън от SX127x.LoRa импорт * от SX127x.board_config импорт BOARD BOARD.setup ()
В този случай времевият пакет се използва за създаване на закъснения, пакетът Lora се използва за LoRa комуникация, а board_config - за задаване на параметрите на борда и LoRa. Също така настройваме платката с помощта на функцията BOARD.setup () .
След това създаваме класа на python LoRa с три определения. Тъй като правим само отстъп, за да накараме програмата да работи като малинов клиент, класът има само три функции, а именно клас init, начален клас и клас on_rx_done . Класът init инициализира модула LoRa на 433MHz с честотна лента 125kHz, както е зададено в метода set_pa_config . След това той също така поставя модула в режим на заспиване, за да спести консумация на енергия.
# Средният обхват по подразбиране след иницииране е 434.0MHz, Bw = 125 kHz, Cr = 4/5, Sf = 128чипа / символ, CRC на 13 dBm lora.set_pa_config (pa_select = 1) def __init __ (самостоятелно, подробно = False): супер (LoRaRcvCont, самостоятелно).__ init __ (подробен) self.set_mode (MODE.SLEEP) self.set_dio_mapping (* 6)
Функцията за старт е мястото, където ние конфигуриране на модула като приемник и се получи като RSSI (Получаване на силата на сигнала Индикатор), състояние, работна честота и др. Настройваме модула да работи в режим на непрекъснат приемник (RXCONT) от спящ режим и след това използваме цикъл while, за да четем стойности като RSSI и състоянието на модема. Също така изхвърляме данните в серийния буфер на терминала.
def start (self): self.reset_ptr_rx () self.set_mode (MODE.RXCONT) while True: sleep (.5) rssi_value = self.get_rssi_value () status = self.get_modem_status () sys.stdout.flush ()
Накрая функцията on_rx_done се изпълнява след прочитане на входящия пакет. В тази функция получените стойности се преместват в променлива, наречена полезен товар от буфера Rx, след като зададете високо получаване на флага. След това получените стойности се декодират с utf-8, за да се отпечатат четими от потребителя данни върху черупката. Също така връщаме модула в режим на заспиване, докато не се получи друга стойност.
def on_rx_done (self): print ("\ nПолучен:") self.clear_irq_flags (RxDone = 1) payload = self.read_payload (nocheck = True) print (bytes (payload).decode ("utf-8", 'ignore'))) self.set_mode (MODE.SLEEP) self.reset_ptr_rx () self.set_mode (MODE.RXCONT)
Останалата част от програмата е само да отпечата получените стойности на конзолата и да прекрати програмата с помощта на прекъсване на клавиатурата. Отново поставяме платката в режим на заспиване дори след прекратяване на програмата, за да спестим енергия.
опитайте: lora.start () с изключение на KeyboardInterrupt: sys.stdout.flush () print ("") sys.stderr.write ("KeyboardInterrupt \ n") накрая: sys.stdout.flush () print ("") lora. set_mode (MODE.SLEEP) BOARD.teardown ()
Arduino код за LoRa за комуникация с Raspberry Pi
Както споменах по-рано, rpsreal кодът поддържа Arduino и Pi и следователно е възможна комуникация между Arduino и Pi. Той работи въз основа на библиотеката Radiohead от AirSpayce's. Така че първо трябва да инсталирате библиотеката на радиото на главата на вашия IDE на Arduino.
За целта посетете страницата на Github и изтеглете библиотеката в ZIP папка. След това го поставете в папката на библиотеката на вашата Arduino IDE. Сега рестартирайте Arduino IDE и ще намерите примерни файлове за библиотеката на Radio head. Тук ще програмираме Arduino да работи като LoRa сървър за изпращане на тестови пакети от 0 до 9. Пълният код, който прави същото, може да бъде намерен в долната част на тази страница, както винаги. Тук ще обясня няколко важни реда в програмата.
Започваме програмата, като импортираме SPI библиотека (инсталирана по подразбиране), за да използваме SPI протокол и след това библиотеката RH_RF95 от Radio head за осъществяване на LoRa комуникация. След това дефинираме към кой щифт на Arduino сме свързали Chip select (CS), Reset (RST) и Interrupt (INT) pin на LoRa с Arduino. Накрая също така дефинираме, че модулът трябва да работи на честота 434MHz и да инициализира модула LoRa.
#include
Във функцията за настройка ще нулираме модула LoRa, като издърпаме щифта му за нулиране за 10 мили секунди, за да започне наново. След това го инициализираме с модула, който създадохме по-рано с помощта на библиотеката Radio head. След това задаваме честотата и мощността на предаване за сървъра LoRa. Колкото по-висока е скоростта на предаване, толкова повече пакети ще изминат, но ще консумират повече енергия.
void setup () { // Инициализиране на Serial Monitor Serial.begin (9600); // Нулиране на LoRa модул pinMode (RFM95_RST, OUTPUT); digitalWrite (RFM95_RST, LOW); забавяне (10); digitalWrite (RFM95_RST, HIGH); забавяне (10); // Инициализиране на LoRa модул докато (! Rf95.init ()) { Serial.println ("LoRa radio init failed"); докато (1); } // Задайте честота по подразбиране 434,0MHz, ако (! Rf95.setFrequency (RF95_FREQ)) { Serial.println ("setFrequency failed"); докато (1); } rf95.setTxPower (18); // Предавателна мощност на модула Lora }
Вътре във функцията за безкраен цикъл ние просто трябва да изпратим пакета данни чрез модула LoRa. Тези данни могат да бъдат нещо като сензорна стойност на потребителска команда. Но за простота ще изпратим стойност на char от 0 до 9 за всеки 1 секунден интервал и след това ще инициализираме стойността обратно до 0 след достигане на 9. Имайте предвид, че стойностите могат да се изпращат само във формат масив char и видът на данните трябва да бъде unit8_t, че е 1 байт наведнъж. Кодът, който прави същото, е показан по-долу
цикъл void () { Serial.print ("Изпращане:"); char радиопакет = char (стойност)}; rf95.send ((uint8_t *) радиопакет, 1); забавяне (1000); стойност ++; ако (стойност> '9') стойност = 48; }
Тестване на LoRa комуникация между Raspberry Pi и Arduino
Сега, след като подготвихме както хардуера, така и програмата, просто трябва да качим кода на Arduino на борда на UNO и скицата на python трябва да бъде стартирана на pi. Моята тестова настройка със свързан хардуер изглежда по-долу по следния начин
След като стартира скицата на клиента на python на Pi (използвайте само python 3), ако всичко работи правилно, трябва да видите пакетите Arduino, получени в pi, през прозореца на черупката. Трябва да забележите „Получено: 0“ до 9, както е показано на изображението по-долу.
Пълният код на Raspberry pi с всички необходими библиотеки можете да изтеглите от тук.
Вече можете да преместите сървъра Arduino и да проверите обхвата на модула; възможно е също да се покаже стойността на RSSI на черупката, ако е необходимо. В пълно функциониране на проекта може да се намери във видеото по-долу свързани. Сега, след като знаем как да установим LoRa комуникация с ниска мощност на дълги разстояния между Arduino и Raspberry pi, можем да продължим с добавянето на сензор от страна на Arduino и облачна платформа от страна на Pi, за да направим пълен IoT пакет.
Надявам се, че сте разбрали проекта и ви е било приятно да го изградите. Ако имате проблем да го накарате да работи, използвайте раздела за коментари по-долу или форумите за други технически въпроси.