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); }:) а может в приемнике надо так ?
может, я же не эксперт)
дядь, да ты гений, работает просто збс, огромное спасибо)