Si4463 arduino подключение

Радиомодули для Ардуино с большим радиусом действия

Секреты подключения радиомодулей от CDSENET на базе микросхемы SI4463

Во многих проектах, использующих в качестве основы плату Ардуино, возникает потребность в передаче различных команд или информации на некоторое расстояние. В этом случае радиосвязь – лучшее из возможных решений. Дистанционное управление квадрокоптерами, самолетами, машинками, катерами, передача тревожных сообщений в различных охранных системах…

Все это немыслимо сегодня без использования различных радиомодулей, коих, к слову сказать, выпускается сейчас превеликое множество. Особый интерес представляют модули, обеспечивающие связь на дальние расстояния. Но, как ни странно, описаний таких радиомодулей и конструкций, сделанных с их использованием, в интернете кот наплакал.

Задумывая канал связи для хитрой автомобильной охранной системы, я заказал себе на Алиэкспрессе радиомодуль от EBYTE на базе микросхемы SI4463 мощностью 500 мВт. Надо сказать, что подобных модулей на частоты от 170 до 915 МГц с выходной мощностью от 100 мВт до 1 Вт существует достаточно много.

Мне нужен был радиомодуль, который обеспечит оповещение в городской среде на расстояние метров 300 – 500 с учетом прохождения радиосигнала через стены зданий. Был соблазн взять максимально дальнобойный модуль мощностью 1 Вт, использующий протокол LoRa. Обещанная дальность радиосвязи по прямой видимости для них равнялась — 8000 метров. Но цена на такие радиомодули зашкаливала за 1000 руб. К тому же мощность их показалась мне избыточной.

В результате был куплен менее мощный модуль на 500 мВт, но его подключение к Ардуино вызвало ряд трудностей. Дело в том, что выводы радиомодулей серии типа Е50, Е53 и т.д. производителя CDSENET несколько отличаются от выводов наиболее распространенных среди ардуинщиков модулей на микросхеме SI4463. А описаний схем подключения их к Ардуино в интернете, похоже, совсем нет.
Рассмотрим для примера типичный радиомодуль такого плана CDSENET E36-TTL-100.

Как видим, он имеет 7 выводов. С четырьмя выводами все понятно:

GND – это земля.
VCC – питание 3,5 – 5,5 В.
TXD – выход сигнала.
RXD – вход сигнала.

А вот что делать с оставшимися выводами, не совсем понятно.
Долгое время запустить радиомодуль, даже имея описание похожего модуля, мне не удавалось. С большим трудом на англоязычных форумах я нашел подсказку и путем экспериментов пришел к решению проблемы.

Оказалось, что выводы М0 и М1 управляют режимами работы радиомодуля. Для стандартного режима работы с Ардуино нам нужно соединить оба этих вывода с землей. Если же вы хотите использовать все возможные режимы работы модуля, такие как режим сохранения энергии или спячки, то эти выводы следует подсоединять к цифровым выводам Ардуино и подавать на них либо низкий, либо высокий уровень. Как это делать, расписано в даташите.

Вывод AUX при этом выполняет вспомогательную функцию. Когда модуль не готов к работе на этот вывод подается «низкий уровень». Когда радиомодуль готов к работе – высокий.
То есть в скетче мы имеем возможность контролировать готовность радиомодуля к передачи данных. Впрочем, вполне можно обойтись и без этого.

Схема подключения радиомодуля к Ардуино Нано у меня выглядела так.

Схема подключения радиомодуля CDSENET E36-TTL-100 к Ардуино Нано

Выводы TXD и RXD радиомодуля я подсоединил к цифровым выводам Ардуино D10 и D11, назначив их в скетче RXD и TXD соответственно. Это важный момент. Вывод RXD радиомодуля должен быть подсоединен к выводу TXD ардуино. А вывод TXD к RXD.

Скетч для отправки радиосообщения, состоящего из одной цифры «5» будет выглядеть таким образом:

Скетч для приемника будет выглядеть так:

Дальность передачи таких модулей превзошла все мои ожидания. Модуль мощностью 100 мВт по прямой передавал данные на расстояние 1 км. А модуль в 500 мВт был успешно испробован на дальность 3 км. На большем расстоянии экспериментов я еще не делал.

Предвижу замечания въедливых читателей по поводу разрешенных мощностей передатчика и радиочастот.
Будем считать, что все мои опыты имели чисто научно-познавательную цель. Я ни в коей мере не хочу призывать кого-то к нарушению установленных правил радиообмена.
Пусть каждый решает сам, соблюдать ли их, когда злоумышленники угоняют вашу машину или обворовывают вашу квартиру.

Настройка радиомодулей

Много вопросов возникает по настройке подобных радиомодулей. Хотя, честно говоря, у меня такой надобности не возникло, так как дефолтные настройки вполне удовлетворяли. Но поменять частоту передачи или адрес частенько бывает необходимо.

Рассмотрим, как это можно сделать на примере радиомодуля E50-TTL-500 производства фирмы EBYTE. Даташит на этот модуль можно посмотреть тут .

Для настройки радиомодуля лучше всего использовать специальный модуль E15-USB-T2 . Его можно купить отдельно, но у меня продавец приложил его в подарок к радиомодулю.

Для того, чтобы ввести этот переходник в режим настройки радиомодуля, нужно снять две перемычки, как показано на фото.
Радиомодуль втыкается в переходник, переходник в USB порт компютера.

Если нет такого переходника можно подключить радиомодуль к компьютеру через любой TTL свисток. Чтобы ввести радиомодуль в режим программирования, следует на контакты М0 и М1 радиомодуля подать плюс.

Теперь нам понадобится программа AccessPort. Ее можно скачать тут . Распаковать и запустить файл AccessPort.exe

Смотрим номер компорта, на котором открылся наш модуль, и указываем его в окне программы AccessPort. Соединяемся.

В нижнем окне набираем команду: C1 C1 C1

Появляется ответ: С0 00 00 18 DC 44

Это означает, что радиомодуль работает на дефолтный настройках.
Чтобы их изменить, нужно набрать команду С0, а за ней пять цифр (байтов), в которых зашифрованы новые параметры работы радиомодуля.
Как это сделать?

В даташите есть такая таблица:

Первые два байта (00 00) задают адрес, по которому будет доставлятся радиосообщение. Первый байт — верхний адрес. Второй байт — нижний адрес. Эти два байта должны быть одинаковыми на передатчике и приемнике. Каждый из этих байтов можно менять в пределах от 00H до FFH.

Третий байт кодирует сразу три параметра радиомодуля — тип протокола UART ( 8N1 по умолчанию), скорость передачи по UARTу (9600 bps по умолчанию),и скорость передачи данных по радиоканалу (1 kbps по умолчанию).
Как мы видим, по умолчанию этот третий байт равен 18. Эта цифра получается следующим образом:
Смотрим в таблицу. Тип протокола кодируется в двоичной системе bin битом 00, скорость по UARTу — 011, скорость по радиоканалу — 000.
Записываем эти биты подряд — 00011000 Их нам нужно перевести в шеснадцатеричую систему HEX. Для этого открываем калькулятор Windows, в окне вид выбираем «Программист», слева ставим точку напротив Bin. Набираем 00011000. Переносим точку и ставим ее напротив HEX. Видим результат — 18.

Теперь, например, мы хотим изменить скорость передачи модуля по радиоканалу и установить 10 kbps.
Тогда по битам, согласно таблицы, у нас будет 00011100. Переводим в HEX и получаем — 1С.

Значит, чтобы изменить скорость передачи и сделать ее равной 10kbps нам в программе AccessPort.exe нужно ввести команду: С0 00 00 1С DC 44

Четвертый байт кодирует частоту, на которой будет осуществляться радиопередача. Частота высчитывается по формуле — 148 MHz + значение четвертого байта * 0,1 MHz
В настройках по умолчанию четвертый байт имеет значение DC. Это в HEX. Переводим в десятичную систему — ставим точку напротив Dec. Получаем — 220. Подставляем в формулу — 148 +220*0,1 = 170. То есть дефолтная частота передачи — 170 MHz.

Попробуем в дефолтной настройке изменить частоту и сделать ее равной, например, 160 MHz. Для этого решим уравнение — 148 +х*0,1 = 160
У нас получается, х = 120. Переводим это число в HEX и получаем — 78.
Соответственно команда будет выглядеть так — С0 00 00 18 78 44

Последний байт кодирует еще 5 различных параметров радиомодуля, самым важным из которых для нас является мощность передатчика. По умолчанию она установлена на максимум. Принцип кодирования аналогичен разобранному ранее.

Источник

Si4463 Radio Library for AVR and Arduino

This is a library for use with the Si4463 radio IC from Silicon Labs, used (or will soon be) in some of my projects. The Si4463 is configurable in a ton of different ways with options for modulation, packet format, CRC algorithms and has a high output power of up to +20dBm (100mW). The Si4463 is used in a number of pre-made modules like the HopeRF RFM26W and Dorji_Com DRF4463F. The whole range of Si446x transceivers should also work with this library.

This library configures the chip to send and receive variable length packets of up to 128 bytes and uses callback functions for when events occur, such as receiving a new packet and completing a packet transmission. The callback functions run straight from the interrupt routine allowing the program to react much faster to events than if the library was polled.

Download from GitHub
Documentation

Pinout

Si4463 ATmega328 Arduino Uno Arduino Mega Description
VCC 3.3V 3.3V 3.3V Power (3.3V)
GPIO0 – – – –
GPIO1 – – – –
SDO B4 (18) 12 50 SPI MISO
SDI B3 (17) 11 51 SPI MOSI
SCLK B5 (19) 13 52 SPI SCK
NSEL B2 (16) 10 10 SPI SS
NIRQ D2 (4) 2 2 Interrupt
SDN D5 (11) 5 5 Shutdown/reset
High = on, Low = off
GND GND GND GND Ground

The Si4463 is not 5V compatible, you’ll need to do some level conversion to bring the 5V IO voltage down to 3.3V.

Callbacks

This library uses callbacks which are ran when events occur. Since the callbacks run from the interrupt routine be sure that any global variables you use in them are declared ‘volatile’, just as you would when dealing with normal ISRs. These events will wake the microcontroller if it is sleeping. Some callbacks can be turned on and off using Si446x_setupCallback() and Si446x_setupWUT() .

Event Callback Default setting
New packet incoming SI446X_CB_RXBEGIN Off
Valid packet received SI446X_CB_RXCOMPLETE Always enabled
Invalid packet received SI446X_CB_RXINVALID Always enabled
Transmission of packet complete SI446X_CB_SENT Off
Wakeup timer expired SI446X_CB_WUT Off
Supply voltage below threshold SI446X_CB_LOWBATT Off

Wakeup timer (WUT)

The Si4463 can be configured to periodically wake up using the wake up timer (WUT). When the wake up timer is active and the radio is put into sleep mode it consumes a tiny 900nA. When the WUT expires the SI446X_CB_WUT callback is ran. The low battery detector uses the wake up timer to initiate a supply voltage measurement. If the supply voltage is below the threshold set by Si446x_setLowBatt() then the SI446X_CB_LOWBATT callback will be ran. Calculating the correct mantissa (M) and exponent (R) values for the WUT can be a little difficult so here’s a calculator:

WUT Calculator
Interval (seconds)
R
M
Resolution
Actual interval

Compatible chips/modules

Device Tested
Si4460 Not tested
Si4461 Not tested
Si4463 Works
Si4467 Not tested
Si4468 Not tested
HopeRF RFM26W Works
Dorji_Com DRF4463F Works

Radio configuration

The radio configuration is quite complex. Wireless Development Suite (WDS) can be used to create different configuration header files:

  1. Open WDS (can sometimes take a while to load, also try clicking on the center logo)
  2. Choose ‘Simulate radio’
  3. Scroll down and select ‘Si4463’
  4. Make sure the Revision is set to ‘C2’
  5. Click ‘Select Radio’ button
  6. Select ‘Radio Configuration Application’
  7. Click ‘Select Application’ button
  8. Click Open (top right of the window) and choose config_normal.xml from the GitHub repo

Areas to avoid changing:

  • Packet tab
    • Don’t change anything in the ‘Packet config’ and ‘Variable length config’ tabs
  • Interrupt tab
    • Don’t change any of these settings
  • GPIO and FRR tab
    • Only change GPIO 2 and 3 if your module uses different pins for the RF TX/RX switch
    • Don’t change NIRQ and SDO
    • Don’t change Fast Response Register A and B

To generate the header file containing the new config:

  1. Click ‘Generate source’ (bottom right)
  2. Choose ‘Save custom radio configuration header file’
  3. Save the file somewhere
  4. The generated config file can’t be used just yet, WDS has a few options missing. A Perl script (and a Windows .exe version of it) is provided in the GitHub repo — perl radio_config.pl radio_config_Si4463.h radio_config.h will read radio_config_Si4463.h and output to radio_config.h. With the Windows .exe the input header file can be dragged on top of the exe and it will output to radio_config.h. Or to do this manually follow the fix up instructions below, though the manual way won’t remove unnecessary settings.

Manual config header fix up:

  1. Remove any ‘#include’ lines (usually just 1 around line 41)
  2. In ‘RF_POWER_UP’ define change the second value from 0x81 to 0x01 (normal power up without any patch stuff)
  3. In ‘RF_GLOBAL_CONFIG_1’ define change the 5th value (GLOBAL_CONFIG) from 0x20 to 0x30 (puts the FIFO into single 129 byte mode)
  4. In ‘RF_PKT_RX_THRESHOLD_12’ define change the 6th from last value (PKT_FIELD_2_LENGTH_7_0) from 0x3F to 0x80 (sets max packet length to 128)
  5. Remove the ‘SI446X_PATCH_CMDS’ and ‘RF_GLOBAL_CONFIG_1_1’ lines from the ‘RADIO_CONFIGURATION_DATA_ARRAY’ define

Sometimes the defines may not be called RF_GLOBAL_CONFIG_1 and RF_PKT_RX_THRESHOLD_12, in which case search for the field name instead (GLOBAL_CONFIG or PKT_FIELD_2_LENGTH_7_0) and change the corresponding value.

GPIOs

The Si4463 has 4 GPIO pins (numbered 0 to 3) which can be configured in a number of ways, however 2 of the GPIOs are used to control an RF TX/RX switch on most pre-made modules. By default the library configures GPIO2=HIGH when receiving and GPIO3=HIGH when transmitting, this works for the RFM26W and DRF4463F. Most other modules use this same configuration, but check anyways.

Library Coding Tips

  • When the radio is put to sleep with Si446x_sleep() it will automatically wake up when its SPI select line is asserted. Once SPI communication has finished the Si446x_sleep() function must be called again to put it back to sleep.
  • Si446x_setupWUT() will take 300us to complete if the WUT was previously disabled.

Range Testing

Using the config_longrange_500 config in the GitHub repo and driving around a fairly flat village/country area I managed to receive a valid packet at 2.2 km (1.37 miles) and 3.79 km (2.36 miles) for an invalid packet. This was done using a 3dBi antenna shown below instead of the sort that are normally supplied with radio modules.

Transmitter setup

Источник

Adblock
detector