Платы расширения (HAT) для Raspberry Pi – это платы, которые имеют примерно такой же размер как и плата Raspberry Pi. Они непосредственно одеваются сверху на плату Raspberry Pi и при этом не требуют никаких других соединений с платой. Сейчас на рынке продается несколько сотен видов различных плат расширения для Raspberry Pi.
В данной статье мы рассмотрим создание платы расширения (HAT) LoRa для Raspberry Pi на основе печатной платы. Данная плата расширения будет состоять из модуля LoRa SX1278 433MHz, модуля OLED дисплея и схемы повышающего преобразователя напряжения с 3.7 до 5V. Данную плату расширения LoRa для Raspberry Pi будет удобно использовать, к примеру, для создания Mesh сети на основе технологии LoRa или для размещения оконечных узлов LoRa. Также в данном проекте мы рассмотрим организацию беспроводной связи по технологии LoRa между платами Raspberry Pi (с использованием разработанной для нее платы расширения LoRa) и Arduino.
Также, прежде чем приступать к изучению данной статьи, вы можете посмотреть на нашем сайте следующие проекты с использованием технологии LoRa, которые помогут вам лучше разобраться в основах данной технологии:
- подключение модуля LoRa к Raspberry Pi и одноранговая сеть с Arduino;
- GPS трекер на основе Arduino и технологии Lora;
- подключение модуля LoRa SX1278 (Ra-02) к Arduino.
Необходимые компоненты
- Плата Raspberry Pi (купить на AliExpress).
- Модуль LoRa SX1278 433MHz (купить на AliExpress).
- Модуль OLED дисплея (купить на AliExpress).
- FP6291 Boost Converter IC (микросхема для повышения напряжения).
- Резисторы 12 кОм (1 шт.), 48 кОм (1 шт.), 88 кОм (1 шт.) (купить на AliExpress).
- Конденсаторы 0,1 мкФ (2 шт.) (купить на AliExpress), 10 мкФ (1 шт.), 20 мкФ (2 шт.) (купить на AliExpress).
- Катушка индуктивности 4.7µH.
- Диод 1N5388BRLG.
- Литиевый аккумулятор 18650.
- Держатель (слот) для аккумулятора 18650.
- 6-контактный кнопочный переключатель.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Схема проекта
Схема платы расширения LoRa для Raspberry Pi представлена на следующем рисунке.
Схема нарисована в редакторе EasyEDA. Схема состоит из модуля LoRa SX1278, OLED дисплея и схемы повышения напряжения (Booster circuit), которая собрана на основе микросхемы FP6291 и предназначена для повышения напряжения с 3.7V до 5V. Закрепляться эта плата расширения будет непосредственно сверху платы Raspberry Pi.
Микросхема FP6291 представляет собой повышающий конвертер напряжения постоянного тока (DC-DC Step-Up Booster IC), работающий на частоте 1 МГц. Она используется во многих приложениях и позволяет получить стабильное напряжение 5V из батарейки на 3V. Для функционирования этой микросхемы необходимо подключить к ней несколько дополнительных компонентов, показанных на приведенной схеме. Стабильной напряжение 5V постоянного тока с выхода микросхемы FP6291 поступает на контакт 5V платы Raspberry Pi. Выходное напряжение с выхода микросхемы FP6291 можно настроить с помощью схемы делителя напряжения. В этом случае формула для расчета выходного напряжения будет выглядеть следующим образом:
VOUT = 0.6(1+ R1/ R2)
Изготовление печатной платы для Raspberry Pi LoRa HAT
Авторы проекта (ссылка на оригинал приведена в конце статьи) использовали редактор EasyEDA для разработки печатной платы для данного проекта.
Разработанная 3D модель верхнего и нижнего слоя печатной платы LoRa HAT для Raspberry Pi выглядит следующим образом:
Также вы можете скачать Gerber файлы, необходимые для изготовления печатной платы данного проекта.
Заказ печатной платы с сервиса PCBWay
Чтобы заказать изготовление печатной платы с сервиса PCBWay выполните следующую последовательность шагов.
Шаг 1. Перейдите на сайт https://www.pcbway.com/ и зарегистрируйтесь на нем. После этого введите размеры вашей печатной платы, число слоев и число необходимых вам экземпляров печатной платы.
Шаг 2. После этого нажмите на кнопку ‘Quote Now’ (заказать сейчас). После этого вас перебросит на страницу, где вам необходимо будет ввести дополнительные параметры для изготовления вашей печатной платы: ее тип, слои, материалы, толщину и т.д. Для данного проекта для всех этих параметров можно оставить значения по умолчанию.
Шаг 3. На заключительном этапе загрузите ваши Gerber файлы в сервис PCBWAY и подождите пока сервис проверит их корректность. Если все нормально, то вы можете переходить к оплате заказа.
Разумеется, вы можете заказать изготовление печатной платы в любом другом сервисе, с которым вы привыкли работать.
Сборка конструкции проекта
Через несколько дней после заказа авторы проекта получили изготовленную печатную плату, ее вид показан на следующем рисунке.
После припаивания на нее необходимых компонентов получилась следующая конструкция проекта:
И после помещения на нее OLED дисплея мы получили следующий окончательный вид конструкции проекта:
Настройка Raspberry Pi для работы с платой расширения LoRa
Сначала необходимо обновить программное обеспечение Raspberry Pi:
1 2 |
sudo apt-get update sudo apt-get upgrade |
Установка pyLoRa на Raspberry Pi
Используйте следующую команду для установки пакета spidev. Spidev – этот пакет на языке python для Linux, который используется для осуществления связи по протоколу SPI в плате Raspberry Pi.
1 |
pip3 install spidev |
На следующем шаге установим пакет pyLoRa с помощью установщика pip. Пакет pyLoRa содержит модели радио, необходимые для работы по технологии LoRa.
1 |
pip3 install pyLoRa |
Установка luma.oled
Пакет luma.oled обеспечивает интерфейс Python3 с OLED дисплеями, построенными на основе контроллеров SSD1306, SSD1309, SSD1322, SSD1325, SSD1327, SSD1331, SSD1351, SSD1362, SH1106 и WS0010. Более подробную информацию по данному пакету вы можете прочитать по следующей ссылке.
Для установки пакета luma.oled и необходимых ему дополнений используйте команды:
1 2 3 4 |
sudo apt-get update sudo apt-get install python3 python3-pip python3-pil libjpeg-dev zlib1g-dev libfreetype6-dev liblcms2-dev libopenjp2-7 libtiff5 -y sudo -H pip3 install luma.oled sudo apt-get install python3-imaging |
Далее нам необходимо проверить включены ли интерфейсы SPI и I2C в настройках платы. Для этого введите в терминале команду:
1 |
sudo raspi-config |
В открывшейся панели настроек выберите настройки подключения и включите в них использование интерфейсов SPI и I2C.
Объяснение программы для Raspberry Pi
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
В данном проекте плата Raspberry Pi выступает в роли клиента, а плата Arduino – в роли сервера. Подобную логику работы между этими платами мы уже рассматривали в предыдущей статье про технологию LoRa.
Первым делом в программе подключим (импортируем) все необходимые библиотеки.
1 2 3 4 5 6 7 |
from time import sleep from SX127x.LoRa import * from SX127x.board_config import BOARD from luma.core.interface.serial import i2c, spi, pcf8574 from luma.core.render import canvas from luma.oled.device import ssd1306, ssd1309, ssd1325, ssd1331, sh1106 from PIL import ImageFont, ImageDraw |
Далее создадим класс LoRa с тремя методами (функциями): init class, start class и on_rx_done class. init class используется для инициализации модуля LoRa на частоте 433 МГц с шириной полосы 125 кГц. Модуль инициализируется в спящем режиме для экономии энергопотребления.
1 2 3 4 |
def __init__(self, verbose=False): super(LoRaRcvCont, self).__init__(verbose) self.set_mode(MODE.SLEEP) self.set_dio_mapping([0] * 6) |
Функция start используется для настройки модуля в режиме приемника и получения от него уровня принимаемого сигнала (RSSI status), рабочей частоты и т.д. Внутри этой функции мы устанавливаем для модуля режим дежурного приема (continuous receiver mode, RXCONT), то есть выводим модуль из спящего режима, и затем используем цикл while чтобы считать значения RSSI и статус модуля.
1 2 3 4 5 6 7 8 |
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 используется для приема пакетов данных. Принятые значения сохраняются в переменной payload. Затем они декодируются в формат utf-8 чтобы их можно было вывести на экран терминала.
1 2 3 4 5 6 |
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')) data = bytes(payload).decode("utf-8",'ignore') |
Затем мы выведем принятые данные на экран OLED дисплея. Для этого мы используем шрифт 'arial.ttf'. Чтобы использовать другой шрифт необходимо скачать его и поместить в каталог шрифтов библиотеки luma.oled. Шрифт ‘arial.ttf’ можно скачать по этой ссылке.
1 2 3 4 5 6 7 |
data1 = data[2:9] print(data1) with canvas(device) as draw: font = ImageFont.load_default() font = ImageFont.truetype('arial.ttf',18) draw.text((10, 17), "Received:", font=font, fill="white") draw.text((25, 40),data1,font=font,fill="white") |
Тестирование работы проекта
Когда аппаратная часть проекта будет готова, загрузите коды программ в платы Arduino и Raspberry Pi и запустите их на выполнение.
Если все работает исправно, то на OLED дисплее сконструированной нами платы расширения вы должны увидеть пакеты, передаваемые платой Arduino.
Исходный код программы на Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
from time import sleep from SX127x.LoRa import * from SX127x.board_config import BOARD from luma.core.interface.serial import i2c, spi, pcf8574 from luma.core.render import canvas from luma.oled.device import ssd1306, ssd1309, ssd1325, ssd1331, sh1106 from PIL import ImageFont, ImageDraw serial = i2c(port=1, address=0x3C) device = sh1106(serial) BOARD.setup() class LoRaRcvCont(LoRa): def __init__(self, verbose=False): super(LoRaRcvCont, self).__init__(verbose) self.set_mode(MODE.SLEEP) self.set_dio_mapping([0] * 6) 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() def on_rx_done(self): print ("\nReceived: ") self.clear_irq_flags(RxDone=1) payload = self.read_payload(nocheck=True) print (payload) data = bytes(payload).decode("utf-8",'ignore') data1 = data[2:9] print(data1) with canvas(device) as draw: device.clear() font = ImageFont.load_default() font = ImageFont.truetype('arial.ttf',18) draw.text((10, 17), "Received:", font=font, fill="white") draw.text((30, 40),data1,font=font,fill="white") device.clear() self.set_mode(MODE.SLEEP) self.reset_ptr_rx() self.set_mode(MODE.RXCONT) lora = LoRaRcvCont(verbose=False) lora.set_mode(MODE.STDBY) # Medium Range Defaults after init are 434.0MHz, Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on 13 dBm lora.set_pa_config(pa_select=1) try: lora.start() except KeyboardInterrupt: sys.stdout.flush() print ("") sys.stderr.write("KeyboardInterrupt\n") finally: sys.stdout.flush() print ("") lora.set_mode(MODE.SLEEP) BOARD.teardown() |
Код программы для платы Arduino возьмите из предыдущей статьи про связь Arduino и Raspberry Pi с помощью технологии LoRa.