Professional Documents
Culture Documents
html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
He utilizado las pantallas LCD en muchos artculos aqu en el Arduino and Co., est mostrando
indicadores de temperatura y humedad en un LCD de Nokia 5110 , o las distancias ledo por un
sensor de ultrasonido en un LCD de 16x2 .
Ahora tengo la oportunidad de mostrar otra pantalla grfica LCD , esto con una resolucin
de 128x64 , basado en el chip ST7920 , que adquiri el FILIPEFLOP .
Esta pantalla tiene luz de fondo azul y blanco de escribir, y con l (y la biblioteca de la derecha) se
puede efectos grficos muy interesantes, como la rotacin de pantalla, fuentes del texto del
cambio, la rotacin de texto y, por supuesto, dibujar. Publiqu un breve vdeo en YouTube que
muestra algunas de estas funciones:
La pantalla tiene 20 pines, numeradas de derecha a izquierda, como podemos ver en la imagen
siguiente. Se puede utilizar para comunicarse con el Arduino tanto forma de serie y paralelo. En
este artculo, cuando la frecuencia de actualizacin LCD no es un punto crtico, vamos a utilizar la
comunicacin serie, ocupando slo 4 puertos Arduino:
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
Una informacin ms detallada sobre la asignacin de pines de la pantalla LCD se puede encontrar
en la hoja de datos del producto.
Actualizacin: Aqu 's cmo para encender la pantalla de forma paralela en el artculo grfico
pantalla LCD de 128x64 ST7920 modo de 8 bits .
Actualizado : montar un reloj analgico / digital con esta pantalla. Ver el poste reloj con pantalla
LCD de 128x64 y el mdulo RTC DS3231 .
La biblioteca que usamos es la U8Glib , una biblioteca muy completa (y compleja, a veces), con
muchos ejemplos de uso. Recomiendo una visita a la u8glib pgina (en Ingls), donde encontrar
instrucciones sobre el funcionamiento de la biblioteca e informacin detallada acerca tambin el
uso de cada comando. Vale la pena explorar.
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
El programa siguiente se basa en el ejemplo "GraphicsTest" , que viene con la biblioteca. De
acuerdo a las instrucciones del desarrollador, ahorr el encabezamiento con la informacin de
derechos de autor:
/*
GraphicsTest.pde
2 >>> Before compiling: Please remove comment from the constructor of
3 the
4 >>> connected graphics display (see below).
5
6 Universal 8bit Graphics Library, http://code.google.com/p/u8glib/
7
8 Copyright (c) 2012, olikraus@gmail.com
9 All rights reserved.
10
11 Redistribution and use in source and binary forms, with or without
12 modification, are permitted provided that the following conditions
13 are met:
14
15 * Redistributions of source code must retain the above copyright
16 notice,
17 this list of conditions and the following disclaimer.
18
19 * Redistributions in binary form must reproduce the above copyright
20 notice, this list of conditions and the following disclaimer in
21 the
22 documentation and/or other materials provided with the
23 distribution.
24
25 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
26 CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
27 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
28 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
29 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
30 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
32 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
33 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
34 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
35 STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
37 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 */
39
40 #include "U8glib.h"
41 // A linha abaixo define as ligacoes e deve ser
42 // ajustada conforme o display utilizado.
43 U8GLIB_ST7920_128X64_1X u8g(6, 5, 4 ,7); //Enable, RW, RS, RESET
44 int display = 1;
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
45
46 void u8g_prepare()
47 {
48 u8g.setFont(u8g_font_6x10);
49 u8g.setFontRefHeightExtendedText();
50 u8g.setDefaultForegroundColor();
51 u8g.setFontPosTop();
52 }
53
54 void u8g_Tela1() //Tela 1 - Arduino e Cia - Retangulos
55 {
56 u8g.setFont(u8g_font_unifont);
57 u8g.drawStr( 11, 35, "Arduino e Cia");
58 u8g.drawStr( 12, 35, "Arduino e Cia");
59 u8g.drawFrame(0,0,128,64);
60 u8g.drawFrame(2,2,124,60);
61 }
62
63 void u8g_Tela2() //Tela 2 - Moldura e relgio
64 {
65 u8g.drawRFrame(0,0,128,64,3);
66 u8g.drawStr( 3, 10, "Hor.: 13:00");
67 u8g.drawStr( 3, 25, "Temp: 27");
68 char s[2] = " ";
69 s[0] = 176;
70 u8g.drawStr(51, 25, s);
71 u8g.drawStr( 3, 40, "Umid: 25%");
72 u8g.drawCircle(95,32,28);
73 u8g.drawCircle(95,32,29);
74 u8g.drawLine(95, 9, 95, 4);
75 u8g.drawLine(123, 32, 118, 32);
76 u8g.drawLine(95, 55, 95, 60);
77 u8g.drawLine(67, 32, 72, 32);
78 u8g.drawLine(95, 32, 95, 12);
79 u8g.drawLine(95, 32, 100.8, 21.87 );
80 u8g.setFont(u8g_font_04b_03);
81 u8g.drawStr(89,43, "Tag");
82 u8g.drawStr(85,50, "Heuer");
83 }
84
85 void u8g_Tela3() //Tela 3 - Caracteres Ascii - Pag. 1
86 {
87 char s[2] = " ";
88 u8g.drawStr( 0, 0, "ASCII page 1");
89 for(int y = 0; y < 6; y++ )
90 {
91 for(int x = 0; x < 16; x++ )
92 {
93 s[0] = y*16 + x + 32;
94 u8g.drawStr(x*7, y*10+10, s);
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
95 }
96 }
97 }
98
99 void u8g_Tela4() //Tela 3 - Caracteres Ascii - Pag. 2
100 {
101 char s[2] = " ";
102 uint8_t x, y;
103 u8g.drawStr( 0, 0, "ASCII page 2");
104 for( y = 0; y < 6; y++ )
105 {
106 for( x = 0; x < 16; x++ )
107 {
108 s[0] = y*16 + x + 160;
109 u8g.drawStr(x*7, y*10+10, s);
110 }
111 }
112 }
113
114 void u8g_Tela5() //Tela 5 - Arduino e Cia - Retangulo preenchido
115 {
116 u8g.setFont(u8g_font_unifont);
117 u8g.drawBox(0,0,128,64);
118 u8g.drawBox(2,2,124,60);
119 u8g.setColorIndex(0);
120 u8g.drawStr( 11, 35, "Arduino e Cia");
121 u8g.drawStr( 12, 35, "Arduino e Cia");
122 u8g.drawFrame(2,2,124,60);
123 }
124
125 void u8g_Tela6() //Tela 6 - Arduino e Cia em 0, 90 e 270 graus
126 {
127 u8g.setFont(u8g_font_helvB08);
128 u8g.drawStr(50,31, " Arduino");
129 u8g.drawStr90(50,31, " e");
130 u8g.drawStr270(50,31, " Cia");
131 }
132
133 void u8g_Tela7() //Tela 7 - Fontes diferentes
134 {
135 u8g.setFont(u8g_font_robot_de_niro);
136 u8g.drawStr(5,13, "Arduino e Cia !");
137 u8g.setFont(u8g_font_helvB08);
138 u8g.drawStr(5,25, "Arduino e Cia !");
139 u8g.drawBox(5,31, 118,11);
140 u8g.setColorIndex(0);
141 u8g.setFont(u8g_font_8x13);
142 u8g.drawStr(5,41, "Arduino e Cia !");
143 u8g.setColorIndex(1);
144 u8g.setFont(u8g_font_ncenB10);
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
145 u8g.drawStr(5,60, "Arduino e Cia !");
146 }
147
148 void draw() //Rotina Desenho
149 {
150 u8g_prepare();
151 switch(display) //Carrega a tela correspondente
152 {
153 case 1:
154 u8g_Tela1();
155 break;
156 case 2:
157 u8g_Tela2();
158 break;
159 case 3:
160 u8g_Tela3();
161 break;
162 case 4:
163 u8g_Tela4();
164 break;
165 case 5:
166 u8g_Tela5();
167 break;
168 case 6:
169 u8g_Tela6();
170 break;
171 case 7:
172 u8g_Tela7();
173 break;
174 }
175 }
176
177 void setup()
178 {
179 // flip screen, if required
180 //u8g.setRot180();
181
182 // assign default color value
183 if ( u8g.getMode() == U8G_MODE_R3G3B2 )
184 u8g.setColorIndex(255); // white
185 else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
186 u8g.setColorIndex(1); // max intensity
187 else if ( u8g.getMode() == U8G_MODE_BW )
188 u8g.setColorIndex(1); // pixel on
189
190 //u8g.setContrast(0x30);
191 }
192
193 void loop()
194 {
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
195 // picture loop
196 for (display =1; display < 8; display++) //Carrega as telas de 1 a
197 7
198 {
199 u8g.firstPage();
200 do
201 {
202 draw();
203 }
while( u8g.nextPage() );
delay(3000); //Pausa de 3 segundos e reinicia o processo
}
}
/////////////////////////////////////////////////////////////////////////////////
/ *
GraphicsTest.pde
>>> Antes de compilar: Por favor quite comentario desde el constructor de
la
>>> pantalla grfica conectada (vase ms adelante).
8bit universal Graphics Library, http://code.google.com/p/u8glib/
Copyright (C) 2012, olikraus@gmail.com Todos los derechos reservados.
La redistribucin y uso en formas fuente y binario, con o sin
modificaciones, estn permitidos siempre Que Las siguientes condiciones
se cumplen: * Las redistribuciones del cdigo fuente deben conservar el
aviso de copyright anterior, esta lista de condiciones y la renuncia de
responsabilidad siguiente. * Las redistribuciones en formato binario
deben reproducir el copyright anterior notificacin, esta lista de
condiciones y la renuncia de responsabilidad Siguiendo la documentacin
y / u otros materiales proporcionados con la distribucin. ESTE
SOFTWARE SE PROPORCIONA LOS PROPIETARIOS DEL COPYRIGHT Y
COLABORADORES "TAL CUAL" SIN GARANTA EXPRESA O IMPLCITAS,
INCLUYENDO, PERO NO LIMITADO A, LAS GARANTAS DE COMERCIALIZACIN Y
APTITUD PARA UN FIN DETERMINADO DENEGARLOS. EN NINGN CASO EL
TITULAR DE DERECHOS DE AUTOR O SUS COLABORADORES responsables de
daos directos, incidentales, indirectos , o daos especiales,
EJEMPLARES DERIVADOS (INCLUYENDO, PERO NO LIMITADO A, LA ADQUISICIN
DE BIENES O SERVICIOS; PRDIDA DE USO, DE DATOS O BENEFICIOS; O
INTERRUPCIN DE NEGOCIO), ORIGEN Y DE CUALQUIER TEORA DE
RESPONSABILIDAD, YA SEA EN CONTRATO, RESPONSABILIDAD OBJETIVA O
AGRAVIO (INCLUYENDO NEGLIGENCIA), DERIVADO EN CUALQUIER FORMA DEL
USO DE ESTE SOFTWARE, INCLUSO SI SE ADVIERTE DE LA POSIBILIDAD DE
TAL DAO. * /
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
# include "U8glib.h"
// La siguiente lnea define la llamada y debe ser
// establece como la pantalla utilizada.
U8GLIB_ST7920_128X64_1X u8g ( 6 , 5 , 4 , 7 ); // Habilitar, RW, RS,
REINICIAR
int pantalla = 1 ;
void u8g_prepare ()
{
u8g.setFont (u8g_font_6x10);
u8g.setFontRefHeightExtendedText ();
u8g.setDefaultForegroundColor ();
u8g.setFontPosTop ();
}
void setup ()
{
Voltear la pantalla //, si es necesario
//u8g.setRot180 ();
//u8g.setContrast(0x30);
}
void loop ()
{
// Bucle de imagen
es (display = 1 ; display < 8 ; pantalla ++) // pantallas de carga 1-7
{
u8g.firstPage ();
de
{
draw ();
}
mientras que (u8g.nextPage ());
retardo ( 3000 ); // 3 segundos de pausa y reiniciar el proceso de
}
}
////////////////////////////////////////////////////////////////////////////////
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
Introduccin
Como ya hemos adelantado, estamos ante un LCD grfico, retroiluminado, con contraste
variable, con 128 pixeles de largo y 64 pixeles de ancho. Las pantallas quedan muy elegantes en
la mayora de proyectos realizados con Arduino, ya sea para mostrar informacin, para ayudar al
usuario con la navegacin por la aplicacin o con la configuracin, etc.
Encapsulado
La unidad que presentamos en ste post es un mdulo etiquetado como HJ12864ZW, con un LCD
grfico 12864 controlada por un integrado ST7920.
LCD
grfico 12864 con ST7920
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
Conexin
El mdulo que os presentamos tiene una variedad de pines que nos puede parecer demasiado
numerosa. Veamos el significado de cada uno:
Esquema de pines
VSS/GND Ground
VDD/VCC Vin
Data Bus 4 Data Bits ms significativos en modo paralelo 8 bits. Bus de datos en
DB4-DB7
Bus 7 modo paralelo 4 bits.
Serial / Parallel
PSB Selecciona el modo de funcionamiento (Serie / Paralelo).
control port
NC Not Connected
RST Reset
Salida del
Vout doblador de
voltaje
Dependiendo del mdulo, tendris o no un tornillo por la parte de atrs, el cual nos sirve
para variar el contraste de la pantalla. En caso de no disponer de ste tornillo (en realidad es
un potencimetro), podemos conectar un potencimetro en el pin V0 y tensin positiva (+) para
variarlo manualmente.
Del mismo modo, podemos variar la retroiluminacin del LCD colocando otro potencimetro para
variar la tensin en el pin BLA.
Un ejemplo de esquema de conexiones para utilizarlo con la librera que os recomendamos ms
abajo sera el siguiente:
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
Pin LCD Pin Arduino Comentarios
VSS/GND Ground
VDD/VCC 5v
RS Pin X digital Tiene distintos propsitos si est trabajando en modo serie o paralelo.
Pin Y digital o Si no vamos a programar ningn caracter del LCD conectamos GND, en
R/W
GND caso contrario a un pin digital.
Pines A D
DB0-DB3
digitales
Pines E H
DB4-DB7
digitales
NC Al aire
RST Al aire
Vout Al aire
BLA 5v
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
BLK Ground
Librera
Hay varias libreras circulando por la red, pero sin duda, la ms completa, con ms actualizaciones
y mejor documentada es la librera u8glib. No slo nos va a servir para este mdulo, sino que es
vlida para un montn de pantallas. Podis encontrar un montn de documentacin en su pgina
oficial de Google Code u8glib.
Requisitos de hardware
Se requiere un 128x64 LCD grfica basada en el chip controlador
KS0108. El 128x64 LCD vendidos por PJRC es totalmente compatible.
ejemplo de programa
Este programa de ejemplo viene con la biblioteca. Puede abrirlo desde
el Archivo -> Ejemplos -> KS0108 -> GLCDexample men; Ms
informacin se puede encontrar en la pgina oficial de GLCD web .
//////////////////////////////////////////////////////////////////
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
Example Program
This example program comes with the library. You can open it from
the File -> Examples -> ks0108 -> GLCDexample menu; More
information can be found on the official GLCD web page.
/*
* GLCDexample
*
* Basic test code for the Arduino KS0108 GLCD library.
* This code exercises a range of graphic functions supported
* by the library and is an example of its use.
* It also gives an indication of performance, showing the
* number of frames drawn per second.
*/
#include <ks0108.h>
#include "Arial14.h" // proportional font
#include "SystemFont5x7.h" // system font
#include "ArduinoIcon.h" // bitmap
void setup(){
delay(500); // allow time for LCD to reset
GLCD.Init(NON_INVERTED); // initialise the library, non inverted
writes pixels onto a clear screen
GLCD.ClearScreen();
GLCD.DrawBitmap(ArduinoIcon, 32,0, BLACK); //draw the bitmap at the
given x,y position
GLCD.SelectFont(System5x7); // switch to fixed width system font
countdown(5);
GLCD.ClearScreen();
introScreen(); // show some intro stuff
GLCD.ClearScreen();
}
void introScreen(){
GLCD.SelectFont(Arial_14); // you can also make your own fonts, see
playground for details
GLCD.GotoXY(20, 2);
GLCD.Puts("GLCD version ");
GLCD.PrintNumber(GLCD_VERSION);
GLCD.DrawRoundRect(16,0,99,18, 5, BLACK); // rounded rectangle around
text area
GLCD.SelectFont(System5x7); // switch to fixed width system font
showCharacters();
countdown(5);
}
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
void showCharacters(){
byte line = 3; // start on the fourth line
for(byte c = 32; c <=127; c++){
if( (c-32) % 20 == 0)
GLCD.CursorTo(1,line++); // CursorTo is used for fixed width
system font
GLCD.PutChar(c);
}
}
////////////////////////////////////////////////////////////////
Requisitos de hardware
Se requiere un 128x64 LCD grfica basada en el chip controlador
KS0108. El 128x64 LCD vendidos por PJRC es totalmente compatible.
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
ejemplo de programa
Este programa de ejemplo viene con la biblioteca. Puede abrirlo desde
el Archivo -> Ejemplos -> KS0108 -> GLCDexample men; Ms
informacin se puede encontrar en la pgina oficial de GLCD web .
/ *
* GLCDexample
*
* cdigo de prueba bsica para la biblioteca Arduino GLCD KS0108.
* Este cdigo ejerce una serie de funciones grficas apoyado
* por la biblioteca y es un ejemplo de su uso.
* Tambin da una indicacin del rendimiento, que muestra el
nmero * de cuadros dibujados.
* /
# include <ks0108.h>
# include "Arial14.h" // proporcional fuente
# include "SystemFont5x7.h" // fuente del sistema
# include "ArduinoIcon.h" // mapa de bits
void setup () {
retardo (500); // Dar tiempo a la LCD para restablecer
GLCD . Init ( NON_INVERTED ); // Inicializar la biblioteca, no
invertida escribe pxeles en una pantalla clara
GLCD . ClearScreen ();
GLCD .DrawBitmap (ArduinoIcon, 32,0, NEGRO ); // dibujar el mapa de
bits en el dado x, y posicin
GLCD . Selectfont (System5x7); // Cambia a fuente de sistema de ancho
fijo
cuenta atrs (5);
GLCD . ClearScreen ();
introScreen (); // Mostrar un poco de materia de
introduccin
GLCD . ClearScreen ();
}
anular introScreen () {
GLCD . Selectfont (Arial_14); // Tambin puede hacer sus propias
fuentes, parque infantil para ver detalles
GLCD . Gotoxy (20, 2);
GLCD . Puts ( "versin GLCD" );
GLCD . PrintNumber (GLCD_VERSION);
GLCD . DrawRoundRect (16,0,99,18, 5, NEGRO ); // Redondeado rectngulo
alrededor de rea de texto
GLCD . Selectfont (System5x7); // Cambia a fuente de sistema de ancho
fijo
muestra caracteres();
cuenta atrs (5);
}
void showCharacters () {
byte de la lnea = 3; // Inicia en la cuarta lnea
de ( byte c = 32; c <= 127; c ++) {
si ((c-32) 20% == 0)
GLCD . CursorTo (1, lnea ++); // CursorTo se utiliza para la
anchura fija de fuente del sistema
GLCD . Putchar (c);
}
}
Ms fotos
Antes de empezar con la leccin hay que hacer dos salvedades importantes. En
primer lugar, hay que saber que existen muchos tipos diferentes de pantallas
grficas y que su gobierno puede diferir mucho de unas a otras. Cuando vayamos
a elegir la pantalla para nuestro proyecto hay que tener en cuenta dos cuestiones:
la pantalla propiamente dicha (su tamao, color o monocromo, resolucin, etc) y el
chip con la que se controla. Hay diferentes tipos de controlador y su programacin
es diferente. Nosotros vamos a ver en esta leccin el control de una pantalla
monocromo de 128 x 64 pixels y basada en el controlador SAMSUNG KS0108.
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
Para simular nuestra pantalla grfica, Proteus nos facilita varios modelos.
Nosotros vamos a utilizar el llamado LGM12641BS1R. En la siguiente pantalla se
muestra su representacin grfica y la forma en que lo tenemos que conectar a
nuestro equipo ARDUINO.
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
Es importante tener en cuenta que hemos puesto la seal de reset (RST)
conectada directamente al potencial de +5V. De esta manera la pantalla est
encendida en todo momento. El resto de los pines se han conectado a los pines
de nuestro ARDUINO segn las especificaciones de la librera que estamos
utilizando. El esquema elctrico completo es el siguiente:
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
Veamos ahora el software. Vamos a empezar con un programa muy sencillo para
poder ir introducindonos poco a poco en el control de una pantalla grfica.
Siguiendo con la costrumbre que vamos adquiriendo en lecciones anteriores
partimos de un armazn bsico que nos sirve de estructura para todos los
programas.
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
Veamos ahora un segundo ejemplo. Con este cdigo vamos a ver un ejemplo de
utilizacin de la mayora de las funciones que nos facilita la librera ks0108 para
dibujar en nuestra pantalla grfica. El cdigo completo es el siguiente:
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
El resultado ser:
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
Cuando el contador vale 3 ejecutamos la funcin GLCD.DrawLine() que se
encarga de dibujar una lnea recta. Los parmetros que debemos pasar a esta
funcin son las coordenadas x e y del origen de la lnea, las coordenadas x e y del
fin de la lnea y el color.
En la pantalla se visualiza:
En la pantalla se visualiza:
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
En la pantalla se visualiza:
En la pantalla se visualiza:
En la pantalla se visualiza:
En la pantalla se visualiza:
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
En esta entrada, aprenderemos a guardar datos permanentes dentro de nuestro Arduino. Nos puede ser til si queremos
que permanezcan aunque se vaya la luz de ste.
Segn la pgina oficial de Arduino, Arduino Uno tiene una memoria EEPROM interna de 1KB
y ArduinoMega2560, una memoria de 4KB.
Yo he usado un Arduino Mega2560, aunque se podra usar un Arduino Uno aprovechando los pines analgicos.
Usaremos la librera EEPROM ( en todas las IDE de Arduino que he usado, vena incluida , no s si hay alguna IDE que
venga sin ella, en la IDE que yo uso, la 1.5.6-r2, viene incluida ).
Esta librera tiene dos funciones, read() y write(). Son muy fciles de usar as que se aprenden rpidamente.
He creado a modo de ejemplo, un sistema para caja fuerte ( o una puerta con control de acceso) donde se pide un
password y se almacena en la EEPROM ( tambin se almacenan el nmero de intentos errneos). De esta forma, si se va
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
la luz, ni el password ni el nmero de intentos fallidos, no se perdern nunca.
Un posible problema que podra haber, es que usamos anteriormente la memoria eeprom de nuestro Arduino y no quedase
limpia, por eso la limpiaremos con el siguiente cdigo:
?
1 #include <EEPROM.h>
3 void setup()
4 {
8 }
10 void loop()
11 {
}
12
Descarga cdigo
Una vez limpia la memoria, cargaremos el nuevo cdigo de la puerta de acceso. Pero antes, explicar un poco qu lleva:
Sensor para detectar el estado de la puerta, cuando est cerrada, est a 1 . Pin 5.
Interruptor para cambiar el password, activo = 1. Pin 6.
Led color verde que representa el pistn de apertura. Pin 7.
Display 16x2. Pines: 8-13;
Teclado Matricial. Pines: 14-21.
Y aqu el cdigo para la puerta de acceso, cre una librera ( para ahorrar un poco de lineas de cdigo y as introducirnos
un poco en la programacin orientada a objetos). Bsicamente est todo implementado en dicha librera ( incluida ms
abajo )
?
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
//GeekChickens
1
//http://geekchickens.blogspot.com.es/
2
3
#include <cajaFuerte.h>
4
#include <EEPROM.h>
5
#include <Keypad.h>
6
#include <LiquidCrystal.h>
7
11 cajaFuerte miCaja;
12
int sensorPuerta = 5;
13
int interruptorCambioPassword = 6;
14
int led_verde = 7;
15
int i = 0;
16
char passwordEntrado[4];
17
int tiempoEspera = 7; // en segundos!
18 int tiempoParaAbrir = 10; // el tiempo que dejamos de margen para que abran la puer
cerramos. Est en segundos!
19
20
void setup()
21
{
22
pinMode(led_verde,OUTPUT);
23
pinMode(sensorPuerta,INPUT);
24
pinMode(interruptorCambioPassword, INPUT);
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
25 passwordPrimeraVez(); // la primera vez que se enciende Arduino y no tiene passwor
26 }
27
void loop()
28
{
29
mensajePassword();
30
31
if( EEPROM.read(0) <3 ) // si el contador de intentos est entre el 0 y el 2 q
32 probando.
33 {
i = leerTecla(passwordEntrado,i);
34
35
if(i == 4) // password lleno, son 4 dgitos
36
{
37
delay(800);
38
39
if( miCaja.comprobarPassword( passwordEntrado ) == 1) // Si el password fu
40
{
41 passwordCorrecto(led_verde, sensorPuerta, interruptorCambioPassword ,
42 i = 0;
43
44 }else
45 {
46 passwordIncorrecto(led_verde);
i = 0;
47
}
48
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
49 limpiarLCD(i);
50 }
}
51
52
else // si el contador de intentos est lleno
53
{
54
demasiadosIntentos( tiempoEspera );
55
}
56
}
57
58
59
60
61
Recordad, tenis que guardar la librera en: carpeta de vuestro Arduino / libraries
El procedimiento es sencillo: Primero cargamos el sketch para limpiar nuestra memoria EEPROM y despus el sketch de
control de acceso. Entonces nos pedir que introduzcamos un password.
Una vez introducido dicho password, lo almacenar en la memoria EEPROM y ya no se borrar aunque apaguemos o
reiniciemos nuestro Arduino ( a menos que limpiemos la memoria EEPROM con el sketch mencionado anteriormente)
USANDO EL MPU6050
Primeras pruebas con GY-201
OBJETIVOS
MATERIAL REQUERIDO.
Un mdulo MPU6050
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
USANDO EL MPU6050
En la sesin anterior dimos un repasito a cuatro ideas claves de las que era preciso
asegranos que las tenamos claras, y as poder empezar a hablar directamente
de acelermetros y girscopos, y una vez sentadas las bases ya podemos empezar con la
parte divertida.
Es importante que entendis que los IMUs son unas piezas de hardware bastante
sofisticadas y que el MPU650 que vamos a utilizar es un chip de 6 dof o grados de libertad
porque incluye un acelermetro de 3 ejes y un girscopo de 3 ejes.
Por eso todos los tutoriales que veis por ah os dirn que conseguir los datos en bruto
del MPU650 es la parte fcil, procesarlos y reaccionar es otra historia que se puede complicar
un poco ms.
Pero como siempre se dice un viaje de 1000 km empieza con un sencillo paso, as que vamos
a darlo. Empecemos viendo cmo se conecta a nuestro Arduino.
Para estas sesin vamos a utilizar una Breakout board bastante tpica llamada GY-201, que
incluye un MPU650 y un regulador de tensin, con lo que podemos alimentar a tanto 3.3V
como a 5V
ESQUEMA DE CONEXIN
EL MPU650 viene con interface I2C por lo que la conexin es trivial y podis hacerla poco ms
o menos as:
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
Basta con conectar los pines de alimentacin y montar los pines necesarios para el control del
bus I2C. Cuando el IMU dispone de alguna medida se lo informa a nuestro Arduino mediante
una interrupcin y por eso conectamos el pin INT a nuestra primera interrupcin en el pin 2.
Si vas a usar un Arduino Mega la conexin es ligeramente diferente como se muestra aqu:
Poco ms porque la conexin es muy sencilla y basta con hacer la conexin del bus I2C.
Pasemos ahora a la parte del software.
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
EL PROGRAMA DE CONTROL
Vamos a montar las libreras correspondientes y a probar con uno de los programas de
ejemplo que tanto las conexiones como el MPU650 estn en condiciones operativas.
El seor Jeff Rowberg ha puesto a nuestra disposicin una bonita librera que podemos
descargar desde aqu: MPU6050 y tambin vamos a necesitar una librera modifica de I2C
que se lleve bien con el IMU llamada I2Cdev.
Parece que el I2C del chip es un tanto peculiar a juzgar por lo que dicen por Internet la pgina
oficial de Arduino y algunos doctos comentaristas, y con aspectos delicados si necesitis
colocar ms elementos I2C al Bus.
Vamos a empezar cargando el ejemplo MPU6050_RAW:
\\Archivo\Ejemplos\MPU6050\Examples\ MPU6050_RAW
Este programa es de lo ms sencillo, y lo que hace es leer e imprimir los valores en bruto que
los acelermetros y girscopos le envan a tu Duino, es decir sin procesar en absoluto, algo
que sirve de muy poco, pero es un programa que si vais saltando las partes de egipcio antiguo
que contiene, encontrareis bastante comprensible, en lneas generales.
No te preocupes demasiado de estos valores, porque son las medidas reales que producen
los acelermetros y los girscopos, pero as no valen de mucho. El objetivo es asegurarnos
de que tu MPU6050 se comunica bien con tu Arduino.
De todos modos fjate en que hay 6 valores. Los tres primeros corresponden a
los acelermetros y los tres ltimos a los girscopos.(De ah el a/g: al principio de la lnea)
Si vas girando el IMU en direcciones perpendiculares vers con rapidez cual es cada uno de
los ejes, porque aunque el chip este en movimiento inercial (O sea en reposo o movimiento
lineal uniforme, Te suena del cole?) aun detectar la aceleracin de la gravedad, claramente
en una de las direcciones.
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
Nosotros estamos tan acostumbrados a la gravedad que ni la notamos a no ser que nos
dejemos los morros contra el suelo de un tropezn, pero el MP6050 es un sensor y mide de
continuo su efecto, que es una aceleracin y mira qu casualidad, es justo lo que mide un
acelermetro).
Vale, todo muy bonito. Pero Cmo mido los ngulos respecto a la horizontal? Que es lo
que os interesa para aseguraros de que no nos estrellamos contra el pavimento.
Y de nuevo, por una de esas increbles casualidades de la vida, el segundo ejemplo trata de
eso
Vamos a cargar el segundo ejemplo que viene de demo con el MPU6050 que se llama DMP6:
\\Archivo\Ejemplos\MPU6050\Examples\ MPU6050_DMP6
Pero el autor quera comprobar que estabais despiertos y ha puesto el programa a 115200
baudios, a diferencia del ejemplo anterior, as que empezar cambiando la velocidad de la
consola Arduino en consonancia:
Dadle cualquier cosa, y enseguida veris que empiezan a aparecer valores en la pantalla,
pero esperad un poco porque necesita como 10 segundos para que los valores se estabilicen
y tengan sentido:
El texto que aparece al principio de cada lnea ypr corresponde a las iniciales en ingles de
los tres ngulos de referencia Yaw, Pitch y Roll, que si recordis los presentamos con esta
imagen:
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
Y los valores que van cambiando son poco ms o menos el valor instantneo de cada uno de
esos ngulos. Para tratar de dar un poco de sentido a es interminable flujo de valores tenemos
que hablar de la gravedad, (De la de Newton, no del estado de nuestras finanzas) y si alguno
pensabais que se puede manejar y programar un IMU sin hablar de fsica ms vale que os
vayis a la biblioteca a por un libro de poesa.
Recordad que lo que mide un acelermetro es una aceleracin en tres ejes y resulta que
nuestro acelermetro siempre est sometido al menos a una aceleracin presente por
doquier que llamamos gravedad y nuestro MPU6050 la detecta y mide permanentemente.
Lo cual es una gran ventaja porque como adems sabe que su valor en reposo es de 9,8
m/seg2 (Disfrutad que yo s que esto os encanta) en cuanto sus lecturas se estabilizan, l
sabe localizar el eje vertical porque es el que la gravedad le indica y por tanto ya tiene una
primera referencia del plano horizontal (El plano horizontal es perpendicular a la gravedad,
naturalmente)
Por eso veris que si habis hecho como yo, y habis colocado vuestro sensor inercial poco
ms o menos horizontal, los ngulos de Pitch y Roll tendern rpidamente a cero como
corresponde a un IMU bien educado.
En mi caso he montado el MPU6050 en una protoboard para poder mover con claridad el
sensor y por eso si ahora vais girando con cuidado la protoboard (O la plataforma de base)
veris como los ngulos van reflejando la desviacin respecto de la horizontal y con valores
que pueden ser tanto positivos como negativos.
COMENTARIOS FINALES
En primer lugar no son demasiado estables y sus medidas bailan bastante por lo que ser
preciso filtrar los errores.
Adems son muy sensibles (Una mala combinacin) por lo que la medida que te dan, baila
mucho con cualquier golpecito o vibracin que detecten. Haz la prueba moviendo un poco la
plataforma y en seguida veras el baile de las cifras.
No se puede despreciar tampoco las interferencias, que como sabis afectan a todos los
aparatos electrnicos y los IMUs no son la excepcin.
Y por ltimo sufren tambin de un problema que se llama deriva (Shift en ingls) y que se
produce porque el procesador interno del IMU calcula las orientaciones, o si prefieres, los ejes
de referencia por clculo de aceleraciones, que por mucha precisin que se intente al final
tendrn pequeos errores que se irn acumulando.
Este error acumulado puede hacernos perder el norte (Literalmente) y acabar recogiendo
cachitos del asfalto para ver que podemos salvar del desastre.
Todo tiene solucin, pero supone clculos y procesamiento abundante, adems de nociones
de fsica, geometra y otras disciplinas que, aunque no os lo creis, no todos disfrutan.
Por ultimo si vais a montar algn robot volador de un cierto valor, no os interesa perder la
posibilidad de que vuestro chip incluya un magnetmetro de 3 ejes ms para localizar
direcciones absolutas de referencia y si el chisme va a volar, un sensor de presin baromtrica
no vendra mal tampoco para calcular la altitud.
Un acelermetro de 3 ejes
Un Girscopo de tres ejes
Un magnetmetro de 3 ejes
http://www.arduinoecia.com.br/2013/09/display-grafico-lcd-128x64-st7920.html
http://www.arduinoecia.com.br/2015/05/display-grafico-128x64-st7920-modo-8-bits-
paralelo.html
https://github.com/olikraus/u8glib/wiki/userreference#begin
Un sensor baromtrico. .
Son algo ms caros que este MPU6050 con el que llevo aburrindoos ya buen rato, pero os
compensar la diferencia de precio.
RESUMEN DE LA SESIN