Hola, necesito un gran favor, o más que todo una ayuda, conectando un módulo transceiver nFR24L01 a un robot móvil; pasa lo siguiente:
Cuando mando datos desde el emisor por el puerto serial, una computadora conectada a un arduino UNO con su propio nFR24L01, el funcionamiento básico de avanzar, retroceder, girar a los lados y detenerse funciona bien cuando el robot recibe la cadena proveniente del emisor, pero esto cuando está conectado el arduino Pro mini del robot a la pc, más cuando lo retiro y lo hago funcionar con su propia fuente externa (una batería de 7,4V para los motores la cual tiene una salida con reguladores para 5V al arduino y 3.3V para el módulo de comunicación RF), este solo me obedece con la primera orden, luego ni caso me hace, como que se queda colgado y sigue realizando la primera orden que se le dio.
¿Alguna idea que podría estar sucediendo y como se puede solucionar? Gracias de ante mano.
Saludos.
Podríamos ayudarte si publicas tu código.
a.- Revisa la alimentación de 3,3 V del modulo nRF24L01p, ya que tuve problemas con un mega y lo resolví colocando un capacitor de 10 uF entre GND y 3,3 V
b.-Por otra parte, algo así me pasaba con la librería nRF24L01p.h la cual modifique para poder usar, ya que no están como public, estas dos lineas en el transmisor.
transmisor._txIndex = 0;
transmisor.flushTX();
cada vez que envío algo limpio el buffer del transmisor para que comience de nuevo porque su buffer es de apenas 32 bytes.
Gracias por responder, voy a verificar lo que me dijiste.
Por cierto, yo utilizo la librería de MIRF.h y no la de nRF24L01p.h, pero está me funciona bien, como mencioné, cuando está conectado el Pro mini a la pc y leo la respuesta por el puerto serial.
Apenas lo pruebe escribo para saber como me fue. Gracias otra vez.
NO FUNCIONO!!!
alguna otra ayuda? sigue sin hacerme caso cuando funciona con su propia fuente.
Bueno como te dije: Publica tu CÓDIGO.
Lo que te adelante es para que fueses probando. Pero la verdadera ayuda viene al ver tu código.
Este es del emisor:
#include "SPI.h"
#include "Mirf.h"
#include "nRF24L01.h"
#include "MirfHardwareSpiDriver.h"
String message;
String temp;
// converts a float into a char
// and sends it via nRF24L01
void transmit( float v)
{
byte c;
char buf[11];
dtostrf(v,9,3,buf);
for( int i=0 ; i < 8 ; i++ )
{
c = buf[i];
Mirf.send(&c);
while( Mirf.isSending() ) ;
}
}
// sends a string via the nRF24L01
void transmit(const char *string)
{
byte c;
for( int i=0 ; string[i]!=0x00 ; i++ )
{
c = string[i];
Mirf.send(&c);
while( Mirf.isSending() ) ;
}
}
void transmit(String string)
{
byte c;
for( int i=0 ; string[i]!=0x00 ; i++ )
{
c = string[i];
Mirf.send(&c);
while( Mirf.isSending() ) ;
}
}
// send a CR/LF sequence via the nRF24L01
void transmitlf(void)
{
byte c;
c = '\r';
Mirf.send(&c);
while( Mirf.isSending() ) ;
c = '\n';
Mirf.send(&c);
while( Mirf.isSending() ) ;
}
void leercadena()
{
int count = 0;
while (Serial.available() > 0)
{
// read incoming serial data:
message = String(message + (char)Serial.read());
if(message[count] == '%')
{
message[count] = '%';
message[count+1] = '\0';
Serial.println(message);
//Serial.println("Enter text");
count = 0;
}
else
{
count++;
}
}
}
void setup()
{
Serial.begin(9600);
Mirf.cePin = 8;
Mirf.csnPin = 7;
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.setRADDR((byte *)"serv1");
Mirf.payload = 1;
Mirf.config();
}
void loop()
{
//Modo de cadena: 1Funcion2Funcion3Funcion%
//1 robot 1, 2 robot 2 y 3 robot 3
//F avanzar, B retroceder, R girar derecha,
//L girar izquierda, S detener
//transmit("1R2S3L%");
if(Serial.available() > 0)
{
leercadena();
Serial.println(message);
transmit(message);
temp = message;
message = "";
}
else
{
transmit(temp);
Serial.println(temp);
}
// ... just take your time
delay(100);
}
y este es del robot receptor:
#include "SPI.h"
#include "Mirf.h"
#include "nRF24L01.h"
#include "MirfHardwareSpiDriver.h"
//Variabels de robot
char id = '1';
char robot [3];
//Variables de RF
String message;
//Variables de motores
int valor = 0;
int valor1 = 0;
int valor2 = 0;
int motor_left[] = {2, 3};
int motor_right[] = {4, 5};
int motorEnable1 = 9;
int motorEnable2 = 6;
void setup()
{
Serial.begin(9600);
// Setup RF
Mirf.cePin = 8;
Mirf.csnPin = 7;
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.setRADDR((byte *)"serv1");
Mirf.payload = 1;
Mirf.config();
// Setup motors
int i;
for(i = 0; i < 2; i++)
{
pinMode(motor_left[i], OUTPUT);
pinMode(motor_right[i], OUTPUT);
}
}
void loop()
{
// Recepcion de mensaje ------------------------------
byte c;
if(Mirf.dataReady())
{
Mirf.getData(&c);
char letter = char(c);
if(letter != '%')
{
message = String(message + letter);
}
else
{
Serial.println(message);
checkrobot(message);
Serial.println(robot);
accion(robot[1]);
delay(10);
message = "";
}
}
}
// Mensaje para robot
void checkrobot(String cadena)
{
int count = 0;
boolean r = 0;
while (!r && count < 6)
{
if(cadena[count] == id)
{
for (int i = 0; i < 2; i++)
{
robot[i] = message[count]; // robot y funcion
count++;
}
robot[2] = '\0';
//Serial.println(robot);
r = 1;
}
else
{
count = count + 2;
}
}
}
void accion(char fun)
{
switch(fun)
{
case 'F':
Serial.println("Avanzar...");
valor1 = 50;
valor2 = 50;
drive_forward(valor1,valor2);
break;
case 'B':
Serial.println("Retroceder...");
valor1 = 50;
valor2 = 50;
drive_backward(valor1,valor2);
break;
case 'R':
//Serial.println("Girar Derecha...");
valor1 = 50;
valor2 = 50;
turn_right(valor1,valor2);
break;
case 'L':
//Serial.println("Girar Izquierda...");
valor1 = 50;
valor2 = 50;
turn_left(valor1,valor2);
break;
case 'S':
Serial.println("Detener...");
valor1 = 0;
valor2 = 0;
motor_stop(valor1,valor2);
break;
}
}
void motor_stop(int pwm1, int pwm2)
{
analogWrite(motorEnable1, pwm1);
analogWrite(motorEnable2, pwm2);
digitalWrite(motor_left[0], LOW);
digitalWrite(motor_left[1], LOW);
digitalWrite(motor_right[0], LOW);
digitalWrite(motor_right[1], LOW);
//delay(25);
}
void drive_forward(int pwm1, int pwm2)
{
analogWrite(motorEnable1, pwm1);
analogWrite(motorEnable2, pwm2);
digitalWrite(motor_left[0], HIGH);
digitalWrite(motor_left[1], LOW);
digitalWrite(motor_right[0], HIGH);
digitalWrite(motor_right[1], LOW);
}
void drive_backward(int pwm1, int pwm2)
{
analogWrite(motorEnable1, pwm1);
analogWrite(motorEnable2, pwm2);
digitalWrite(motor_left[0], LOW);
digitalWrite(motor_left[1], HIGH);
digitalWrite(motor_right[0], LOW);
digitalWrite(motor_right[1], HIGH);
}
void turn_left(int pwm1, int pwm2)
{
analogWrite(motorEnable1, pwm1);
analogWrite(motorEnable2, pwm2);
digitalWrite(motor_left[0], LOW);
digitalWrite(motor_left[1], HIGH);
digitalWrite(motor_right[0], HIGH);
digitalWrite(motor_right[1], LOW);
}
void turn_right(int pwm1, int pwm2)
{
analogWrite(motorEnable1, pwm1);
analogWrite(motorEnable2, pwm2);
digitalWrite(motor_left[0], HIGH);
digitalWrite(motor_left[1], LOW);
digitalWrite(motor_right[0], LOW);
digitalWrite(motor_right[1], HIGH);
}
Saludos.
Te comento lo que hice, cargue tus códigos y me arrojo el mismo problema que vi cuando use la libreria Mirf.h, en verdad no se si tengo la librería corrompida. Ya que envio algo y lo recibe de forma incorrecta.
Modifique tu código para usarlos con la librería nRF24L01p.h, Solo pruebalas y me comentas.
Receptor
#include <SPI.h>
#include <nRF24L01p.h>
//Variabels de robot
char id = '1';
char robot [3];
//Variables de RF
String message;
//Variables de motores
int valor = 0;
int valor1 = 0;
int valor2 = 0;
int motor_left[] = {2, 3};
int motor_right[] = {4, 5};
int motorEnable1 = 9;
int motorEnable2 = 6;
nRF24L01p receptor(7,8);//CSN,CE
void setup()
{
Serial.begin(9600);
SPI.begin();
SPI.setBitOrder(MSBFIRST);
receptor.channel(92);
receptor.RXaddress("Kerin");
receptor.TXaddress("Josue");
receptor.init();
// Setup motors
int i;
for(i = 0; i < 2; i++)
{
pinMode(motor_left[i], OUTPUT);
pinMode(motor_right[i], OUTPUT);
}
}
void loop()
{
// Recepcion de mensaje ------------------------------
if(receptor.available()){
receptor.read();
receptor.rxPL(message);
// Serial.println(message);
for (int i = 0; i <= message.length(); i++){
if(message.charAt(i)== '%'){
message= message.substring(i-6, i+1);
checkrobot(message);
}
}
for (int i = 0; i <4; i++){
//Serial.print("Robot ");Serial.print(i+1,DEC);
accion(robot[i]);
}
message= "";
}
}
// Mensaje para robot
void checkrobot(String cadena)
{
for (int i = 0; i < 6; i++){
switch (cadena.charAt(i)){
case '1':
robot[1]= cadena.charAt(i+1);
break;
case '2':
robot[2]= cadena.charAt(i+1);
break;
case '3':
robot[3]= cadena.charAt(i+1);
break;
}
}
}
void accion(char fun)
{
switch(fun)
{
case 'F':
Serial.println(" Avanzar...");
valor1 = 50;
valor2 = 50;
drive_forward(valor1,valor2);
break;
case 'B':
Serial.println(" Retroceder...");
valor1 = 50;
valor2 = 50;
drive_backward(valor1,valor2);
break;
case 'R':
Serial.println(" Girar Derecha...");
valor1 = 50;
valor2 = 50;
turn_right(valor1,valor2);
break;
case 'L':
Serial.println(" Girar Izquierda...");
valor1 = 50;
valor2 = 50;
turn_left(valor1,valor2);
break;
case 'S':
Serial.println(" Detener...");
valor1 = 0;
valor2 = 0;
motor_stop(valor1,valor2);
break;
}
}
void motor_stop(int pwm1, int pwm2)
{
analogWrite(motorEnable1, pwm1);
analogWrite(motorEnable2, pwm2);
digitalWrite(motor_left[0], LOW);
digitalWrite(motor_left[1], LOW);
digitalWrite(motor_right[0], LOW);
digitalWrite(motor_right[1], LOW);
//delay(25);
}
void drive_forward(int pwm1, int pwm2)
{
analogWrite(motorEnable1, pwm1);
analogWrite(motorEnable2, pwm2);
digitalWrite(motor_left[0], HIGH);
digitalWrite(motor_left[1], LOW);
digitalWrite(motor_right[0], HIGH);
digitalWrite(motor_right[1], LOW);
}
void drive_backward(int pwm1, int pwm2)
{
analogWrite(motorEnable1, pwm1);
analogWrite(motorEnable2, pwm2);
digitalWrite(motor_left[0], LOW);
digitalWrite(motor_left[1], HIGH);
digitalWrite(motor_right[0], LOW);
digitalWrite(motor_right[1], HIGH);
}
void turn_left(int pwm1, int pwm2)
{
analogWrite(motorEnable1, pwm1);
analogWrite(motorEnable2, pwm2);
digitalWrite(motor_left[0], LOW);
digitalWrite(motor_left[1], HIGH);
digitalWrite(motor_right[0], HIGH);
digitalWrite(motor_right[1], LOW);
}
void turn_right(int pwm1, int pwm2)
{
analogWrite(motorEnable1, pwm1);
analogWrite(motorEnable2, pwm2);
digitalWrite(motor_left[0], HIGH);
digitalWrite(motor_left[1], LOW);
digitalWrite(motor_right[0], LOW);
digitalWrite(motor_right[1], HIGH);
}
Transmisor
String titulo = "nRF24L01p V0.1 PTR ";
#include <SPI.h>
#include <nRF24L01p.h>
nRF24L01p transmisor(7,8);//CSN,CE MEGA
//nRF24L01p transmisor(10,9);//CSN,CE NANO
void setup(){
titulo.concat(__DATE__);
#define VERSION titulo
delay(150);
Serial.begin(9600);
Serial.println(VERSION);
SPI.begin();
SPI.setBitOrder(MSBFIRST);
transmisor.channel(92);
transmisor.TXaddress("Kerin");
transmisor.RXaddress("Josue");
transmisor.init();
//Serial.println(transmisor.getStatus());
}
String message = "";
void loop(){
if(Serial.available()>0){
char character=Serial.read();
if(character=='%'){
transmisor.powerUp();
message+=character;
message+= '\0';
if (message.length()> 32){
Serial.println("Mensaje muy largo se enviara solo 32 caracteres");
}
transmisor.txPL(message);
transmisor.send(FAST);
Serial.print("Enviado: "); Serial.println(message);
message="";
transmisor._txIndex = 0;
transmisor.flushTX();
}else{
message+=character;
}
}
if(transmisor.available()){
String respuesta = "";
transmisor.read();
transmisor.rxPL(respuesta);
Serial.println(respuesta);
respuesta= "";
}
}
regMapCmds.h (1.57 KB)
Transmisor.ino (1.2 KB)
nRF24L01p.h (2.69 KB)
nRF24L01p.cpp (10.9 KB)
Hola nuevamente, hice unas modificaciones a lo que pusiste, pero más que nada en la parte de interpretación de la cadena enviada (checkrobot, use la que yo tenía), y funciona!!! muchas gracias, aunque ahora me surge la duda por qué la librería que tu usaste funcionó y la del MIRF que yo usé no funcionaba adecuadamente? qué cosas son por las que debo cambiar a la libería que me pasaste.
De verdad muchas gracias por la ayuda, ahora solo debo corregir un problema que a veces sucede (supongo que es por el capacitor) que como que se pierde en un momento la recepción del RF y tengo que resetear el arduino para que vuelva a funcionar correctamente, cuando sucede eso, el emisor se pone lento al momento de imprimir en el puerto serial, me imagino que está intentando enviar el mensaje y al no poder ya que el otro no recibe en ese momento, demora un poco al imprimir y el robot sigue con la acción que estaba realizando sin cambiar a una nueva. Solución por el momento: resetearlo.
GRACIAS max_saeta, eres un pro!