viernes, 9 de diciembre de 2016

Diodos LED RGB

En este artículo vamos a "jugar" un poco con los diodos led RGB.

Un LED RGB es en realidad la unión de tres LEDs de los colores básicos (Red-Green-Blue), en un encapsulado común, compartiendo el Ground (cátodo).  En función de la tensión que pongamos en cada pin podemos conseguir la mezcla de color que deseemos con relativa sencillez.



El montaje supone sencillamente conectar el negativo (el pin más largo) a Ground mediante una resistencia que limite la intensidad, y luego identificar los pines de colores:
  • El pin más largo en estos LED es el GND.
  • Al lado de GND hay dos pines a un lado y uno solitario al otro. Por lo normal el solitario es el rojo R.
  • Así pues el pin out (patillaje) de un RGB LED suele ser R, GND, G, B.


Nota: Utilizo un led con ánodo común A+ por lo que si utilizas otro tipo de led (por ejemplo de cátodo común C-) tendrás que adaptar la programación del mismo. Gracias Víctor Aca por el apunte.

El esquema de nuestras pruebas será el siguiente:



El código para estas primeras pruebas es muy simple, simplemente iremos variado el color de led en sus tres colores primarios haciendo una pausa con cada color de 1 segundo. 

void setup() {
  // Definimos los pins
  pinMode(2, OUTPUT); // Red: D4
  pinMode(4, OUTPUT); // Green: D2
  pinMode(5, OUTPUT); // Blue: D1
}

void color (int R, int G, int B) {
  analogWrite(2, R);
  analogWrite(4, G);
  analogWrite(5, B);
}
void loop() {
  color(1023, 0, 0);
  delay(1000);
  color(0, 1023, 0);
  delay(1000);
  color(0, 0, 1023);
  delay(1000);
}

Una variación de este código sería el ir variando la intensidad de cada color de forma progresiva. El código sería el siguiente:

void setup() {
  // Definimos los pins
  pinMode(2, OUTPUT); // Red: D4
  pinMode(4, OUTPUT); // Green: D2
  pinMode(5, OUTPUT); // Blue: D1
}

void fade (int pin) {
  for (int u = 0; u < 1024; u++) {
    analogWrite(pin, u);
    delay(1);
  }
  for (int u = 0; u < 1024; u++) {
    analogWrite(pin,  1023 - u);
    delay(1);
  }
}
void loop() {
  fade(2); // R
  fade(4); // G
  fade(5); // B
}

Utilizando un servidor web para controlar los colores

En este segundo ejemplo vamos configurar el módulo ESP8266 como un servidor web al que nos conectaremos e iremos vairando su color utilizando el navegador de nuestro smartphone.

El esquema será el mismo pero modificaremos el código

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
// Definimos los pins
const int R = 2; // Red: D4
const int G = 4; // Green: D2
const int B = 5; // Blue: D1


// Red WiFi
const char* ssid = "WLAN_E17C";
const char* password = "ced0ccb58c84e525e35f";


ESP8266WebServer server(80);


// Página Web que mostrará el servidor
String webpage = ""
"<!DOCTYPE html><html><head><title>RGB control</title><meta name='mobile-web-app-capable' content='yes' />"
"<meta name='viewport' content='width=device-width' /></head><body style='margin: 0px; padding: 0px;'>"
"<canvas id='colorspace'></canvas></body>"
"<script type='text/javascript'>"
"(function () {"
" var canvas = document.getElementById('colorspace');"
" var ctx = canvas.getContext('2d');"
" function drawCanvas() {"
" var colours = ctx.createLinearGradient(0, 0, window.innerWidth, 0);"
" for(var i=0; i <= 360; i+=10) {"
" colours.addColorStop(i/360, 'hsl(' + i + ', 100%, 50%)');"
" }"
" ctx.fillStyle = colours;"
" ctx.fillRect(0, 0, window.innerWidth, window.innerHeight);"
" var luminance = ctx.createLinearGradient(0, 0, 0, ctx.canvas.height);"
" luminance.addColorStop(0, '#ffffff');"
" luminance.addColorStop(0.05, '#ffffff');"
" luminance.addColorStop(0.5, 'rgba(0,0,0,0)');"
" luminance.addColorStop(0.95, '#000000');"
" luminance.addColorStop(1, '#000000');"
" ctx.fillStyle = luminance;"
" ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);"
" }"
" var eventLocked = false;"
" function handleEvent(clientX, clientY) {"
" if(eventLocked) {"
" return;"
" }"
" function colourCorrect(v) {"
" return Math.round(1023-(v*v)/64);"
" }"
" var data = ctx.getImageData(clientX, clientY, 1, 1).data;"
" var params = ["
" 'r=' + colourCorrect(data[0]),"
" 'g=' + colourCorrect(data[1]),"
" 'b=' + colourCorrect(data[2])"
" ].join('&');"
" var req = new XMLHttpRequest();"
" req.open('POST', '?' + params, true);"
" req.send();"
" eventLocked = true;"
" req.onreadystatechange = function() {"
" if(req.readyState == 4) {"
" eventLocked = false;"
" }"
" }"
" }"
" canvas.addEventListener('click', function(event) {"
" handleEvent(event.clientX, event.clientY, true);"
" }, false);"
" canvas.addEventListener('touchmove', function(event){"
" handleEvent(event.touches[0].clientX, event.touches[0].clientY);"
"}, false);"
" function resizeCanvas() {"
" canvas.width = window.innerWidth;"
" canvas.height = window.innerHeight;"
" drawCanvas();"
" }"
" window.addEventListener('resize', resizeCanvas, false);"
" resizeCanvas();"
" drawCanvas();"
" document.ontouchmove = function(e) {e.preventDefault()};"
" })();"
"</script></html>";


void handleRoot() {
  // Leemos los argumentos RGB
  String red = server.arg(0);
  String green = server.arg(1);
  String blue = server.arg(2);

  analogWrite(R, red.toInt());
  analogWrite(G, green.toInt());
  analogWrite(B, blue.toInt());

  Serial.println(red.toInt());
  Serial.println(green.toInt());
  Serial.println(blue.toInt());

  server.send(200, "text/html", webpage);
}

// Error en la url solicitada
void handleNotFound() {
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}
void setup() {
  // Definimos los pins
  pinMode(R, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(B, OUTPUT);
  // Valores iniciales
  analogWrite(R, 0);
  analogWrite(G, 0);
  analogWrite(B, 0);
  // Inicializamos el puerto serie y nos conectamos a la red wifi
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  Serial.println("");
  // Esperamos a que se conecte a la red wifi
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Conectado a ");
  Serial.println(ssid);
  Serial.print("IP: ");
  Serial.println(WiFi.localIP());
  // Con server.on indicamos una función como respuesta del servidor
  // cuando el navegador solicita cierta URL

  server.on("/", handleRoot);
  // El método server.onNotFound() definiremos la función que    

  // queremos que actúe cuando la petición que recibimos no la 
  // tenemos definida  server.onNotFound(handleNotFound);
  server.begin();
  Serial.println("HTTP server started");
}

void loop() {
  server.handleClient();
}


Confieso que la parte de javascript no la entiendo pero muestra en el navegador una degradación de colores que al ir variando la posición en la que nos movemos en la pantalla va variando el color del diodo RGB. Este código lo he obtenido del artículo ESP8266 WiFi Module Control RGBLED.


La parte del código del servidor web ya se ha explicado en el artículo Librería ESP8266WebServer.

La salida del puerto seríe es la siguiente:


La verdad es que no me coinciden los colores de la pantalla con los colores del Led y no sé exactamente por qué.

Existen otros muchos proyectos que utilizan los módulos ESP8266 para controlar leds RGB. Algunos ejemplos:

Fuentes:

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.