nrf24l01 и 2 ардуины
- Войдите на сайт для отправки комментариев
      Втр, 11/02/2020 - 23:34
          
      Всем привет, 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 реакции, кто то подскажет что не так?
 
          
а если добавить в передатчике после 25 строки
так оно откроет трубу и сразу закроет, не будут передаваться данные
переделал приемник, теперь вот так и все ровно реакции 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 потенциометром } }получилось добиться реакции, но видит только 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 потенциометром } }конденсатор по питанию nrf поставь
так оно откроет трубу и сразу закроет, не будут передаваться данные
труба открывается этой командой
а вам надо прекратить слушать эфир и передавать и если мне память не изменяет то в библиотеке
автоматически запускается
я уже разобрался и вроде получилось, токс серва теперь дрожит сильно, спасибо за помощь
#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); }:) а может в приемнике надо так ?
может, я же не эксперт)
дядь, да ты гений, работает просто збс, огромное спасибо)