Радиомодуль SI4432: выводы, подключение к Arduino, обмен данными

Трансивер SI4432 обеспечивает двустороннюю связь на 240–930 МГц на дистанции до 1 км. Рассказываем о выводах, подключении по SPI и работе с библиотекой RF22.
Возможности трансивера
Модули на микросхеме SI4432 — это компактные приёмопередатчики для двусторонней радиосвязи в диапазоне от 240 до 930 МГц. На открытой местности связь держится на расстоянии до 1 км, в помещении — на 100–300 м. Поддерживаются три вида модуляции: FSK, GFSK и OOK, а мощность передатчика достигает +20 дБм.

- Частотный диапазон: 240–930 МГц
- Чувствительность приёмника: до 121 дБм
- Модуляция: FSK (ЧМн), GFSK (ГЧМн), OOK (АМн)
- Максимальная выходная мощность: 20 дБм
- Скорость передачи данных: 0,123–256 кбит/с
- Напряжение питания: 1,8–3,6 В
- Рабочая температура: от −20 до 60 °C
Назначение выводов

- VDD — питание, GND — общий провод
- NSEL — разрешение работы интерфейса SPI
- SCLK — тактовый сигнал SPI
- SDI — приём данных по SPI, SDO — отправка данных по SPI
- NIRQ — прерывание по получению данных
- SDN — перевод в режим энергосбережения (активный уровень HIGH)
- GPIO0, GPIO1, GPIO2 — программируемые порты ввода-вывода
Подключение к Arduino
Обмен с контроллером идёт по SPI. Важный момент: модуль работает от 3,3 В, а логика Arduino Uno и Mega — 5 В, поэтому между ними обязательно ставят конвертер уровней. Питать трансивер желательно от отдельного источника 3,3 В; брать питание с вывода 3.3 В самой платы допустимо только при передаче на небольшое расстояние.
| GND | GND | GND |
| SDN | GND | GND |
| NIRQ | D2 | D2 |
| NSEL | D10 | D53 |
| SCLK | D13 | D52 |
| SDI | D11 | D51 |
| SDO | D12 | D50 |

Обратите внимание на вывод SDN: высокий уровень на нём переводит трансивер в режим энергосбережения, поэтому в приведённой схеме он соединён с землёй, и модуль постоянно активен. Вывод прерывания NIRQ на обеих платах заводится на D2, а линии SPI различаются: у Uno это D10–D13, у Mega — D50–D53.
Первая проверка: примеры библиотеки RF22
Для работы с модулем используется библиотека RF22. Проверить пару трансиверов проще всего её штатными примерами: на одну плату загружается rf22_client, на другую — rf22_server.

Клиент периодически отправляет строку Hello world, ждёт ответа и сообщает в монитор последовательного порта, пришёл он или нет. Сервер постоянно слушает эфир и на каждое полученное сообщение отправляет ответ. Открыв монитор порта для обеих плат, можно наблюдать обмен с двух сторон.
Проект: температура и влажность по запросу
Более практичный пример — передача показаний датчика с одной платы на другую по запросу. Для него понадобятся две платы Arduino Uno, две макетные платы, два модуля SI4432, два конвертера уровней и модуль GY21 с датчиком SHT21, который подключается к серверной стороне.
Клиент раз в 3 секунды поочерёдно отправляет в эфир текстовый запрос tempSH21 или humiditySH21, дожидается окончания передачи (waitPacketSent) и ждёт ответа с тайм-аутом. Полученное значение выводится в монитор порта с пометкой, что именно запрашивалось. Если инициализация трансивера не удалась, скетч сообщает об этом строкой si4432 no init.
Сервер, помимо SPI и RF22, подключает библиотеки Wire и SHT2x. Он ожидает входящий пакет, определяет по тексту запроса, что требуется — температура или влажность, — считывает соответствующую величину с SHT21, преобразует число в строку и отправляет его обратно. На нераспознанный запрос в порт выводится сообщение error, а в ответ уходит значение 999.
Обе программы открывают последовательный порт на скорости 9600, так что после загрузки скетчей работу связки удобно контролировать в двух окнах монитора порта: у клиента видны отправленные запросы и полученные значения температуры и влажности, у сервера — принятые запросы и отметки об отправке ответа. Схемы клиента и сервера различаются только наличием датчика: трансивер на обеих платах подключается одинаково, через конвертер уровней.
Что проверить при отсутствии связи
Если модули не обмениваются данными, причину обычно ищут в питании, монтаже или несовпадении радиопараметров:
- подано ли питание на модуль и достаточно ли его
- правильно ли модуль соединён с платой Arduino
- совпадают ли на обоих модулях частота, скорость передачи и тип модуляции