|
|
|
Статистика сайта |
Всего статей:
Категорий/рубрик:
Комментариев:
Пользователей: |
33
7
239
2124 |
|
Юмор от "Городок" |
|
|
Для корректного отображения этого элемента вам необходимо установить FlashPlayer и включить в браузере Java Script.
|
|
|
|
Пример приема и передачи информации посредством модулей Hoperf RFM22 |
Автор: Ильющенков Д. А.
Дата: 2010-01-10 |
В данной статье будет рассмотрен пример организации связи с помощью радиомодулей фирмы HopeFR RFM22. Выбор пал на эти модули неспроста. Во-первых, у них низкая цена (300-400 руб.). Во-вторых, дальность 200-300 м на открытой местности (до 100 м в помещении), что достаточно для управления автоматикой в пределах дома или квартиры. В-третьих, это их малые габаритные размеры.
Поставленная перед нами задача проста: передавать байт от одного модуля к другому, байт будет инкрементироваться каждые полсекунды.
На рисунке 1 предсталены основные электронные компоненты, необходимые для сборки модуля, работающего в режиме приема. На рисунке 2 изображен готовый "приемник" собранный на макетной плате.

Рисунок 1 – Основные элементы для приемника.

Рисунок 2 – Модуль RFM22, работающий в режиме приема.
Итак, скачав мануал с офф-сайта, первым делом стоит разобраться со способами передачи данных: напрямую (direct-mode) или через буфер (fifo-mode). Первый тип подходит для данных, которые нужно отправлять без задержки (например, потоки аудио-данных, моментальные измерения с АЦП и т.д.). Второй тип – передача информации идет только после помещения её в буфер fifo. Мною было принято решение отправлять данные через fifo-буфер, т.к. «срочность» данных не требуется. В данном проекте была использована рекомендованная производителем частотная модуляция данных GFSK (регистр 0x71). Скорость передачи данных установлена на отметке 4800 kbit per sec. На остальных настройках останавливаться не буду, полный перечень регистров-установок приведен в документации к модулям.
Процедура инициализации модуля, работающего в режиме передачи, приведена ниже.
void SPI_RFM_INIT (void)
{
SPI_WRITE(0x06, 0x00);
SPI_WRITE(0x07, 01);
SPI_WRITE(0x09, 0x7f);
SPI_WRITE(0x0a, 0x05
SPI_WRITE(0x0d, 0x00);
SPI_WRITE(0x0e, 0x00);
SPI_WRITE(0x0f, 0x70);
SPI_WRITE(0x10, 0x00);
SPI_WRITE(0x12, 0x00);
SPI_WRITE(0x13, 0x00);
SPI_WRITE(0x70, 0x20);
SPI_WRITE(0x1c, 0x04);
SPI_WRITE(0x1d, 0x40);
SPI_WRITE(0x1e, 0x08);
SPI_WRITE(0x20, 0x41);
SPI_WRITE(0x21, 0x60);
SPI_WRITE(0x22, 0x27);
SPI_WRITE(0x23, 0x52);
SPI_WRITE(0x24, 0x00);
SPI_WRITE(0x25, 0x06);
SPI_WRITE(0x6e, 0x27);
SPI_WRITE(0x6f, 0x52);
SPI_WRITE(0x30, 0x8c);
SPI_WRITE(0x32, 0xff);
SPI_WRITE(0x33, 0x42);
SPI_WRITE(0x34, 64);
SPI_WRITE(0x35, 0x20);
SPI_WRITE(0x36, 0x2d);
SPI_WRITE(0x37, 0xd4);
SPI_WRITE(0x38, 0x00);
SPI_WRITE(0x39, 0x00);
SPI_WRITE(0x3a, 's');
SPI_WRITE(0x3b, 'o');
SPI_WRITE(0x3c, 'n');
SPI_WRITE(0x3d, 'g');
SPI_WRITE(0x3e, 1);
SPI_WRITE(0x3f, 's');
SPI_WRITE(0x40, 'o');
SPI_WRITE(0x41, 'n');
SPI_WRITE(0x42, 'g');
SPI_WRITE(0x43, 0xff);
SPI_WRITE(0x44, 0xff);
SPI_WRITE(0x45, 0xff);
SPI_WRITE(0x46, 0xff);
SPI_WRITE(0x6d, 0x03);
SPI_WRITE(0x79, 0x0);
SPI_WRITE(0x7a, 0x0);
SPI_WRITE(0x71, 0x22);
SPI_WRITE(0x72, 0x48);
SPI_WRITE(0x73, 0x0);
SPI_WRITE(0x74, 0x0);
SPI_WRITE(0x75, 0x53);
SPI_WRITE(0x76, 0x64);
SPI_WRITE(0x77, 0x00);
SPI_WRITE(0x0C,0b00010111);
SPI_WRITE(0x0B,0b00011000);
SPI_WRITE(0x08, 0x03);
SPI_WRITE(0x08, 0x00);
}
Функции считывания и записи данных:
void SPI_WRITE(unsigned char Addr, unsigned char data)
{
unsigned char i=0;
Addr=Addr|0x80;
nSEL=0;
delay_us(10);
for (i=0; i<8; i++)
{
nSDI=(Addr>>(7-i))&0x01;
delay_us(10);
nSCK=1;
delay_us(30);
nSCK=0;
delay_us(20);
}
for (i=0; i<8; i++)
{
nSDI=(data>>(7-i))&0x01;
delay_us(10);
nSCK=1;
delay_us(30);
nSCK=0;
delay_us(20);
}
nSEL=1;
delay_us(20);
}
unsigned char SPI_READ(unsigned char Addr)
{
unsigned char i=0;
unsigned char data=0;
Addr=Addr&0x7F;
nSEL=0;
delay_us(10);
for (i=0; i<8; i++)
{
nSDI=(Addr>>(7-i))&0x01;
delay_us(10);
nSCK=1;
delay_us(30);
nSCK=0;
delay_us(20);
}
for (i=0; i<8; i++)
{
nSCK=1;
delay_us(30);
data=data<<1;
data|=(nSDO);
nSCK=0;
delay_us(20);
}
nSEL=1;
delay_us(20);
}
В главном цикле передатчика мы инкрементируем байт (а), записываем его в буфер fifo по адресу 0x7F и отправляем байт, переведя модуль в TX режим. Прерывание (низкий уровень на PINB.3) будет сигнализировать о том, что все данные из буфера были отправлены.
while (1)
{
SPI_WRITE(0x7F, a++);
SPI_WRITE(0x07, 9);
while (PINB.3) PORTA.0=0;
while (!PINB.3)
{
PORTA.0=1;
SPI_RFM_INTREAD();
}
};
Чтобы сбросить флаги прерываний, необходимо прочитать соответствующие регистры. Эта операция выполняется в процедуре SPI_RFM_INTREAD
void SPI_RFM_INTREAD (void)
{
char temp;
temp = SPI_READ(0x03);
temp = SPI_READ(0x04);
SPI_WRITE(0x05, 0x04);
};
На приемном устройстве принятый пакет вызовет прерывание - низкий уровень на PINB.3. Изменение этого уровня фиксируется микроконтроллером приемника в основном цикле программы, проводится чтение одного байта из Fifo-буфера и выводит этот байт на LED-линейку.
while(1)
{
if (!PINB.3)
{
LED_OUT(SPI_READ(0x7F));
SPI_RFM_INTREAD();
while (!PINB.3);
}
};
Видео с работающими модулями:
Все необходимые материалы для повторения, включая исходные коды для микроконтроллеров, datasheet на RFM22 в PDF, электрические принципиальные схемы, прилагаются.
P.S. В следующей статье будет рассмотрен модуль RFM12BP, обладающий большей выходной мощностью (до 0,5 Вт) по сравнению с RFM22.
Рейтинг:  |
Просмотров: 170937 |
 |
Гости не имеют права добавлять комментарии и проставлять рейтинг. |
|
Автор: LVV (2013-12-23, 20:06)
Когда же будет статья про RFM12BP очень хочется дальность 3км для радиоуправления. [Ответить]