<===

ProNotes

2025-10-08 20:42:00
Использование **CircuitPython** на **RP2040** (как в Waveshare RP2040-Zero) для работы с **EBYTE E220-400T22D** (LoRa-модуль на SX1262, 433 МГц, 22 dBm) — вполне реальная тема, но она менее развита, чем Arduino для таких задач. CircuitPython на RP2040 поддерживается отлично (Adafruit и сообщество активно развивают экосистему), но для LoRa-модулей, включая EBYTE E220, готовых библиотек под CircuitPython меньше, чем под Arduino. Это значит, что некоторую работу придется проделать самостоятельно, но "изобретать велосипед" полностью не потребуется — можно адаптировать существующие решения.

### CircuitPython на RP2040: что есть
- **Поддержка RP2040**: CircuitPython официально поддерживает RP2040 (Raspberry Pi Pico, RP2040-Zero и т.д.). Для Waveshare RP2040-Zero вы устанавливаете прошивку CircuitPython (версия 9.x, например, с adafruit.com). Она работает стабильно, включая UART, GPIO, и низкоуровневые операции, нужные для E220.
- **UART для E220**: E220-400T22D подключается через UART (пины RX/TX для данных, AUX/M0/M1 для управления). CircuitPython имеет модуль `busio.UART` для работы с UART, что идеально для общения с E220. Пример: `uart = busio.UART(board.GP0, board.GP1, baudrate=9600)` (для пинов GP0/GP1 на RP2040-Zero).
- **Сообщество и ресурсы**: CircuitPython популярен для IoT, но LoRa-проекты чаще встречаются на Arduino. Adafruit и форумы (Reddit, Discord) имеют примеры для LoRa (обычно для их модулей, вроде RFM95W), которые можно адаптировать под EBYTE.

### Состояние библиотек для E220 в CircuitPython
- **Прямая поддержка E220**: Готовой библиотеки для EBYTE E220 под CircuitPython нет (в отличие от Arduino, где есть EByte_LoRa_E220_Series_Library от Renzo Mischianti). Однако E220 использует стандартный UART-протокол, и вы можете:
  1. Портировать Arduino-библиотеку E220 (она открытая, на GitHub). Это требует перевода C++ в Python, но структура простая: отправка/чтение команд по UART + управление пинами M0/M1 для режимов (TX, RX, sleep, config).
  2. Использовать низкоуровневый подход: отправлять AT-команды или сырые пакеты через `busio.UART`. Документация EBYTE (на сайте или в PDF от продавца на AliExpress) дает формат пакетов (например, заголовок + адрес + данные).
- **Альтернативы**: Библиотека Adafruit_CircuitPython_RFM9x (для LoRa-модулей RFM95/96 на SX1276) частично совместима, так как SX1262 (в E220) и SX1276 похожи по протоколу. Можно адаптировать методы отправки/приема, но настройки (регистры, частота, spreading factor) нужно подогнать под E220 (см. datasheet SX1262).
- **Пример кода**: На форумах (Reddit, Adafruit Discord) есть примеры для LoRa на CircuitPython с RP2040, но они чаще для RFM95. Для E220 потребуется задать параметры (433 МГц, air rate 2.4 кбит/с, мощность 22 dBm) вручную через UART.

### Плюсы и минусы CircuitPython для E220 на RP2040
**Плюсы**:
- Простота кода: CircuitPython позволяет писать лаконично (например, `uart.write(b"\xC0\x00\x00data")` для отправки пакета).
- Быстрая разработка: Подключение E220 к RP2040-Zero (GP0=RX, GP1=TX, AUX/M0/M1 к GPIO, питание 3.3V) и базовая отправка/прием данных делаются за пару часов.
- Сообщество: Adafruit и CircuitPython Discord дают поддержку для IoT-задач.
- Низкое потребление: RP2040 + E220 (sleep-режим <10 мкА) подходит для батарейных проектов, а CircuitPython поддерживает deep sleep.

**Минусы**:
- Нет готовой библиотеки для E220: нужно писать/адаптировать код для управления E220 (режимы, WOR, настройки частоты).
- Ограниченная документация: EBYTE дает datasheet на английском/китайском, но примеров для CircuitPython мало.
- Производительность: CircuitPython медленнее Arduino для реального времени (но для передачи состояний раз в секунду/минуту это не критично).
- Отладка: Ошибки в UART или настройке LoRa (например, неверный spreading factor) требуют чтения datasheet и тестов.

### Рекомендации для старта
1. **Прошивка**: Скачайте CircuitPython для RP2040 с adafruit.com (UF2-файл). Установите, подключив RP2040-Zero в BOOTSEL-режиме. Проверьте версию: `import microcontroller; print(microcontroller.cpu)`.
2. **Подключение E220**:
   - E220 VCC → 3.3V (RP2040-Zero)
   - E220 GND → GND
   - E220 RX → GP0 (TX на RP2040)
   - E220 TX → GP1 (RX на RP2040)
   - E220 AUX → GP2 (для статуса передачи)
   - E220 M0 → GP3, M1 → GP4 (для режимов: 00=normal, 01=WOR, 11=sleep)
3. **Базовый код** (пример отправки состояния):
   ```python:disable-run
   import busio
   import digitalio
   import board
   import time

   # UART для E220
   uart = busio.UART(board.GP0, board.GP1, baudrate=9600)
   # Пины управления
   m0 = digitalio.DigitalInOut(board.GP3)
   m0.direction = digitalio.Direction.OUTPUT
   m1 = digitalio.DigitalInOut(board.GP4)
   m1.direction = digitalio.Direction.OUTPUT
   aux = digitalio.DigitalInOut(board.GP2)
   aux.direction = digitalio.Direction.INPUT

   # Установить режим Normal (M0=0, M1=0)
   m0.value = False
   m1.value = False

   # Отправка состояния
   state = {"id": 1, "status": "ON", "temp": 25.5}
   data = f"{state['id']}:{state['status']}:{state['temp']}".encode()
   # Формат пакета E220: заголовок + адрес + канал + данные
   packet = b"\xC0\x00\x00" + data  # Адрес 0, канал 0 (433 МГц)
   uart.write(packet)
   print("Sent:", data)
   time.sleep(1)

   # Чтение ответа
   while aux.value:  # Ждать, пока AUX=0 (готов к приему)
       pass
   if uart.in_waiting:
       received = uart.read(32)  # Читать до 32 байт
       print("Received:", received)
   ```
   Это базовый пример для отправки/приема. Для настройки (частота, мощность, SF) отправляйте команды конфигурации (см. datasheet E220, раздел UART-команд).
4. **Адаптация библиотеки**: Возьмите Arduino-библиотеку EByte_LoRa_E220_Series_Library и перепишите ключевые функции (sendFixedMessage, receiveMessage) под CircuitPython, используя `busio.UART` и `digitalio`. Это займет 1-2 дня, если знакомы с Python.
5. **Тесты**: Начните с режима transparent (все модули слышат друг друга). Для адресации задайте уникальные адреса/каналы в настройках E220 (через UART-команды или утилиту EBYTE).

### Альтернатива: Arduino
Если писать библиотеку лень, Arduino на RP2040-Zero проще: библиотека EByte_LoRa_E220_Series_Library уже готова, примеры для RP2040 есть (например, на GitHub и форумах). Установите Arduino IDE, добавьте поддержку RP2040 (Raspberry Pi Pico core), и код типа `LoRa_E220 e220ttl(&Serial1, 4, 2, 3); e220ttl.sendFixedMessage(0, 0, 23, "state:ON", 8);` заработает сразу. Но CircuitPython удобнее для быстрого прототипирования и Python-разработчиков.

### Итог
CircuitPython на RP2040 для E220-400T22D — рабочий вариант, но требует ручной настройки UART и портирования/написания кода для LoRa (около 100-200 строк для базовой отправки/приема состояний). Если готовы потратить день на изучение datasheet и адаптацию, "велосипед" будет минимальным. Для скорости и готовых решений — попробуйте Arduino. Если нужна помощь с кодом, схемой или настройкой (например, WOR для батарейного режима), уточните детали проекта (расстояние, частота передачи, размер данных)!
```

---------------------------------------

### Полный пример кода для EBYTE E220 в CircuitPython

На основе доступной библиотеки `ebyte-lora-e220-circuitpython` (устанавливается через `pip install ebyte-lora-e220-circuitpython`), вот полный рабочий пример для RP2040 (например, Waveshare RP2040-Zero). Он включает инициализацию, настройку модуля, отправку и прием сообщений (как строк, так и словарей). Я адаптировал его для вашего случая: использование UART на пинах GP0/GP1, AUX на GP2, M0 на GP3, M1 на GP4. 

Библиотека поддерживает режимы Normal, WOR, Deep Sleep, фиксированную/прозрачную передачу, RSSI и шифрование. Для теста используйте два модуля: один как отправитель, другой как получатель.

#### Требования
- Установите CircuitPython на RP2040 (скачайте UF2 с adafruit.com).
- Подключите E220:
  - VCC → 3.3V
  - GND → GND
  - RX → GP0 (TX UART на RP2040)
  - TX → GP1 (RX UART на RP2040)
  - AUX → GP2
  - M0 → GP3
  - M1 → GP4
- Установите библиотеку: скопируйте её в `lib/` на устройстве или используйте `pip` в Thonny/Mu Editor.

#### Полный код (code.py)
Сохраните как `code.py` на устройстве — он запустится автоматически.

```python
import time
import board
import busio
from lora_e220 import LoRaE220, Configuration, ResponseStatusCode
from lora_e220_operation_constant import AirDataRate, UARTParity, UARTBaudRate, TransmissionPower, \
    RssiAmbientNoiseEnable, SubPacketSetting, FixedTransmission, WorPeriod, LbtEnableByte, RssiEnableByte

# Инициализация UART (GP0 - TX, GP1 - RX, baudrate=9600 по умолчанию для E220)
uart = busio.UART(board.GP0, board.GP1, baudrate=9600)

# Инициализация LoRa E220 (модель '400T22D' для 433 МГц, 22 dBm; укажите вашу модель)
lora = LoRaE220('400T22D', uart, aux_pin=board.GP2, m0_pin=board.GP3, m1_pin=board.GP4)

# Запуск модуля
code = lora.begin()
print("Инициализация: {}".format(ResponseStatusCode.get_description(code)))

# Получение текущей конфигурации
code, config = lora.get_configuration()
print("Текущая конфигурация: {}".format(ResponseStatusCode.get_description(code)))
print(config.to_string())  # Печать конфигурации в читаемом виде

# Настройка новой конфигурации (пример: адрес 0x0001, канал 23 для 433 МГц, мощность 22 dBm, air rate 9.6 kbps)
config_to_set = Configuration('400T22D')
config_to_set.ADDH = 0x00  # Старший байт адреса
config_to_set.ADDL = 0x01  # Младший байт адреса
config_to_set.CHAN = 23    # Канал (433 МГц + CHAN, от 0 до 83)

config_to_set.SPED.airDataRate = AirDataRate.AIR_DATA_RATE_100_96  # 9.6 kbps для надежности
config_to_set.SPED.uartParity = UARTParity.MODE_00_8N1            # 8N1 (по умолчанию)
config_to_set.SPED.uartBaudRate = UARTBaudRate.BPS_9600           # 9600 бод

config_to_set.OPTION.transmissionPower = TransmissionPower('400T22D').get_transmission_power().POWER_22  # 22 dBm
config_to_set.OPTION.RSSIAmbientNoise = RssiAmbientNoiseEnable.RSSI_AMBIENT_NOISE_DISABLED
config_to_set.OPTION.subPacketSetting = SubPacketSetting.SPS_200_00  # 200 байт пакеты

config_to_set.TRANSMISSION_MODE.fixedTransmission = FixedTransmission.FIXED_TRANSMISSION  # Фиксированная передача (по адресу)
config_to_set.TRANSMISSION_MODE.WORPeriod = WorPeriod.WOR_2000_011                        # 2000 мс для WOR
config_to_set.TRANSMISSION_MODE.enableLBT = LbtEnableByte.LBT_DISABLED                    # LBT выкл
config_to_set.TRANSMISSION_MODE.enableRSSI = RssiEnableByte.RSSI_ENABLED                  # Вкл RSSI

config_to_set.CRYPT.CRYPT_H = 0x00  # Шифрование (ключ, если нужно)
config_to_set.CRYPT.CRYPT_L = 0x00

# Применение конфигурации (временно, сохраняется после power-off)
code, set_config = lora.set_configuration(config_to_set, permanent_configuration=False)
print("Установка конфигурации: {}".format(ResponseStatusCode.get_description(code)))
print(set_config.to_string())

# Пример отправки (как отправитель; закомментируйте для получателя)
# lora.send_fixed_message(0x00, 0x02, 23, "Состояние: ON, Temp: 25.5")  # Отправка строки на адрес 0x0002, канал 23
# lora.send_fixed_dict(0x00, 0x02, 23, {"status": "ON", "temp": 25.5})   # Отправка словаря
# print("Сообщение отправлено")

# Цикл приема (как получатель)
while True:
    if lora.available() > 0:  # Проверка буфера
        # Прием строки с RSSI
        code, message, rssi = lora.receive_message(rssi=True)
        if code == ResponseStatusCode.E220_SUCCESS:
            print("Получено: {} (RSSI: {})".format(message, rssi))
        else:
            print("Ошибка приема: {}".format(ResponseStatusCode.get_description(code)))
        
        # Альтернатива: прием словаря
        # code, dict_message, rssi = lora.receive_dict(rssi=True)
        # if code == ResponseStatusCode.E220_SUCCESS:
        #     print("Получено dict: {} (RSSI: {})".format(dict_message, rssi))
    
    time.sleep(0.5)  # Пауза для экономии ресурсов
```

#### Объяснение
- **Инициализация**: Создает объект LoRaE220 с UART и пинами управления.
- **Конфигурация**: Получает текущую, настраивает новую (адрес, частота, мощность, скорость). Параметры сохраняются в модуле.
- **Отправка**: `send_fixed_message` для строк по адресу/каналу; `send_fixed_dict` для словарей. Для прозрачной передачи (broadcast) используйте `send_transparent_message`.
- **Прием**: Проверяет `available()`, получает сообщение с/без RSSI. Для WOR-режима настройте `WORPeriod`.
- **Ошибки**: Все операции возвращают код статуса (E220_SUCCESS и т.д.).

#### Тестирование
- Запустите на двух RP2040: один с отправкой (раскомментируйте), другой с приемом.
- Мониторьте в REPL (Thonny/Mu): увидите конфигурацию и сообщения.
- Для состояний: замените "Состояние: ON, Temp: 25.5" на вашу структуру данных.
- Если RSSI не нужен, уберите `rssi=True` и `enableRSSI`.

Если ошибки (например, UART), проверьте пины/baudrate. Для WOR или sleep добавьте `lora.set_mode(Mode.WOR_TRANSMITTER)` перед отправкой. Библиотека полная, документация на GitHub.


----------    Simple (very) --------

import time
import board
import busio
from lora_e220 import LoRaE220, ResponseStatusCode

# Настройка UART (пины GP0 и GP1 для TX/RX)
uart = busio.UART(board.GP0, board.GP1, baudrate=9600)

# Инициализация LoRa E220 (модель 400T22D, 433 МГц, 22 dBm)
lora = LoRaE220('400T22D', uart, aux_pin=board.GP2, m0_pin=board.GP3, m1_pin=board.GP4)

# Запуск модуля
print("Запуск LoRa...")
code = lora.begin()
if code == ResponseStatusCode.E220_SUCCESS:
    print("LoRa готова!")
else:
    print("Ошибка запуска:", ResponseStatusCode.get_description(code))

# Установка базовых настроек (433 МГц, канал 23, прозрачная передача)
lora.set_configuration_to_default()  # Сброс на настройки по умолчанию
print("Настройки установлены")

# Основной цикл: отправка и прием сообщений
while True:
    # Отправка сообщения (раскомментируйте для отправителя)
    # message = "Состояние: ON"
    # lora.send_transparent_message(message)
    # print("Отправлено:", message)
    
    # Проверка и прием сообщений
    if lora.available() > 0:
        code, message = lora.receive_message()
        if code == ResponseStatusCode.E220_SUCCESS:
            print("Получено:", message)
        else:
            print("Ошибка приема:", ResponseStatusCode.get_description(code))
    
    time.sleep(1)  # Пауза 1 секунда




-------- for EBYTE E220 900M22S ----------------

Да, всё, о чём мы говорили (RP2040-Zero, передача состояний между модулями, CircuitPython с библиотекой `ebyte-lora-e220-circuitpython`, подключение по UART, примеры кода для отправки/приёма строк или словарей), **полностью подойдёт для EBYTE E220-900M22S**. Это тот же базовый модуль из серии E220, что и E220-400T22D (на чипе LLCC68 от Semtech, аналог SX1262), но с ключевым отличием: диапазон частот **850–930 МГц** (868/915 МГц) вместо 410–493 МГц (433 МГц). Остальные характеристики идентичны: UART-интерфейс, 22 dBm мощность, дальность до 5–7 км в прямой видимости, поддержка WOR/sleep, шифрование и т.д.

### Почему всё совместимо
- **Аппаратная часть**: 
  - Подключение к RP2040-Zero такое же: VCC/GND на 3.3V, RX/TX к GP0/GP1, AUX к GP2, M0 к GP3, M1 к GP4. Нет нужды в level-shifter'ах или изменениях схемы.
  - Антенна: У E220-900M22S обычно IPEX-разъём (SMD-версия, компактная 14x20 мм), так что используйте подходящую антенну для 900 МГц (лучше проникает через стены, чем 433 МГц).
- **Программная часть**:
  - Библиотека `ebyte-lora-e220-circuitpython` работает с любой моделью E220 — просто укажите `'900M22S'` вместо `'400T22D'` при инициализации: `lora = LoRaE220('900M22S', uart, aux_pin=board.GP2, m0_pin=board.GP3, m1_pin=board.GP4)`.
  - Код из предыдущих примеров (упрощённый или полный) копируется 1:1. Единственное изменение: в настройках конфигурации укажите канал (CHAN) для 868/915 МГц. Например:
    - Для 868 МГц: CHAN = 0–36 (начальная частота 850 МГц + CHAN).
    - Для 915 МГц: CHAN = 65–83 (850 + 65 = 915 МГц).
    - Пример: `config_to_set.CHAN = 65` для 915 МГц (в полном коде).
  - В упрощённом коде `set_configuration_to_default()` автоматически подхватит диапазон модуля, так что даже не нужно трогать.
- **Передача состояний**: Всё то же — строки ("Состояние: ON"), словари `{"status": "ON", "temp": 25.5}`, фиксированная/прозрачная передача, RSSI. Пакеты до 200–240 байт, низкое потребление (<10 мкА в sleep).

### Что нужно учесть (маленькие нюансы)
- **Частота и регуляции**: 
  - 868 МГц — для Европы/России (лучше для городской среды с препятствиями, но проверьте локальные правила: ISM-диапазон, мощность до 25 mW EIRP).
  - 915 МГц — для США/Азии (больше помех от Wi-Fi, но дальность похожая). 
  - В коде настройте air rate на 2.4–9.6 kbps для надёжности (как в примерах).
- **Дальность**: Такая же, как у 400T22D (3–5 км реально в помещении/лесу, до 7 км LOS), но на 900 МГц чуть лучше проникаемость через стены.
- **SMD-формат**: Это SMD-версия (поверхностный монтаж), так что если вы новичок, купите с тестовой платой (E220-900MBL-01, ~$10 на AliExpress) для удобства пайки/прототипа. Она добавляет USB-TTL и STM8 MCU для отладки.
- **Цена/покупка**: 6–10$ на AliExpress/LCSC. Ищите "EBYTE E220-900M22S" с отзывами (FCC-сертифицирован, надёжный). Datasheet: [скачайте здесь](https://www.lcsc.com/datasheet/lcsc_datasheet_2201210930_Chengdu-Ebyte-Elec-Tech-E220-900M22S_C2971736.pdf) — там все регистры и команды UART.

### Пример скорректированного кода (для 915 МГц)
В упрощённом коде добавьте только это после `lora.set_configuration_to_default()`:
```python
# Настройка канала для 915 МГц (CHAN=65)
from lora_e220 import Configuration
config = Configuration('900M22S')
config.CHAN = 65  # 850 + 65 = 915 МГц
lora.set_configuration(config)
print("Канал установлен на 915 МГц")
```
Для 868 МГц: `config.CHAN = 18` (850 + 18 = 868 МГц). Остальное без изменений.
← Previous Next →
Back to list