Luces LED programables para tu bicicleta con Arduino

Queria hacer unas luces totalmente personalizadas para mi bicicleta, de manera que sea aún más bisible en la calle, en la luz tracera se va a mostrar un patron de iluminación para llamar la atención, será posible cambiar varios modos de iluminación con un botón, en la luz frontal pienso colocar una luz LED que esté conectada con todo el sistema y que responda a los modos. Vamos a ello.

En el video en YouTube que pueden ver más abajo está todo el proceso, pero aquí les explico de forma escrita y gráfica en caso de que necesites más material de apoyo para comprender este proyecto aún mejor.

Para este proyecto vamos a necesitar lo siguiente:

  • Tarjeta Arduino
  • 50 luces LED rojas y 3 blancas
  • Cable o cobre esmaltado
  • Batería/s de alta capacidad de tu prefencia (6V mínimo, 20V máximo)
  • Resistencias dependiendo de los LEDs y voltaje
  • ULN2803 Driver Darlington
  • Transistor NPN (2N2222A o parecido)
  • Herramientas variadas como máquina para soldar, cinta eléctrica, etc.

El código de Arduino lo puedes copiar del código fuente que aparece abajo o descargar en el botón de abajo, si descides descargar del botón, hay dos códigos diferentes, uno de ellos se llama “bicycle_LED_attiny13_V1.0” que está hecho para funcionar en un micro chip ATtiny13 pero el proyecto se vuelve mucho más complicado como podras ver en el video, usa el archivo llamado “bicycle_LED_arduino_nano_V1.2” programado para funcionar con cualquier tarjeta Arduino, sin embargo yo uso un Arduino nano por su tamaño y portabilidad también puedes usar un Arduino pro mini o incluso un Arduino UNO.

/*Proyecto de sistema de luces LED para bicicleta por Joyvel Osorio y la ayuda de recursos online.
 * Este proyecto es explicado con más detalle en https://joyplanes.com/luces-led-programables-bicicleta-arduino y en el video https://youtu.be/oG8k94WaMJQ
 * a continuación el código para ser cargado en un Arduino portátil como el nano o pro mini para ser colocado discretamente en la bicicleta.
 */

// constantes que no cambian:
int  buttonPin = 9;    // the pin that the pushbutton is attached to

// Variables cambiantes:
int buttonPushCounter = 0;   // contador del botón
int buttonState = 0;         // estado actual del botón
int lastButtonState = 0;     // estado anterior del botón
int i = 0;

/*pins*/
int timer = 50;           // Mayor el número más delay.
int ledPins[] = {
  2, 3, 4, 5, 6, 7
};       // El conjunto de pines en los que los LED están conectados
int pinCount = 6;           // El número de pins en uso (número de pines en el conjunto)

//Foco frontal:
int luzPin =  10;      // pin de la luz frontal

void setup() {
  // Inicializar el pin del botoón como una entrada:
  pinMode(buttonPin, INPUT);
  // inicializar los LED como salida:
  pinMode(luzPin,OUTPUT);

  for (int thisPin = 0; thisPin < pinCount; thisPin++) {
    pinMode(ledPins[thisPin], OUTPUT);
  }
}

void loop() {

  boton();
    /*modo por defecto luego de encender*/

if (buttonPushCounter == 0) {

  for (int thisPin = 0; thisPin < pinCount; thisPin++) {
    // turn the pin on:
    digitalWrite(ledPins[thisPin], HIGH);
    delay(timer);
  }

  // loop del mayor al menor:
  for (int thisPin = 0; thisPin < pinCount; thisPin++) {
    // turn the pin off:
    digitalWrite(ledPins[thisPin], LOW);
    delay(timer);
  }

}

  //--------Modo 1----------/
  if (buttonPushCounter == 1) {
    luz1();

     for (int j; j < 5; j++) {

     for (int i=0; i<6; i++)
  {
    digitalWrite(ledPins[i], HIGH);
  }

  boton();

      delay(50);
      for (int i=0; i<6; i++)
  {
    digitalWrite(ledPins[i], LOW);
  }
      delay(80);
    }
    if (i == 6) i = 0; 
     delay(20);

      for (int thisPin = 0; thisPin < pinCount; thisPin++) {
    // turn the pin on:
    digitalWrite(ledPins[thisPin], HIGH);
    delay(timer);
  }

  // loop del mayor al menor:
  for (int thisPin = 0; thisPin < pinCount; thisPin++) {
    // turn the pin off:
    digitalWrite(ledPins[thisPin], LOW);
    delay(timer);
  }

  }

  //--------Modo 2----------/
  if (buttonPushCounter == 2) {
    boton();
    digitalWrite(luzPin,HIGH);

      for (int thisPin = 0; thisPin < pinCount; thisPin++) { // turn the pin on: digitalWrite(ledPins[thisPin], HIGH); delay(timer); } // loop from the highest pin to the lowest: for (int thisPin = pinCount - 1; thisPin >= 0; thisPin--) {
    // turn the pin off:
    digitalWrite(ledPins[thisPin], LOW);
    digitalWrite(luzPin,LOW);
    delay(timer);
   }

  }

    //----------Modo 3-----------/
  if (buttonPushCounter == 3) {
    digitalWrite(luzPin,LOW);
    boton();

    for (int j; j < 3; j++) {
      digitalWrite(luzPin,HIGH);
      delay(20);
      digitalWrite(luzPin,LOW);
      delay(30);
      digitalWrite(luzPin,HIGH);
      delay(20);
     for (int i=0; i<6; i++)
  {
    digitalWrite(ledPins[i], HIGH);

  }

      delay(10);

      for (int i=0; i<6; i++) { digitalWrite(ledPins[i], LOW); } digitalWrite(luzPin,LOW); delay(200); } if (i == 6) i = 0; delay(20); digitalWrite(luzPin,HIGH); for (int thisPin = pinCount - 1; thisPin >= 0; thisPin--) {
    // turn the pin on:
    digitalWrite(ledPins[thisPin], HIGH);
    boton();
    delay(30);
  }
  digitalWrite(luzPin,LOW);
  // loop from the highest pin to the lowest:
  for (int thisPin = 0; thisPin < pinCount; thisPin++) {
    // turn the pin off:
    digitalWrite(ledPins[thisPin], LOW);
    boton();
    delay(30);
  }
  digitalWrite(luzPin,HIGH);

for (int thisPin = 0; thisPin < pinCount; thisPin++) { // turn the pin on: digitalWrite(ledPins[thisPin], HIGH); boton(); delay(30); } digitalWrite(luzPin,LOW); for (int thisPin = pinCount - 1; thisPin >= 0; thisPin--) {
    // turn the pin off:
    digitalWrite(ledPins[thisPin], LOW);
    delay(30);
  }

  boton();
  delay(50);
    }

}

void boton()
{
   // leer el botón:
  buttonState = digitalRead(buttonPin);

  // comparar el estado del botón con el estado previo
  if (buttonState != lastButtonState) {
    // si el botón ha cambiado, incrementar contador
    if (buttonState == HIGH) {
      buttonPushCounter++;
    } 

  }
  lastButtonState = buttonState;

    if (buttonPushCounter >= 4) {
    buttonPushCounter =0;
  }
 }

void luz1()
{
 if (buttonPushCounter == 1) 
 { 
  digitalWrite(luzPin,HIGH);
 }

}

Una vez tengan todo en mano debemos subir el programa al Arduino, esto es algo básico que ya debes saber hacer ya que no voy a detallar el proceso para cargar el programa. Fíjate que en el código se espesifícan las entradas y salidas de nuestras luces y el botón. Puedes cambiarlas a tu voluntad dependiendo de tus necesidades. En el siguiente gráfico verás como he hecho las conexiones.

Todavía tengo en mente mejorar este sistema y hacer una mejor versión, próximamente espero hacer un case protector impreso en 3D para que tenga un mejor acabado y protegido de los elementos, también haceindo su montaje en cualquier bicicleta muy fácil, de luz frontal voy a usar un LED mucho más potente para ver en total oscuridad. Esas modificaciones están en proceso y si no te quieres perder del video cuando esté listo suscríbete al canal de YouTube.

Versión simple

No requiere programación

Este otro video es sobre la creación de un sistema más simple y que no requiere programación y se usa una PCB para mantener orden en el diseño.

Lista de componentes.

  • NE555 o similar
  • Resistencia de 10K
  • Resistencia de 22K
  • Capacitor de 10uF
  • Interruptor
  • LEDs rojos de 10mm

Ambos esquemas de los circuitos:

Escribe un comentario