Go Down

Topic: [SOLUCIONADO] nRF24L01. No logro comunicación (Read 778 times) previous topic - next topic

demorgar

Jan 13, 2019, 08:39 pm Last Edit: Jan 28, 2019, 12:16 am by demorgar
Hola buenas tardes,
Después de varias pruebas y varias librerías probadas acudo aquí para ver si hay alguna solución.
Compré estos chips nRF24, conectado arduino nano.
Mi entorno de trabajo: debian con el ide arduino 1.8.8.

He realizado muchísimas pruebas todas, con el mismo resultado. No me envía datos con la tarjeta RF. en un post algo antiguo surbyte recomedaba la librería TMRh20, que ha sido la última que probé, incluso he probado varias versiones de dicha librería. con este ejemplo, extraído de la documentación oficial de dicha librería.
El patillaje realizado es el que indica la documentación











PIN NRF24L01 Arduino UNO ATtiny85ATtiny85LittleWire RPI RPi -P1 Connector  
1 GND GND pin 4 pin 14 GND rpi-gnd (25)
2 VCC 3.3V pin 8 pin 1 regulator 3.3V required rpi-3v3 (17)
3 CE digIO 7 pin 2 pin 12 pin to 3.3V rpi-gpio22 (15)
4 CSN digIO 8 pin 3 pin 11 RESET rpi-gpio8 (24)
5 SCK digIO 13 pin 7 pin 9 SCK rpi-sckl (23)
6 MOSI digIO 11 pin 6 pin 7 MOSI rpi-mosi (19)
7 MISO digIO 12 pin 5 pin 8 MISO rpi-miso (21)
8 IRQ - - - - - -


Lo curioso, es que si desconecto el pin 7 MISO del rf y lo cojo con la mano, funciona sin ningún problema, si lo dejo desconectado sin tocar, el programa se detiene, quedandose el led integrado en arduino encendido pero tenue.

Cable MISO conectado o desconectado sin tocar con la mano
O bien led integrado se queda tenue y se queda detenido el probgrama
Quote
RF24/examples/GettingStarted
*** PRESS 'T' to begin transmitting to the other node
*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK
Now sending
O bien. drectamente da errores de envio
Quote
Failed, response timed out.
Now sending
failed
Failed, response timed out.
Now sending
failed
Failed, response timed out.
Now sending
failed
Failed, response timed out.
Cable MISO desconectado del chip RF pero tocando el cable con la mano:
RF24/examples/GettingStarted
*** PRESS 'T' to begin transmitting to the other node
*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK
Now sending
Quote
Sent 146203864, Got response 4294967295, Round-trip delay 816 microseconds
Now sending
failed
Sent 147206944, Got response 8388607, Round-trip delay 5872 microseconds
Now sending
Sent 148214544, Got response 4294967295, Round-trip delay 10208 microseconds
Now sending
Sent 149226696, Got response 0, Round-trip delay 10743676 microseconds
Now sending
Sent 160972008, Got response 0, Round-trip delay 158268 microseconds
Now sending
Sent 162131804, Got response 0, Round-trip delay 58352 microseconds
He de decir, que si está desconectado si que envía, pero sólo a veces. Y como último detalle, probé también a poner un condensador electrolítico tal y como dicen muchos manuales de 10uF, dándome exactamente los mismos resultados.
Actualmente estoy conectando los módulos directamente a la salida de 3.3v de arduino, aunque la idea mas adelante sería conectarlos a una fuente de alimentación externa previo paso por regulador de tensión.
Al otro lado, en el receptor, diría que ocurren los mismos problemas, aunque no lo puedo asegurar 100x100 ya que solo he conseguido enviar cuando hago lo explicado.


Edición 27/01/2019
Hola buenas noches, por fin puedo editar el Post y darlo por solucionado
Finalmente no he descubierto el motivo de los mal funcionamiento en cuanto al pin flotante ya que al final no lo está.
Detallo el procedimiento seguido.

En cuanto a los esquemas de montaje y el código utilizado, finalmente he seguido el tutorial de Luís Llamas, ya que me parecía mas claro.
Listado Material:
2x Protoboard pequeña
2x Arduino NANO
2x Step-Down 3.3
2x Condensador electrolítico 10uF
2x Cable USB mini
2x nRF24L01+
El esquema de montaje básicamente he seguido el de el, pero con una modificación, ya que es como lo usaré en el montaje final de mi proyecto:
La tensión para el módulo RF la saco del pin +5V, este lo conecto a un step-down de 3.3V y la salida de este a un condensador de 10uF.

EMISOR
Code: [Select]

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
//Declaremos los pines CE y el CSN
#define CE_PIN 9
#define CSN_PIN 10
//Variable con la dirección del canal por donde se va a transmitir
byte direccion[5] ={'c','a','n','a','l'};
//creamos el objeto radio (NRF24L01)
RF24 radio(CE_PIN, CSN_PIN);
//vector con los datos a enviar
float datos[3];
void setup()
{
  //inicializamos el NRF24L01
  radio.begin();
  //inicializamos el puerto serie
  Serial.begin(9600);
//Abrimos un canal de escritura
 radio.openWritingPipe(direccion);
}
void loop()
{
 //cargamos los datos en la variable datos[]
 datos[0]=analogRead(0)* (5.0 / 1023.0);;
 datos[1]=millis();
 datos[2]=5896.6;
 //enviamos los datos
 bool ok = radio.write(datos, sizeof(datos));
  //reportamos por el puerto serial los datos enviados
  if(ok)
  {
     Serial.print("Datos enviados: ");
     Serial.print(datos[0]);
     Serial.print(" , ");
     Serial.print(datos[1]);
     Serial.print(" , ");
     Serial.println(datos[2]);
  }
  else
  {
     Serial.println("no se ha podido enviar");
  }
  delay(1000);
}


RECEPTOR
Code: [Select]

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

//Declaremos los pines CE y el CSN
#define CE_PIN 9
#define CSN_PIN 10

//Variable con la dirección del canal que se va a leer
byte direccion[5] ={'c','a','n','a','l'};

//creamos el objeto radio (NRF24L01)
RF24 radio(CE_PIN, CSN_PIN);

//vector para los datos recibidos
float datos[3];

void setup()
{
 //inicializamos el NRF24L01
  radio.begin();
  //inicializamos el puerto serie
  Serial.begin(9600);

  //Abrimos el canal de Lectura
  radio.openReadingPipe(1, direccion);

    //empezamos a escuchar por el canal
  radio.startListening();

}
 
void loop() {
 uint8_t numero_canal;
 //if ( radio.available(&numero_canal) )
 if ( radio.available() )
 {    
     //Leemos los datos y los guardamos en la variable datos[]
     radio.read(datos,sizeof(datos));

     //reportamos por el puerto serial los datos recibidos
     Serial.print("Dato0= " );
     Serial.print(datos[0]);
     Serial.print(" V, ");
     Serial.print("Dato1= " );
     Serial.print(datos[1]);
     Serial.print(" ms, ");
     Serial.print("Dato2= " );
     Serial.println(datos[2]);
 }
 else
 {
     Serial.println("No hay datos de radio disponibles");
 }
 delay(1000);
}

La librería utilizada es la última versión de RF24 de TMRh20, la 1.3.1.
He usado dos protoboards pequeñas totalmente independientes y con dos equipos independientes uno del otro.
Todas las tensiones están comprobadas con un voltímetro.
Uno de los errores que se seguro que he cometido, es que me he centrado en que el emisor indicaba que no enviaba datos, y buscaba soluciones para ello, pero en muchos casos sin tener en funcionamiento el receptor, en otros casos sí, y tampoco funcionaba, aunque imagino que habría cometido algún error.
Hasta que no he montado todo por separado con sus cables de serie conectados a dos PC distintos para probarlos realmente a la vez no me he dado cuenta de todo esto.
Tal y como me habían comentado en un post intermedio, nunca hay que desesperar la solución a veces es mucho mas sencilla de lo que pensamos
Muchas gracias por vuestra ayuda


surbyte

#1
Jan 16, 2019, 11:10 pm Last Edit: Jan 16, 2019, 11:11 pm by surbyte
Bueno el capacitor de 10uF debe ir.
Lo esas alimentando con los 3.3V del Arduino que en este caso es suficiente.

Esos módulos nunca me han fallado así que tenemos que encontrar que has hecho mal o en que te has equivocado.

para comenzar trabaja con dos Arduino del mismo tipo. Dos NANOs por ejemplo o dos UNOs no hagas cambios, máximo un UNO y un NANO. El ATtiny y RPi para luego.

Dime si tienes dos y si te pasa lo mismo.

tauro0221

#2
Jan 17, 2019, 01:04 am Last Edit: Jan 17, 2019, 01:12 am by tauro0221
Hi,
Tu dices si lo tocas el miso  trabaja no. Entonces haz una prueba. Anadele una resistencia de 10K del pin miso al los 3.3 y mira haber si trabaja.

surbyte

Yo jamás le puse resistencia a MISO.
Lo tengo conectado directo al pin.

tauro0221

#4
Jan 17, 2019, 01:24 am Last Edit: Jan 17, 2019, 01:29 am by tauro0221
Hi,
Surbyte segun la descripcion que el dice parece que el pin esta flotando. Algunos modulos no traen los pullup resistor. Yo dije que es solamente una prueba. Otra cosa a que modulo lo conectas.

surbyte

Lo que no dice si esta armado en un protoboard ?

tauro0221

Hi,
Buena observacion. Esto tienden a tener malas conecciones.

demorgar

hola buenas tardes,
justamente esta mañana he recibido la misma respuesta en otro canal, añadir una resistencia 10k en el pin que esta flotando y al parecer funciona. aunque aun no he podido comprobar si el envio es correcto, al menos tiene el funcionamiento deseado.
mi entorno de pruebas sin dos arduino nano en protoboard

surbyte

Quote
mi entorno de pruebas sin dos arduino nano en protoboard
Quisiste decir dos arduinos EN protoboard? Entonces ahi tienes el problema. mala conexion mi amigo.

No uses protoboard. Mi consejo de siempre. Compra placas PCB y sueldas todo con cables finos.
0 problemas a menos que lo tengas mal conectados pero ahora tienes la duda de que no sabes si el contacto esta bien o no. Obviamente no lo esta.

demorgar

la idea es pasarlo todo a pcb en el montaje final soldando los componentes., utilizo la proto como banco de pruebas para comprobar que todo va como debe ir.
Como os dije, ha sido añadir la resistencia al pin y el funcionamiento ha sido el esperado.
tengo que comprobar que realmente se recibe lo que se envía

surbyte

#10
Jan 17, 2019, 09:35 pm Last Edit: Jan 17, 2019, 09:36 pm by surbyte
Yo como no uso protoboards jamás tengo esos problemas, tengo otros porque puedo conectarlos mal pero jamás mal contacto.

Lo que tu describes me pasó un par de veces con mis protoboards. un dias los separé y decidí no usarlos mas. Si no tengo ganas de armar algo en un pcb de prototipos como este entonces tengo otro problema.

Este es algo exagerado pero sirve para que veas de que hablo



o este video que muestra mas ejemplos

Aca tienes cómo link

otro mas paso a paso

http://brooksbots.com/Extrasensory%20II.html

y el último
http://www.ermicro.com/blog/?p=1940

tauro0221

Hi,
Yo lo que uso para mis prototios es lo que se conoce como wire wrap. Puedes modificar /hacer cambios si nesecidad de soldar/desoldar.Adjunto un link:

https://en.wikipedia.orgwiki/Wire_wrap#/media/File:Wire_Wrapping.jpg

surbyte

#12
Jan 18, 2019, 03:12 am Last Edit: Jan 18, 2019, 03:13 am by surbyte
Yo usaba wire wrapping pero los zócalos y demás son caros en Argentina y pasé al método soldado usando el cable de wire wrapping, y la herramienta para pelarlo. Me resulta muy cómodo soldarlo y queda perfecto.
Mis prototipos quedan como la imagen del post anterior. Eso es cable de wire wrapping soldado.

tauro0221

Hi,
Una ventaja de usar el cable wire wrapping que es que esta cubierto de plata y es de un amperio y sirve como fusible

demorgar

#14
Jan 18, 2019, 11:55 am Last Edit: Jan 18, 2019, 12:06 pm by demorgar
Sigo con los problemas con los rf. Tal y como comenté ayer, al añadir la resistencia en el pin 12 al menos actúa de la manera esperada. Ahora por eso, en el receptor no recibo datos o si los recibo son erróneos.

Sketch del emisor:
Code: [Select]

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define CE_PIN 7
#define CSN_PIN 8

const byte address[6] = "0001";

RF24 radio(CE_PIN, CSN_PIN); // creamos el objeto radio (NRF24L01)

void setup() {
  pinMode(CE_PIN, INPUT_PULLUP);
  Serial.begin (9600);
  radio.begin();                  // inicializamos el NRF24L01
  radio.openWritingPipe(address); // Abrimos un canal de escritura
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();          // Deja de escuchar para que podamos transmitir.
    
}
void loop() {
  const char text[] = "Hola mundo";
  radio.write(&text, sizeof(text));// Manda mensaje
  Serial.println("Enviado");
  delay(1000);
}




Sketch del receptor
Code: [Select]

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define CE_PIN 7
#define CSN_PIN 8

RF24 radio(CE_PIN, CSN_PIN); // creamos el objeto radio (NRF24L01)
const byte address[6] = "00010";

void setup() {
  
  Serial.begin(9600);       // inicializamos el puerto serie
  Serial.println("#################################");
  Serial.println(" Escuchando datos de radio");
  Serial.println("#################################");
  radio.begin();            // inicializamos el NRF24L01
  radio.openReadingPipe(0, address); // Abrimos un canal de lectura
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();   // empezamos a escuchar por el canal
}

void loop() {
  if (radio.available()) {
    Serial.println("radio disponible");
    char text[32] = "";
    radio.read(&text, sizeof(text));
    Serial.println(text);
 
  }else{
    //radio.printDetails();
    Serial.println("No hay datos de radio disponibles");
 }
 delay(1000);
}


Salida en puerto serie:
Code: [Select]

No hay datos de radio disponibles
No hay datos de radio disponibles
No hay datos de radio disponibles
No hay datos de radio disponibles
radio disponible

No hay datos de radio disponibles
No hay datos de radio disponibles
No hay datos de radio disponibles
No hay datos de radio disponibles
radio disponible
`pppppppppppppppp⸮|
radio disponible

radio disponible

radio disponible

radio disponible

radio disponible

No hay datos de radio disponibles
radio disponible

radio disponible

radio disponible


He probado a añadir una resistencia de 10k al pin 11 y también por probar activar las resistencias PULLUP por software en todos los pins. Realmente lo he probado por probar aunque no se si  tenía algún sentido.
Code: [Select]
pinMode(10,INPUT_PULLUP);

Los sketch los he copiado de internet, sin adaptarlos ya que de momento sólo estoy probando los módulos



Un saludo


Go Up