Luces led programables en mini aviones o coches RC de juguete

¿Cómo se hace?

Conocimientos de electrónica básica o intermedia requeridos.
Para lograr esto necesitas un canal libre en el receptor del juguete para controlar las luces LED desde el radio, si no hay ningún canal libre (es el caso la mayoría de las veces) entonces debes sacrificar un canal lo cual no es recomendable, es mejor usar un sistema RC que te permita usar varios canales pero en ese caso nos salimos del objetivo de colocarle luces a un juguete sin un control adicional, otra opción es usar un botón para cambiar de modos pero no se podrían controlar desde el radio.
En este tutorial le he colocado luces a un avión Cessna 182 el cual tiene una tarjeta con un canal disponible que podemos usar para lograr esto. Este avión es muy económico pero excelente para aprender a volar aviones RC, lo puedes comprar aquí. O puedes comprar la tarjetar receptora y el control aparte aquí y hacer un avión con estos elementos como lo hice en este video.

Vas a necesitar la tarjeta Digispark que va a controlar las luces, y necesitas unas luces LED y resistencias de al menos 100 o 200 Ohms.

Para poder porgramar la tarjeta debes seguir los pasos de este video donde demuestro todo el proyecto de principio a fin.

Luces LED programables en un Cessna RC

El código a usar lo puedes copiar de aquí abajo o desde la página de descargas donde puedes seleccionar otras versiones. La versión 1.1 tiene algunos errores pero funciona bien.

#include <elapsedMillis.h>
elapsedMillis timeElapsed;
elapsedMillis timeElapsed2; //declare global if you don't want it reset every time loop runs

/*pwm read*/
int pwm = 1;
long mode;

/*Puertos luces LED*/
int led1 = 4;
int led2 = 3;

/* fade int's */
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by
unsigned int interval1 = 2000;
unsigned int interval2 = 1300;
int counter = 0;
int a = 0;

// state of the LED = LOW is off, HIGH is on
boolean ledState = LOW;

void setup() 
{
  // set the digital pin as output:
  pinMode(pwm,INPUT);
  pinMode(led1, OUTPUT);      
  pinMode(led2, OUTPUT);    

  /*indicador final de inicializacion*/
 for(a = 0; a <= 255; a = a + 35)
  {
     // set the brightness of pin 9: 
     analogWrite(led2, a);    
    // wait for 30 milliseconds to see the dimming effect    
    delay(30);                            
  }

  for(a = 255; a >= 0; a = a - 15)
  {
     // set the brightness of pin 9: 
     analogWrite(led2, a);    
    // wait for 30 milliseconds to see the dimming effect    
    delay(30);                            
  }
  /*fin de iniciacion*/
}

void loop()
{

mode = pulseIn(pwm, HIGH);

/*selector*/
  if (mode <= 1150 && mode >= 850) {
      counter++;
      delay(250);
    }

    if (counter >= 5){ 
      counter = 0;
      }
/*fin del selector*/

if (mode <= 1920 && mode >= 1700 && counter == 1 
|| mode <= 1920 && mode >= 1700 && counter == 2 
|| mode <= 1920 && mode >= 1700 && counter == 3 
|| mode <= 1920 && mode >= 1700 && counter == 4) {
  if (timeElapsed >= 1300) {
    timeElapsed = 0;
    }

  if (timeElapsed >= interval2)
    {       
    counter = 0;
    }
  }

if (counter == 0) {

 digitalWrite(led1,LOW);
 digitalWrite(led2,LOW);
}

 if (timeElapsed < interval2 && mode <= 1450 && mode >= 1400) {
    counter = 0;
    }

/*---------modo1-----------*/

   if (counter == 1) {

    if (timeElapsed2 >= 1801)
    {
    timeElapsed2 = 0;
    }

      if (timeElapsed2 < 20) {
        digitalWrite(led1,LOW);
        digitalWrite(led2,HIGH);
      }
      if (timeElapsed2 > 20 && timeElapsed2 < 100) {
        digitalWrite(led2,LOW);
      }
      if (timeElapsed2 > 100 && timeElapsed2 < 120) {
        digitalWrite(led2,HIGH);
      }
      if (timeElapsed2 > 120 && timeElapsed2 < 200) {
        digitalWrite(led2,LOW);
      }
      if (timeElapsed2 > 200 && timeElapsed2 < 220) {
        digitalWrite(led2,HIGH);
      }
      if (timeElapsed2 > 220 && timeElapsed2 < 920) {
        digitalWrite(led2,LOW);
      }
      if (timeElapsed2 > 920 && timeElapsed2 < 970) {
        digitalWrite(led1,HIGH);
      }
      if (timeElapsed2 > 970 && timeElapsed2 < 1070) {
        digitalWrite(led1,LOW);
      }
      if (timeElapsed2 > 1070 && timeElapsed2 < 1120) {
        digitalWrite(led1,HIGH);
      }
      if (timeElapsed2 > 1120 && timeElapsed2 < 1170) {
        digitalWrite(led1,LOW);
        digitalWrite(led2,HIGH);
      }
      if (timeElapsed2 > 1170 && timeElapsed2 < 1800) {
        digitalWrite(led2,LOW);
      }

      }

  /*modo 2*/

  if (counter == 2) {
      digitalWrite(led1,LOW);
      digitalWrite(led2,HIGH);
       }

  /*modo 3*/
  if (counter == 3) {
      digitalWrite(led1,HIGH);
      digitalWrite(led2,HIGH);
      }

  /*modo 4*/
  if (counter == 4) {
    if (timeElapsed2 < 20) {
        digitalWrite(led1,LOW);
        digitalWrite(led2,HIGH);
      }
      if (timeElapsed2 > 20 && timeElapsed2 < 100) {
        digitalWrite(led2,LOW);
        digitalWrite(led1,HIGH);
      }

  }

}

Notas sobre compatibilidad

Si usas otro receptor con este código probablemente tengas problemas de compatibilidad por los rangos diferentes en los que trabajan los distintos sistemas, si usas el mismo avión o tarjeta receptora no debería haber problemas, asegúrate de colocar el radio en modo H para que funcione el cambio de los modos. De cualquier forma puedes modificar los rangos desde la linea 68 donde dice: if (mode <= 1920 && mode >= 1700 && counter == 1 … pero es recomendable subir el código al Arduino para ver el serial port y ver en que rangos trabajan los otros sistemas.

Escribe un comentario