- Необхідні матеріали
- Підключення 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-вузла із шлюзом LoRa, існує багато сценаріїв, коли вузол LoRa повинен взаємодіяти з іншим вузлом LoRa для обміну інформацією на великі відстані. Отже, у цьому підручнику ми дізнаємося, як використовувати модуль LoRa SX1278 з Raspberry piдля спілкування з іншим SX1278, підключеним до мікроконтролера, такого як Arduino. Цей метод може стати в нагоді в багатьох місцях, оскільки Arduino може виступати в ролі сервера для отримання даних із датчиків і надсилання їх до Pi на велику відстань через LoRa, а потім Pi, що діє як клієнт, може отримати цю інформацію та завантажити її на може, оскільки він має доступ до Інтернету. Звучить цікаво, правда? Отже, давайте почнемо.
Необхідні матеріали
- Модуль LoRa 433 МГц SX1278 - 2 номери
- 433 МГц LoRa антена - 2 Ні
- Arduino UNO- або інша версія
- Raspberry Pi 3
Передбачається, що ваш Raspberry Pi вже прошитий операційною системою і може підключатися до Інтернету. Якщо ні, дотримуйтесь підручника Початок роботи з Raspberry Pi, перш ніж продовжувати. Тут ми використовуємо Rasbian Jessie, встановлену Raspberry Pi 3.
Попередження: Завжди використовуйте свій модуль SX1278 LoRa з антенами 433 МГц; інакше модуль може пошкодитися.
Підключення Raspberry Pi до LoRa
Перш ніж ми потрапляємо в програмні пакети, давайте підготуємо апаратне забезпечення. SX1278 є 16-контактний Lora модуль, який здійснює зв'язок з використанням SPI на 3.3V Logic. Raspberry pi також працює на логічному рівні 3,3 В, а також має вбудований порт SPI та регулятор 3,3 В. Тож ми можемо безпосередньо підключити модуль LoRa до Raspberry Pi. Таблиця підключень наведена нижчеRaspberry Pi | Лора - модуль SX1278 |
3,3 В | 3,3 В |
Земля | Земля |
GPIO 10 | МОЗІ |
GPIO 9 | MISO |
GPIO 11 | SCK |
GPIO 8 | Nss / Увімкнути |
GPIO 4 | DIO 0 |
GPIO 17 | ДІО 1 |
GPIO 18 | ДІО 2 |
GPIO 27 | ДІО 3 |
GPIO 22 | RST |
Ви також можете використовувати схему нижче для довідки. Зверніть увагу, що принципова схема була створена з використанням модуля RFM9x, який дуже схожий на модуль SX1278, отже зовнішній вигляд може відрізнятися на зображенні нижче.
Підключення досить прямі, єдина проблема, з якою ви можете зіткнутися, полягає в тому, що SX1278 не сумісний із макетними платами, отже вам доведеться використовувати сполучні дроти безпосередньо для підключення або використовувати дві невеликі макетні дошки, як показано нижче. Також мало людей пропонують живити модуль LoRa з окремою силовою шиною 3,3 В, оскільки Pi може не мати достатнього струму. Однак Лора, будучи модулем низької потужності, повинен працювати на 3,3 В шині Pi, я протестував те саме і виявив, що він працює без жодних проблем. Але все-таки приймайте його з дрібкою солі. Моє налаштування підключення LoRa з Raspberry pi виглядає приблизно так нижче
Підключення Arduino до LoRa
З'єднання для модуля Arduino залишається тим самим, що і в попередньому навчальному посібнику. Єдина відмінність полягає в тому, що замість використання бібліотеки від Sandeep Mistry ми будемо використовувати бібліотеку Rspreal на основі голови Radio, про яку ми поговоримо далі в цьому проекті. Схема наведена нижче
Знову ж таки, ви можете використовувати 3,3 В контакт на Arduino Uno або використовувати окремий регулятор 3,3 В. У цьому проекті я використовував вбудований регулятор напруги. Таблиця штифтових з'єднань наведена нижче, щоб допомогти вам легко встановити з'єднання.
Модуль LoRa SX1278 | Правління Arduino UNO |
3,3 В | 3,3 В |
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. Але в цьому проекті ми прагнемо встановити взаємодію між рівними між двома модулями 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, оскільки, як ми вже обговорювали, РК-дисплей та 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 install python-rpi.gpio python3-rpi.gpio sudo apt-get install 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 на 433 МГц, а потім прослуховувати вхідні пакети. Якщо ми щось отримуємо, ми просто роздруковуємо їх на консолі. Як завжди, ми починаємо програму з імпорту необхідних бібліотек python.
від часу імпортувати сон із SX127x.LoRa імпортувати * з SX127x.board_config імпортувати BOARD BOARD.setup ()
У цьому випадку часовий пакет використовується для створення затримок, пакет Lora використовується для зв'язку LoRa, а board_config - для встановлення параметрів плати та LoRa. Ми також встановлюємо плату за допомогою функції BOARD.setup () .
Далі ми створюємо клас python LoRa з трьома визначеннями. Оскільки ми робимо відступ лише для того, щоб програма працювала як клієнт raspberry, клас має лише три функції, а саме клас init, клас start та клас on_rx_done . Клас init ініціалізує модуль LoRa на 433 МГц з пропускною здатністю 125 кГц, як встановлено в методі set_pa_config . Потім він також переводить модуль в режим сну для економії енергоспоживання.
# Середній рівень по замовчуванням після ініціалізації є 434.0MHz, Bw = 125 кГц, Cr = 4/5, Sf = 128chips / символ, CRC 13 дБм lora.set_pa_config (pa_select = 1) чіткості __init __ (самозабезпечення, багатослівний = False): супер (LoRaRcvCont, self).__ 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 ("\ nReceived:") 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. Потім помістіть його в папку бібліотеки вашого IDE Arduino. Тепер перезапустіть IDE Arduino, і ви знайдете приклади файлів для головної бібліотеки Radio. Тут ми запрограмуємо Arduino на роботу як LoRa-сервер для відправки тестових пакетів типу 0 до 9. Повний код, що робить те саме, можна знайти внизу цієї сторінки, як завжди. Тут я поясню кілька важливих рядків у програмі.
Ми розпочинаємо програму з імпорту бібліотеки SPI (встановленої за замовчуванням) для використання протоколу SPI, а потім бібліотеки RH_RF95 від Radio head для здійснення зв'язку LoRa. Потім ми визначаємо, до якого виводу Arduino ми підключили вибір мікросхеми (CS), скидання (RST) та переривання (INT) штифта LoRa з Arduino. Нарешті, ми також визначимо, що модуль повинен працювати на частоті 434 МГц та ініціалізувати модуль LoRa.
#включати
Усередині функції налаштування ми скинемо модуль LoRa, витягнувши його штифт скидання на 10 секунд, щоб почати свіжо. Потім ми ініціалізуємо його за допомогою модуля, який ми створили раніше за допомогою бібліотеки Radio head. Потім ми встановлюємо частоту та потужність передачі для сервера LoRa. Чим вище передача, тим більше відстані пройдуть ваші пакети, але споживатиме більше енергії.
void setup () { // Ініціалізація Serial Monitor Serial.begin (9600); // Скидання модуля LoRa pinMode (RFM95_RST, ВИХІД); digitalWrite (RFM95_RST, LOW); затримка (10); digitalWrite (RFM95_RST, HIGH); затримка (10); // Ініціалізуємо модуль LoRa, поки (! Rf95.init ()) { Serial.println ("Помилка запуску радіо LoRa"); в той час як (1); } // Встановіть частоту за замовчуванням 434,0 МГц, якщо (! 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 radiopacket = 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.
Сподіваюся, ви зрозуміли проект і сподобалось його будувати. Якщо у вас є проблеми з тим, щоб це працювало, використовуйте розділ коментарів нижче або форуми для інших технічних питань.