помогите понять RF22
- Войдите на сайт для отправки комментариев
Ср, 20/05/2015 - 09:21
ребята есть радиомодули rf22/si4432 собрал на их основе радиомаячок для хоря и приёмник, приёмник имеет дисплей, с ним всё понятно а вот модуль rf22 с ним несколько вопросов
модуль 100мват но работает всего на 10мват, какая функция способна регулировать мошьность, читал базу так и не смог понять. резясните пожалуста
бедный хорь 100мват.. у него шуба начнет клочьями выпадать..
я бы предположил что вы его не питаете достаточно. что бы он работал на полную..
а зачем тебе 100? и с 10 мвт в квартире найдешь. или ты его в лес отпускаешь а потом ищешь. типа как развлечение:
if(хомяка не съели && он не сдох && не сломался маячок && не убежал слишком далеко && не залез под землю и сигнала нет) может я его найду))
а зачем тебе 100? и с 10 мвт в квартире найдешь. или ты его в лес отпускаешь а потом ищешь. типа как развлечение:
if(хомяка не съели && он не сдох && не сломался маячок && не убежал слишком далеко && не залез под землю и сигнала нет) может я его найду))
новый вариант Охоты на лис :) тока хорек и цифровой канал :)
ага)) цифровой лис-хорек
ага)) цифровой лис-хорек
Хорьки классные... мой умер, от старости :( Филимоном звали...
модуль 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метров, вот и спрашиваю как можно увеличить мощьность, дальше буду думать об остальных примочках
это гогтовый образец но увы он работает в тоновом режиме
а зачем тебе 100? и с 10 мвт в квартире найдешь. или ты его в лес отпускаешь а потом ищешь. типа как развлечение:
if(хомяка не съели && он не сдох && не сломался маячок && не убежал слишком далеко && не залез под землю и сигнала нет) может я его найду))
да, вот как уже полгода мы гуляем в лесу, поводком не пользуюсь, из вида друг друга не теряем да хоря лазит по норам и капает новые охотится или просто иследует свои угодья, но всё же подстраховатся не мишает
да и 100миливат это максимальный придел, можно сделать автонастройку уровня в завиимости от уровня сигнала, так и баратеи экономить можно и модуль не будит перенапрягатся
в даташите найди просто как настраивается. обычно это просто в каком то регистре поменять значение
выглядит как пояс шахида
да, учитовая что это литеполимерные аккамуляторы, в полне сойдёт, но увы модуль rf22 прожорлив надо как минимум 50мач, да и зверёк маленький это самый аптимальный вариант шлейки
в даташите найди просто как настраивается. обычно это просто в каком то регистре поменять значение
я использую библиотеку rf22 для ардуино, не думаю что разработчики софта не предусмотрели функции для управления мощности передачи, кто вообще сталкивался с этой проблемой ?
а ты пробовал? если нет воткни в setup после инициализации радиомодуля
а вообще гуглить и читать учись
http://www.airspayce.com/mikem/arduino/RadioHead/classRH__RF22.html
насколько я понял, нужно сделать так, но эффекта нет, вот если найти пример как это реалезованно было бы понятней.
#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);
}
я вообще фиг знает где и что вы там читаете.. но в оригинале написано так
пухлявый либа другая у тс
хорошо а где вы читаите ?
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.
References RHSPIDriver::spiWrite().
Referenced by init().
это то что у меня, а что у вас
прошу прощения, я почти незнаю С++, раньше програмел в других языках, многие вещи мне не понятны.
я вообще фиг знает где и что вы там читаете.. но в оригинале написано так
спасибо что ткнули носом, я конечно не уверен что воткнул это правильно но мощность явно возрасла
#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 вольт и ниже частотой
пухлявый либа другая у тс
проблемы индейцев, шерифа вообще ни как не интересуют..
не будем джагонами мерится, господа. мне интересно почитать вашу доку
здравствуйте ещё раз, возник вопрос требующий обсуждения
http://www.airspayce.com/mikem/arduino/RadioHead/classRHSoftwareSPI.html
в этой библиотеки нашел описание RHSoftwareSPI она должна менять распиновку подключения к ардуино. как я понял mosi. miso. sck. поменять не выйдит или будит рабоать крайне криво, а вот nsel & niro можно с одной стороны и это не плохо но я вот не совсем понял как
Ещё вопросик про мощьность.
В библиотеке имеем:
По умолчанию выставляется 8DB. На максимальной (20DB) виснит сразу. На 17DB после нескольких секунд работы. На 14DB все работет нормально. Может модуль создает сильную помеху? Или в чем причина?
проблема с питанием
По мощьности? т.е. AMS1117 3.3 не достаточно? Она даже не нагревается, т.е. среднее потребление не очень высокое.
а конденсатор поставил?
От такой платы + БП 12V питаю:
подцепись мультиметром и измеряй напряжение при передаче. если есть осцил то лучше им
то что проблема в питании вероятнее чем в нерабочей либе
ну я тоже думаю, что скорее всего с физикой проблемы, а не с математикой :)
осцилографа нету :(, а мультиметр показывает четко 3.25V
попробую завтра ещё такой БП:
всегда показывает 3.25? и при передаче тоже?
даже без нагрузки
если все норм с питанием значит проблема в самом модуле или программе
а если запаять конденсатор прямо на модуль по питанию как на модуляъ nrf24l01. у тебя же все на проводах. контакты может плохие, провода длинные
И таки да, с блоком из #28 работает на 20DB
мне помогло самодельное ардуино, использую её без кварца, так менее надёжно но увы я ограничен в размерах и стабилизатор AMS1117 для питания радиомодуля
http://samopal.pro/atmega328-arduino/#comment-1032
и вопрос, в описании я нашол полезную функцию enum RHGenericDriver::RHMode, но так и не понял как это применить, идея такова, отправлять радиомодуль в режим сна чтобы экономить батареи и выводить его из сна пока его не разбудит его радиосигнал с передатчика, может кто сталкивался с этой проблемой ?
ребята, кто занимался програмной проблемой экономии энергии радиомодуля, вобщем идея какая, если радиомодуль не используется он уходит в режим сна и выходит из него по необходимости, очень мало про это написанно не могу понять как это реализованно
господа
пытаюсь подключить rf22d к ардуино на atmega128 всё как пологается шина SPI miso-d11/mosi-d10/sck-d9/ss-d8, и int0 на d16
пишит init failed, в общем он неработает.
ктонибудь подключал радиомодуль к нестандартной ардуине ??
странное дело, на atmega328 всё работает, даже если програмно изменить пины шины spi. даже собрал пару проэктов на этой основе
увы для моего следующего проэкта нехватает памяти пришлось взять чип atmega128 и памяти побольше и пинов влезет всё дисплей, gps модуль, радиомодуль и компас, даже радио можно прикрутить, но увы пока запнулся на rf22b.
попробую ещё вырианты, но хотелось перенять опыт тех кто работал с этими модулями более плотно
люди помагите в 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()); получаю данные с датчика температур