Go Down

Topic: leds intermitente pasado a NRF24l01 (Read 286 times) previous topic - next topic

sevillalva

Jul 18, 2019, 07:13 pm Last Edit: Jul 18, 2019, 07:20 pm by sevillalva
Hola a todos,
Alguno me puede orientarme por que en un Sketch me funciona perfecto y cuando lo paso a TX y RX (NRF24l01) no me funciona, pero los servos si, ya he probado de mil maneras y no doy con la solución
Aquí pongo el primer Sketch que si funciona corregido por el Sr. Rig un solo Arduino,
luego a continuación pondré el TX "transmisor", y por ultimo el RX "receptor". alguna idea??

Gracias por adelantado

Original

Code: [Select]

int valor1;                           //Variable donde almacenaremos el valor del potenciometro
int valor;                             //Variable donde almacenaremos el valor del potenciometro
unsigned long beep;
const int duracion=400;       //si quieres que el tono sea mas corto baja este valor
const int frecuencia=2000;   //si quieres que se escuche mas agudo sube este valor
const byte ledPin1 = 2,        //Declaramos los pins de los LEDs
           ledPin2 = 3,             //Declaramos los pins de los LEDs
           ledPin3 = 4,             //Declaramos los pins de los LEDs
           ledPin4 = 5,             //Declaramos los pins de los LEDs
           buzzer1 = 6;            //Declaramos el pin del buzzer
unsigned long impresion;

//--------Intermitentes-----------
unsigned long previousMillis = 0;       // almacenará la última vez que se actualizó el LED
const unsigned long interval = 400;   // intervalo de los intermitentes

void setup() {
 
  pinMode(ledPin1, OUTPUT);        //marcha atras           led Blanco
  pinMode(ledPin2, OUTPUT);        //freno                  led Rojob
  pinMode(ledPin3, OUTPUT);        //intermitente Derecho   led Ambar
  pinMode(ledPin4, OUTPUT);        //intermitente Izquierdo led Ambar
  pinMode(buzzer1, OUTPUT);       //buzzer 5v
}

void loop() {

  freno();
  intermitente();
}


 
void intermitente()
{

valor1 = analogRead(A1);             // leemos del pin A1 valor1 

  if(valor1 >= 451 && valor1 <=549)
  {
     digitalWrite(ledPin3, LOW);
     digitalWrite(ledPin4, LOW);
  }
   
//-----Intermitente Derecho-----
  if (valor1 >= 0 && valor1 <=450)
    {
 
  if (millis() - previousMillis >= interval)
    {   
      digitalWrite(ledPin3, !digitalRead(ledPin3));
        previousMillis = millis();   
    }

  digitalWrite(ledPin4, LOW);
    }
   
//-----Intermitente Izquierdo----
  if (valor1 >= 550 && valor1 <=1023) 
    {

  if (millis() - previousMillis >= interval)
    {
    digitalWrite(ledPin4, !digitalRead(ledPin4));   
    previousMillis = millis();
    }
    digitalWrite(ledPin3 , LOW);
   
    }
}

void freno(){
 
  if(millis() - impresion >= 500UL){
     
      impresion=millis();

 
 valor = analogRead(A0);         // leemos del pin A0 valor
//------Freno y M.Atras----------
  if(valor >= 512 && valor <=1023)
  {

       if( millis()- beep >= duracion*2){  //multiplico duracion por 2 para que dure el mismo tiempo el tono encendido que apagado
       tone(buzzer1, frecuencia, duracion);
               beep=millis();
        }
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, LOW);     
    }
     
  }
  if (valor >= 256 && valor <=511)
    {
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, HIGH);
    }
  if (valor >= 0 && valor <=255)
    {
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    }
}


sevillalva

Hola, todavía no se poner dos Codes seguidos os pido perdón por mi torpeza gracias. la estructura se tiene que mantener porque tengo mas Sketch con la misma estructura con motores y leds que uniré con esta.

Aquí pongo el TX

Code: [Select]

//transmisor
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Wire.h>

RF24 radio(9,10);   
const byte address[6] = "00001";

                                // El tamaño máximo de esta estructura es de 32 bytes - NRF24L01 límite de búfer
struct Data_Package {
  byte j1PotX;                  // joystick 1
  byte j1PotY;                  // joystick 1
  byte j2PotX;                  // joystick 2
  byte j2PotY;                  // joystick 2
  byte j3PotX;                  // joystick 3
  byte j3PotY;                  // joystick 3
 
};

Data_Package data;              //Crear una variable con la estructura anterior.

void setup() {
  Serial.begin(9600);
   
                                // Define la comunicación por radio.
  radio.begin();
  radio.openWritingPipe(address);
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_LOW);
   
                                // Establecer valores iniciales predeterminados
 
  data.j1PotX = 127;            // Valores de 0 a 255. Cuando el Joystick está en posición de reposo,                       
  data.j1PotY = 127;            // El valor está en el medio, o 127.
  data.j2PotX = 127;            // En realidad mapeamos el valor del pozo de 0 a 1023 a 0 a 255 porque ese es un valor BYTE
  data.j2PotY = 127; 
  data.j3PotX = 127;
  data.j3PotY = 127;
  }
void loop() {
                                                      // Lee todas las entradas analógicas y asignelas a un valor de byte
  data.j1PotX = map(analogRead(A0), 0, 1023, 0, 255); // Convierta el valor de lectura analógica de 0 a 1023 en un valor BYTE de 0 a 255
  data.j1PotY = map(analogRead(A1), 0, 1023, 0, 255);
  data.j2PotX = map(analogRead(A2), 0, 1023, 0, 255);
  data.j2PotY = map(analogRead(A3), 0, 1023, 0, 255);
  data.j3PotX = map(analogRead(A4), 0, 1023, 0, 255);
  data.j3PotY = map(analogRead(A5), 0, 1023, 0, 255);
 
                                                     // Envia todos los datos de la estructura al receptor.
  radio.write(&data, sizeof(data));
 
}


 

sevillalva

Hola, y aquí va la ultima RX "receptor". y perdon por hacer esto tan largo.

P.D. esto es luces (LEDS) intermitentes, freno y M.atrás para camión escala 1/16

Gracias de nuevo.

Aquí pongo el RX

Code: [Select]

// Receptor

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

RF24 radio(9,10);   
const byte address[6] = "00001";
unsigned long lastReceiveTime = 0;
unsigned long currentTime = 0;

Servo servo1;
Servo servo2;
Servo servo3;
int servo1Value,servo2Value,servo3Value;

struct Data_Package
{
  byte j1PotX;
  byte j1PotY;
  byte j2PotX;
  byte j2PotY; 
  byte j3PotX;
  byte j3PotY;
 
};


int valorPin1;                          //Variable donde almacenaremos el valor del potenciometro
int valorPin2;                         //Variable donde almacenaremos el valor del potenciometro
int valorPin3;
bool valor1_state = false;
bool valor2_state = false;
bool valor3_state = false;
unsigned long beep;
const int duracion=400;            //si quieres que el tono sea mas corto baja este valor
const int frecuencia=2000;         //si quieres que se escuche mas agudo sube este valor
const byte ledPin1 = 2,            //Declaramos los pins de los LEDs
           ledPin2 = 3,            //Declaramos los pins de los LEDs
           ledPin3 = 4,            //Declaramos los pins de los LEDs
           ledPin4 = 5,            //Declaramos los pins de los LEDs
           buzzer1 = 6;            // Declaramos el pin del buzzer
unsigned long impresion;

//--------Intermitentes-----------
unsigned long previousMillis = 0;     // almacenará la última vez que se actualizó el LED
const unsigned long interval = 400;   // intervalo de los intermitentes
//------------------nuevo----------

Data_Package data;

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_LOW);
  radio.startListening();
 // resetData();
  //-----------nuevo-------------
  pinMode(ledPin1, OUTPUT);        //marcha atras           led Blanco
  pinMode(ledPin2, OUTPUT);        //freno                  led Rojo
  pinMode(ledPin3, OUTPUT);        //intermitente Derecho   led Ambar
  pinMode(ledPin4, OUTPUT);        //intermitente Izquierdo led Ambar
  pinMode(buzzer1, OUTPUT);        //buzzer 5v
 
  servo1.attach(14);
  servo2.attach(15);
  servo3.attach(16);
  servo1.write(0);
  servo2.write(0); 
  servo3.write(0);
 
  //-----------nuevo--------------
}
void loop() {
 
  if (radio.available()) {
    radio.read(&data, sizeof(data));
    lastReceiveTime = millis();
  }
 
  currentTime = millis();
  if ( currentTime - lastReceiveTime > 1000 ) {
//    resetData();
    //-------------nuevo-----------
    freno();
    intermitente();
   
    //--------los servos funcionan------------
  }
  servo1Value = map(data.j1PotX, 0, 255, 0, 180);
  servo1.write(servo1Value);
  servo2Value = map(data.j1PotY, 0, 255, 0, 180);
  servo2.write(servo2Value);
  servo3Value = map(data.j2PotY, 0, 255, 0, 180);
  servo3.write(servo3Value);
 
}
void intermitente()
{
//if (data.j1PotX == 1 && !data.j1PotX)
   valorPin1 =  digitalRead(data.j1PotX);             
//if (data.j1PotX == 0)
  if(valorPin1 >= 451 && valorPin1 <=449)
  {
     digitalWrite(ledPin3, LOW);
     digitalWrite(ledPin4, LOW);
  }
   
//-----Intermitente Derecho-----
  if (valorPin1 >= 0 && valorPin1 <=450)
    {
 
  if (millis() - previousMillis >= interval)
    {   
      digitalWrite(ledPin3, !digitalRead(ledPin3));
        previousMillis = millis();   
    }

  digitalWrite(ledPin4, HIGH);
    }
   
//-----Intermitente Izquierdo----
  if (valorPin1 >= 550 && valorPin1 <=1023) 
    {

  if (millis() - previousMillis >= interval)
    {
    digitalWrite(ledPin4, !digitalRead(ledPin4));   
    previousMillis = millis();
    }
    digitalWrite(ledPin3 , HIGH);
   
    }
}

void freno(){
  //------Freno y M.Atras----------
 
  if(millis() - impresion >= 500UL){
     
      impresion=millis(); 
 
 valorPin2 = digitalRead(data.j1PotY);

  if(valorPin2 >= 512 && valorPin2 <=1023)
  {

       if( millis()- beep >= duracion*2){    //multiplico duracion por 2 para que dure el mismo tiempo el tono encendido que apagado
       tone(buzzer1, frecuencia, duracion);
               beep=millis();                //enciende buzzer1
        }
      digitalWrite(ledPin1, HIGH);           //enciende led marcha atras        led Blanco
      digitalWrite(ledPin2, LOW);            //apaga led freno                  led Rojo   
    }
     
  }
  if (valorPin2 >= 256 && valorPin2 <=511)
    {
    digitalWrite(ledPin1, LOW);              //apaga led marcha atras            led Blanco
    digitalWrite(ledPin2, HIGH);             //enciende led freno                led Rojo
    }
  if (valorPin2 >= 0 && valorPin2 <=255)
    {
    digitalWrite(ledPin1, LOW);              //apaga led marcha atras            led Blanco
    digitalWrite(ledPin2, LOW);              //apaga led freno                   led Rojo
    digitalWrite(buzzer1, LOW);              //apaga buzzer1
    }
}

surbyte

El problema que veo es que estas sobrecargando al receptor con exceso de datos.
Agrega  una secuencia simple que envie datos cada 1000 mseg o cuando haya cambios. Como se trata de joystick aun en reposo habra cambios asi que o usas alguna tecnica que los limite o simplemente envia cada 1000 mseg

sevillalva

Hola, Surbyte buenas noches, bien lo que usted me propone no se como se hace si me puede orientar poniéndome un ejemplo yo intentaría subsanarlo haber si de esa forma me funciona.

Gracias

P.D. para usted y los de esa zona buenas tardes

surbyte

Esta seria la modificacion del TX

Code: [Select]
void loop() {
                                                      // Lee todas las entradas analógicas y asignelas a un valor de byte
  data.j1PotX = map(analogRead(A0), 0, 1023, 0, 255); // Convierta el valor de lectura analógica de 0 a 1023 en un valor BYTE de 0 a 255
  data.j1PotY = map(analogRead(A1), 0, 1023, 0, 255);
  data.j2PotX = map(analogRead(A2), 0, 1023, 0, 255);
  data.j2PotY = map(analogRead(A3), 0, 1023, 0, 255);
  data.j3PotX = map(analogRead(A4), 0, 1023, 0, 255);
  data.j3PotY = map(analogRead(A5), 0, 1023, 0, 255);
 
                                                     // Envia todos los datos de la estructura al receptor.
  radio.write(&data, sizeof(data));
  delay(1000); // <= aca esta el cambio
}

sevillalva

Hola, he probado de poner el delay(1000); y sigue sin funcionar lo he cambiado desde 100 a 2000 y tampoco funciona.
cuando lo pongo se enciende el led 3 fijo y el led 7 parpadea pero no se apaga ninguno, he echo varias pruebas con el RX y tampoco, en fin estoy un poco desconcertado y no se por donde tirar, creo que voy a empezar de nuevo, es una lastima que este código no funcione porque todo los demás códigos de leds, motores y servos con este TX (en un A.Mega mini)si que me funciona y tener que empezar de nuevo con otra forma de hacer el TX y RX, me va a costar otros 6 meses o mas como me esta pasando ahora con este ultimo, bueno voy ha continuar un poco mas y si no funciona empezare de otra forma desde cero.

Gracias Sr. Surbyte por su ayuda y saludos.

sevillalva

Hola a todos, ya estoy aquí de nuevo con mi proyecto, Ya he conseguido pasar freno e intermitentes a
NRF24L01, pero ahora tengo que pasarlo a mi Sketch de (struct Data_Package)

aquí dejo el TX

Code: [Select]
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 10);

int Array[4];
const uint64_t pipe = 0xF0F0F0F0E1LL;

const int X_pin = 0; // analog pin connected to X output
const int Y_pin = 1; // analog pin connected to Y output

void setup()
{
  Serial.begin(9600);
  // Define the radio communication
  radio.begin();
  radio.setAutoAck(false);
  radio.enableAckPayload();
  radio.setRetries(5, 15);
  radio.openWritingPipe(pipe);
  radio.stopListening();
 
}

void loop()
{

  Array[0] = analogRead(X_pin);
  Array[1] = analogRead(Y_pin);

  if (!radio.write( &Array, sizeof(Array)));
}

sevillalva

Hola, como sigo sin saber como poner dos códigos en la misma respuesta.
Si alguno tiene idea de como pasarlo a ( struct Data_Package  )que son los Sketch 2º y 3º que puse arriba se lo agradecería y gracias de antemano.
Yo seguiré intentándolo haber si lo consigo y los puedo unir todos en dos (Mega mini pro), que creo que sera una pasada para los RC "barcos,coches,camiones,drones,aviones,etc." y todo lo que uno cree con control remoto basado en NRF24L01

aquí pongo RX

Code: [Select]

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


RF24 radio(9,10);

int gotArray[4];
const uint64_t pipe = 0xF0F0F0F0E1LL;

int X_value;
int Y_value;
unsigned long beep;
const int duracion=300;       //si quieres que el tono sea mas corto baja este valor
const int frecuencia=2450;    //si quieres que se escuche mas agudo sube este valor
const byte Pin1 = 2,        //Declaramos los pins de los LEDs
           Pin2 = 3,             //Declaramos los pins de los LEDs
           Pin3 = 4,             //Declaramos los pins de los LEDs
           Pin4 = 5,             //Declaramos los pins de los LEDs
           buzzer1 = 6;            //Declaramos el pin del buzzer
unsigned long impresion;

//--------Intermitentes-----------
unsigned long previousMillis = 0;       // almacenará la última vez que se actualizó el LED
const unsigned long interval = 400;

void setup()
{
  Serial.begin(9600);
  radio.begin();
  radio.setAutoAck(false);
  radio.enableAckPayload();
  radio.setRetries(5, 15);
  radio.openReadingPipe(1, pipe);
  radio.startListening();
 

  //Set pins as outputs
  pinMode(Pin1, OUTPUT);
  pinMode(Pin2, OUTPUT);
  pinMode(Pin3, OUTPUT);
  pinMode(Pin4, OUTPUT);
  pinMode(buzzer1, OUTPUT);
}

void loop()
{
 
  while (radio.available()) {
    radio.read( &gotArray, sizeof(gotArray) );
    X_value = gotArray[0];
    Y_value = gotArray[1];
   
  }
  {
    freno();
    intermitente();
  }
}
 
void intermitente()
{
   if (Y_value >= 451 && Y_value <= 549 ) {
    digitalWrite(Pin1, LOW);  //izquierda
    digitalWrite(Pin2, LOW);   //derecha
   
  }
      //-----Intermitente Derecho-----
   if (Y_value >=0 && Y_value <= 450 )
   {
    if (millis() - previousMillis >= interval)
    {
    digitalWrite(Pin1, !digitalRead(Pin1));   //izquierda
    previousMillis = millis();
    }
    digitalWrite(Pin2, LOW);  //derecha
 //-----Intermitente Izquierdo----
  }
  if (Y_value >= 550 && Y_value <= 1023 )
  {
   if (millis() - previousMillis >= interval)
    {
    digitalWrite(Pin2, !digitalRead(Pin2));  //derecha
    previousMillis = millis();
    }
    digitalWrite(Pin1, LOW);   //izquierda
 
  }
}
  void freno()
  {
 
  if(millis() - impresion >= 500UL){
     
      impresion=millis();
//---------------freno marcha atras-----------------------
   if (X_value >= 0 && X_value <= 255)
   {
    if( millis()- beep >= duracion*2){  //multiplico duracion por 2 para que dure el mismo tiempo el tono encendido que apagado
       tone(buzzer1, frecuencia, duracion);
               beep=millis();
        }
 
    digitalWrite(Pin4, HIGH);   //freno
    digitalWrite(Pin3, LOW);    //marcha atras
  }
  }
   if (X_value >= 256 && X_value <= 550)
   {
    digitalWrite(Pin3, HIGH);   //marcha atras
    digitalWrite(Pin4, LOW);    //freno
  }
   if (X_value >= 555 && X_value <= 1023) {
    digitalWrite(Pin3, LOW);   //marcha atras
    digitalWrite(Pin4, LOW);    //freno
  }
   
 
}

Go Up