nrf24l01+mega+nano
- Войдите на сайт для отправки комментариев
Пт, 01/03/2013 - 01:17
В наличии одна мега, одна нано и 4 радиомодуля nrf24l01. Был небольшой тестовый проект - на ардуину нано собирались данные с датчиков
#include <duino.h>
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#include <DHT.h>
DHT dht(3, DHT22); //Создаем датчик DHT11 на 3 пине
void setup(){
Serial.begin(9600);
Mirf.cePin = 8;
Mirf.csnPin = 10;
dht.begin(); //Инициализируем датчик DHT
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.setRADDR((byte *)"nano");
Mirf.payload = 8;
Mirf.config();
Serial.println("Beginning ... ");
}
void loop(){
float t1 = 0;
float t = dht.readTemperature();
float h = dht.readHumidity();
unsigned long time = millis();
Serial.print("Local_temp=");
Serial.println(t);
Serial.println(h);
duino2_ temphum = {t,h}; // передаём температуру
Serial.println(temphum.Y);
Serial.println(temphum.Z);
Mirf.setTADDR((byte *)"mega");
Mirf.send((byte *)&temphum);
while(Mirf.isSending()){
}
Serial.println("Finished sending");
delay(1000);
}
И потом пересылались на мегу где выводились на lcd с включаемой по движению подсветкой
#include <duino.h>
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
int backLight = 13;
const int analogInPin = A0;
int sensorValue = 0;
void setup(){
Serial.begin(9600);
pinMode(backLight, OUTPUT);
Mirf.csnPin = 53;
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.payload = 8;
Mirf.config();
Serial.println("Listening...");
}
void loop(){
//byte data[Mirf.payload];
float t = 0;
float h = 0;
duino2_ temphum = {t,h};
if(!Mirf.isSending() && Mirf.dataReady())
{
Mirf.getData((byte *)&temphum);
Serial.println(temphum.Y);
Serial.println(temphum.Z);
lcd.begin(16,2);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temperatyra: ");
lcd.print(temphum.Y);
lcd.setCursor(0,1);
lcd.print("Vlajnost: ");
lcd.print(temphum.Z);
lcd.print("%");
delay(500);
sensorValue = analogRead(analogInPin);
if (sensorValue >=500){
digitalWrite(backLight, HIGH);
}
else
digitalWrite(backLight, LOW);
}
//Serial.println(data);
//Serial.println(sensorValue);
}
Все до поры до времени работало, потом после какой то сборки-переборки и других проектов, было все снова собрано, подключено и перепроверено по нескольку раз, но так ничего и не заработало. В ходе экспериментов было выявлено, что если мега выступает в качестве передатчика то нано нормально принимает данные, а если наоборот то мега ничего не может принять, в чем может быть проблема? Все пины при подключении вызванивались несколько раз, подключено все верно :(
А куда со стороны Меги у вас подключен вывод модуля СЕ ?
А куда со стороны Меги у вас подключен вывод модуля СЕ ?
По дефолту на 8й и вручную используя Mirf.cePin на другие переключал толку ноль
Так и где он у вас проинициализирован в коде?
Ну как я понял из описания библиотеки он 8й пин использует по умолчанию, можно переназначить на другой если надо, но даже когда менял в коде и менял подключение например на 9й и дописывал Mirf.cePin = 9 толку небыло
Да есть такое, а со стороны меги адреса не должны быть прописаны?
хотя бы адрес приема?
Да есть такое в этой версии забыл дописать, но с ним ничего не изменилось (
Да и просто там с библиотекой есть скетчи примеры пинг_серв и пинг_клиент и с ними тоже нифига теперь не работает, самое интересное что думал мол проблема в модулях, сегодня приехали новые и такая же ситуация, а на старых если на питания модуля подать вместо 3.3в подать 5в, то начинает хоть как то работать
5В подавать не стоит - спалите модули
Кстати, дома больше нет других, работающих модулей nrf24?
У меня была проблема, что два "модуля" работали между собой прекрасно. А вот когда в систему стал добавлять третий - были большие затыки и ничего толком не работало. Решение описал тут: http://arduino.ru/forum/proekty/peredacha-temperatury-s-datchikov-dht11-ds18b20-cherez-nrf24l01#comment-9619
5В подавать не стоит - спалите модули
Кстати, дома больше нет других, работающих модулей nrf24?
У меня была проблема, что два "модуля" работали между собой прекрасно. А вот когда в систему стал добавлять третий - были большие затыки и ничего толком не работало. Решение описал тут: http://arduino.ru/forum/proekty/peredacha-temperatury-s-datchikov-dht11-ds18b20-cherez-nrf24l01#comment-9619
Да я знаю что 5в не стоит, просто решил проверить и каким то чудом заработало :) Модулей всего 4 передавать только между двумя пробовал, но тасовал их по разному эффект тот же. Мог на меге заглючить один из выводов SPI? MISO например и теперь не передает данные к мастеру, и как его проверить можно? Желательно без осцилографа)
Самое интересное что в первоначальном варианте все работало, данные передавались-принимались и отлично выводились
Если вдруг кто столкнется с такой же проблемой, то решение было найдено на другом форуме:
The power supply on the megas can mess up this module. Try adding a large capacitor (>1uf) across 3.3v and ground
И правда установка конденсатора помогла решить проблему.
угу.. "блокировочные конденсаторы" - их вообще полезно ставить
Добрый день.
Почти такаяже ситуация. Есть 3 дуины: UNO (приемник), Mega256 (передатчик) и Pro Mini (передатчик).
у Mega и Pro Mini код один и тотже:
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include <avr/sleep.h> #include <avr/wdt.h> #include <Wire.h> #include <DHT.h> //int battVolts; int count; //переменная для счётчика циклов volatile boolean wdt_tripped=1; RF24 radio(9,10); // было 8,7 const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL }; DHT dht(6, DHT22); //Создаем датчик DHT22 на 6 пине //создаём структуру для передачи 4х значений typedef struct{ int W; int X; float Y; float Z; } B_t; B_t duino2; //режим сна для МК void system_sleep() { delay(2); // Wait for serial traffic _SFR_BYTE(ADCSRA) &= ~_BV(ADEN); // Switch ADC off set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sleep_mode(); // System sleeps here sleep_disable(); _SFR_BYTE(ADCSRA) |= _BV(ADEN); // Switch ADC on } void wdt_interrupt_mode() { wdt_reset(); WDTCSR |= _BV(WDIE); // Restore WDT interrupt mode } ISR(WDT_vect) { wdt_tripped=1; // set global volatile variable } void setup() { Serial.begin(9600); wdt_disable(); wdt_reset(); wdt_enable(WDTO_8S); //пробуждение каждые 8 сек count = 0; dht.begin(); //Инициализируем датчик DHT radio.begin(); radio.openWritingPipe(pipes[0]); radio.openReadingPipe(1,pipes[1]); } void loop(void) { //тут можно увеличить интервал времени между отправками данных по RF24 за счёт счётчика циклов Serial.println("Wakeup duino"); wdt_interrupt_mode(); if (wdt_tripped) { count++; wdt_tripped = 0; Serial.print("Run mine module #"); Serial.println(count); if (count == 9) { // каждые 8 сек * 9 циклов = 72 секунды делаем измерения и отправляем на базу: Serial.println("Reding sensor DHT"); float h = dht.readHumidity(); float t = dht.readTemperature(); delay(20); int vb = getBandgap (); // записываем в переменную vb значение замеренного напряжения с батарии //записываем в структуру данные для передачи if (isnan(t) || isnan(h)) { duino2.W = 11; // этот номер передатчика для идентификации в принятом пакете данных duino2.X = vb; // передаём напряжение батареи duino2.Y = 0; duino2.Z = 0; } else { duino2.W = 11; // этот номер передатчика для идентификации в принятом пакете данных duino2.X = vb; // передаём напряжение батареи duino2.Y = t; // передаём температуру duino2.Z = h; // передаем влажность } Serial.print("Controller = "); Serial.println(duino2.W); Serial.print("Battery voltage= "); Serial.println(duino2.X); Serial.print("Temperature = "); Serial.println(duino2.Y); Serial.print("Humidity = "); Serial.println(duino2.Z); radio.powerUp(); //подаём питание на NRF24 radio.stopListening(); // отключаем режим приёма Serial.println("Start send"); bool ok = radio.write( &duino2, sizeof(duino2) ); //отправляем данные по RF24 Serial.println("End send"); delay(20); count = 0; radio.powerDown(); //отключаем питание RF24 } } system_sleep(); //МК засыпает } //внутренний контроль напряжения на батареи const long InternalReferenceVoltage = 1062; int getBandgap () { // REFS0 : Selects AVcc external reference // MUX3 MUX2 MUX1 : Selects 1.1V (VBG) ADMUX = _BV (REFS0) | _BV (MUX3) | _BV (MUX2) | _BV (MUX1); ADCSRA |= _BV( ADSC ); // start conversion while (ADCSRA & _BV (ADSC)) { } // wait for conversion to complete int results = (((InternalReferenceVoltage * 1024) / ADC) + 5) / 10; return results; } // end of getBandgapУ приемника такой:
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" typedef struct{ int W; int X; float Y; float Z; } B_t; B_t duino2; RF24 radio(9,10); //RF24 radio(uint8_t _cepin, uint8_t _cspin); const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL }; void setup() { Serial.begin(9600); radio.begin(); radio.openWritingPipe(pipes[1]); radio.openReadingPipe(1,pipes[0]); radio.startListening(); } void loop(void) { //Serial.println("Begining."); if ( radio.available() ) { bool done = false; while (!done) { done = radio.read( &duino2, sizeof(duino2) ); Serial.print("Controller = "); Serial.println(duino2.W); Serial.print("Battery voltage= "); Serial.println(duino2.X); Serial.print("Temperature = "); Serial.println(duino2.Y); Serial.print("Humidity = "); Serial.println(duino2.Z); } } }Только Mega работает нормально, а Pro Mini ничего абсолютно не передает в эфир. Вот схема для последней:

В этой схеме менял Pro Mini на Mega - все работает. Возвращаю обратно - опять тишина.
Пробовал запитывать схему через модуль питания мекетки MB102, такой: http://www.ebay.com/itm/170886733144 на дуину подавал +5В, на NRF24L01 +3.3В с общей землей - все равно не работает.
Куда копать уже мысли кончились.
Оказывается напутал всетаки с питанием.
Та что выше схема, скорее всего будет работать только с Arduino Pro Mini 3.3V 8M (как приедет буду проверять).
Для Arduino Pro Mini 5V 16M необходимо добавить стабилизатор AMS1117-3.3 или LM1117-3.3. Вот с такой схемой работает все нормально:
В наличии одна мега, одна нано и 4 радиомодуля nrf24l01. Был небольшой тестовый проект - на ардуину нано собирались данные с датчиков
Доброго времени суток! Начинаю осваивать библиотеки для дуино и появились вопросы. Помогите пожалуйста разобраться с библиотекой SPI применительно к NRF2L01
http://arduino.ru/forum/programmirovanie/rabota-s-spi
я собрался собрался использовать NRF24L01 на 5В от Mega2560б , или так не надо делать? (еще мне будут доступны Mini Micro и UNO, но все они пятивольтовые); прочел в обзоре, что модули NRF24L01 лояльны к входным сигналам 5В:
http://avrproject.ru/publ/kak_podkljuchit/radiomoduli_nrf24l01/2-1-0-92
Почти такаяже ситуация. Есть 3 дуины: UNO (приемник), Mega256 (передатчик) и Pro Mini (передатчик).
у Mega и Pro Mini код один и тотже:
У приемника такой:
Подскажите у вас получилось передавать данные с двух передатчиков и принимать их.
У меня 1 UNO в качестве сервера на ней кроме nrf24l01 еще DS1302 и Ethernet shield с SD картой.
В качестве передатчиков 2 NANO с nrf24l01 и HT11-HT22.
Пробовал ваш скетч. Немного переделав под себя.
Все модули работают корректно и выдают в СОМ порт то, что задумано.
Все нормально работает только когда один передатчик в эфире.
Когда включаю второй. данные идут в разнобой. правильная комбинация иногда совпадает, но редко, примерно 1 раз в 26 сек, иногда реже.
Имена всех переменных иддивидуальны, имена контроллеров доже разные.
может быть есть полность рабочий комплект скетчей на два передатчика и один приемник.
В идеале планируется добиться получения с 4-х клиентов информацию с нескольких подключенных к ним датчиков (разных-температуры, растояния, газа, света) на центральный блок. с него отдавать инфу на WEB морду, записывать лог с датчиков на SD с привязкой ко времени. И обратная связь: т.е. возможность управлять 2-3 реле на каждом клиенте.
По отдельности уже все опробовано, осталось увязать все в комплекс и тут возникла описанная выше проблема.
Буду признателен за помощь и подсказки, ссылки по теме.
помогите пожалуйста
на меге подключаю sd card и nrf24l01 по шине spi начинает конфликтовать nrf24l01 а отдельно все работает
что надо при этом сделать
Вангую, что пин Chip Select (CS) для обоих устройств задан один и тот же. Он для каждого устройства должен быть свой.
нет для обоих разный
для одного 53
для другого 47
передатчик
передатчик
передатчик #include <SPI.h> #include <SD.h> #include <Wire.h> #include <DS1307.h> // written by mattt on the Arduino forum and modified by D. Sjunnesson #include "DHT.h" #include <nRF24L01.h> #include <RF24.h> File myFile; // SD CARD #define DHTPIN 13 #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); int SaveTemperature; // Для фиксации температуры. #define JOYSTICK_X A0 #define JOYSTICK_Y A1 // const uint64_t pipe = 0xE8E8F0F0E1LL; // Define the transmit pipe const uint64_t pipes[2] = { 0xF0F0F0F000LL, 0xF0F0F0F0FFLL};// адреса каналов приема и передачи радио сигнала #define CE_PIN 48 #define CSN_PIN 47 RF24 radio(CE_PIN, CSN_PIN); // Create a Radio //переменная для радио кодов int radiocode[1]; int joystick[2]; // 2 element array holding Joystick readings void setup() { // Open serial communications and wait for port to open: Serial.begin(9600); pinMode(53, OUTPUT); if (!SD.begin(53)) { Serial.println("initialization failed!"); return; } // radio.begin(); // radio.openWritingPipe(pipe); //настройки для радио модуля NRF24L01+ 2.4GHz radio.begin(); radio.setDataRate(RF24_250KBPS); // Скорость передачи radio.setChannel(100); // Номер канала от 0 до 127 radio.setRetries(15,15); // Кол-во попыток и время между попытками radio.openWritingPipe(pipes[1]); // Открываем канал передачи radio.openReadingPipe(1, pipes[0]); // Открываем один из 6-ти каналов приема radio.startListening(); // Начинаем слушать эфир SDcardWrite(); // Запускаем функцию записи на SD card. // Установка часов если надо // RTC.stop(); // RTC.set(DS1307_SEC,1); //set the seconds // RTC.set(DS1307_MIN,37); //set the minutes // RTC.set(DS1307_HR,11); //set the hours // RTC.set(DS1307_DOW,4); //set the day of the week // RTC.set(DS1307_DATE,29); //set the date // RTC.set(DS1307_MTH,9); //set the month // RTC.set(DS1307_YR,14); //set the year // RTC.start(); // проверка сенсора температуры Serial.println("DHT11 test!"); dht.begin(); SaveTemperature = dht.readTemperature(); // Фиксируем текущую температуру. } // *************************************** // ------------------- // Делаем функцию для чтения с SD card и вывода в Serial монитор. void SDcardRead() { // re-open the file for reading: myFile = SD.open("dimasens.txt"); if (myFile) { Serial.println("dimasens.txt:"); // read from the file until there's nothing else in it: while (myFile.available()) { Serial.write(myFile.read()); } // close the file: myFile.close(); } else { // if the file didn't open, print an error: Serial.println("error opening dimasens.txt"); } } void SDcardWrite() // Делаем функцию, для записи на SD card. { myFile = SD.open("dimasens.txt", FILE_WRITE); if (myFile) { Serial.print("Writing to dimasens.txt..."); myFile.print("\nActual time : "); myFile.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true myFile.print(":"); myFile.print(RTC.get(DS1307_MIN,true));//read minutes without update (false) myFile.print(":"); myFile.print(RTC.get(DS1307_SEC,true));//read seconds myFile.print(" "); // some space for a more happy life myFile.print(" -- "); myFile.print(RTC.get(DS1307_DATE,true));//read date myFile.print("/"); myFile.print(RTC.get(DS1307_MTH,true));//read month myFile.print("/"); myFile.println(RTC.get(DS1307_YR,true)); //read year myFile.print(" -- "); myFile.print("Humidity: "); myFile.print(dht.readHumidity()); // Значения влажности. myFile.print(" %\t"); myFile.print("Temperature: "); myFile.print(dht.readTemperature()); // Значения температуры. myFile.println(" *C"); myFile.close(); // close the file: Serial.println("done."); } else { // if the file didn't open, print an error: Serial.println("error opening dimasens.txt"); } } void Joy() { // radio.begin(); // radio.openWritingPipe(pipe); // joystick[0] = analogRead(JOYSTICK_X); // joystick[1] = analogRead(JOYSTICK_Y); // radio.write( joystick, sizeof(joystick) ); radiocode[0] = 140; radio.stopListening(); radio.write(radiocode, 1); radio.startListening(); } // ************************************ void loop() { Joy(); //SDcardWrite(); if (SaveTemperature != dht.readTemperature()) { // Serial.println("pered zapis'u"); SDcardWrite(); // Запускаем функцию записи на SD card. // Снова фиксируем текущее значение температуры. // Serial.println("posle zapisi"); SaveTemperature = dht.readTemperature(); // Serial.println("save temp"); } // Для вывода в Serial монитор данных с SD card. if (Serial.available() > 0) { // Если отправляем через Serial монитор цифру 1 // запускаем функцию SDcardRead. // То есть выводим в Serial монитор всё содержимое файла dimasens.txt if (Serial.read()-48 == 1)SDcardRead(); } // nothing happens after setup*/ } приемник #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> /*-----( Declare Constants and Pin Numbers )-----*/ #define CE_PIN 9 #define CSN_PIN 10 // NOTE: the "LL" at the end of the constant is "LongLong" type const uint64_t pipes[2] = { 0xF0F0F0F000LL, 0xF0F0F0F0FFLL};// адреса каналов приема и передачи радио сигнала //переменная для радио кода int radiocode[1]; /*-----( Declare objects )-----*/ RF24 radio(CE_PIN, CSN_PIN); // Create a Radio /*-----( Declare Variables )-----*/ int joystick[2]; // 2 element array holding Joystick readings void setup() /****** SETUP: RUNS ONCE ******/ { Serial.begin(9600); delay(1000); Serial.println("Nrf24L01 Receiver Starting"); // radio.begin(); // radio.openReadingPipe(1,pipe); // radio.startListening();; radio.begin(); radio.setDataRate(RF24_250KBPS); // Скорость передачи radio.setChannel(100); // Номер канала от 0 до 127 radio.setRetries(15,15); // Кол-во попыток и время между попытками radio.openWritingPipe(pipes[0]); // Открываем канал передачи radio.openReadingPipe(1, pipes[1]); // Открываем один из 6-ти каналов приема radio.startListening(); // Начинаем слушать эфир }//--(end setup )--- void loop() /****** LOOP: RUNS CONSTANTLY ******/ { /* if ( radio.available() ) { // Read the data payload until we've received everything bool done = false; while (!done) { // Fetch the data payload done = radio.read( joystick, sizeof(joystick) ); Serial.print("X = "); Serial.print(joystick[0]); Serial.print(" Y = "); Serial.println(joystick[1]); } } else { Serial.println("No radio available"); } */ // начинаем слушать радио эфир if (radio.available()); bool done = false; while (!done)done = radio.read(radiocode, 1); // если пришёл радио код 101 то digitalWrite(ledPin2, HIGH); if (radiocode[0] == 140) { // Read the data payload until we've received everything bool done = false; while (!done) { // Fetch the data payload done = radio.read( joystick, sizeof(joystick) ); Serial.print("X = "); Serial.print(joystick[0]); Serial.print(" Y = "); Serial.println(joystick[1]); } } else { Serial.println("No radio available"); } }//--(end main loop )--- /*-----( Declare User-written Functions )-----*/ //NONE //*********( THE END )***********мега в передатчике в loop после joy(); есть
if (SaveTemperature != dht.readTemperature())
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
Не стал создавать тему отдельную, мжет тут кт тветит)
Хчу сделать авторизацию "свей" метки 2.4ггц, как на современных автосигнализациях. Аппаратно для этого что потребуется? или проще купить метки от сигнализации и их уже женить с например NRF24L01?