I have 2 nRF24L01, one in an Arduino Nano and the other in an ESP32. i can't make them talk to eachother.
Transceiver code:
#include <Arduino.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <SPI.h>
RF24 radio(4, 5);
const int joyAXp = 27; // Pino Joystick A - X
const int joyAYp = 26; // Pino Joystick A - Y
const int phP1 = 32; // Pino PonteH 1
const int phP2 = 35; // Pino PonteH 2
int MidpointEsqX = 119;
int MidpointEsqY = 119;
int MidpointDirX = 119;
int MidpointDirY = 119;
int Tolerance = 0;
int joyAX = 0; // Joystick Esquerdo X (0-255) (Midpoint: 119)
int joyAY = 0; // Joystick Esquerdo Y (0-255) (Midpoint: 119)
struct MeuControleRemoto {
boolean BotEsqCim = 0;
boolean BotEsqEsq = 0;
boolean BotEsqDir = 0;
boolean BotEsqBai = 0;
boolean BotDirCim = 0;
boolean BotDirEsq = 0;
boolean BotDirDir = 0;
boolean BotDirBai = 0;
boolean Mts1 = 0;
boolean Mts2 = 0;
boolean Mts3 = 0;
boolean Mts4 = 0;
byte Pot1 = 0;
byte Pot2 = 0;
byte Pot3 = 0;
byte Pot4 = 0;
byte JoyDireitaX = 127;
byte JoyDireitaY = 127;
byte JoyEsquerdaX = 127;
byte JoyEsquerdaY = 127;
};
MeuControleRemoto ControleRemoto;
const int numReadings = 10; // Número de leituras para calcular a média
// Função para calcular a média de 10 leituras do joystick para uma leitura mais limpa:
int getSmoothedJoystickValue(int pin) {
static int readingsX[numReadings] = {0}; // Array para armazenar as leituras do eixo X
static int readingsY[numReadings] = {0}; // Array para armazenar as leituras do eixo Y
static int indexX = 0; // Índice da leitura atual para o eixo X
static int indexY = 0; // Índice da leitura atual para o eixo Y
static long totalX = 0; // Soma das leituras do eixo X
static long totalY = 0; // Soma das leituras do eixo Y
static int countX = 0; // Contador de leituras para o eixo X
static int countY = 0; // Contador de leituras para o eixo Y
// Variáveis para armazenar a média
int average = 0;
// Subtrai a leitura mais antiga do total
if (pin == joyAXp) {
totalX -= readingsX[indexX];
// Lê o novo valor do joystick
int newValue = analogRead(pin);
// Armazena o novo valor no array
readingsX[indexX] = newValue;
// Adiciona o novo valor ao total
totalX += newValue;
// Incrementa o índice da leitura atual
indexX = (indexX + 1) % numReadings;
// Incrementa o contador de leituras até atingir o número desejado
if (countX < numReadings) {
countX++;
}
// Calcula a média
average = totalX / countX;
} else if (pin == joyAYp) {
totalY -= readingsY[indexY];
// Lê o novo valor do joystick
int newValue = analogRead(pin);
// Armazena o novo valor no array
readingsY[indexY] = newValue;
// Adiciona o novo valor ao total
totalY += newValue;
// Incrementa o índice da leitura atual
indexY = (indexY + 1) % numReadings;
// Incrementa o contador de leituras até atingir o número desejado
if (countY < numReadings) {
countY++;
}
// Calcula a média
average = totalY / countY;
}
return average;
}
void setup() {
Serial.begin(115200);
pinMode(joyAXp, INPUT);
pinMode(joyAYp, INPUT);
pinMode(phP1, OUTPUT);
pinMode(phP2, OUTPUT);
radio.begin(); //Inicialidando o MÓDULO RF24l01 para comunicação.
radio.setAutoAck(false); // Desativando pacotes ACK (Pacote de Confirmação de Recebimento de Mensagem)
radio.setChannel(100); // Configurando Módulo para operar no canal numéro 1 (você pode escolher um canal de 0 a 127) (Canal Padrão é o 76)
radio.setDataRate(RF24_250KBPS); // Configurando Módulo para operar em uma taxa de 250kbps (Menor taxa de dados possível para um maior alcance do rádio)
radio.setPALevel(RF24_PA_HIGH); // Configurando Módulo para transmitir em potência máxima
radio.powerUp(); // Ativando Módulo, caso entre em estado de baixo consumo.
radio.openWritingPipe(0xE8E8F0F0E1LL); // Abrindo o meio de comunicação entre transmissor e receptor e configurando endereço de comunicação(0xE8E8F0F0E1LL)
radio.stopListening(); // Interrompendo mecanismos de recepção "escuta" do Módulo
}
void loop() {
delay(20);
joyAX = map(getSmoothedJoystickValue(joyAXp), 0,4095, 0, 255);
joyAY = map(getSmoothedJoystickValue(joyAYp), 0,4095, 0, 255);
if ((joyAX != ControleRemoto.JoyEsquerdaX) || (joyAY != ControleRemoto.JoyEsquerdaY)) {
if ((joyAX > (MidpointEsqX + Tolerance)) || ((joyAX < (MidpointEsqX - Tolerance)))) {
ControleRemoto.JoyEsquerdaX = joyAX;
}
if ((joyAY > (MidpointEsqY + Tolerance)) || ((joyAY < (MidpointEsqY - Tolerance)))) {
ControleRemoto.JoyEsquerdaY = joyAY;
}
/*
Serial.print("joyAX: ");
Serial.print(joyAX);
Serial.print(" joyAY: ");
Serial.println(joyAY);
*/
}
for (int i = 0; i < 5; i++) {
//Serial.println(ControleRemoto.JoyEsquerdaX);
radio.write(&ControleRemoto, sizeof(ControleRemoto));
}
}
Receiver code:
#include "RF24.h"
#include "nRF24L01.h"
#include "Servo.h"
#include <SPI.h>
struct MeuControleRemoto {
boolean BotEsqCim = 0;
boolean BotEsqEsq = 0;
boolean BotEsqDir = 0;
boolean BotEsqBai = 0;
boolean BotDirCim = 0;
boolean BotDirEsq = 0;
boolean BotDirDir = 0;
boolean BotDirBai = 0;
boolean Mts1 = 0;
boolean Mts2 = 0;
boolean Mts3 = 0;
boolean Mts4 = 0;
byte Pot1 = 0;
byte Pot2 = 0;
byte Pot3 = 0;
byte Pot4 = 0;
byte JoyDireitaX = 127;
byte JoyDireitaY = 127;
byte JoyEsquerdaX = 127;
byte JoyEsquerdaY = 127;
};
MeuControleRemoto ControleRemoto;
Servo servo;
RF24 radio(7, 8);
int LastServoPos = 90;
void setup() {
radio.begin(); //Inicialisando o MÓDULO RF24l01 para comunicação.
radio.setAutoAck(false); // Desativando pacotes ACK (Pacote de Confirmação de Recebimento de Mensagem)
radio.setChannel(100); // Configurando canal de transmissão do rádio (você pode escolher um canal de 0 a 127)
radio.setDataRate(RF24_250KBPS); // Configurando Módulo para operar em uma taxa de 250kbps (Menor taxa de dados possível para um maior alcance do rádio)
radio.setPALevel(RF24_PA_HIGH); // Configurando Módulo para transmitir em potência máxima (a título de conhecimento, pois aqui o rádio está configurado apenas como receptor)
radio.powerUp(); // Ativando Módulo, caso entre em estado de baixo consumo.
radio.startListening(); //Inicializando o MÓDULO para 'escutar' as requisições enviadas pelo transmissor.
radio.openReadingPipe(1, 0xE8E8F0F0E1LL); // Abrindo o meio de comunicação entre transmissor e receptor, também configurando endereço de comunicação(0xE8E8F0F0E1LL)
Serial.begin(9600);
servo.attach(9);
}
void loop() {
delay(20);
Serial.println("1");
if (radio.available()) { //verificando se há dados enviados pelo tranmissor.
Serial.println("2");
radio.read(&ControleRemoto, sizeof(ControleRemoto)); // Recebendo dados enviado pelo transmissor
if (ControleRemoto.JoyEsquerdaX != LastServoPos) {
Serial.println(ControleRemoto.JoyEsquerdaX);
servo.write(map(ControleRemoto.JoyEsquerdaX, 0,255, 10,170));
LastServoPos = map(ControleRemoto.JoyEsquerdaX, 0,255, 10,170);
}
}
}
- I've already checked the connections on both nRF24.
- I'm powering the boards using my laptop.
- Both nRF24 are being powered by the boards' 3v3 ports.
- Also both nRF24 are working.
I know they are working because I loaded the scanner program into the receiver and when i turned the transceiver, the receiver showed a lot of interference on the serial
They don't have a capacitor yet. Which one should i use: 10uf, 15uf, 47uf, or 100uf?
3 posts - 2 participants