---

Пример проекта: Отправка и приём сообщений LoRa с RP2040-Zero

Оборудование:

  • Плата: Waveshare RP2040-Zero.
  • LoRa-модуль: SX1276/SX1278 (например, RFM95 или RA-02, 433 МГц для России).
  • Антенна: Подходящая для 433 МГц (или 868 МГц, в зависимости от модуля).
  • Провода: Для подключения LoRa-модуля к RP2040-Zero.
  • Компьютер: Для прошивки и настройки через CircuitPython.

Подключение:

LoRa-модуль подключается к RP2040-Zero через интерфейс SPI. Пример подключения для SX1276 (RFM95):

| Пин LoRa-модуля | Пин RP2040-Zero | Описание |
|-----------------|------------------|----------|
| VCC | 3V3 | Питание 3.3 В |
| GND | GND | Земля |
| MOSI | GP3 (SPI0 TX) | SPI MOSI |
| MISO | GP4 (SPI0 RX) | SPI MISO |
| SCK | GP2 (SPI0 SCK) | SPI Clock |
| NSS (CS) | GP5 | Chip Select |
| DIO0 | GP6 | Прерывание |
| RST | GP7 | Сброс |

Примечание: Убедитесь, что антенна подключена к LoRa-модулю, иначе передача может повредить модуль.

Требования:

1. CircuitPython: Установите последнюю версию прошивки CircuitPython для RP2040 на RP2040-Zero.

  • Скачайте UF2-файл с https://circuitpython.org/board/waveshare_rp2040_zero/.
  • Переведите плату в режим загрузчика (зажмите кнопку BOOT и подключите к USB), перетащите UF2-файл на диск RPI-RP2.

2. Библиотека: Используйте библиотеку adafruit-circuitpython-sx127x для работы с LoRa-модулем.

  • Установите через circup или скопируйте файлы adafruit_sx127x.mpy и зависимости (adafruit_bus_device) на диск CIRCUITPY в папку lib.

3. USB-терминал: Используйте Mu Editor, Thonny или терминал (например, screen или minicom) для взаимодействия с платой.

Код примера:

Этот код настраивает LoRa-модуль SX1276 на частоту 433 МГц, отправляет сообщение каждые 10 секунд и проверяет входящие сообщения.

import board
import busio
import digitalio
import time
import adafruit_sx127x

# Настройка SPI
spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO)

# Настройка пинов для LoRa
cs = digitalio.DigitalInOut(board.GP5)  # Chip Select
reset = digitalio.DigitalInOut(board.GP7)  # Reset
lora = adafruit_sx127x.SX1276(spi, cs, reset)

# Параметры LoRa
lora.frequency = 433000000  # Частота 433 МГц
lora.tx_power = 20  # Мощность передачи (до 20 дБм, в России до 10–20 мВт)
lora.spreading_factor = 9  # SF9 для баланса дальности и скорости
lora.bandwidth = 125000  # 125 кГц
lora.coding_rate = 5  # CR 4/5
lora.preamble_length =ទ

# Счётчик сообщений
counter = 0

while True:
    # Отправка сообщения
    message = f"Hello, LoRa! #{counter}".encode("utf-8")
    lora.transmit(message)
    print(f"Sent: {message.decode('utf-8')}")
    
    # Проверка входящих сообщений
    packet = lora.receive(timeout=5.0)  # Ждать 5 секунд
    if packet is not None:
        print(f"Received: {packet.decode('utf-8')}")
    
    counter += 1
    time.sleep(10)  # Пауза 10 секунд

Объяснение кода:

1. Инициализация SPI: Настраивается интерфейс SPI для связи с LoRa-модулем.
2. Настройка SX1276: Указываются пины CS и RST, а также параметры LoRa:

  • Частота: 433 МГц (для России).
  • Spreading Factor: 9 (компромисс между скоростью и дальностью).
  • Bandwidth: 125 кГц (стандарт для Meshtastic).
  • Coding Rate: 4/5 (баланс надёжности и скорости).

3. Отправка и приём:

  • Каждые 10 секунд отправляется сообщение с номером.
  • Проверяются входящие сообщения с таймаутом 5 секунд.

4. Кодировка: Сообщения передаются в UTF-8.

Настройка двух устройств:

Чтобы два устройства (например, два RP2040-Zero с SX1276) общались друг с другом:
1. Убедитесь, что оба используют одинаковые параметры:

  • Частота: 433 МГц (или 868 МГц).
  • Spreading Factor: 9.
  • Bandwidth: 125 кГц.
  • Coding Rate: 4/5.

2. Установите одинаковые антенны (например, 433 МГц).
3. Используйте код выше на обоих устройствах. Они будут отправлять и принимать сообщения автоматически.

Тестирование:

1. Загрузите код на оба RP2040-Zero через USB.
2. Откройте REPL (например, в Mu Editor) или терминал (screen /dev/ttyACM0 115200) для просмотра сообщений.
3. Убедитесь, что устройства находятся в зоне прямой видимости (для теста — до 1–2 км).
4. Проверьте вывод в терминале: отправленные и полученные сообщения должны отображаться.

Результат:

  • Устройство 1 отправляет "Hello, LoRa! #0", устройство 2 получает его и выводит в терминал.
  • Устройство 2 отправляет свои сообщения, которые устройство 1 принимает.

---

Дополнительные советы:

1. Антенна:

  • Используйте антенну, настроенную на 433 МГц (длина ~17.3 см для четвертьволновой антенны).
  • Плохая антенна резко снижает дальность (до 100–200 м вместо 1–5 км).

2. Частота:

  • Для России используйте 433.075–434.750 МГц (LPD-диапазон).
  • Проверьте местные правила, чтобы не превышать мощность (10–20 мВт).

3. Энергопотребление:

  • Для экономии энергии уменьшите tx_power (например, до 10 дБм).
  • Используйте time.sleep() с большими интервалами.

4. Дальность:

  • Для увеличения дальности увеличьте spreading_factor до 10–12 (но скорость снизится).
  • Установите устройства на возвышенности.

5. Meshtastic:

  • CircuitPython не поддерживает Meshtastic напрямую, так как прошивка Meshtastic написана на C++.
  • Для Meshtastic используйте платы с прошивкой Meshtastic (например, Heltec LoRa32), но код выше можно адаптировать для аналогичной функциональности.

---

Расширение проекта:

1. Добавление GPS:

  • Подключите GPS-модуль (например, NEO-6M) к UART-портам RP2040-Zero (GP0, GP1).
  • Добавьте в код чтение координат и их передачу через LoRa.
  • Пример:
     import adafruit_gps
     uart = busio.UART(board.TX, board.RX, baudrate=9600)
     gps = adafruit_gps.GPS(uart, debug=False)
     gps.send_command(b"PMTK314111")  # Включить данные о координатах
     gps.update()
     if gps.has_fix:
         coords = f"Lat:{gps.latitude},Lon:{gps.longitude}"
         lora.transmit(coords.encode("utf-8"))

2. Датчики:

  • Подключите датчик (например, BME280 для температуры/влажности) через I2C.
  • Передавайте данные датчиков через LoRa.

3. Шифрование:

  • Для безопасности добавьте шифрование данных (например, с библиотекой cryptography).
  • Meshtastic использует AES, но в CircuitPython это нужно реализовать вручную.

---

Ограничения:

  • Пропускная способность: LoRa передаёт до ~200 байт за раз, поэтому сообщения должны быть короткими.
  • CircuitPython: Более ресурсоёмкий, чем C++ (как в Meshtastic), поэтому сложнее оптимизировать энергопотребление.
  • Дальность: На 433 МГц с SF9 и 125 кГц ожидайте 1–5 км в реальных условиях.
  • Совместимость: Код выше не совместим с Meshtastic напрямую, но может быть адаптирован для схожих задач.

---

Ресурсы:

[file-name 000159_2025-06-26_23-51-28.txt]