miércoles, 26 de marzo de 2014

Nokia LCD 5110.Ejemplo de Radar Gráfico

En esta entrada (como en la mayoría :) sólo voy a coger algo de código de otra fuente y ponerlo aquí con las reflexiones acerca del componente y su utilidad. Como siempre , las cosas nunca son exactamente como te las encuentras en los foros o en tutoriales. En este caso he cogido el cableado y la programación de http://muziol.com/nokialcd/. Y excepto un par de detalles, lo demá está tal cual aparece en dicho blog.


El componente en questión es el LCD Nokia 5110. Es un lcd gráfico que cuenta con librerías de ADAFRUIT (copia local de código del blog anterior, en Adafruit tb están disponibles) :

https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library https://github.com/adafruit/Adafruit-GFX-Library

Estas librerías permiten dibujar lineas, círculos e imprimir cadenas con facilidad , lo que hace de este lcd un magnífico elemento para montar encima de un vehículo robótico y que nos vaya mostrando lo que ve (sonar).


Para ello voy a utilizar tb un sonar con una librería(ultrasonic.h) para facilitar su uso: http://www.ardublog.com/library-for-arduino-ultrasonic-ranging-hc-sr04/#more-62


El programa dibuja un grid y una linea que se mueve de izquierda a derecha simulando el comportamiento de una pantalla radar. Luego dibuja un circulo relleno donde encuentre un obstáculo hasta a 51 cmd de distancia.Esta distancia es la máxima que permite la librería, pero es facilmente modificable dentro de ella en una constante que viene con explicaciones en el propio código de la misma


La imagen del circuito es la siguiente (los pines y cabreados se deducen fácilmente del código):


Como adelantaba en la introducción , las cosas no siempre funcionan a la primera y el circuito, tal cual está planteado en el blog de referencia, sobrecargaba el Arduino, haciendo que se reiniciara aparte de que se veía muy mal el dibujo. La parte del dibujo la arreglé subiendo el contraste en el código , a 60. Pero la segunda parecía tener que ver con consumo.  El LCD de Nokia se alimenta a 3,3v. Por lo que puse una resistencia desde vcc (en  Arduino uno no hace falta porque hay salida directa de 3,3v). Sin embargo la luz de fondo es muy intensa y no me parecía normal (se puede apreciar en la foto). El cableado del blog indica poner la patilla 2, light, a GND. Yo he puesto  una resistencia de 100 ohmios  a masa en este pin y ahora el sistema es estable y la imagen es más nítida.
:








El programa es el siguiente:



#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

// pin 3 - Serial clock out (SCLK)    3
// pin 4 - Serial data out (DIN)      4
// pin 5 - Data/Command select (D/C)  5
// pin 7 - LCD chip select (CS)       7
// pin 6 - LCD reset (RST)            6
/*
HC-SR04 VCC -> ARDU 5V
HC-SR04 TRIG-> ARDU 11
HC-SR04 ECHO-> ARDU 12
HC-SR04 GND -> ARDU GND
*/

#include <Ultrasonic.h>
Ultrasonic ultrasonic(11,12);


Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 7, 6);

int i=0;
int dist,inv=0;
boolean stan=0;

void setup()   {
  display.begin();
  display.setContrast(60);
  display.clearDisplay();
}

void loop() {
distance();


//sweep loops
for(i=0;i<=84;i=i+2){
      if(i>0){
    display.clearDisplay();  
  display.drawLine(i-2,0,42,47,WHITE);
  display.drawLine(i,0,42,47,BLACK);
  grid();
  distance();
  } else {
   display.clearDisplay();
  display.drawLine(i,0,42,47,BLACK);
  grid();
  distance();
  }
  display.display();  
  delay(50);
}
for(i=84;i>=0;i=i-2){
   if(i>=84){
      display.clearDisplay();
  display.drawLine(i,0,42,47,BLACK);
  grid();
  distance();
  display.display();  
  delay(50);
  } else {
     display.clearDisplay();
  display.drawLine(i+2,0,42,47,WHITE);
  display.drawLine(i,0,42,47,BLACK);
  grid();
  distance();
  display.display();  
  delay(50);  
  }
}
distance();
}

void distance(){
  grid();
  display.setCursor(66,33);
  dist=ultrasonic.Ranging(CM);
  display.println(dist);
  if (dist<=5){
  display.setCursor(54,41);
  display.println("ALERT");
  }
}

void grid(){
  //function body
  display.drawLine(0,0,42,47,BLACK);
  display.drawLine (84,0,42,47,BLACK);
  display.drawCircle(42,47,5,BLACK);
  display.drawCircle(42,47,15,BLACK);
  display.drawCircle(42,47,25,BLACK);
  display.drawCircle(42,47,35,BLACK);
  display.drawCircle(42,47,45,BLACK);
  display.drawCircle(42,47,55,BLACK);
  display.fillTriangle(0,1,41,47,0,47,WHITE);
  display.fillTriangle(84,1,43,47,84,47,WHITE);
  display.drawLine(0,7,0,47,BLACK);
  display.drawLine(42,0,42,47,BLACK);
  display.drawLine(0,47,3,47,BLACK);
  display.drawLine(0,42,1,42,BLACK);
  display.drawLine(0,37,3,37,BLACK);
  display.drawLine(0,32,1,32,BLACK);
  display.drawLine(0,27,3,27,BLACK);
  display.drawLine(0,22,1,22,BLACK);
  display.drawLine(0,17,3,17,BLACK);
  display.drawLine(0,12,1,12,BLACK);
  display.drawLine(0,7,3,7,BLACK);
  display.fillCircle(42,(48-dist),2,BLACK);
}


La idea ahora es montar este dispositivo sonar encima de un servo y mostrar la linea de obstáculos que tiene enfrente el Arduino car, pero antes tengo que encontrar 5 pines libres!. La solución a este problema va a ser poner el arduino mega en el robot. Sin embargo el primer intento de este cambio no funcionó, probablemente por alguna incompatibilidad con el motorshield. Ya contaré si tiene solución.



1 comentario: