RF24L01 + módulo de radio no funciona sin un dedo en él

0

Tengo problemas con mis chips RF24, la configuración:

dos arduino nanos están conectados cada uno a un RF24. Uno está conectado a un joystick para la entrada de datos de prueba, el otro tiene cuatro LED (en lugar de un puente H para pruebas) en cuatro pwm para salida.

  • pasadores de alegría A0, A1, A2
  • pasadores PWM 5,6, 9,10
  • RF24 7,8 + SPI

El remitente no funcionará a menos que toque la parte posterior de los pines, lo estreché hasta el pin MOSI, tocando cada uno con una sonda de metal.

Intenté agregar un pequeño límite a la entrada de alimentación RF24, intenté agregar más capacitancia, intenté agregar mucha más capacitancia.

Probé un condensador de MOSI a tierra.

Intenté torcer cables de tierra alrededor de los cables MOSI y MISO que conectan el NANO y el RF24.

Probé un gran lanzamiento de 10M en MOSI.

Intenté cambiar los niveles de potencia.

Intenté cambiar el canal.

Intenté reducir la velocidad de datos.

Intenté soldar nuevos tableros, o bien no funcionan en absoluto o requieren un dedo para transmitir.

He intentado cambiar las placas RF24, he intentado cambiar las de un lote / fabricación diferente.

Intenté separar las tablas; sin suerte.

Funcionó correctamente en una ocasión, y todo pareció funcionar sin problemas para entonces, pero no ha funcionado sin un dedo desde entonces, y algunas veces no.

Una última pista: una vez que funcionó, pude controlar las luces con el joystick, pero el monitor de serie siempre decía "FALLADO" aunque estaba funcionando claramente.

Aquí está el código arudino que estaba usando. Código de envío:

#include <RF24Network.h>
#include "RF24.h"
#include <SPI.h>

/* Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 */
RF24 radio(7,8);
/**********************************************************/
RF24Network network(radio);      // Network uses that radio
const uint16_t this_send_node = 00;    // Address of our node in Octal format ( 04,031, etc)
const uint16_t other_node = 01;   // Address of the other node in Octal format

struct pair
{
  int x;
  int y;
};

void setup()
{
  Serial.begin(115200);
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);

  SPI.begin();
  radio.begin();
  radio.setPALevel(RF24_PA_LOW);
  radio.setDataRate(RF24_250KBPS);
  network.begin(/*channel*/ 102, /*node address*/ this_send_node);
}

void loop()
{
  network.update();

  RF24NetworkHeader header(/*to node*/ other_node);
  pair p;
  p.x = analogRead(0);
  p.y = analogRead(1);
  int z = analogRead(2);

  bool ok = network.write(header,&p,sizeof(pair));
  if (!ok)
    Serial.println("failed.");
  else
  {
    Serial.print(p.x);
    Serial.print(" ");
    Serial.print(p.y);
    Serial.print(" ");
    Serial.println(z);
  }

  delay(10);
}

Código de recepción:

   #include <RF24Network.h>
#include "RF24.h"
#include <SPI.h>

/* Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 */
RF24 radio(7,8);
RF24Network network(radio);      // Network uses that radio
const uint16_t this_recv_node = 01;    // Address of our node in Octal format ( 04,031, etc)
const uint16_t other_node = 00;   // Address of the other node in Octal format

struct pair
{
  int x;
  int y;
};

int a1 = 5;
int a2 = 6;
int b1 = 9;
int b2 = 10;

void setup() 
{
  Serial.begin(115200);

  pinMode(a1, OUTPUT);
  pinMode(a2, OUTPUT);
  pinMode(b1, OUTPUT);
  pinMode(b2, OUTPUT);

  analogWrite(a1, 0);
  analogWrite(a2, 0);
  analogWrite(b1, 0);
  analogWrite(b2, 0);

  SPI.begin();
  radio.begin();
  radio.setPALevel(RF24_PA_LOW);
  radio.setDataRate(RF24_250KBPS);
  network.begin(/*channel*/ 102, /*node address*/ this_recv_node);
  Serial.println("SETUP COMPLETE");
}

void setMotor(int pa1, int pa2, int pb1, int pb2)
{
  analogWrite(a1, pa1);
  analogWrite(a2, pa2);
  analogWrite(b1, pb1);
  analogWrite(b2, pb2);
}

unsigned long last = millis();

void loop() 
{
  pair p;
  network.update();

  while ( network.available() )
  {
    RF24NetworkHeader header; 
    network.read(header, &p, sizeof(pair));
    last = millis();
  }

  int x = p.x - 512;
  int y = p.y - 512;
  int a1=0;
  int b1=0;
  int a2=0;
  int b2=0;

  x /= 2;
  y /= 2;

  int xx = x+y;
  int yy = x-y;

  if (xx >= 0)
    a1 = xx;
  else
    a2 = -xx;

  if (yy >= 0)
    b1 = yy;
  else
    b2 = -yy;

  a1 = constrain(a1,0,255);
  a2 = constrain(a2,0,255);
  b1 = constrain(b1,0,255);
  b2 = constrain(b2,0,255);

  setMotor(a1,a2,b1,b2);

  Serial.print(a1);
  Serial.print(" ");
  Serial.print(a2);
  Serial.print(" ");
  Serial.print(b1);
  Serial.print(" ");
  Serial.print(b2);
  Serial.println(" ");

  // don't run away if the RC cuts
  if(millis() - last  > 500) // no rx for 500 ms 
  {
    setMotor(0,0,0,0); // turn off the motor
    Serial.println("HALTING!!!");
  }
}
    
pregunta esoterik

0 respuestas

Lea otras preguntas en las etiquetas