помогите понять RF22

exolon
Offline
Зарегистрирован: 20.05.2015

ребята есть радиомодули rf22/si4432 собрал на их основе радиомаячок для хоря и приёмник, приёмник имеет дисплей, с ним всё понятно а вот модуль rf22 с ним несколько вопросов

модуль 100мват но работает всего на 10мват, какая функция способна регулировать мошьность, читал базу так и не смог понять. резясните пожалуста

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

бедный хорь 100мват.. у него шуба начнет клочьями выпадать..

 я бы предположил что вы его не питаете достаточно. что бы он работал на полную..

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а зачем тебе 100? и с 10 мвт в квартире найдешь. или ты его в лес отпускаешь а потом ищешь. типа как развлечение: 

if(хомяка не съели && он не сдох && не сломался маячок && не убежал слишком далеко && не залез под землю и сигнала нет) может я его найду))

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

jeka_tm пишет:

а зачем тебе 100? и с 10 мвт в квартире найдешь. или ты его в лес отпускаешь а потом ищешь. типа как развлечение: 

if(хомяка не съели && он не сдох && не сломался маячок && не убежал слишком далеко && не залез под землю и сигнала нет) может я его найду))

новый вариант Охоты на лис :) тока  хорек и цифровой канал :) 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ага)) цифровой лис-хорек

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

jeka_tm пишет:

ага)) цифровой лис-хорек

Хорьки классные... мой умер, от старости :(  Филимоном звали...

exolon
Offline
Зарегистрирован: 20.05.2015

модуль rf22 имеет цифровое управление уровня мощности, просто по умолчанию оспользуеться самый низкий уровень, вот и интересно какая функция регулирует это, ещё бы хотелось понять можно ли менять стандартную распиновку, щас мы используем тот же модуль но в нём работа в тоновом режиме что не удобно, а так пелинг возможен до 1 киломметра

собрал на макетки и залил стандартный скейч

#include <SPI.h>
#include <RH_RF22.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);
// Singleton instance of the radio driver
RH_RF22 rf22;

void setup()
{
  Serial.begin(9600);
  display.begin();
  display.setContrast(60);
  display.display(); // show splashscreen
  //delay(200);
  display.clearDisplay();   // clears the screen and buffer
 display.setTextColor(BLACK);
  if (!rf22.init())
  //  display.setCursor(0,0);
    Serial.println("init failed");  
 display.print ("init failed");
 
  // Defaults after init are 434.0MHz, 0.05MHz AFC pull-in, modulation FSK_Rb2_4Fd36
}

void loop()
{
  display.setCursor(0,0);
 
  if (rf22.available())
  {
    // Should be a message for us now   
    uint8_t buf[RH_RF22_MAX_MESSAGE_LEN];
    uint8_t len = sizeof(buf);
    if (rf22.recv(buf, &len))
    {
    // RF22::printBuffer("request: ", buf, len);
     Serial.print("Name: ");
     Serial.println((char*)buf);
     Serial.print("RSSI: ");
      Serial.println(rf22.lastRssi(), DEC);
      
     display.print("Name: ");
      display.println((char*)buf);
      display.print("RSSI: ");
     display.println(rf22.lastRssi(), DEC);
  display.display();
      // Send a reply
      uint8_t data[] = "And hello back to you";
      rf22.send(data, sizeof(data));
      rf22.waitPacketSent();
      Serial.println("Sent a reply");
    display.println("Sent a reply");  
}
    else
    {
      Serial.println("recv failed");
    }
  }
  display.clearDisplay();
 
}

а передатчик

#include <SPI.h>
#include <RH_RF22.h>

// Singleton instance of the radio driver
RH_RF22 rf22;

void setup()
{
  Serial.begin(9600);
  if (!rf22.init())
    Serial.println("init failed");
  // Defaults after init are 434.0MHz, 0.05MHz AFC pull-in, modulation FSK_Rb2_4Fd36
}

void loop()
{
  Serial.println("Sending to rf22_server");
  // Send a message to rf22_server
  uint8_t data[] = "Hello World!";
  rf22.send(data, sizeof(data));
 
  rf22.waitPacketSent();
  // Now wait for a reply
  uint8_t buf[RH_RF22_MAX_MESSAGE_LEN];
  uint8_t len = sizeof(buf);

  if (rf22.waitAvailableTimeout(500))
  {
    // Should be a reply message for us now   
    if (rf22.recv(buf, &len))
    {
      Serial.print("got reply: ");
      Serial.println((char*)buf);
    }
    else
    {
      Serial.println("recv failed");
    }
  }
  else
  {
    Serial.println("No reply, is rf22_server running?");
  }
  delay(400);
}

тесты показали что передача всего на 150метров, вот и спрашиваю как можно увеличить мощьность, дальше буду думать об остальных примочках

это гогтовый образец но увы он работает в тоновом режиме

exolon
Offline
Зарегистрирован: 20.05.2015

jeka_tm пишет:

а зачем тебе 100? и с 10 мвт в квартире найдешь. или ты его в лес отпускаешь а потом ищешь. типа как развлечение: 

if(хомяка не съели && он не сдох && не сломался маячок && не убежал слишком далеко && не залез под землю и сигнала нет) может я его найду))

да, вот как уже полгода мы гуляем в лесу, поводком не пользуюсь, из вида друг друга не теряем да хоря лазит по норам и капает новые охотится или просто иследует свои угодья, но всё же подстраховатся не мишает

да и 100миливат это максимальный придел, можно сделать автонастройку уровня в завиимости от уровня сигнала, так и баратеи экономить можно и модуль не будит перенапрягатся

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

в даташите найди просто как настраивается. обычно это просто в каком то регистре поменять значение

maksim
Offline
Зарегистрирован: 12.02.2012

выглядит как пояс шахида

exolon
Offline
Зарегистрирован: 20.05.2015

да, учитовая что это литеполимерные аккамуляторы, в полне сойдёт, но увы модуль rf22 прожорлив надо как минимум 50мач, да и зверёк маленький это самый аптимальный вариант шлейки

exolon
Offline
Зарегистрирован: 20.05.2015

jeka_tm пишет:

в даташите найди просто как настраивается. обычно это просто в каком то регистре поменять значение

я использую библиотеку rf22 для ардуино, не думаю что разработчики софта не предусмотрели функции для управления мощности передачи, кто вообще сталкивался с этой проблемой ?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а ты пробовал? если нет воткни в setup после инициализации радиомодуля

setTxPower(RH_RF22_TXPOW_20DBM);

а вообще гуглить и читать учись

http://www.airspayce.com/mikem/arduino/RadioHead/classRH__RF22.html

 

exolon
Offline
Зарегистрирован: 20.05.2015

насколько я понял, нужно сделать так, но эффекта нет, вот если найти пример как это реалезованно было бы понятней.

#include <SPI.h>
#include <RH_RF22.h>

// Singleton instance of the radio driver
RH_RF22 rf22;
 RH_RF22 rf22_TXPOW_20DBM;
void setup()
{
  Serial.begin(9600);
  if (!rf22.init())
    Serial.println("init failed");
  // Defaults after init are 434.0MHz, 0.05MHz AFC pull-in, modulation FSK_Rb2_4Fd36
//setTxPower(RH_RF22_TXPOW_20DBM);
}

void loop()
{
  Serial.println("Sending to rf22_server");
  // Send a message to rf22_server
  uint8_t data[] = "Masiy";
  uint8_t setTxPower(RH_RF22_TXPOW_20DBM);
  rf22.send(data, sizeof(data));
 
  rf22.waitPacketSent();
  // Now wait for a reply
  uint8_t buf[RH_RF22_MAX_MESSAGE_LEN];
  uint8_t len = sizeof(buf);

  if (rf22.waitAvailableTimeout(500))
  {
    // Should be a reply message for us now   
    if (rf22.recv(buf, &len))
    {
      Serial.print("got reply: ");
      Serial.println((char*)buf);
    }
    else
    {
      Serial.println("recv failed");
    }
  }
  else
  {
    Serial.println("No reply, is rf22_server running?");
  }
  delay(400);
}

 

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

я вообще фиг знает где и что вы там читаете.. но в оригинале написано так

rf22.setTxPower(RF22_TXPOW_17DBM);  

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

пухлявый либа другая у тс

exolon
Offline
Зарегистрирован: 20.05.2015

хорошо а где вы читаите ?

Sets the transmitter power output level in register RH_RF22_REG_6D_TX_POWER. Be a good neighbour and set the lowest power level you need. After init(), the power will be set to RH_RF22::RH_RF22_TXPOW_8DBM on RF22B or RH_RF22_RF23B_TXPOW_1DBM on an RF23B. The highest power available on RF22B is RH_RF22::RH_RF22_TXPOW_20DBM (20dBm). The highest power available on RF23B is RH_RF22::RH_RF22_RF23B_TXPOW_13DBM (13dBm). Higher powers are available on RF23BP (using RH_RF22_RF23BP_TXPOW_*), and then only with an adequate power supply. See comments above. Caution: In some countries you may only select certain higher power levels if you are also using frequency hopping. Make sure you are aware of the legal limitations and regulations in your region.

Parameters
[in] power Transmitter power level, one of RH_RF22_*TXPOW_*

References RHSPIDriver::spiWrite().

Referenced by init().

это то что у меня, а что у вас

exolon
Offline
Зарегистрирован: 20.05.2015

прошу прощения, я почти незнаю С++, раньше програмел в других языках, многие вещи мне не понятны.

exolon
Offline
Зарегистрирован: 20.05.2015

Puhlyaviy пишет:

я вообще фиг знает где и что вы там читаете.. но в оригинале написано так

rf22.setTxPower(RF22_TXPOW_17DBM);  

 

спасибо что ткнули носом, я конечно не уверен что воткнул это правильно но мощность явно возрасла

#include <SPI.h>
#include <RH_RF22.h>

// Singleton instance of the radio driver
RH_RF22 rf22;
 
void setup()
{
  Serial.begin(9600);
  if (!rf22.init())
    Serial.println("init failed");
  // Defaults after init are 434.0MHz, 0.05MHz AFC pull-in, modulation FSK_Rb2_4Fd36

}

void loop()
{
  Serial.println("Sending to rf22_server");
  // Send a message to rf22_server
 
  uint8_t data[] = "Masiy";
 
  rf22.setTxPower(RH_RF22_TXPOW_17DBM);
  rf22.send(data, sizeof(data));
 
  rf22.waitPacketSent();
  // Now wait for a reply
  uint8_t buf[RH_RF22_MAX_MESSAGE_LEN];
  uint8_t len = sizeof(buf);

  if (rf22.waitAvailableTimeout(500))
  {
    // Should be a reply message for us now   
    if (rf22.recv(buf, &len))
    {
      Serial.print("got reply: ");
      Serial.println((char*)buf);
    }
    else
    {
      Serial.println("recv failed");
    }
  }
  else
  {
    Serial.println("No reply, is rf22_server running?");
  }
  delay(1000);
}

осталось решить вопрос с повисанием ардуины, как вариант можно собрть самодельную на 3,3 вольт и ниже частотой

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

jeka_tm пишет:

пухлявый либа другая у тс

проблемы индейцев, шерифа вообще ни как не интересуют..

exolon
Offline
Зарегистрирован: 20.05.2015

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

exolon
Offline
Зарегистрирован: 20.05.2015

здравствуйте ещё раз, возник вопрос требующий обсуждения

http://www.airspayce.com/mikem/arduino/RadioHead/classRHSoftwareSPI.html

в этой библиотеки нашел описание RHSoftwareSPI она должна менять распиновку подключения к ардуино. как я понял mosi. miso. sck. поменять не выйдит или будит рабоать крайне криво, а вот nsel & niro можно с одной стороны и это не плохо но я вот не совсем понял как

 #include <RH_RF22.h>
 #include <RHSoftwareSPI.h>
 RH_RF22 driver(10, 2, spi);
 
тоесть получается 10 NSEL, 2 NIRO. или я ошибаюсь ?
конечно было бы очень хорошо поменять распиновку полностью это облегчело разводку печатной платы
 
но при попытке поменять driver (10, 2, spi) на drive(10, 3, spi) и подключится к D3 в место D2 не принесло эффкта модуль попрежнему работает в D2 по умолчанию, что не так ?
KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Ещё вопросик про мощьность.

В библиотеке имеем:

#define RH_RF22_TXPOW_1DBM                         0x00
#define RH_RF22_TXPOW_2DBM                         0x01
#define RH_RF22_TXPOW_5DBM                         0x02
#define RH_RF22_TXPOW_8DBM                         0x03
#define RH_RF22_TXPOW_11DBM                        0x04
#define RH_RF22_TXPOW_14DBM                        0x05 
#define RH_RF22_TXPOW_17DBM                        0x06 
#define RH_RF22_TXPOW_20DBM                        0x07 

По умолчанию выставляется 8DB. На максимальной (20DB) виснит сразу. На 17DB после нескольких секунд работы. На 14DB все работет нормально. Может модуль создает сильную помеху? Или в чем причина?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

проблема с питанием

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

По мощьности? т.е. AMS1117 3.3 не достаточно? Она даже не нагревается, т.е. среднее потребление не очень высокое.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а конденсатор поставил?

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

От такой платы + БП 12V питаю:

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

подцепись мультиметром и измеряй напряжение при передаче. если есть осцил то лучше им

то что проблема в питании вероятнее чем в нерабочей либе

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

ну я тоже думаю, что скорее всего с физикой проблемы, а не с математикой :)

осцилографа нету :(, а мультиметр показывает четко 3.25V

попробую завтра ещё такой БП:

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

всегда показывает 3.25? и при передаче тоже?

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

даже без нагрузки

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

если все норм с питанием значит проблема в самом модуле или программе

а если запаять конденсатор прямо на модуль по питанию как на модуляъ nrf24l01. у тебя же все на проводах. контакты может плохие, провода длинные

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

И таки да, с блоком из #28 работает на 20DB

exolon
Offline
Зарегистрирован: 20.05.2015

 мне помогло самодельное ардуино, использую её без кварца, так менее надёжно но увы я ограничен в размерах и стабилизатор AMS1117 для питания радиомодуля

http://samopal.pro/atmega328-arduino/#comment-1032

exolon
Offline
Зарегистрирован: 20.05.2015

и вопрос, в описании я нашол полезную функцию enum RHGenericDriver::RHMode, но так и не понял как это применить, идея такова, отправлять радиомодуль в режим сна чтобы экономить батареи и выводить его из сна пока его не разбудит его радиосигнал с передатчика, может кто сталкивался с этой проблемой ?

 

exolon
Offline
Зарегистрирован: 20.05.2015

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

exolon
Offline
Зарегистрирован: 20.05.2015

господа

пытаюсь подключить rf22d к ардуино на atmega128 всё как пологается шина SPI miso-d11/mosi-d10/sck-d9/ss-d8, и int0 на d16

пишит init failed, в общем он неработает.

ктонибудь подключал радиомодуль к нестандартной ардуине ??

exolon
Offline
Зарегистрирован: 20.05.2015

странное дело, на atmega328 всё работает, даже если програмно изменить пины шины spi. даже собрал пару проэктов на этой основе

увы для моего следующего проэкта нехватает памяти пришлось взять чип atmega128 и памяти побольше и пинов влезет всё дисплей, gps модуль, радиомодуль и компас, даже радио можно прикрутить, но увы пока запнулся на rf22b.

попробую ещё вырианты, но хотелось перенять опыт тех кто работал с этими модулями более плотно

exolon
Offline
Зарегистрирован: 20.05.2015

люди помагите в si4332 имееться встроенный вольтметр но я не могу понять как с нимать с него данные, в базе для rf22 есть упоменание для этого

uint8_t RH_RF22::adcRead     (     uint8_t
        uint8_t      adcref = RH_RF22_ADCREF_BANDGAP_VOLTAGE,
        uint8_t      adcgain = 0,
        uint8_t      adcoffs = 0
    )         
Reads a value from the on-chip analog-digital converter
Parameters
    [in]    adcsel    Selects the ADC input to measure. One of RH_RF22_ADCSEL_*. Defaults to the internal temperature sensor
    [in]    adcref    Specifies the refernce voltage to use. One of RH_RF22_ADCREF_*. Defaults to the internal bandgap voltage.
    [in]    adcgain    Amplifier gain selection.
    [in]    adcoffs    Amplifier offseet (0 to 15).

Returns
    The analog value. 0 to 255.

но я немогу понять по этому скудному описанию как это правельно писать

если написать просто serial.print(RF22.adcRead()); получаю данные с датчика температур