nrf24l01 и 2 ардуины

Den1234567890
Offline
Зарегистрирован: 23.02.2018

Всем привет, i need help! кто то может мне объяснить почему не работают скетчи?

Суть в том что есть 2 ардуино, на одной датчик MPU6050(аксилерометр), вот скетч

#include <Wire.h>
#include <MPU6050.h>
#include <SPI.h>                                          // Подключаем библиотеку для работы с шиной SPI
#include <nRF24L01.h>                                     // Подключаем файл настроек из библиотеки RF24
#include <RF24.h>                                         // Подключаем библиотеку для работы с nRF24L01+
RF24           radio(9, 10);                              // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
int            data[2];                                   // Создаём массив для передачи данных
MPU6050 sensor ;
int16_t ax, ay, az ;
int16_t gx, gy, gz ;

void setup(){
    Wire.begin ( );
    Serial.begin  (9600); 
    Serial.println  ( "Initializing the sensor" ); 
    sensor.initialize ( ); 
    Serial.println (sensor.testConnection ( ) ? "Successfully Connected" : "Connection failed"); 
    delay (1000); 
    Serial.println ( "Taking Values from the sensor" );
    delay (1000);
    radio.begin();                                        // Инициируем работу nRF24L01+
    radio.setChannel(5);                                  // Указываем канал передачи данных (от 0 до 127), 5 - значит передача данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
    radio.setDataRate     (RF24_1MBPS);                   // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
    radio.setPALevel      (RF24_PA_HIGH);                 // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
    radio.openWritingPipe (0x1234567890LL);               // Открываем трубу с идентификатором 0x1234567890 для передачи данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)
}

void loop(){
    sensor.getMotion6 (&ax, &ay, &az, &gx, &gy, &gz);;
    data[0] = ax;                             // считываем показания Trema слайдера с вывода A1 и записываем их в 0 элемент массива data
    data[1] = ay;                             // считываем показания Trema потенциометра с вывода A2 и записываем их в 1 элемент массива data
    radio.write(&data, sizeof(data));        // отправляем данные из массива data указывая сколько байт массива мы хотим отправить
    Serial.print("ax");Serial.print(ax);
    Serial.print("aу");Serial.print(ay);
}

на второй 2 сервопривода, вот скетч

#include <SPI.h>                                          // Подключаем библиотеку  для работы с шиной SPI
#include <nRF24L01.h>                                     // Подключаем файл настроек из библиотеки RF24
#include <RF24.h>                                         // Подключаем библиотеку  для работы с nRF24L01+
//#include <iarduino_4LED.h>                                // Подключаем библиотеку  для работы с четырёхразрядным LED индикатором
#include <Servo.h>                                        // Подключаем библиотеку  для работы с сервоприводами
RF24           radio(9, 10);                              // Создаём объект radio   для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
//iarduino_4LED  dispLED(2,3);                              // Создаём объект dispLED для работы с функциями библиотеки iarduino_4LED, с указанием выводов дисплея ( CLK , DIO ) 
Servo          myservo1;                                   // Создаём объект myservo для работы с функциями библиотеки Servo
Servo          myservo2;
int            data[2];                                   // Создаём массив для приёма данных
int ay;
int ax;
void setup(){
    delay(1000);
    
    myservo2.attach(4);                                    // Подключаем объект myservo к 4 выводу Arduino
    myservo1.attach(3);
//    dispLED.begin();                                      // Инициируем работу индикатора
    radio.begin();                                        // Инициируем работу nRF24L01+
    radio.setChannel(5);                                  // Указываем канал приёма данных (от 0 до 127), 5 - значит приём данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
    radio.setDataRate     (RF24_1MBPS);                   // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
    radio.setPALevel      (RF24_PA_HIGH);                 // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
    radio.openReadingPipe (1, 0x1234567890LL);            // Открываем 1 трубу с идентификатором 0x1234567890 для приема данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)
    radio.startListening  ();                             // Включаем приемник, начинаем прослушивать открытую трубу
//  radio.stopListening   ();                             // Выключаем приёмник, если потребуется передать данные

}

void loop(){
  
    if(radio.available()){                                // Если в буфере имеются принятые данные
      
        radio.read(&data, sizeof(data));                  // Читаем данные в массив data и указываем сколько байт читать
        data[0]=ax;
        data[1]=ay;
        Serial.print(ax);
        myservo1.write(map(ax,-17000,17000,0,180));                           // Выводим показания Trema слайдера на индикатор
        myservo2.write(map(ay,-17000,17000,0,180));         // Поворачиваем сервопривод на угол заданный Trema потенциометром
    }
}

так вот в чем дело, первая вроде отправляет, всё норм, но у второй 0 реакции, кто то подскажет что не так? 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

а если добавить в передатчике после 25 строки

radio.stopListening  (); 

 

Den1234567890
Offline
Зарегистрирован: 23.02.2018

так оно  откроет трубу и сразу закроет, не будут передаваться данные

Den1234567890
Offline
Зарегистрирован: 23.02.2018

переделал приемник, теперь вот так и все ровно реакции 0

#include <SPI.h>                                          // Подключаем библиотеку  для работы с шиной SPI
#include <nRF24L01.h>                                     // Подключаем файл настроек из библиотеки RF24
#include <RF24.h>                                         // Подключаем библиотеку  для работы с nRF24L01+
#include <Servo.h>                                        // Подключаем библиотеку  для работы с сервоприводами
RF24           radio(9, 10);                              // Создаём объект radio   для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
//iarduino_4LED  dispLED(2,3);                              // Создаём объект dispLED для работы с функциями библиотеки iarduino_4LED, с указанием выводов дисплея ( CLK , DIO ) 
Servo          myservo1;                                   // Создаём объект myservo для работы с функциями библиотеки Servo
Servo          myservo2;
int            data[2];                                   // Создаём массив для приёма данных
int16_t ay;
int16_t ax;
void setup(){
    delay(1000);
    
    myservo2.attach(4);                                    // Подключаем объект myservo к 4 выводу Arduino
    myservo1.attach(3);
    radio.begin();                                        // Инициируем работу nRF24L01+
    radio.setChannel(5);                                  // Указываем канал приёма данных (от 0 до 127), 5 - значит приём данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
    radio.setDataRate     (RF24_1MBPS);                   // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
    radio.setPALevel      (RF24_PA_HIGH);                 // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
    radio.openReadingPipe (1, 0x1234567890LL);            // Открываем 1 трубу с идентификатором 0x1234567890 для приема данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)
    radio.startListening  ();                             // Включаем приемник, начинаем прослушивать открытую трубу
//  radio.stopListening   ();                             // Выключаем приёмник, если потребуется передать данные

}

void loop(){
  
    if(radio.available()){                                // Если в буфере имеются принятые данные
      
        radio.read(&data, sizeof(data));                  // Читаем данные в массив data и указываем сколько байт читать
        data[0]=ax;
        data[1]=ay;
        Serial.print(ax);
        myservo1.write(map(ax,-17000,17000,0,180));                           // Выводим показания Trema слайдера на индикатор
        myservo2.write(map(ay,-17000,17000,0,180));         // Поворачиваем сервопривод на угол заданный Trema потенциометром
    }
}

 

Den1234567890
Offline
Зарегистрирован: 23.02.2018

получилось добиться реакции, но видит только 0 и все

#include <SPI.h>                                          // Подключаем библиотеку  для работы с шиной SPI
#include <nRF24L01.h>                                     // Подключаем файл настроек из библиотеки RF24
#include <RF24.h>                                         // Подключаем библиотеку  для работы с nRF24L01+
#include <Servo.h>                                        // Подключаем библиотеку  для работы с сервоприводами
RF24           radio(9, 10);                              // Создаём объект radio   для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
//iarduino_4LED  dispLED(2,3);                              // Создаём объект dispLED для работы с функциями библиотеки iarduino_4LED, с указанием выводов дисплея ( CLK , DIO ) 
Servo          myservo1;                                   // Создаём объект myservo для работы с функциями библиотеки Servo
Servo          myservo2;
int            data[2];                                   // Создаём массив для приёма данных
int16_t ay;
int16_t ax;
void setup(){
    delay(1000);
    Serial.begin  (9600);
    myservo2.attach(4);                                    // Подключаем объект myservo к 4 выводу Arduino
    myservo1.attach(3);
    radio.begin();                                        // Инициируем работу nRF24L01+
    radio.setChannel(9);                                  // Указываем канал приёма данных (от 0 до 127), 5 - значит приём данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
    radio.setDataRate     (RF24_1MBPS);                   // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
    radio.setPALevel      (RF24_PA_HIGH);                 // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
    radio.openReadingPipe (1, 0xF0F1F2F3F4LL);            // Открываем 1 трубу с идентификатором 0x1234567890 для приема данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)
    radio.startListening  ();                             // Включаем приемник, начинаем прослушивать открытую трубу
//  radio.stopListening   ();                             // Выключаем приёмник, если потребуется передать данные

}

void loop(){
  
    if(radio.available()){                                // Если в буфере имеются принятые данные
      
        radio.read(&data, sizeof(data));                  // Читаем данные в массив data и указываем сколько байт читать
        data[0]=ax;
        data[1]=ay;
        Serial.print("ах");
        Serial.print(ax);
        Serial.print("ау");
        Serial.print(ay);
        myservo1.write(map(ax,-17000,17000,0,180));                           // Выводим показания Trema слайдера на индикатор
        myservo2.write(map(ay,-17000,17000,0,180));         // Поворачиваем сервопривод на угол заданный Trema потенциометром
    }
}

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

конденсатор по питанию nrf поставь

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

Den1234567890 пишет:

так оно  откроет трубу и сразу закроет, не будут передаваться данные

труба открывается этой командой

radio.openWritingPipe (0x1234567890LL);  

а вам надо прекратить слушать эфир и передавать и если мне память не изменяет то в библиотеке

radio.startListening  ();

автоматически запускается

 

Den1234567890
Offline
Зарегистрирован: 23.02.2018

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

#include <Wire.h>
#include <MPU6050.h>
#include <SPI.h>                                          // Подключаем библиотеку для работы с шиной SPI
#include <nRF24L01.h>                                     // Подключаем файл настроек из библиотеки RF24
#include <RF24.h>                                         // Подключаем библиотеку для работы с nRF24L01+
RF24           radio(9, 10);                              // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
int            data[2];                                   // Создаём массив для передачи данных
MPU6050 sensor ;
int16_t ax, ay, az ;
int16_t gx, gy, gz ;
void setup(){
    Wire.begin ( );
    Serial.begin  (9600);
    Serial.println  ( "Initializing the sensor" );
    sensor.initialize ( );
    Serial.println (sensor.testConnection ( ) ? "Successfully Connected" : "Connection failed");
    delay (1000);
    Serial.println ( "Taking Values from the sensor" );
    delay (1000);
    radio.begin();                                        // Инициируем работу nRF24L01+
    radio.setChannel(9);                                  // Указываем канал передачи данных (от 0 до 127), 5 - значит передача данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
    radio.setDataRate     (RF24_1MBPS);                   // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
    radio.setPALevel      (RF24_PA_HIGH);                 // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
    radio.openWritingPipe (0xF0F1F2F3F4LL);               // Открываем трубу с идентификатором 0x1234567890 для передачи данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)
    
}
void loop(){
    sensor.getMotion6 (&ax, &ay, &az, &gx, &gy, &gz);;
    data[0] = ax;                             // считываем показания Trema слайдера с вывода A1 и записываем их в 0 элемент массива data
    data[1] = ay;                             // считываем показания Trema потенциометра с вывода A2 и записываем их в 1 элемент массива data
    //radio.write(&data, sizeof(data));        // отправляем данные из массива data указывая сколько байт массива мы хотим отправить
    radio.write(&ax, sizeof(ax));
    radio.write(&ay, sizeof(ay));
    Serial.print("ax");Serial.print(ax);
    Serial.print("aу");Serial.print(ay);
}

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
radio.write(&ax, sizeof(ax));
radio.write(&ay, sizeof(ay));

:) а может в приемнике надо так ?

ax=data[0] ;
ay=data[1] ;  

 

Den1234567890
Offline
Зарегистрирован: 23.02.2018

может, я же не эксперт)

Den1234567890
Offline
Зарегистрирован: 23.02.2018

дядь, да ты гений, работает просто збс, огромное спасибо)