Четверг, 21.11.2024, 11:17

Главная Регистрация Вход
Приветствую Вас, Гость · RSS
Меню сайта
Чат
 Запуск радиомодуля RFM22B на STM32
В данной статье хочу поделиться опытом наладки модуля от HopeRF RFM23B.
Если вы спросите почему именно этот модуль, то ответ будет простой,
он дешевый всего около 10$, это за RFM22B 20dBm передача, и простотой в использовании.
RFM22 - трансивер,
RFM23 - трансивер,
RFM42 - передатчик,
RFM31 - приемник,
Данная статья относится ко всем этим модулям и примеры должны будут работать на всех выше перечисленных.
С этими модулями мне пришлось еще работать с AVR, и с тех пор я использую только их.
Мы будем работать вот с этим модулем
 
Собственно вот схема подключения
Порты для подключения были выбраны под SPI2, nIRQ был подключен к порту C Пин 7, если подключать к другому то нужно поменять в Header-е и в функции void nIRQ_Pin_init(void)
SDN посажен на землю, что обозначает, что модуль постоянно включен.
В Header-е можно и даже нужно выставить размер FIFO буфера для передачи, для корректной работы, иначе, если он не заполнится до конца перед передачей,
то передача не удастся.Так же возможна ручная регулировка выходной мощности.

/*****************************************************************************************************************************/
#define TX_FIFO_BUFF                13                                                   //Выьираем размер FIFO бцфера для передачи от 1 до 64
                                                                                                         //(передавать нужно имеено столько же байт иначе не заработает)
#define OUTPUT_POWER             7                                                   //Выбираем мощность передатчика от 0 до 7 (см. таблицы в datasheet)
#define Event_RFM                      (GPIOC->IDR & GPIO_IDR_IDR7)     //nIRQ с RFM, если менять вывод, то еще и в void nIRQ_Pin_init(void)
/*****************************************************************************************************************************/
Настрой частоты настраивается в функции void RFM_init (void), настраивается в диапазоне от 240 МГц до 960 МГц,
то что написано на модулях это не показатель, по крайней мере модуль на 868 МГц легко заводил на 434 МГц.
настраивается здесь:
spi_send(0x75, 0x53);            // !!!в этих трех байтах настраивается частота модуля
spi_send(0x76, 0x64);             // !!!сейчас она настроена на 434 МГц
spi_send(0x77, 0x00);             // !!!(что бы изменить смотрите datasheet ст.21)
но для этого надо будет посмотреть в Datasheet на 21 странице.

Вот примерчик для организации приема
char LCDBUF[50];
RFM_init();                                                  //инициализируем модуль

while(1)
    {
     RX_ON();                                               //включаем модуль на прием, там же и сбрасываются прерывания по приему                                           
     while (Event_RFM);                                 //Ждем прерывания по приему пакета
     RX_FIFO_BUFF=received_packed();         //присваиваем RX_FIFO_BUFF количество принятых байт
     for(a=0;a<RX_FIFO_BUFF;a++)               //
{
sprintf(LCDBUF,"%X",RX_packed[a]);         //выводим пакет из принятых байт
LCD_PUT(LCDBUF);                                    //на экран
}
    }
вот что получилось:
Передатчиком служил пульт от "Шара", который передает один байт, который соответствует нажатой кнопке
 
Схему и проект на пульт, можно найти здесь
Как мы видим на экране высветились последовательно цифры 4080, что соответствует нажатой кнопке влево (4),
Затем отсутствие нажатых кнопок (0), затем нажатой кнопке вправо (8), 
и опять отсутствие нажатых кнопок.
Использовал пульт так как ничего больше готового под рукой не было.
А теперь рассмотрим пример:
1. Сначала инициализировали RFM_init();
2. Затем перевели в режим приема RX_ON();
3. Дождались прерывания от модуля while (Event_RFM);
4. получили количество байт и одновременно прочитали пакет из модуля RX_FIFO_BUFF=received_packed();
записав в массив RX_packed[] принятый пакет
5. затем мы просто выводим весь пакет на экран
6. не забываем что затем надо сбросить прерывания, так как у нас зациклено, прерывание сбрасывается в RX_ON();
ну вот собственно что касается приема.

Теперь что касается передачи:
RFM_init();                                                  //инициализируем модуль
TX_packed[0]='H';                                      //
TX_packed[1]='e';                                      //Заполняем
TX_packed[2]='l';                                       //
TX_packed[3]='l';                                       //Массив
TX_packed[4]='o';                                      //
TX_packed[5]=' ';                                       //TX_packed[]
TX_packed[6]='W';                                     //
TX_packed[7]='o';                                      //
TX_packed[8]='r';                                      //
TX_packed[9]='l';                                       //
TX_packed[10]='d';                                    //
TX_packed[11]=13;                                    //перевод строки
TX_packed[12]=10;                                    //возврат каретки

while(1)
    {
     TX_ON();                                               //включаем модуль на передачу, там же и сбрасываются прерывания по передачи                                           
    send_packed();                                       //передаем пакет TX_packed[]
    delay_ms(1000);                                     //делаем задержку
    }

Вот что у нас получилось:
Прием осуществлялся следующий аппаратурой:
 
Рассмотрим пример передачи, хотя здесь вроде все понятно:)
1. Заполнили массив, в конце спец символы для перевода строчки
2. Настроили на передачу и сбросили прерывания
3. Передали пакет
А теперь что это за аппаратура такая:)
Платка слева, это такая хороша и удобная штучка как адаптер USB-UART куплен здесь
Платка справа тоже хорошая штучка:) Адаптер RFM31-UART сделанная самим проект здесь
Радиомодули покупал здесь
Да и чуть не забыл выложить сами библиотеки, они вот здесь, так же не забываем про Delay и LCD
Ну вот собственно и все.
2024
Поиск
Перевод
Статистика
Счетчики
Онлайн лист
Онлайн всего: 1
Гостей: 1
Пользователей: 0