RF модули от HOPERF RFM01 & RFM02

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 361
Зарегистрирован: Чт дек 28, 2006 12:46:58
Откуда: Хлынов

Сообщение MiklSh »

По крайней мере то, что в глаза бросилось:
*приемник вывод DATA/nFFS иногда на массу сажает - у Вас оно жестко на +Upp подключено - через резистор надо.
*у передатчика задержки тактирования по SCK 16мс - помню бился, сильно мало / сильно много, не хотел передавать, остановился на 1мкс.
*у приемника CE84/CE87: s1=0 s0=1 - при этом приемник цепляется именно за преамбулу, те самые "0xAA 0xAA 0xAA 0x2D 0xD4" передатчика, иначе весь массив битов принимается со сдвигом - в итоге на выходе каша. Если при этом буфер не запоняется - значит что то выше, в приемной части не так.

с полосой приема - не то, у Вас:
на приемнике 8D8A = 134кГц на передатчике 8B81 = 60кГц

у меня
на приемнике 9189 = 200кГц на передатчике 9086 = 210кГц

Ширина передачи должна быть больше чем лимит срабатывания у приемника.

Остальное пока не осилил.

Все это ИМХО, могу ошибаться.
Контактная информация:
Реклама
avv
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вс мар 21, 2010 13:12:46

Сообщение avv »

Maxxon,
удалось запустить модули-то?
Реклама
Родился
Сообщения: 2
Зарегистрирован: Пт июл 09, 2010 13:37:48

Сообщение Муромец »

Добрый день, у меня вопрос по дальности работы rfm модулей.
Собраны приемник и передатчик на модулях RFM01, 02 фирмы hope. 433 Мгц. первый вариант был собран на макетной плате с кучей проводов, как на приемнике так и на передатчике, получилось растояние порядка 150 метров с антеннами ANT 433 HETH, но намотанными вручную. далее была собрана вторая версия, которая работала максимум на 70м. после чего развели платы и спаяли все аккуратно на smd компонентах. Вышло расстояние 70м(
купил антенны в магазе и получилось следующее:
ANT 433 PW-LP 100м с натягом
ANT 433 SP примерно 50м
ANT 433 HETH 70м.
http://www.megachip.ru/search.php?searc ... mp;x=0&y=0
а необходимо 150м. какие могут быть варианты для увеличения дальности?
... может есть еще какие-то антенны
... Есть ли усилитель, который можно поставить на выход передатчика, Вот например такой не подойдет:
http://www.terraelectronica.ru/news_postup.php?ID=791 или я не так понял?
... есть ли какието советы по расположению модулей относительно общей платы, относительно батареек питания

хотелось бы оставить эти модули, посколько под них уже все есть. приемник (ручной прибор) должен иметь небольшую антенну, передатчик стационарный, но тоже не хотелось бы антунну вешать 70см.
Открыл глаза
Аватара пользователя
Сообщения: 43
Зарегистрирован: Пт апр 09, 2010 12:54:00
Откуда: Санкт-Петербург

Сообщение Maxxon »

2 avv: сорри, был в отпуске, не мог проверить. Займусь в ближайшие пару дней и отпишусь. Тут поляк один классную документацию прислал на сами чипы модулей и прогу для симуляции передачи между модулями на компе, надо осилить. Поделюсь со всеми.
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Аватара пользователя
Сообщения: 43
Зарегистрирован: Пт апр 09, 2010 12:54:00
Откуда: Санкт-Петербург

Сообщение Maxxon »

2 Муромец

Может дальность прямо пропорциональна напряжению питания, не пробовали изменять до верхних границ?
Реклама
Родился
Сообщения: 2
Зарегистрирован: Пт июл 09, 2010 13:37:48

Сообщение Муромец »

пробовал, к сожалению питание не вариант.
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 117
Зарегистрирован: Вс апр 12, 2009 22:40:37

Сообщение zebrox »

Maxxon писал(а):Поделюсь со всеми.
Ждем-с с нетерпением)
Открыл глаза
Аватара пользователя
Сообщения: 43
Зарегистрирован: Пт апр 09, 2010 12:54:00
Откуда: Санкт-Петербург

Сообщение Maxxon »

Забирайте :)

Выложил сюда: http://depositfiles.com/files/kds6h85ck
И сюда: http://rapidshare.com/files/406524289/r ... sheets.zip

В архиве доки на чипы модулей и конфигуратор с симуляцией.

Буду благодарен модераторам форума, если разместят здесь на сайте, так как ссылки на файлообменники недолговечные.
Также можно было бы выложить конфигураторы от controller-designs.de, так как google их совсем неявно индексирует:

RFM01: http://www.controller-designs.de/index. ... 1_eva&sub=
RFM02: http://www.controller-designs.de/index. ... 2_eva&sub=
RFM12: http://www.controller-designs.de/index. ... sicht&sub= (целый список)
avv
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вс мар 21, 2010 13:12:46

Сообщение avv »

О_о!!! :o
Спасибо!!!
Открыл глаза
Аватара пользователя
Сообщения: 43
Зарегистрирован: Пт апр 09, 2010 12:54:00
Откуда: Санкт-Петербург

Сообщение Maxxon »

Комментарий: насколько мне известно, для симуляции надо выбирать SI4320 (RFM01) и SI4021 (он же IA4221, RFM02).
На сайте silabs.com доступна версия 3.1 софтины.
Открыл глаза
Аватара пользователя
Сообщения: 43
Зарегистрирован: Пт апр 09, 2010 12:54:00
Откуда: Санкт-Петербург

Сообщение Maxxon »

В очередной раз сел мучать модули. Крышу снесло окончательно... Столько лет занимаюсь электроникой и программированием и тут такой облом. Плюнул, съездил в мегу за новым приемником. Запаял. Завелось с первого раза. Приличных слов просто не осталось...

P.S.: его пример - другим наука (с)...
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса

Сообщение clawham »

Maxxon, не могли бы вы выслать Вашу тех документацию мне на электронку чтоб я её разместил на своём сервере - домашний 5 мегабит отдача и всегда живой :)
ато эти рапиды и депозиты....блин ну такое фуфло
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Контактная информация:
Родился
Сообщения: 1
Зарегистрирован: Пн авг 09, 2010 09:41:01

Сообщение bsresident »

Maxxon, можешь выложить свою рабочую версию...Две недели уже мучаюсь, а эффекта никакого: RFM01 не получает посылку (не дергает nIRQ, в статусе не горит FFIT) , если включено обнаружение Sync word, если выключено - поток бессмысленный байтов
Открыл глаза
Аватара пользователя
Сообщения: 43
Зарегистрирован: Пт апр 09, 2010 12:54:00
Откуда: Санкт-Петербург

Сообщение Maxxon »

Выложу чуть попозже, когда все тесты пройдут :) Скорее всего, в виде отдельной статьи :)

На самом деле, огромная благодарность тов. MiklSh. Когда я уже отчаялся, вспомнил что он выложил несколько постов назад рабочий код, собственно отсюда и стал плясать. Собрал схемку согласно комментам, увидел что при работающем коде приемник не реагирует адекватно и заменил его. После замены все действительно заработало :) Рекомендую тоже пойти этим путем.
Пара нюансов:
1. По коду передатчика на SPI инициализируются единички, это, например, мешает моему программатору (а-ля AVR910 USB), который перестает видеть тиньку после прошивки. В случае программатора типа uniprof, полагаю, все будет работать без косяков.
2. Дребезг контактов на передатчике. Если нажать кнопку очень быстро, отрабатывает. Если хоть на долю секунды дольше, то нет (для моей конструкции, конечно, это минус, так как мне наоборот дребезг необходим :) подлечим как-нибудь...)

P.S.: повесьте светодиод на VDI до земли и включите его в фифо, для отладки очень удобно.
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Пн сен 28, 2009 08:59:02

Сообщение grjgrj »

Люди помогите! Работаю с RFM01 и RFM02 + две Atmega8.
Использую примеры выложенные в этой теме: не идет поллинг nIRQ, программа на нем зависает и работать не хочет.
В чем может быть проблема? Вот код:

Код: Выделить всё

//Команда работает проверл с помоoью CLK
void WriteCMD  (unsigned int Cmd)
{


 unsigned char u;

   nSEL=0; delay_us(10);
   SCK=0; delay_us(10);
   for(u=0;u<16;u++)
   {
       SCK=0; delay_us(10);
       if(Cmd&0x8000)
       {
          SDI=1;
       }
       else
       {
          SDI=0;
       }
       delay_us(10);
       SCK=1;
       delay_us(10);
       Cmd<<=1;
   };
   SCK=0; delay_us(10);
   nSEL=1;delay_us(10);

}


void rf02_shiftout(unsigned short wert)
{
   unsigned char j;
   for (j=0; j<8; j++)
   {
       UART1_Write_Text("Sn1");
       while(nIRQ==1);                                                          //вот здесь виснит
       UART1_Write_Text("Send2");
       while(!(nIRQ==1));                                                             
       UART1_Write_Text("Send3");
       delay_us(3);                                                             
       if (wert&128)                                                            
          {SDI=1;}                                                              
  //        {FSK=1;}                                                              
       else
          {SDI=0;}                                                              
   //       {FSK=0;}                                                              
       wert<<=1;                                                                
    }
}

//Отправка
void rf02_txdata(unsigned char date[8])
{
   unsigned char k,wert,temp;

   wert=0xC6;
   nSEL=0;
   for (k=0; k<8; k++)
   {
     if (wert&128)
         {SDI=1;}
     else
         {SDI=0;}
     SCK=1;
     delay_us(1);
     wert<<=1;
     SCK=0;
     delay_us(1);
   }

   rf02_shiftout(0xAA);
   rf02_shiftout(0xAA);
   rf02_shiftout(0xAA);
   rf02_shiftout(0x2D);
   rf02_shiftout(0xD4);
   for (k=0; k<8; k++)
    {
     temp=date[k];
     rf02_shiftout(temp);
    }
   rf02_shiftout(0xAA);
   rf02_shiftout(0x00); // áåç ýòîãî îòðåçàåòññÿ ïîñëåäíèé áèò ïðè ïåðåäà÷å
   while(nIRQ==1);
   delay_us(10);                                                               
   nSEL=1;
   delay_us(10);                                                                
     UART1_Write_Text("SendFin");

}

//Инициализция
void Inti_RFM_02()
{
   UART1_Write_Text("Init");
   Delay_ms(500);
   nSEL=0;delay_us(10);
  // WriteCMD(0xC001);
  // WriteCMD(0xCC00);   //×òåíèå ñòàòóñ áàéòà (ìîæåò è íå íàäî)
   WriteCMD(0x9086);   //868 MHz band, 1 MHz CLK, 12.5 pF   ms : FSK sign = 0   df(fsk) = 150 kHz
   WriteCMD(0xA840);   //RFM02 - Frequency Command      //Set center frequency to 867.84 MHz
   WriteCMD(0xC811);   //RFM02 - Datarate Command       //Set datarate to 19.15708 kbps
   WriteCMD(0xB400);   //RFM02 - Power Setting Command  //Set output power to -12 dB
   WriteCMD(0xC2A0);   //RFM02 - LB Det./TX Sync. Command //âêëþ÷åíà ñèíõðîíèçàöèÿ óðîâåíü áàòðàåå 2,2Â, êàëèáðîâêà WathDog âûêëþ÷åíà
   WriteCMD(0xD2C0);   //RFM02 - PLL Command              //38,4 ìàêñ áèòðåéò, -107 dbc/hz 33% òîêà
   WriteCMD(0xC0E0);   //RFM02 - Power Management Command

   UART1_Write_Text("InitFin");

}

//Отправка
void RFM_Send()
{
  unsigned short date[8];

  date[0]=0xA0; date[1]=0xA1; date[2]=0xA2; date[3]=0xA3; date[4]=0xA4; date[5]=0xA5; date[6]=0xA6; date[7]=0xA7;
 Inti_RFM_02();
  rf02_txdata(date);
  VD=1; delay_ms(10); VD=0;
  rf02_txdata(date); delay_ms(1);
  rf02_txdata(date); delay_ms(1);
  rf02_txdata(date); delay_ms(1);
  rf02_txdata(date); delay_ms(1);
  rf02_txdata(date); delay_ms(1);
  rf02_txdata(date); delay_ms(1);
  rf02_txdata(date); delay_ms(1);
  WriteCMD(0xC001);                                                             //CLOSE TX çàâðåøåíèå ïåðåäà÷è!, à ãäå íà÷àëàñü?
  UART1_Write_Text("SendFin");
  InputBytes[0]=0;                                                             //Ñáðîñ êîìàíäû
  i=0;
}
Проблеме найдена, код рабочий, проблема была в кривых лапах. Удалось запустить прием-передачу, проблем нет!
Но есть еще вопрос, подскажите как правильно организовать прием данных одним RFM01 он нескольких RFM02, да так чтобы коллизии не было и данные не терялись, передача 11 байт раз в день или реже.
Встал на лапы
Сообщения: 126
Зарегистрирован: Пн мар 16, 2009 07:37:42
Откуда: Новосибирск

Сообщение Stepan »

grjgrj вам надо rfm12 и проверки чек сумм и высылание подтвержения о том что пакет принят правильно и опрос... т.к. вероятность неприема пакета всегда есть, а вам ещё и несколько передатчиков надо принимать
меньше слов - больше дела
Прорезались зубы
Сообщения: 247
Зарегистрирован: Сб дек 15, 2007 23:00:54
Откуда: Moscow

Сообщение TechMike »

Разбираюсь с RFM02+tiny2313, пытаюсь ее заставить передавать на нужной частоте, но не получается.
Использую исходники немца, вот отсюда http://myfablab.wordpress.com/2010/06/2 ... rsion-0-1/
Подключил так:
FSK - на +5в или "в воздухе"
CLS - "в воздухе"
VDD-+5в
nIRQ - PB4
SDI - PB0
SCK - PB1
VSS - GND
nSEL - PB2
и светодиоды на PD4 и PD2 для отладки.
МК заведен от внутреннего RC генератора 8Мгц.
tiny2313 видит RFM02, успешно проходит ее инициализация и начинает раз в секунду слать "0000001111100000888888888\n" но на частоте 434.0мгц ничего не происходит, тишина. Отсканировал все вплоть до 450.0мгц, иногда на пару кубиков слышно передачу модуля, но это явно промежуточная частота или гармоники самого RFM02.
Сканирую с помощью yaesu vr6
Исходники ниже.
Что я делаю не так?
Вложения
rf02.h
(684 байт) 608 скачиваний
rf02.c
(3.35 КБ) 330 скачиваний
main.c
(2.3 КБ) 343 скачивания
Контактная информация:
Прорезались зубы
Сообщения: 247
Зарегистрирован: Сб дек 15, 2007 23:00:54
Откуда: Moscow

Сообщение TechMike »

Заработал RFM02 на передачу. пришлось в исходнике немного задержки в SPI подкорректировать, самое главное сконфигурировать входы-выходы МК. Для моего включения вот так:

Код: Выделить всё

DDRB=0b11101111; // делаем выходами все порты PINB, кроме PB4(IRQ).
PINB=0b00000000; // выводим на все выходы PORTB 0
PORTB=0b00000000; // и НЕ подягиваем на +питания.

DDRD=0b11111111; // делаем выходами все порты PIND.
PIND=0b00000000; // выводим на все выходы PORTD 0
PORTD=0b00000000; // и НЕ подягиваем на +питания.
Теперь вопрос в том, почему у меня модуль не включает несущую когда конфигурю Power Management Command, а приходится играться Configuration Setting Command
Пример, инициализирую модуль вот так:

Код: Выделить всё

// init rfm02, see datasheet
rf02_trans(0b1100110000000000); // read status

// Configuration Setting Command: band[MHz]=433,CLK frequency[MHz]=2,Load capacitor [pF]=10,ms=0,frequency deviation[kHz]=60
rf02_trans(0b1000101110000001); 

// Power Management Command: close all ,the module will get into the sleep state.
//rf02_trans(0b1100000000000001);

// Frequency Setting Command: 433band: Fc=430+1600*0.0025= MHz
rf02_trans(0b1010011001000000);

// Data Rate Command: data rate=4.8k bps 
rf02_trans(0b1100100001000111);

// Low Battery Detector and Tx bit Synchronization Command: 
// dwc: Disable wake-up timer periodical calibration
// ebs: Enable TX bit synchronization function
// Disable Low battery detector
rf02_trans(0b1100001000100000);

// PLL Setting and Reset Mode Command: 
// PLL bandwidth: Max datarate [kbps]=19.2, Phase Noise at 1MHz offset [dBc/Hz](typical)=-112,Charage pump current=25%
rf02_trans(0b1101001001000000);

// Power Management Command:
// ea:Enable power amplifier
// ex:Enable crystal oscillator
// es:Enable synthesizer
rf02_trans(0b1100000000111000);

// Power Setting Command: set relative output power:=MAX
rf02_trans(0b10110000);
Потом перед началом передачи приходится давай команду

Код: Выделить всё

rf02_trans(0b1000101111100000); // TX on (Configuration Setting Command)
А "выключать" несущую только вот так:

Код: Выделить всё

rf02_trans(0b100010111000 0001); // TX off (Configuration Setting Command)
Хотя по примеру обмена с модулем в датащите, нужно для этого использоваться последние два байта Power Management Command
Почему так?
Контактная информация:
Родился
Сообщения: 1
Зарегистрирован: Вс мар 18, 2007 10:44:45

Сообщение newbart »

А у меня виснет и при ожидании nIRQ и SDO.
Сделал вариант считки статуса - выдает все время разные числа 1276, 1218, 1091 и т.д.

Код: Выделить всё

#define Set_SDI()    (PORTB |=  (1 << 6))
#define Clr_SDI()    (PORTB &= ~(1 << 6))
#define Set_SCK()    (PORTB |=  (1 << 5))
#define Clr_SCK()    (PORTB &= ~(1 << 5))
#define Set_nSEL()    (PORTB |=  (1 << 4))
#define Clr_nSEL()    (PORTB &= ~(1 << 4))

unsigned int rf01_read_status(void) 
{
  unsigned char i;
  unsigned int temp = 0;
  
  Clr_SCK();
  Clr_nSEL();
  Clr_SDI();
  for (i=0; i<16; i++)
  {
    Clr_SCK(); delay_us(10);  
    temp <<= 1;
    if (PINA & (1<<1)) temp |= 0x0001;
    Set_SCK(); delay_us(10);
  };
  Clr_SCK();
  delay_us(10);
  Set_nSEL();
  return(temp);
}

void main(void)
{
  lcd_init();
  __delay_cycles(1000000);
  DDRB |= (1 << 4)|(1 << 5)|(1 << 6);
  Set_nSEL();
  DDRA = 0x00;
  __delay_cycles(1000000);

  for (;;)
  {
    temp = rf01_read_status();
    lcd_show_uint(temp);
    __delay_cycles(9000000);
  }
}
Прорезались зубы
Сообщения: 247
Зарегистрирован: Сб дек 15, 2007 23:00:54
Откуда: Moscow

Сообщение TechMike »

newbart писал(а):А у меня виснет и при ожидании nIRQ и SDO.
Сделал вариант считки статуса - выдает все время разные числа 1276, 1218, 1091 и т.д.
Порт для nIRQ сконфигурирован как вход?
Контактная информация:
Ответить

Вернуться в «Периферия»