Archivo de la etiqueta: shield

Necesitas visualizar información con tu Arduino? Nada mejor que un LCD a color

En este post, vamos a revisar el Color LCD Shield, fabricado por Elecfreaks y distribuido por www.dx.com, que viene listo para usar con cualquier placa Arduino.

DSC00252

Este shield tiene las siguientes características:

  • Display a color de 128x128px, basado en el display Nokia 6100
  • 4096 colores (profundidad de color de 12 bits)
  • Interfaz I2C (requiere unos pocos pines para funcionar)
  • Control de iluminación del backlight, mediante PWM en el pin 10 del arduino
  • Joystick de 5 posiciones, conectado a las entradas A0-A4 (deben ser configuradas como entradas digitales)
  • Regulación automática de 3.3v (no requiere modificaciones adicionales al Arduino)

El precio de este shield es bastante conveniente (19.xx con envío gratis desde China), y la calidad de fabricación es excelente. El item viene debidamente empacado, protegiendo con gomaespuma la pantalla y los pines de conexión, evitando las pantallas rotas o pines doblados en el largo viaje desde el otro lado del mundo.

Para esta prueba, vamos a usar los siguientes componentes:

Por que usar un LCD gráfico en lugar del clásico shield LCD 16×2? bueno, aquí es cuestión de gustos, y de la aplicación que le querramos dar. Como ejemplo del funcionamiento del Shield, y para ilustrar las funciones disponibles para el mismo, vamos a programar un voltímetro, que mida entre 0 y 5v, y que nos grafique en tiempo real las variaciones de voltaje ingresadas por el pin A5 de nuestro Arduino Uno.

Primero, debemos descargar e instalar la librería ColorLCDShield, que la puedes descargar de este enlace. Esta librería debe ser descomprimida en la carpeta “Libraries” de tu instalación del Arduino IDE, antes de empezar con nuestra prueba.

Primero, debemos incializar el LCD, para lo cual usamos los siguientes comandos:

pinMode(10, OUTPUT);
analogWrite(10, 1023); 
lcd.init(PHILLIPS); 
lcd.contrast(40);

Como podemos ver en este fragmento de código, el pin 10 de nuestro arduino controlará la intencidad del backlight mediante PWM. El valor de 40 para el contraste es un valor recomendado por el fabricante, así que no hay mucha explicación sobre dicho valor.

A continuación, luego de inicializada la pantalla, procedemos a dibujar la grilla de fondo. Para esto, vamos a usar el siguiente código:

  int x,y;  
  lcd.clear(BLACK);  
  lcd.setStr("Datalogger 2013 ", 2, 0, RED, WHITE);
  lcd.setStr("www.patolin.com ", 112, 1, BLUE, WHITE);
  for (x=1;x< =132;x+=20) {
       lcd.setLine(30,x,110,x, GRAY);
  } 
  for (y=30;y<=110;y+=20) {
       lcd.setLine(y,1,y,132, GRAY);  
  }
  lcd.setRect(30,2,110,129, 0, MAGENTA);

Dentro de este bloque, como podemos observar, usamos rutinas para limpiar la pantalla lcd.clear(BLACK);, escribir strings lcd.setStr(“Datalogger 2013 “, 2, 0, RED, WHITE);, dibujar líneas lcd.setLine(30,x,110,x, GRAY); y dibujar rectángulos lcd.setRect(30,2,110,129, 0, MAGENTA);.

Todas estas funciones, y el listado de colores disponibles como constantes para facilidad de uso, se encuentran detallados dentro de la ayuda de la librería del display.

Lo que vamos a hacer con nuestro arduino, es leer el valor del potenciómetro conectado en el puerto A5, y graficarlo en escala, dentro de la grilla que dibujamos previamente. El momento que el gráfico de la señal llegue al borde derecho de la grilla, limpiaremos la pantalla y empezaremos desde el borde izquierdo. Les dejo el código completo que estoy usando.

#include <ColorLCDShield.h> 

LCDShield lcd;  
int buttonPins[5] = {A0, A1, A2, A3, A4};  

void setup()
{
  pinMode(10, OUTPUT);
  analogWrite(10, 1023); //PWM control blacklight
  lcd.init(PHILLIPS);  // Initializes lcd, using an PHILIPSdriver
  lcd.contrast(40);  // -51's usually a good contrast value

  dibujaGrilla();
}

void dibujaGrilla() {

  int x,y;  
  lcd.clear(BLACK);  
  lcd.setStr("Datalogger 2013 ", 2, 0, RED, WHITE);
  lcd.setStr("www.patolin.com ", 112, 1, BLUE, WHITE);
  for (x=1;x< =132;x+=20) {
       lcd.setLine(30,x,110,x, GRAY);
  } 
  for (y=30;y<=110;y+=20) {        lcd.setLine(y,1,y,132, GRAY);     }   lcd.setRect(30,2,110,129, 0, MAGENTA); } void dibujaPunto(int x,int valADC) {   // ajustamos el valor del adc para la escala del grafico   int valor;   valor=valADC/20;   lcd.setPixel(RED,(110-valor),x); } void loop() {   int x=3;   int valor;   while(1) {     if (x>128) { x=3; dibujaGrilla();}
    valor=analogRead(A5);
    dibujaPunto(x,valor);
    delay(100);

    x++;
  }
}

Luego de cargar el código en el Arduino, el resultado es excelente! hemos creado con unas pocas líneas de código, un datalogger gráfico, que puede servir como base para muchas aplicaciones más. Les dejo un pequeño video del resultado.

Como podemos observar, este LCD Shield es bastante práctico, y es una gran mejora sobre el LCD 16×2 que casi siempre usamos en nuestros proyectos, para resumir sus características, podemos lanzar la siguiente comparativa:

A favor:

  • Bajo costo
  • Envío gratis desde dx.com
  • Incluye joystick de 5 posiciones
  • Interfaz I2C reduce el número de pines usados
  • Librerías listas para generar texto y gráficos
  • Facil uso y de facil integración en tus proyectos con Arduino

En contra

  • Largo tiempo de espera para recibirlo
  • el Joystick utiliza 5 pines (A0-A4) dejando solo una entrada analógica disponible (podría arreglarse cambiando los pines usados, conectándolo a un arduino nano o pro)
  • La actualización del display es un poco lenta, para algunas aplicaciones (podría ser un poco lenta si queremos usarla para un osciloscopio digital)

 

 

Transmisor de 2.4Ghz con Arduino

Como vieron hace un par de semanas, estuve diseñando un transmisor de radio control de 4 canales, de 2.4Ghz de frecuencia, para actualizar mi transmisor básico (un Hobbyking de 6 canales).

La idea es que el Arduino se encargue de todo lo que concierne a la lectura de los potenciómetros, inversión de la dirección de los servos (en los casos que se requiera), ajuste de máximos y mínimos, y la generación de la señal PPM, que se enviará al módulo de RF original del transmisor donante.

Actualmente, el programa simple que hice, mantiene memoria para 5 modelos (almacenados en la eeprom del microcontrolador), controla la dirección de los servos, y dual rates para cada canal.

El circuito del transmisor es el siguiente:

tx

 

Como podemos observar, el circuito es bastante simple. El arduino va conectado a un shield de LCD+teclado para la visualización y comando de los menus; los 4 potenciómetros son los que van en las palancas de mando, los 2 interruptores son los de Throtle Cut (apaga los motores directamente) y para el Dual Rate, y la señal PPM es generada en el pin 9 del Arduino, desde donde se la conecta al módulo de 2.4Ghz.

El transmisor funciona a la perfección. Hoy hice un pequeño vuelo de prueba, y no hubo interferencias ni pérdidas de señal.

El código fuente, y la librería RC, necesaria para el cálculo y generación de los pulsos PPM, los pueden descargar de los siguientes enlaces:

El código puede ser mejorado, pero para desoxidarme un poco en la programada de microcontroladores, funciona bién.

Les dejo un video de las últimas pruebas, antes del vuelo.