martes, 2 de agosto de 2016

TIRA DE LED WS2812, simulando un cuenta revoluciones


    Hola a todos,

    hace unas semanas compré esta tira de led programable. Está basada en el chip WS2812 y lo que quiero hacer con ella es simular un cuenta revoluciones que posteriormente usaré en un dashboard que estoy diseñando para mis simuladores de coches.

     Espero poder mostraros en breve una prueba de la tira de led funcionando con un juego.

     La tira de led funciona a 5 Voltios y la hace perfecta para trabajar con arduino, a no ser, que usemos una tira de led  demasiado larga que necesitaría una alimentación externa. Con esta tira podemos iluminar y cambiar de color cada led individualmente.

Para este ejemplo necesitamos:

- Tira de led W2812
- Arduino Uno
- Potenciometro
- Cables varios

Vamos a simular que nuestro potenciometro es el acelerador del coche y a medida que aceleramos se iluminan leds y cambian de color, este "programita" también nos sirve para aprender a manejar está tira de led.

Este es el esquema de conexiones que he utilizado:



Y este es el código, antes deciros que necesitáis descargar la librería Adafruit NeoPixel y añadirla a vuestro editor de arduino y os aconsejo que os leáis la documentación asociada ya que es bastante clara y nos ayuda a usar esta tira de led

#include <Adafruit_NeoPixel.h>
#include <avr/power.h>

//Designamos nuestro pin de datos
#define PIN 6
//Designamos cuantos pixeles tenemos en nuestra cinta led RGB
#define NUMPIXELS      10

//Definimos el número de pixeles de la cinta y el pin de datos
//   Parámetro 1 = número de pixeles de la cinta
//   Parámetro 2 = número de pin de datos del Arduino
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

const byte Pot = A0;
int val=0;

// IMPORTANTE: Para reducir el riesgo de dañar los pixeles de la cinta, añada un condensador de 1000 uF a través de
// los cables de alimentación de la cinta, agregue una resistencia de 300-500 Ohm en la entrada de datos del primer pixel
// Y reduzca la distancia entre Arduino y el primera pixel. 
// Evite realizar conexiones en el circuito vivo si lo va a hacer, conecte GND primero.

void setup() {
// Inicializamos nuestra cinta led RGB
  pinMode(Pot, INPUT); //Marcamos el pin como entrada
  pixels.begin(); //inicializamos la tira de led
   
  
}

void loop() {
  //Definimos nuestras variables de tipo uint32 para cada color que utilizaremos
  // pixels.Color toma valores en RGB, desde 0,0,0 hasta 255,255,255
  uint32_t rojo = pixels.Color(150,0,0); //declaramos los colores que queremos usar en varaiables
  uint32_t verde = pixels.Color(0,150,0);
  uint32_t azul = pixels.Color(0,0,150);

  int delayval = 5; // Pausa de cincuenta milisegundos
  int a;
  int i;
  int control=0;
  val=analogRead(Pot);

  i=map(val, 0,1023 ,0,9);  
  
  if(control<=i){
  
    switch(i){
      case 0: pixels.setPixelColor(i, verde); break; 
      case 1: pixels.setPixelColor(i, verde); break;
      case 2: pixels.setPixelColor(i, verde); break;
      case 3: pixels.setPixelColor(i, verde); break;
      case 4: pixels.setPixelColor(i, azul);  break;
      case 5: pixels.setPixelColor(i, azul);  break;
      case 6: pixels.setPixelColor(i, azul);  break;
      case 7: pixels.setPixelColor(i, rojo);  break;
      case 8: pixels.setPixelColor(i, rojo);pixels.setPixelColor(i+1, rojo);  break;
      case 9: for(int a=0;a<NUMPIXELS;a++){
              pixels.setPixelColor(a, rojo); // Brillo moderado en rojo
              //pixels.show();   // Mostramos y actualizamos el color del pixel de nuestra cinta led RGB
              delay(delayval); // Pausa por un periodo de tiempo (en milisegundos).
              }
              for(int a=0;a<NUMPIXELS;a++){
              pixels.setPixelColor(a, azul); // Brillo moderado en azul
              pixels.show();   // Mostramos y actualizamos el color del pixel de nuestra cinta led RGB
              delay(delayval); // Pausa por un periodo de tiempo (en milisegundos).
              }break;
    }
    
    pixels.show();   // Mostramos y actualizamos el color del pixel de nuestra cinta led RGB
    control=i;
    }
    
    if(control>=i){
          
      pixels.setPixelColor(i+1, 0,0,0);
      control=i;
    }
   
  }

y aquí os dejo un vídeo de como funciona.