Está en la página 1de 338

Sensores inteligentes y sus

aplicaciones
Guía del Estudiante

VERSION 1.0
GARANTÍA
Parallax garantiza sus productos contra defectos en sus materiales o debidos a la fabricación por un período de 90
días a partir de la recepción de los mismos. Si usted descubre un defecto, Parallax según corresponda, reparará,
reemplazará o regresará el valor de la compra. Antes de regresar el producto a Parallax, simplemente pida un número
de autorización de regreso de mercancía (Return Merchandise Authorization, “RMA”), escriba el número en el
exterior de la caja y envíela a Parallax. Por favor incluya su nombre, número telefónico, dirección y una descripción
del problema. Parallax le regresará su producto o el reemplazo, usando el mismo método de correo que usted usó para
enviar el producto a Parallax.

GARANTÍA DE 14 DÍAS DE REGRESO DEL DINERO

Si dentro de los 14 días en que usted recibió su producto, encuentra que no es conveniente para sus necesidades,
puede regresarlo, recibiendo un reembolso. Parallax regresará el precio de compra del producto, excluyendo los
gastos de envío y manejo. Esto no se aplica si el producto ha sido alterado o dañado. Consulte la sección de Garantía
arriba acerca de las instrucciones para regresar un producto a Parallax.

DERECHOS DE COPIA Y MARCAS REGISTRADAS

Este documento tiene derechos de copia Copyright 2006 por Parallax, Inc. Al descargar este documento o software
por Internet o al obtener una copia dura usted acepta los derechos de copia y se compromete a usar este material
solamente con productos comercializados por Parallax, Inc. Cualquier otro uso no está permitido y representa una
violación de los derechos de copia, propiedad intelectual y derechos de autor de Parallax, Inc. y dicha violación es
objeto de las penas que marcan las leyes Federal de derechos de autor y propiedad intelectual. Parallax Inc.
expresamente no permite la reproducción con fines comerciales. Se permite la reproducción con fines educativos,
reproducción sujeta a las siguientes condiciones: el texto, ya sea en su totalidad o cualquier parte del mismo, no
puede ser duplicado para uso comercial; puede ser duplicado solo para fines educativos cuando se use únicamente en
conjunto con los productos Parallax y el estudiante abone solo el costo de la duplicación.

Este texto está disponible en formato impreso por Parallax Inc. Dado el tiraje de la impresión del mismo, el precio al
consumidor es frecuentemente menor que los costos típicos por duplicación.

BASIC Stamp, Stamps en Class, Board of Education, Boe-Bot SumoBot, SX-Key y Toddler son marcas registradas
de Parallax, Inc. Si usted decide usar cualquiera o cualesquiera de las marcas registradas de Parallax Inc. en sus
páginas de Internet o en cualquier material impreso, forzosamente deberá agregar la aclaración: “(la marca en
cuestión) es una marca registrada de Parallax, Inc.” Otros nombres de productos y marcas son marcas registradas de
sus respectivos dueños.

ISBN 1-928982-39-5
DESVINCULACIÓN DE RESPONSABILIDAD
Parallax, Inc. no es responsable de daños por consecuencias, incidentes o daños especiales que resulten de cualquier
violación de la garantía, bajo cualquier teoría legal, incluyendo pérdida de beneficios, tiempos muertos, buena fe,
daño o reemplazo de equipo o propiedad y cualesquiera costos de recuperación, reprogramación o de reproducción de
datos guardados o usados dentro de los productos Parallax. Parallax tampoco es responsable de cualquier daño
personal, incluyendo vida o muerte, resultado del uso de cualquiera de nuestros productos. Usted tiene absoluta
responsabilidad por la aplicación que desarrolle con el BASIC Stamp, sin importar la naturaleza del riesgo de la
misma.

SEGUNDA IMPRESION

SITIOS WEB Y LISTAS DE DISCUSIÓN


Mantenemos foros de discusión activa basados en la red mundial dirigidos a personas interesadas en los productos
Parallax. Estos foros o listas de discusión son accesibles desde www.parallax.com:

• Propeller chip – Esta lista es específicamente para clientes que usan los circuitos y productos
Propeller.
• BASIC Stamp – esta lista es extensamente utilizada por Ingenieros, aficionados y estudiantes,
quienes comparten sus proyectos y preguntas acerca del BASIC Stamp.
• Stamps en Class® – Creada para educadores y estudiantes, los suscriptores de esta lista discuten el
uso del material de Stamps en Class en sus cursos. La lista prove la oportunidad tanto a estudiantes
como a educadores de hacer preguntas y obtener respuestas.
• Parallax Educators – Es un foro exclusivo para educadores y aquellos que contribuyen al desarrollo
de Stamps en Class. Parallax creo este grupo con el fin de obtener retroalimentación en el desarrollo
de nuestro currículum y proveer un sitio para que los educadores desarrollen y obtengan Guías para
Profesores.
• Robotics – Diseñado para los robots Parallax, este foro fue creado para ser un diálogo abierto entre
entusiastas de la robótica. Los temas incluyen el ensamble, código fuente, expansiones y
actualizaciones de manuales. Los robots Boe-Bot®, Toddler®, SumoBot®, HexCrawler y
QuadCrawler son ampliamente discutidos aquí.
• SX Microcontrollers y SX-Key – Discusión de la programación del microcontrolador SX con
herramientas del lenguaje ensamblador Parallax SX – Key® y compiladores de terceros en lenguajes
BASIC y C.
• Javelin Stamp – Discusión de aplicaciones y diseños usando Javelin Stamp, un modulo Parallax que
es programado utilizando un subconjunto de comandos del lenguaje de programación Java® de Sun
Microsystems.

ERRATA

Si bien se realiza un gran esfuerzo para asegurar la precisión de nuestros textos, aún puede haber errores.
Continuamente nos esforzamos para mejorar todos nuestros materiales educativos y documentos y frecuentemente
revisamos nuestros textos. Ocasionalmente se publica en nuestro sitio www.parallax.com una hoja de fe de errata con
una lista de los errores y correcciones conocidos para un texto determinado. Por favor, revise las páginas individuales
de los productos para obtener una descarga gratuita de este archivo de fe de errata.
Tabla de Contenido · Página i

Tabla de Contenido

Prefacio.......................................................................................................................iii
Introducción y notas del autor........................................................................................ iii
Idea general.................................................................................................................... v
Antes de comenzar......................................................................................................... v
La serie educativa Stamps en class .............................................................................. vi
Traducciones ................................................................................................................ vii
Colaboradores especiales ............................................................................................ vii
Capítulo 1: La Pantalla LCD Serial Parallax.............................................................1
LCDs en Productos.........................................................................................................2
El LCD serial Parallax - Su terminal portátil de depuración............................................2
Actividad #1: Conexión y prueba de la pantalla LCD .....................................................4
Actividad #2: Despliege de mensajes simples................................................................8
Actividad #3: Aplicacion en un timer.............................................................................17
Actividad #4: Caracteres personalizados y animación en LCD ....................................19
Actividad #5: Avance de texto traves de la pentalla .....................................................25
Resumen ......................................................................................................................34
Capítulo 2: El Sensor Ultrasónico de Distancia Ping)))........................................41
¿Cómo trabaja el Sensor Ping)))? ................................................................................41
Actividad #1: Medición del tiempo de eco ....................................................................42
Actividad #2: Mediciones de CentÍmetroS....................................................................46
Actividad #3: Medición de pulgadas .............................................................................49
Actividad #4: Mediciones en movimiento......................................................................51
Actividad #5: El efecto de la temperatura en la velocidad del sonido...........................58
Resumen ......................................................................................................................61
Capítulo 3: El Acelerómetro MEMS de dos ejes....................................................65
EL Acelerómetro MX2125 – como funciona .................................................................67
Actividad #1: Conexión y prueba de pendiente con el MX2125 ...................................68
Actividad #2: Mediciones en movimiento......................................................................71
Actividad #3: División proporcional y compensación de los valores de entrada ..........76
Actividad #4: Dividiendo en 1/100 g .............................................................................83
Actividad #5: Medición de Rotación Vertical de 360° ...................................................85
Actividad #6: Medición de la inclinación respecto a la Horizontal ................................98
Resumen ....................................................................................................................112
Capítulo 4: El Módulo de brújula Hitachi HM55B ................................................119
Interpretación de las mediciones de la brújula ...........................................................119
Actividad #1: Conexion y prueba del módulo de brújula.............................................120
Actividad #2: Calibración del módulo de brújula.........................................................128
Página ii · Sensores inteligentes y sus aplicaciones

Actividad #3: Probando la Calibración........................................................................ 138


Actividad #4: Mejora de las mediciones de la brújula a través del promedio ............. 143
Actividad #5: Mediciones en movimiento ................................................................... 148
Resumen .................................................................................................................... 159
Capítulo 5: Fundamentos de juegos con el Acelerómetro ................................ 167
Actividad #1: Desplegado de caracters gráficos PBASIC .......................................... 168
Actividad #2: Guardado y refrescado de fondo con la EEPROM ............................... 179
Actividad #3: Inclinando la gráfica de burbuja ............................................................ 188
Actividad #4: Control de juego.................................................................................... 196
Resumen .................................................................................................................... 205
Capítulo 6: Más Proyectos con el Acelerómetro ................................................ 211
Actividad #1: Medición de altura de eficios, árboles, Etc. .......................................... 211
Actividad #2: Grabación y reproducción..................................................................... 213
Actividad #3: Uso de la EEPROM para cambio de modos......................................... 219
Actividad #4: Registro Remoto de la Aceleración ...................................................... 223
Actividad #5: Estudio de la aceleración en un auto de radio control .......................... 230
Actividad #6: Estudio de la aceleración en un truco con patineta .............................. 240
Actividad #7: Distancia de recorrido de una bicicleta ................................................. 247
Resumen .................................................................................................................... 255
Capítulo 7: Graficos de Barra en LCD para Distancias e inclinaciones........... 261
Actividad #1: Intercambio de caracteres personalizados ........................................... 261
Actividad #2: Graficos de Barras Horizontales para Distancia con Ping))) ................ 271
Actividad #3: Grafica de Barra de dos ejes para inclinación del Acelerómetro .......... 281
Resumen .................................................................................................................... 294
Apéndice A: Tabla de caracteres ASCII............................................................... 303
Apéndice B: Documentación de la pantalla LCD Serial Parallax ...................... 305
Apéndice C: Definiciones de Caracteres Hexadecimales.................................. 317
Apéndice D: Listado de Partes ............................................................................. 321
Índice ....................................................................................................................... 323
Prefacio · Página iii

Prefacio
INTRODUCCIÓN Y NOTAS DEL AUTOR
La primera vez que ví el término “sensor inteligente” fue en el texto Sensores Aplicados
de Tracy Allen (entonces conocido como Mediciones Ambientales). De manera adecuada,
Tracy aplicó este término al termómetro digital DS1620, el cual tiene elementos
electrónicos interconstruídos que simplifican las mediciones de temperatura del
microcontrolador. Adicionalmente, podía recordar la configuración1 que recibía del
microcontrolador y, más aún, funcionar independientemente como un controlador de
termostato.

En contraste con los sensores inteligentes, los sensores primitivos son dispositivos o
materiales que tienen alguna propiedad eléctrica que cambia con algún fenómeno físico.
Un ejemplo de un sensor primitivo en ¿Qué es un Microcontrolador? es la
fotorresistencia de sulfato de cadmio. Su resistencia cambia con la intensidad de la luz.
Con el programa y el circuito adecuados, es posible realizar mediciones de luz con un
microcontrolador. Otros ejemplos de sensores primitivos comunes son los sensores de
temperatura con salida de corriente/tensión, transductores de micrófonos y aún el
potenciómetro, que es un sensor de posición rotacional.

Dentro de cada sensor inteligente radica uno o más sensores primitivos y la circuitería de
soporte. Lo que hace a un sensor inteligente “inteligente” es la electrónica interconstruída
adicional. Esta electrónica hace que estos sensores sean capaces de hacer una o más de
las siguientes funciones:

• Pre-procesar los valores medidos en cantidades que posean algún significado.


• Comunicar las medidas con señales digitales y protocolos de comunicación.
• Orquestar las acciones de los sensores primitivos y sus circuitos para “tomar”
mediciones.
• Tomar decisiones e iniciar alguna acción en base a las condiciones sensadas, de
manera independiente al microcontrolador.
• Recordar la calibración o la configuración de sus parámetros.

Durante mi primer encuentro con un sensor inteligente pensé: “¡Vaya! ¡Un kit completo
de estos sensores con un libro podría ser REALMENTE interesante! En verdad espero

1
En ingles, setting (N. del T)
Página iv · Sensores inteligentes y sus aplicaciones

que alguien haga un kit y un libro así pronto…” No tenía idea que “pronto” terminaría
siendo casi seis años después, y que “alguien” terminaría siendo yo. Y si alguno de mis
jefes me hubiera dicho entonces que ese kit contendría un acelerómetro, un medidor de
distancias ultrasónico, una brújula digital y una pantalla o visor LCD2 serial para
mediciones en movimiento, quizá la impresión me hubiera deshecho por completo.
Puesto que solo recientemente fue posible para nosotros conjuntar un grupo de
componentes tan sorprendente en un solo kit, debería decir que la espera valió la pena.

En concordancia con el resto de los tutoriales Stamps en Class, este libro es una colección
de actividades, algunas de las cuales cubren aspectos básicos, algunas otras cubren otros
aspectos más avanzados, y otras demuestran aplicaciones o arman bloques para varios
productos e inventos. La primera mitad del libro presenta al sensor junto con algunas
mediciones en movimiento desplegadas en una pantalla LCD. Luego, la segunda mitad
del libro tiene una cantidad considerable de aplicaciones para que usted las intente, tales
como juegos de video por inclinación, herramientas de medición personalizadas y
dispositivos de diagnóstico para entusiastas del deporte y del bricolaje. El límite de
páginas para este libro delimitado por nuestro empaque es 350 y fue difícil detenerme
allí. Se pueden encontrar actividades adicionales de sensores inteligentes para el robot
Boe-Bot en el foro de Stamps en Class en www.parallax.com.

Si bien este libro cubre los fundamentos y demuestra algunas aplicaciones como
ejemplos, solamente rasga la superficie de lo que usted puede hacer con estos
dispositivos. El propósito principal de este libro es proveer algunos bloques de
construcción e ideas para proyectos e inventos futuros. Por ejemplo, después de
completar el capítulo 3, nuestro revisor del libro Kris Magri puso su tarjeta de
entrenamiento “Board of Education” con el acelerómetro y la LCD sobre el tablero de su
auto, y ahora su auto tiene un medidor de aceleración en planos a un lado de su
velocímetro. Con algunas modificaciones al código, se pudo haber cambiado por un
sistema de alerta de volcadura en autos de doble tracción. Después de revisar el
dispositivo mecánico de vigilancia para predecir condiciones de avalancha en áreas
montañosas basado en la inclinación de la ladera, Ken Gracey desarrolló en una noche la
versión digital con las mismas partes que tenía Kris en su auto.

El acelerímetro en el tablero del auto y el medidor de riesgo de avalancha son dos


ejemplos únicos de las muchas aplicaciones, proyectos e inventos que pueden ser
inspirados por el kit de sensores inteligentes y su texto. Nos gustaría ver lo que usted

2
Visor o pantalla de cristal líquido; de sus siglas en inglés, Liquid Cristal Display (N. del T.)
Prefacio · Página v

puede hacer con su kit en el foro de Stamps en Class. No importa si piensa que su
proyecto esta en onda, es único, poco original o lo que sea. Solo tome unos minutos para
publicar las cosas que ha hecho con estos sensores inteligentes en
http://forums.parallax.com/forums/ → Stamps en Class. Asegúrese de incluir algunas
fotos, una descripción breve y preferentemente un esquema y el programa PBASIC.

Entonces, diviértase con este kit y este libro y nosotros veremos sus inventos en el foro
de Stamps en Class.

IDEA GENERAL
El kit de sensores inteligentes contiene cuatro dispositivos que, cuando se usan con
BASIC Stamp y la Tarjeta Board of Education o la tarjeta HomeWork Board, pueden ser
bloques de construcción para una variedad de inventos y proyectos de estudiantes. He
aquí una lista de los dispositivos:

• Pantalla LCD Serial Parallax 2x16


• Buscador de rangos ultrasónico Ping)))
• Acelerómetro de 2 ejes 2125
• Módulo de Brújula Hitachi HM55B

Además de proveer tanto el equipo como la información de cómo se usa este para
proyectos estudiantiles, este texto hace 2 énfasis mayores que proveen teoría, ejemplos y
los cálculos requeridos, lo cual puede ser usado para reforzar una variedad de conceptos
de medición, de física/ingeniería y de trigonometría. Estos énfasis son:

• Técnicas matemáticas para escalar los valores de sensores primarios hasta


mediciones con significado propio dado que son expresadas en sistemas de
unidades comunes.
• Interpretación de la proyección de los vectores de campos magnéticos y de
gravedad sobre ejes cartesianos.

ANTES DE COMENZAR
Para ejecutar los experimentos en este texto, necesitará tener su tarjeta Board of
Education o bien HomeWork Board conectada a su computadora, el software Editor de
BASIC Stamp instalado en su computadora y haber verificado que hay comunicación
enre su computadora y su BASIC Stamp. Para instrucciones detalladas a este respecto,
consulte ¿Qué es un Microcontrolador?, disponible como descarga gratuita en
Página vi · Sensores inteligentes y sus aplicaciones

www.parallax.com. También necesitará las partes contenidas en el kit de partes de


Sensores Inteligentes. Consulte el apéndice D para una lista completa del sistema,
software y requerimientos de hardware.

LA SERIE EDUCATIVA STAMPS EN CLASS


La serie Stamps en Class de textos y kits provee recursos económicamente alcanzables
para la educación en electrónica e ingeniería. Todos los libros listados están disponibles
para descarga gratuita en www.parallax.com. Las versiones citadas a continuación se
encontraban disponibles en el momento de este tiraje. Por favor, revise nuestros sitios
web www.parallax.com o www.stampinclass.com para las últimas revisiones;
continuamente nos esforzamos para mejorar nuestro programa educativo.

Guías del Estudiante Stamps en Class:


¿Qué es un Microcrontolador? es el nivel recomendado de entrada a la serie educativa
Stamps en Class. En vez de ello, algunos estudiantes empiezan con Robótica con el Boe-
Bot, también diseñado para principiantes.

“¿Qué es un Microcontrolador?”, Guía del Estudiante, Version 2.2, Parallax


Inc., 2004
“Robotica con el Boe-Bot”, Guía del Estudiante, Version 2.2, Parallax Inc., 2004

Podrá entonces continuar con otros tópicos de proyectos educativos, o quizá prefiera
explorer nuestros kits Robóticos.

Kits de Proyectos Educativos:


Los siguientes textos y kits proven una variedad de actividades que son útiles para
aficionados al bricolaje, inventores y diseñadores de productos interesados en intentar un
amplio espectro de proyectos:

“Sensores inteligentes y sus aplicaciones”, Guía del Estudiante, Version 1.0,


Parallax Inc., 2006
“Control de Procesos”, Guía del Estudiante, Version 1.0, Parallax Inc., 2006
“Sensores Aplicados”, Guía del Estudiante, Version 1.3, Parallax Inc., 2003
“Basicos Analógicos y Digitales”, Guía del Estudiante, Version 1.3, Parallax Inc.,
2004
“Entendiendo las señales”, Guía del Estudiante, Version 1.0, Parallax Inc., 2003
Prefacio · Página vii

Kits Robóticos:
Para adquirir experiencia con robótica, considere continuar con las siguientes Guías Del
Estudiante Stamps en Class, cada una tiene un kit robot correspondiente:

“Control remoto IR para el Boe-Bot”, Guía del Estudiante, Version 1.1, Parallax
Inc., 2004
“Robotica Aplicada con el SumoBot”, Guía del Estudiante, Version 1.0, Parallax
Inc., 2005
“Robótica avanzada con el Toddler”, Guía del Estudiante, Version 1.2, Parallax
Inc., 2003

Referencias
Este libro es una referencia esencial para todas las Guías del Estudiante Stamps en Class.
Se presenta con información de la serie de modulos microcontroladores BASIC Stamp,
nuestro Editor BASIC Stamp y nuestro lenguaje de programación PBASIC.

“Manual BASIC Stamp”, Version 2.2, Parallax Inc., 2005

TRADUCCIONES
Los textos educativos Parallax pueden ser traducidos a otros idiomas con nuestro permiso
(correo electrónico: translations@parallax.com). Si usted planea hacer alguna traducción
por favor contáctenos y así podremos proveerle con los documentos MS Word en el
formato adecuado, imágenes, etc. También mantenemos un grupo privado de discusión
para traductores al cual quizá quiera unirse. Esto asegurará que se le mantiene al corriente
con nuestras frecuentes revisiones de texto.

COLABORADORES ESPECIALES
Parallax Inc. quiere dar reconocimiento a sus miembros del equipo de Educación: al
administrador del Proyecto Aristides Alvarez, el Ilustrador Técnico Rich Allred,
Diseñadora Gráfica Larissa Crittenden, Revisor Técnico Kris Magri y la Editora Tecnica
Stephanie Lindsay. Adicionalmente, gracias a nuestro cliente Steve Nicholson por poner
a prueba de usuario la mayoria de nuestras actividades. Como siempre, un
agradecimiento especial a Ken Gracey, fundador del programa educativo Stamps en Class
de Parallax Inc.
Página viii · Sensores inteligentes y sus aplicaciones
Cap 1: La pantalla LCD Serial Parallax · Página 1

Capítulo 1: La Pantalla LCD Serial Parallax


El desplegado de información que un sensor envía en un formato comprensible tiene
muchos usos y, en algunas aplicaciones, es todo lo que importa. El termómetro digital es
un ejemplo común que puede ser encontrado en muchos hogares. Dentro de cada
termómetro digital, hay una sonda de temperatura, un microcontrolador y una pantalla de
cristal líquido (LCD) para mostrar las mediciones. El microcontrolador BASIC Stamp y
la pantalla LCD Serial Parallax mostrados en la Figura 1 – 1 son 2 de los elementos del
termómetro digital. Ese arreglo es excelente para mostrar mediciones en movimiento,
haciendo posible desconectar su tarjeta de la PC, depurar esta terminal y probar en campo
sus sensores inteligentes.

Figura 1-1: BASIC Stamp, Board of Education, y Pantalla LCD Serial Parallax

Las actividades en este capítulo presentan algunos fundamentos de la pantalla LCD


Parallax, como conectarla al BASIC Stamp, encenderla y apagarla, colocar su cursor y
desplegar texto y dígitos. Los capítulos posteriores mostrarán cómo crear y animar
caracteres personalizados y mostrar mensajes con movimiento.
Página 2 · Sensores Inteligentes y sus Aplicaciones

LCDS EN PRODUCTOS
Todos los productos mostrados en la Figura 1-2 tienen pantallas de cristal líquido. Son
fáciles de leer y los más pequeños consumo poca energía. Piense cuántos productos que
usted posee tienen pantallas de cristal líquido. Al avanzar en las actividades de este texto,
piense acerca los proyectos de BASIC Stamp, los prototipos y los inventos que tiene en
progreso y cómo una pantalla LCD serial puede mejorarlos o ayudarle a completarlos.

Figura 1-2: Ejemplos de Productos con pantallas LCD

De arriba a abajo y de izquierda a derecha: teléfono celular, GPS portátil, calculadora,


multímetro digital, reloj de oficina, computadora lap-top, osciloscopio, teléfono de oficina.

EL LCD SERIAL PARALLAX - SU TERMINAL PORTÁTIL DE


DEPURACIÓN
Si ha trabajado con otros textos de la serie Stamps en Class, probablemente le es familiar
lo valiosa que puede ser la herramienta de Terminal de Depuración. La Terminal de
Depuración es una ventana que puede usar para que su computadora muestre mensajes
Cap 1: La pantalla LCD Serial Parallax · Página 3

que recibe del BASIC Stamp. Es especialmente útil para mostrar mensajes de diagnóstico
y valores de variables, haciendo más fácil aislar los problemas en un programa. También
es útil para probar circuitos, sensores y más.

La Terminal de Depuración tiene una desventaja y es la conexión por cable serial.


Considere cuantas veces fue inconveniente tener su tarjeta conectada a la computadora
para probar un sensor, o para descubrir qué estaba “viendo” su robot Boe-Bot con sus
detectores infrarrojos en la otra habitación. Estas son situaciones que pueden ser
remediadas con la pantalla LCD Serial Parallax mostrada en la Figura 1-3. Una vez que
construya un circuito sensor en su tarjeta Board of Education, puede usar una batería y su
pantalla LCD Serial parallax para llevar el arreglo tan lejos de su terminal de
programación como usted quiera, mientras que despliega las mediciones de su sensor y
otra información de diagnóstico.

Figura 1-3
LCD Serial Parallax
(2×16)

La pantalla LCD Serial Parallax 2×16 tiene dos renglones de 16 caracteres cada uno para
desplegar mensajes. La pantalla es controlada por mensajes seriales desde el BASIC
Stamp. El BASIC Stamp envía estos mensajes desde un solo pin de entrada/salida que está
conectado a la entrada serial de la LCD. Hay dos versiones, estándar y con luz de fondo:
Version Parte Parallax #
Estándar 27976
Con Luz 27977
Pantallas LCDs Seriales vs Paralelas
La pantalla LCD paralela es probablemente el tipo más común de pantallas LCD. Requiere
un mínimo de 6 pines de entrada/salida para ser controlada por el BASIC Stamp. También,
si no está usando un BASIC Stamp 2p, 2pe o 2px, el código para controlar la pantalla tiende
a ser más complejo que el código para una pantalla LCD serial.
La pantalla LCD serial en realidad es una pantalla LCD con un microcontrolador extra. Este
microcontrolador extra convierte los mensajes seriales del BASIC Stamp en mensajes
paralelos que controlan la pantalla LCD paralela.
Página 4 · Sensores Inteligentes y sus Aplicaciones

ACTIVIDAD #1: CONEXIÓN Y PRUEBA DE LA PANTALLA LCD


Además de las conexiones eléctricas y algunos programas PBASIC muy simples para
probar la pantalla LCD Serial Parallax, esta actividad presenta el comando SEROUT.
También demuestra cómo el comando DEBUG es un caso especial de SEROUT. Esto es
especialmente útil al trabajar con su pantalla LCD serial porque puede tomar muchos de
los argumentos de comando DEBUG y usarlos con el comando SEROUT para controlar y dar
formato a la información que muestre su pantalla LCD.

Partes Requeridas
(1) Pantalla LCD Serial Parallax 2×16
(3) Segmentos de cable

Además de la pantalla LCD Serial Parallax y los 3 cables, es especialmente importante


que tenga la documentación de la pantalla (incluida en el Apéndice B de este texto). Aún
cuando son unas cuantas páginas, tienen una larga lista de valores que puede enviar a su
LCD para hacer que ejecute funciones similares a las que ha usado en la Terminal de
Depuración. Funciones como control de cursor, retorno de carro, retorno, limpiar
pantalla, etc., todas tienen sus propios códigos especiales. Algunos de estos códigos son
idénticos a los de la Terminal de Depuración; otros son bastante diferentes.

Armando el circuito de la pantalla LCD Serial


La conexión de la pantalla LCD Serial Parallax al BASIC Stamp es sorprendentemente
simple, como se muestra en la Figura 1-4. Solo tiene que hacer tres conexiones: una para
la alimentación, otra para tierra y una mas para la señal. El pin RX de la LCD es para la
señal y debe ser conectada al pin de entrada/salida del BASIC Stamp. En esta actividad,
usaremos el pin P14. El pin de tierra GND de la pantalla debe ser conectado a VSS en la
tarjeta Board of Education, y el pin 5 V de la pantalla debe ser conectado a Vdd.

PRECAUCIÓN: Una conexión errónea puede dañar esta pantalla LCD.


La Revisión D y los modelos anteriores de esta pantalla LCD tienen 5 pines. Si Ud.
tiene un modelo de 5 pines, por favor vea la Figura B-1 en la página 306 para
verificar cuáles son los pines correctos a usar en los circuitos de este libro.
La versión de 5 pines no es compatible con los modelos Scott Edwards o Matrix
Orbital. Si usted ha usado otras marcas de pantallas LCD seriales antes, note que este
diagrama de pines es diferente. No cometa el error de usar el mismo alambrado que usó
para otros modelos.
Cap 1: La pantalla LCD Serial Parallax · Página 5

√ Desconecte la alimentación de energía de su tarjeta Board of Education.


√ Conecte la terminal Vss de la tarjeta Board of Education al pin GND de la LCD.
√ Conecte la terminal P14 de la tarjeta Board of Education al pin RX de la LCD,
como se muestra en la Figura 1-4.
√ Conecte la terminal Vdd de la tarjeta Board of Education al pin 5V de la LCD.
√ No conecte la fuente de energía aún.

Figura 1-4: Diagramas esquemático y de conexiones


Página 6 · Sensores Inteligentes y sus Aplicaciones

Probando la pantalla LCD Serial


La LCD Serial Parallax tiene un modo de auto-prueba que puede usar para asegurarse que
esta en condiciones de operar y que el contraste está ajustado adecuadamente. La Figura
1-5 muestra la parte posterior del modulo de la LCD. Los interruptores SW1 y SW2 son
para entrar en modo de auto-prueba y para ajustar la velocidad de transmisión baud, el
contraste se ajusta con un potenciómetro “INCREASE CONTRAST”.

Figura 1-5
Vista posterior
del Módulo de la
pantalla LCD

√ Su tarjeta Board of Education aún debe estar desenergizada.


√ Encuentre los interruptores SW1 y SW2 en la parte baja del módulo de la
pantalla LCD como se muestran en la Figura 1-6 .
√ Coloque SW1 en posición off.
√ Coloque SW2 en posición off.
√ Re-energice su tarjeta nuevamente ahora.

Figura 1-6
Configurando los
interruptores de
velocidad Baud en el
modo de auto- prueba

√ Cuando re-energice, la LCD debe mostrar el texto "Parallax, Inc." en la línea


superior (Línea 0) y "www.parallax.com" en la línea inferior (Línea 1), como se
muestra en la Figura 1-3. Si deja la pantalla en este modo por un rato, un
carácter personalizado bien conocido por los jugadores de video juegos de los
80’s aparecerá comiéndose el texto.
Cap 1: La pantalla LCD Serial Parallax · Página 7

√ Si la pantalla parece atenuada o en blanco, puede girar el potenciómetro de ajuste


de contraste mostrado en la Figura 1-7con un desarmador. Si los caracteres en la
pantalla se ven bien, quizá no necesite ajustarlo. Si los caracteres están muy
oscuros o como cuadros grises, el ajuste al potenciómetro podría ser de ayuda.

√ Ajuste el potenciómetro de contraste si se requiere.

Figura 1-7
Potenciómetro de
Ajuste de Contraste

Ajustando la pantalla LCD para recibir Mensajes del BASIC Stamp


La comunicación de datos en serie involucra una velocidad de transmisión baud . Esto es
el número de bits por segundo (bps) que el emisor transmite y a los que el receptor tiene
que estar listo para recibir los datos a la misma velocidad baud. En las actividades de este
capítulo, el BASIC Stamp será programado para enviar mensajes a la LCD a 9600 bps.
Puede ajustar los mismos interruptores que usó para el modo auto-prueba ahora para fijar
la velocidad baud.

√ Desenergice la tarjeta Board of Education.


√ Deje el interruptor SW1 en la posición OFF.
√ Coloque el interruptor SW2 en la posición ON como se indica en la Figura 1-8.
√ Energice la tarjeta nuevamente ahora.

La pantalla se mantendrá en blanco hasta que programe el BASIC Stamp 2 para controlar
la pantalla.

Figura 1-8
Velocidad Baud.
Interruptores a
9600 bps
Página 8 · Sensores Inteligentes y sus Aplicaciones

La Figura 1-9 muestra la tabla impresa en la parte posterior de la LCD Serial Parallax. Si
quiere enviar mensajes a otras velocidad baud (2400 o 19,200 bps), use esta tabla y ajuste
los interruptores SW1 y SW2 según sea el caso.

Figura 1-9
Configuración de
los interruptores de
Velocidad Baud

ACTIVIDAD #2: DESPLIEGE DE MENSAJES SIMPLES


Como se mencionó antes, los comandos que envían texto, números y elementos que dan
formato y códigos de control (caracteres de control) a la LCD serial están relacionados
con el comando DEBUG. De hecho, el comando DEBUG es solo una versión especial de un
comando más general llamado SEROUT. El comando SEROUT tiene muchos usos, algunos
son enviar mensajes a la LCD serial, a otros módulos BASIC Stamp y a computadoras.

En esta actividad, usted programará el BASIC Stamp para hacer que la LCD despliegue
mensajes de texto y valores numéricos. Como un primer paso en la animación, también
modificará los programas para que el texto y los números parpadeen. El comando SEROUT
será su herramienta para cumplir estas tareas. Usará el comando SEROUT para enviar
texto, números, códigos de control y elementos de formato a la pantalla LCD Serial
Parallax. Como pronto verá, el texto, los números y los formateadotes son idénticos a los
que usa con el comando DEBUG. Los códigos de control serán un poco diferentes, pero
con un poco de práctica serán tan fáciles de usar como CR, CLS, HOME, y CRSRXY. (Si no
está familiarizado con CRSRXY, podrá aprender más de él en el capítulo 6, Actividad # 1).

La versión minima de la sintaxis del comando SEROUT es como sigue:

SEROUT Pin, BaudMode, [ DataItem, {DataItem, ...} ]

En nuestros programas, el argumento Pin tiene que ser 14 puesto que el pin RX (de
recepción de datos) de la pantalla LCD's está conectada a pin de entrada/salida P14 del
BASIC Stamp.
Cap 1: La pantalla LCD Serial Parallax · Página 9

El argumento BaudMode es un valor que le dice al BASIC Stamp qué tan rápido deberá
enviar los datos en serie y también determina algunas de las características de la señal
serial. El programa de ayuda del Editor del BASIC Stamp tiene tablas que dan los
valores de BaudMode para velocidades baud y señales comunes. Al consultarlas, resulta
que 84 es el valor del argumento de BaudMode para 9600 bits por segundo (bps), palabras
de 8 bits, sin paridad, señal verdadera. Esto es exactamente para lo que la LCD Serial
Parallax fue diseñada para recibir.

Los argumentos DataItem pueden ser escritos entre comillas como “Hola”. También
pueden ser caracteres de control como CR, CLS, o valores, con o sin formateadotes como
DEC, BIN, y ?. Si se envía con formateadores, ellos son enviados como los caracteres que
representan el valor. Si se envían sin formateadores, ellos serán enviados como valores,
como 22, 12 y 13. Podemos enviar valores sin formato como estos a la LCD, los cuales
serán interpretados como códigos de control.

Más acerca SEROUT

Si usted desea intentar usar la terminal de Depuración con SEROUT en vez de DEBUG,
primero ábrala desde la barra de herramientas con Run → Debug → New. Luego,
seleccione Run → Identify para ver qué puerto está usando su BASIC Stamp. Entonces, en
la Terminal de Depuración, haga coincidir la designación del puerto de comunicación. Note
que también puede cambiar la velocidad Baud de la Terminal de Depuración así como otros
parámetros de comunicación.
Hay mucho más que aprender acerca de SEROUT. Tanto el Manual del BASIC Stamp como
la Guía de Sintaxis del Editor PBASIC dan explicación amplia acerca el comando SEROUT.
El Manual del BASIC Stamp está disponible como descarga gratis en www.parallax.com →
Downloads → Documentation. Si su Editor de BASIC Stamp soporta PBASIC 2.5,
probablemente ya tenga la Guía de Sintaxis de PBASIC. Para accesar, simplemente
seleccione el índice desde el menú de ayuda del Editor de BASIC Stamp.

Mensajes de Texto Simples y Códigos de Control


A diferencia de la Terminal de Depuración, la LCD serial necesita ser encendida con un
comando desde el BASIC Stamp. La pantalla debe recibir el valor 22 desde el BASIC
Stamp para activarse. Este es el comando PBASIC para enviarlo a la LCD serial:
SEROUT 14, 84, [22]

Usado así, 22 es un ejemplo de un código de control de la pantalla LCD. Otros códigos


de control básicos son:
Página 10 · Sensores Inteligentes y sus Aplicaciones

• 12 limpia la pantalla. Nota: siempre debe seguir PAUSE 5 para dar tiempo a la
LCD de limpiarse.
• 13 es un retorno de carro; manda al cursor a la siguiente línea.
• 21 apaga la pantalla LCD.
• 22 enciende la pantalla LCD.

Para encender y apagar la luz de fondo (solo pantallas LCD con Luz de fondo):
Algunas pantallas de LCD tienen luz de fondo para poder leerlas cuando está oscuro. Si
usted tiene esta versión de LCD Serial Parallax (parte # 27977), puede controlar la luz de
fondo con estos valores:
• 17 para encender la luz de fondo.
• 18 para apagar la luz de fondo.

En PBASIC, CR es una constante predefinida para el valor 13. Siempre que en el


comando DEBUG use la constante CR, envía el valor 13 a la Terminal de Depuración. La
Terminal de Depuración mueve el cursor al principio de la siguiente línea siempre que
recibe el valor 13. En este caso, los dos comandos a continuación son equivalentes:
SEROUT 14, 84, ["Ve esto?", CR, "La LCD funciona!"]

SEROUT 14, 84, ["Ve esto?", 13, "La LCD funciona!"]


Si bien funciona para CR, no funciona para otras constantes PBASIC predefinidas.
Por ejemplo, CLS, que es una constante predefinida para el número 0, no limpia la LCD. El
equivalente de CLS de la LCD Serial Parallax es 12. HOME, que es una constante
predefinida para el valor 1, no manda el cursor al carácter en “casa” en la esquina superior
izquierda de la LCD. El código de control que lo hace para la LCD Serial Parallax es 128.

Programa Ejemplo - LcdTestMessage.bs2


√ Introduzca, salve y corra LcdTestMessage.bs2. Verifique que muestre el mensaje
"See this?" en la línea 0 y "The LCD works!" en la línea 1 (ver Figura 1-10).

' Sensores inteligentes y sus Aplicaciones - LcdTestMessage.bs2


' Muestra un mensaje de prueba en la LCD Serial Parallax.

' {$STAMP BS2} ' Dispositivo Objeto = BASIC Stamp 2


' {$PBASIC 2.5} ' Lenguaje = PBASIC 2.5
Cap 1: La pantalla LCD Serial Parallax · Página 11

SEROUT 14, 84, [22, 12] ' Inicializa la LCD


PAUSE 5

SEROUT 14, 84, ["See this?", 13, ' Mensaje de texto, retorno de carro
"The LCD works!"] ' mas texto en la linea 1.
END ' Fin del Programa

Figura 1-10
Desplegado de texto.

Si la LCD no despliega adecuadamente: Revise su cableado, su programa y los


interruptores en la parte posterior de la LCD. Desconecte y reconecte la batería de su
tarjeta Board of Education. Vaya a las instrucciones que anteceden al programa y verifique
que cada una haya sido completada correctamente.

Su Turno - Códigos de Control para que el desplegado encienda y apague


¿Recuerda que 22 enciende la pantalla y que 21 la apaga? Puede usar estos códigos de
control para hacer que el texto parpadee.

√ Reemplace el comando END en LcdTestMessage.bs2 con este bloque de código.


DO ' Inicia el bloque DO...LOOP
PAUSE 600 ' Retraso de 6/10 de segundo
SEROUT 14, 84, [22] ' Enciende la pantalla
PAUSE 400 ' Retraso de 4/10 de segundo
SEROUT 14, 84, [21] ' Apaga la pantalla
LOOP ' Repite el bloque DO...LOOP

√ Corra el programa modificado y note el efecto.


Página 12 · Sensores Inteligentes y sus Aplicaciones

Desplegando Números con Formateadores


Muchos de los formateadores usados para mostrar números con la terminal de
Depuración funcionan con la LCD Serial Parallax. El formateador DEC es probablemente
el más útil, pero también puede usar DIG, REP, ASC, BIN, HEX, SDEC, y muchos de los
otros. Por ejemplo, si quiere desplegar el valor decimal de una variable llamada
counter, puede usar comandos como este:

SEROUT 14, 84, [DEC counter]

Programa Ejemplo - LcdTestNumbers.bs2


Además de demostrar que puede desplegar valores de variables en la LCD serial, este
programa también muestra qué pasa si el programa manda más de 16 caracteres a la línea
0. Los ajusta hacia la línea 1. También, después de llenar la línea 1 con otros 16
caracteres, el texto se vuelve a ajustar hacia la línea 0.

√ Introduzca, salve y corra LcdTestNumbers.bs2

' Sensores inteligentes y sus Aplicaciones - LcdTestNumbers.bs2


' Muestra valores numericos con la LCD Serial Parallax.

' {$STAMP BS2} ' Dispositivo Objeto = BASIC Stamp 2


' {$PBASIC 2.5} ' Lenguaje = PBASIC 2.5

counter VAR Byte ' Variable del ciclo FOR...NEXT

SEROUT 14, 84, [22, 12] ' Inicializa la LCD


PAUSE 5 ' Retraso 5 ms para limpiar la pantalla

FOR counter = 0 TO 12 ' Cuenta hasta 12; incrementa cada 1/2 s

SEROUT 14, 84, [DEC counter, " "]


PAUSE 500

NEXT

END ' Programa end

√ Verifique que la pantalla se asemeje a la Figura 1-11.


Cap 1: La pantalla LCD Serial Parallax · Página 13

Figura 1-11
Despliegue de números

Su Turno - Otros Formateadores


√ Intente reemplazar DEC con DEC2 y observe qué pasa.
√ Repita con el formateador ?.
√ Si es necesario, busque estos comandos en el Manual BASIC Stamp o en la
ayuda del Editor BASIC Stamp. Ensáyelos también en la Terminal de
Depuración.
√ ¿Cuáles son las similitudes y diferencias entre usar estos formateadores en la
Terminal de Depuración y usarlos en la LCD Serial Parallax?

Códigos de Control para Posicionar el Cursor


Los códigos de control de la LCD son diferentes de los caracteres de control del comando
DEBUG. Por ejemplo, HOME y CRSRXY simplemente no tienen el mismo efecto que tienen
en la Terminal de Depuración. Sin embargo, hay comandos de cursor para la LCD Serial
Parallax que puede usar para controlar las coordenadas X y Y del cursor. También puede
enviar el cursor a la posición superior izquierda o “posición de casa”. Revise el conjunto
de comandos en la sección de la documentación de la LCD al principio de la página 312.
Enlista todos los comandos de control válidos para la LCD; a continuación se indican
algunos ejemplos de la lista que controlan la posición del cursor.

• 8 Cursor a la izquierda
• 9 Cursor a la derecha
• 10 Cursor abajo (la linea inferior ajustara en la linea superior)
• 128 to 143 Posiciona el cursor en la linea 0, caracteres 0 al 15
• 148 to 163 Posiciona el cursor en la linea 1, caracteres 0 al 15
Página 14 · Sensores Inteligentes y sus Aplicaciones

Los valores 128 to 143 y 148 to 163 son particularmente útiles. La Figura 1-12 muestra
donde cada valor posiciona al cursor. Puede usar valores de 128 to 143 para colocar al
cursor en los caracteres 0 al 15 en la línea superior de la LCD (línea 0). De manera
semejante, puede usar valores de 148 to 163 para colocar el cursor en los caracteres 0 al
15 de la línea inferior (línea 1).

Figura 1-12
Desplegado de Texto

Luego de colocar el cursor, el siguiente caracter que envíe a la LCD será desplegado en
esa posición. Por ejemplo, he aquí un comando SEROUT con un argumento Pace opcional
configurado a 200 ms. Este comando mostrará los caracteres "L", "I", "N", "E", "-", y
"0", igualmente espaciados a lo ancho de la línea superior, un caracter cada 200 ms.
SEROUT 14, 84, 200, [128, "L",
131, "I",
134, "N",
137, "E",
140, "-",
143, "0"]

Si se despliegan caracteres múltiples después de dar una posición inicial, la LCD aún
cambiará el cursor a la derecha después de cada caracter. Por ejemplo, también puede
colocar el cursor en el caracter 7 de la línea superior y entonces desplegar "ALL", luego
mover el cursor al carácter 6 de la línea inferior y desplegar "DONE!", así:
SEROUT 14, 84, [135, "ALL", 154, "DONE!"]
Cap 1: La pantalla LCD Serial Parallax · Página 15

He aquí un bloque de código que hará que el texto "Line 1" resbale abajo a la linea
inferior, de derecha a izquierda.
FOR index = 9 TO 0
' IMPORTANTE: Deje un espacio luego del 1 en "Line 1 "
SEROUT 14, 84, [148 + index, "Line 1 "]
PAUSE 100
NEXT

Borrando Caracteres
Siempre puede barrar un caracter colocando el cursor donde lo desee y enviando el
caracter de espacio " " para sobreescribir lo que sea que allí haya. Es por esto que el texto
"Line 1 " tiene un espacio después del caracter "1", para borrar los caracteres a su derecha
conforme se mueve el texto a la izquierda.

Programa Ejemplo - CursorPositions.bs2


Este programa introduce unos trucos básicos para colocar el cursor.

√ Revise CursorPositions.bs2 y trate de predecir lo que el programa hará que haga


la LCD. También trate de predecir la secuencia y el tiempo.
√ Introduzca, salve y corra CursorPositions.bs2.
√ Compare el comportamiento de la LCD con sus predicciones.

' Sensores inteligentes y sus Aplicaciones - CursorPositions.bs2


' Muestra valores numericos con la LCD Serial Parallax.

' {$STAMP BS2} ' Dispositivo Objeto = BASIC Stamp 2


' {$PBASIC 2.5} ' Lenguaje = PBASIC 2.5

index VAR Nib ' Variable del ciclo FOR...NEXT


character VAR Byte ' Guardado del caracter
offset VAR Byte ' Valor de compensacion

SEROUT 14, 84, [22, 12] ' Inicializa la LCD


PAUSE 500 ' Retraso de 1/2 segundo

' Muestra caracteres equidistantes en la linea 0 cada 200 ms.


SEROUT 14, 84, 200, [128, "L",
131, "I",
134, "N",
137, "E",
140, "-",
143, "1"]
PAUSE 1000
Página 16 · Sensores Inteligentes y sus Aplicaciones

' Cambia "Line 1" sobre la linea 1 de derecha a izq, luego izq a derecha.
FOR index = 9 TO 0
' IMPORTANTE: Asegurese de que haya un espacio luego del 1 en "Line 1 ".
SEROUT 14, 84, [148 + index, "Line 1 "]
PAUSE 100
NEXT

FOR index = 0 TO 9
' IMPORTANTE: Asegurese de que haya un espacio entre " y la letra L.
SEROUT 14, 84, [148 + index, " Line 1"]
PAUSE 250
NEXT

PAUSE 1000 ' 1 segundo de retraso

' Limpia LCD, luego muestra "ALL DONE" al centro y flashea 5 veces
SEROUT 14, 84, [12]: PAUSE 5 ' Limpia la LCD
SEROUT 14, 84, [135, "ALL", 13, 154, "DONE!"]' "ALL" y "DONE" centrados

FOR index = 1 TO 4 ' Flashea 5 veces


SEROUT 14, 84, 500, [21, 22]
NEXT
END ' Fin del programa

Su Turno - Mas sobre el Posicionado


Desplegados más elaborados se pueden beneficiar con ciclos y las tablas de valores. He
aquí un ejemplo del mensaje "T E S T" en un ciclo y con la ayuda de un par de comandos
LOOKUP. Note que usted puede controlar la posición de cada caracter ajustando los
valores de offset en la segunda lista de valores del comando LOOKUP.
PAUSE 1000
SEROUT 14, 84, [12]: PAUSE 5 ' Limpia la pantalla
SEROUT 14, 84, ["This is a", 13] ' Texto y CR

FOR index = 0 TO 3 ' secuencia de Caracteres


PAUSE 600
LOOKUP index, ["T", "E", "S", "T"], character
LOOKUP index, [ 1, 5, 9, 13], offset
SEROUT 14, 84, [(148 + offset), character]
NEXT

√ ¡Inténtelo!
Cap 1: La pantalla LCD Serial Parallax · Página 17

ACTIVIDAD #3: APLICACION EN UN TIMER


Esta actividad aplica las técnicas de la actividad # 2 a un timer de hora-minuto-segundo.

Mostrando el Tiempo Transcurrido


He aquí un bloque de código que enciende la LCD, la limpia y coloca algunos caracteres
que no cambiarán. El resto del programa puede entonces desplegar los valores numéricos
cambiantes de hora, minuto y segundo junto a los caracteres fijos "h", "m" y "s".
SEROUT 14, 84, [22, 12] ' Enciende LCD y limpia
PAUSE 5 ' Pausa 5 ms para limpiar

SEROUT 14, 84, ["Time Elapsed...", 13] ' Texto + retorno de carro
SEROUT 14, 84, [" h m s"] ' Texto en la segunda linea

Para esta aplicación, los códigos de control para colocación del cursor son
particularmente útiles. Por ejemplo, el cursor puede ser colocado en la línea 1, caracter 0
antes de enviar el valor decimal de 2 dígitos de las horas. El cursor puede ser movido a la
línea 1, caracter 5 para desplegar los minutos y luego movido a la línea 1, caracter 10
para desplegar los segundos.

Un comando SEROUT que mustra los valores de las 3 variables, en posiciones correctas:
SEROUT 14, 84, [ 148, DEC2 hours,
153, DEC2 minutes,
158, DEC2 seconds ]

El siguiente programa ejemplo aplica este concepto con tan solo las habilidades de
tiempo del modulo BASIC Stamp. La precisión no es por mucho la de un reloj de
muñeca digital; sin embargo es lo suficientemente Buena para mostrar como el desplegar
la hora puede trabajar con el posicionado de caracteres. Para mayor precisión, intente
incorporar el circuito integrado de tiempo DS1302. Está disponible en
www.parallax.com, solo teclee DS1302 en el campo de búsqueda.

Programa Ejemplo - LcdTimer.bs2


Este programa ejemplo despliega las horas, los minutos y los segundos transcurridos con
la LCD Serial Parallax. Apretando el botón de RESET en la tarjeta Board of Education,
usted puede reiniciar el timer.

√ Introduza, salvey corra LcdTimer.bs2.


√ Verifique que la pantalla trabaja adecuadamente.
Página 18 · Sensores Inteligentes y sus Aplicaciones

' Sensores inteligentes y sus Aplicaciones - LcdTimer.bs2


' Muestra el tiempo transcurrido con BS2 y Parallax Serial LCD.

' {$STAMP BS2} ' Directiva de Stamp


' {$PBASIC 2.5} ' Directiva de PBASIC

hours VAR Byte ' Guarda horas


minutes VAR Byte ' Guarda minutos
seconds VAR Byte ' Guarda segundos

SEROUT 14, 84, [22, 12] ' Inicia LCD y limpia pantalla
PAUSE 5 ' Pausa 5 ms para limpiar

SEROUT 14, 84, ["Time Elapsed...", 13] ' Texto + retorno de carro
SEROUT 14, 84, [" h m s"] ' Texto en segunda linea

DO ' Rutina Principal


' Calcula horas, minutos, segundos
IF seconds = 60 THEN seconds = 0: minutes = minutes + 1
IF minutes = 60 THEN minutes = 0: hours = hours + 1
IF hours = 24 THEN hours = 0

' Muestra digitos en LCD en Linea 1. Los valores 148, 153, 158 colocan
' el cursor en los caracteres 0, 5, y 10 para los valores de tiempo.
SEROUT 14, 84, [148, DEC2 hours,
153, DEC2 minutes,
158, DEC2 seconds ]

PAUSE 991 ' Pausa + consumo ~ 1 segundo


seconds = seconds + 1 ' Incrementa segundo contador
LOOP ' Repite Rutina Principal

Su Turno - Definiendo Códigos de Control con Constantes


Hasta este punto, los códigos de control de la LCD han tenido valores decimales. Sin
embargo, cuando está escribiendo o leyendo un programa largo, memorizar todos estos
valores de códigos de control puede ser tedioso. Es mejor declarar una constante para
cada código de control al principio del programa. Luego, usar nombres de constantes en
vez de números. También puede hacer lo mismo con el valor de BaudMode y luego
también agregar una directiva PIN para el pin P14 de entrada/salida. He aquí un ejemplo:
LcdPin PIN 14 ' pin de E/S de la LCD

T9600 CON 84 ' True, 8-bits, no parity, 9600

LcdCls CON 12 ' Form feed -> clear screen


LcdCr CON 13 ' Retorno de Carro
LcdOff CON 21 ' Apaga la pantalla
Cap 1: La pantalla LCD Serial Parallax · Página 19

LcdOn CON 22 ' Enciende la pantalla


Line0 CON 128 ' Linea 0, caracter 0
Line1 CON 148 ' Linea 1, caracter 0

Estas declaraciones harán a su código más fácil de entender, lo cual es especialmente


importante si decide hacer cambios a su programa después de no haberlo visto por varios
meses. Por ejemplo, el primer comando SEROUT puede ser re-escrito así:
SEROUT LcdPin, T9600, [LcdOn, LcdCls]

El comando SEROUT en LcdTimer.bs2 que muestra los números en la línea 1 de la LCD


puede ser re-escrito como sigue:
SEROUT LcdPin, T9600, [(Line1 + 0), DEC2 hours,
(Line1 + 5), DEC2 minutes,
(Line1 + 10), DEC2 seconds]

√ Salve LcdTimer.bs2 bajo un nuevo nombre.


√ Agregue constantes descriptivas a su programa.
√ Reemplace tantos números como pueda con nombres de constantes significativos.
√ Corra su programa y corrija según lo requiera.

ACTIVIDAD #4: CARACTERES PERSONALIZADOS Y ANIMACIÓN EN


LCD
Si Bien no toda imagen ahorra mil palabras, aún las que ahorra una frase o dos son útiles
cuando solo cuenta con 32 espacios de caracteres para trabajar. Un ejemplo de una
imagen útil es el cursor de reloj de arena que su computadora muestra para hacerle saber
que el programa está ocupado. Este simple ícono animado trabaja mucho mayor que un
mensaje en algún lugar de la pantalla diciendo “por favor espere, el programa está
ocupado…”. Esta actividad usa un reloj de arena para introducir técnicas para definir,
guardar, desplegar y animar caracteres personalizados.

Caracteres Personalizados en la LCD Parallax


La LCD Serial Parallax tiene espacio asignado para ocho caracteres mostrados en la
Figura 1-13. Para desplegar el carácter personalizado 0, solo mande a la LCD el valor 0
con el comando SEROUT. De igual manera, para mostrar el caracter Personalizado 1, solo
mande un 1, para mostrar el caracter Personalizado 2, mande un 2, etc. Note que los
Caracteres 0 y 1 están pre-configurados como la contradiagonal y el tilde. He aquí un
ejemplo de comando SEROUT que muestra ambos - SEROUT 14, 84, [0, 1].
Página 20 · Sensores Inteligentes y sus Aplicaciones

Figura 1-13: Caracteres personalizados predefinidos O (contradiagonal) y 1 (Tilde)

Programa Ejemplo: PredfinedCustomCharacters.bs2


Este ejemplo envía a la LCD serial los dos comandos para desplegar los caracteres
personalizados 0 y 1, la contradiagonal "\"y el tilde"~".

√ Introduzca y corra el programa y verifique que muestra la contradiagonal y el


tilde.

' Sensores inteligentes y sus Aplicaciones - PredefinedCustomCharacters.bs2

' {$STAMP BS2}


' {$PBASIC 2.5}

SEROUT 14, 84, [22, 12] ' Inicializa la LCD


PAUSE 5 ' 5 ms retardo para limpiar

' Muestra caracteres personalizados pre-definidos:"\" (caracter predefinido 0)


' y "~" (caracter predefinido 1).

SEROUT 14, 84, [0, 1]

Definiendo (and Redefiniendo) Caracteres Personalizados


Los caracteres personalizados de la LCD Serial Parallax están guardados en su RAM.
Para definir uno de sus ocho caracteres personalizados, su commando SEROUT tiene que
decirle a la LCD cuál de los 8 caracteres personalizados está definiciendo y entonces
describer los estados de encendido/apagado de cada pixel en el caracter. Cada carácter
tiene 40 pixeles, 8 pixeles de alto por 5 de ancho.

La Figura 6-14 muestra los comandos de Definición que puede enviar a la LCD para
decirle cuál es el caracter que está a punto de definir. También lo puede ver así: para
decirle a la LCD cuál caracter está definiendo, envíele el valor del caracter personalizado,
más 248. Por ejemplo, si usted quiere definir el caracter personalizado 0, mande 248, si
quiere definir el caracter personalizado 1, mande 249, y así sucesivamente hasta 255 para
el caracter personalizado 7.
Cap 1: La pantalla LCD Serial Parallax · Página 21

Figura 1-14: Comandos de Definición de Caracteres personalizados

Luego de enviar el código que le dice a la LCD cuál caracter personalizado va a definir,
debe enviar 8 bytes que describan al caracter. La LCD usa los 5 bits más bajos de cada
byte que recibe para describir cada una de las 8 líneas de 5 pixeles de ancho que hay en el
caracter. La Figura 1-15 muestra un ejemplo de la definición del caracter personalizado 0
para un reloj de arena que acaba de ser volteado.

SEROUT 14, 84, [248,


%00000, 
%11111, 
%11111,  Figura 1-15
%01110,  Redefiniendo el caracter
%00100,  personalizado 0
%01010, 
%10001, 
%11111] 

Note como cada valor sucesivo en el comando SEROUT corresponde a una línea de pixeles
en el caracter personalizado. Note también como los unos corresponde a pixeles negros y
los ceros corresponden a blancos.

Las definiciones de caracteres personalizados SEROUT no son permanentes. Cada


vez que la LCD es encendida y apagada los caracteres personalizados son borrados.
Puesto que BASIC Stamp y la LCD comparten la misma batería, el programa BASIC Stamp
también reinicia cuando la energía es restituida. Es buena práctica definir los caracteres
personalizados que planea usar al principio del programa, de tal forma que BASIC Stamp
pueda definir los caracteres personalizados cada vez que la energía se conecte.
Página 22 · Sensores Inteligentes y sus Aplicaciones

Esta definición de caracter personalizado de un reloj de arena con sus 4 pixeles de arena
abajo usa 255 para decirle al LCD que lo haga para el Caracter personalizado 7. También
usa una técnica para dibujar los caracteres con asteriscos en los comentarios a la derecha
del comando SEROUT. Empieza SEROUT con todos los valores binarios colocados en
%00000 y entonces dibuja el caracter con asteriscos en el comentario a la derecha.
Después de que se ve bien, usa los asteriscos para indicar cuáles ceros deben ser
cambiados a unos.
SEROUT 14, 84, [255, ' Define Caracter Personalizado 7
%00000, '
%11111, ' * * * * *
%10001, ' * *
%01010, ' * *
%00100, ' *
%01110, ' * * *
%11111, ' * * * * *
%11111] ' * * * * *

Figura 1-16 muestra como los dos comandos SEROUT recién discutidos redefinen los
caracteres personalizados de la LCD.

Figura 1-16: After Defining Caracteres personalizados 0 y 7

Algunas veces los caracteres personalizados se definen con valores hexadecimales.


Incluso verá esto en programas ejemplos disponibles como descargas en la página del
producto LCD Serial Parallax en www.parallax.com. Para información de cómo trabaja la
definición hexadecimal de caracteres, intente la actividad en el apéndice B.

Con estas nuevas definiciones puede escribir un ciclo para hacer que el reloj de arena
cambie de vacío a lleno, indicando que el usuario debe esperar. El siguiente bloque
DO...LOOP hace esto primero colocando el cursor en la línea 0, caracter 5 en la LCD.
Luego muestra el caracter personalizado 0, el reloj de arena recién volteado. Después de
una breve PAUSE, el programa envía el comando de espacio atrás (8) para que el cursor
regrese al caracter 5. Luego, manda el caracter personalizado 7, el reloj de arena con la
arena ya en su base. Repitiendo esta secuencia parece como si el reloj de arena ha sido
volteado, drenado, volteado otra vez, drenado nuevamente, etc.
Cap 1: La pantalla LCD Serial Parallax · Página 23

DO

SEROUT 14, 84, [133] ' Cursor -> Linea 0, char


SEROUT 14, 84, [0] ' Muestra Caracter Personalizado 0
PAUSE 1250 ' Retraso de 1.25 segundos
SEROUT 14, 84, [8] ' Espacio atras
SEROUT 14, 84, [7] ' Muestra Caracter Personalizado 7
PAUSE 1500 ' Retraso de 1.50 segundos

LOOP

Programa Ejemplo: Hourglass.bs2


Este programa define y muestra los caracteres personalizados del reloj recién discutidos.

√ Introduzca, salve y corra el programa.


√ Verifique que despliega alternadamente los dos caracteres de reloj de arena en el
sexto caracter de la línea superior de la LCD.

' -----[ Titulo ]-------------------------------------------------------------


' Sensores inteligentes y sus Aplicaciones - Hourglass.bs2
' Define y muestra caracteres personalizados.

' {$STAMP BS2} ' Dispositivo objeto = BASIC Stamp 2


' {$PBASIC 2.5} ' Lenguaje = PBASIC 2.5
' -----[ Inicializacion ]-----------------------------------------------------

PAUSE 250 ' Estabiliza fuente de energia

SEROUT 14, 84, [248, ' Define Caracter Personalizado 0


%00000, '
%11111, ' * * * * *
%11111, ' * * * * *
%01110, ' * * *
%00100, ' *
%01010, ' * *
%10001, ' * *
%11111] ' * * * * *

SEROUT 14, 84, [255, ' Define Caracter Personalizado 7


%00000, '
%11111, ' * * * * *
%10001, ' * *
%01010, ' * *
%00100, ' *
%01110, ' * * *
%11111, ' * * * * *
%11111] ' * * * * *
Página 24 · Sensores Inteligentes y sus Aplicaciones

SEROUT 14, 84, [22, 12] ' Enciende pantalla y limpia


PAUSE 5 ' 5 ms retraso para limpiar

' -----[ Main Rutina ]-------------------------------------------------------

DO

SEROUT 14, 84, [133] ' Cursor -> Linea 0, char


SEROUT 14, 84, [0] ' Muestra Caracter Pers. 0
PAUSE 1250 ' Retraso de 1.25 seconds
SEROUT 14, 84, [8] ' Espacio atras
SEROUT 14, 84, [7] ' Muestra Caracter Pers. 7
PAUSE 1500 ' Retraso de 1.50 seconds

LOOP

Su Turno
La Figura 1-17 muestra a los caracteres personalizados describiendo a los granos de arena
en el reloj moviéndose de arriba hacia abajo.

Figura 1-17: Caracteres personalizados para reloj de arena animado

√ Salve Hourglass.bs2 como HourGlassYourTurn.bs2.


√ Expanda la rutina de Inicialización de tal forma que defina los ocho caracteres
personalizados que se muestran en la Figura 1-17.
√ Modifique la Rutina Principal de tal forma que de un efecto animado de los
granos de arena cayendo de arriba a abajo.

He aquí una Rutina principal que puede también intentar para animar los ocho caracteres
personalizados una vez que los haya dado de alta en la sección de Inicialización:

DO

' Coloca el cursor en el caracter 5, y muestra el Caracter personalizado 0.


SEROUT 14, 84, 100, [133, 0]
PAUSE 750 ' Retraso de 0.750 segundos
Cap 1: La pantalla LCD Serial Parallax · Página 25

' Espacio atras, Caracter Pers. 1, espacio atrás, Caracter Pers. 2, etc.
' Ritmo opional en el argumento de 100 manda cada valor cada 1/10 segundo.
SEROUT 14, 84, 100, [8, 1, 8, 2, 8, 3, 8, 4, 8, 5, 8, 6, 8, 7, 8]
PAUSE 750

LOOP

√ ¡Inténtelo!

Aún cuando la LCD solo guarda 8 caracteres personalizados a la vez, su programa


puede guarder tantos como necesite. Recuerde, su programa puede redefinir los
caracteres personalizados en cualquier momento. Si su aplicación necesita 20 caracteres
personalizados, su programa PBASIC puede guardarlos y redefinirlos en la LCD según se
requiera.
Usted puede desplegar el reloj de arena con un solo caracter personalizado. La
animación del reloj de arena completa puede hacerse con un solo caracter personalizado.
El truco está en redefinirlo cada vez que la pantalla es actualizada.

ACTIVIDAD #5: AVANCE DE TEXTO TRAVES DE LA PENTALLA


Si su mensaje es muy ancho para desplegarse en los 16 caracteres de la pantalla, puede
ser que funcione hacerlo avanzar a lo largo de la misma. La Figura 1-18 muestra un
ejemplo. Con el avance, el texto empieza en la parte de la derecha de la pantalla. Luego,
el texto cambia a lo largo de la pantalla una letra a la vez.

Figura 1-18
Text Avanzando

El código para el avance que se presenta en esta actividad es bastante diferente del
programa ejemplo en la Actividad #2, el cual hizo que la línea 1 se moviera a lo ancho de
Página 26 · Sensores Inteligentes y sus Aplicaciones

la pantalla. La principal diferencia estriba en que en la Actividad # 2 el mensaje se


detenía en la parte izquierda. Cuando el mensaje es mas largo que la pantalla, el detenerse
en la parte izquierda de la pantalla impide hacer visible el resto del mensaje.

Para hacer que un texto avance sobre solo una línea, el programa tiene que empezar con
la primera letra en el mensaje y desplegarla en la posición extrema derecha. Después de
un corto retraso, el programa debe mover el cursor a la segunda posición (de derecha a
izquierda) de caracteres de la pantalla, y allí imprimir tanto la primera como la segunda
letra. Debe continuar este proceso hasta que el cursor llegue hasta la parte izquierda de la
pantalla. Entonces, el cursor debe ser reposicionado repetidamente a la misma posición
en la que porciones de texto de 16 caracteres puedan ser desplegadas, haciendo que el
mensaje aparezca con corrimiento de derecha a izquierda, una letra a la vez.

La técnica de programación para este proceso es llamada de ventana corrediza. Además


de ser de utilidad para la LCD Parallax, esta técnica es lo que ve cuando sube y baja texto
en programas como el Editor de BASIC Stamp o su explorador de Internet. También se
usa en programas para transmitir y recibir paquetes TCP/IP. Cada vez que abre su
explorador de red, hay más de una instancia de código de ventana corrediza trabajando.

Una Subrutina de Desplazamiento Configurable


El siguiente programa ejemplo presenta una subrutina que es conveniente para desplegar
una variedad de mensajes con desplazamiento con una cantidad mínima de esfuerzo.
Todo lo que involucra es poner los mensajes en directivas DATA precedidas por nombres
Símbolos, establecer algunas variables y luego llamar la subrutina de desplazamiento.

He aquí algunos ejemplos de directivas DATA.


Message1 DATA @ 2, "Message "
Message2 DATA "again"
Message3 DATA "Larger message, going faster"
Message4 DATA

El primer mensaje de texto empieza en una dirección EEPROM igual al valor del símbolo
del Message1, el cual ha sido establecido en 2 a través del argumento opcional @Address
de la directiva DATA. La dirección después del final del Message1 es la dirección
EEPROM 11. Esto es denotado por la etiqueta Message2, lo cual es también el inicio del
Segundo mensaje. Puesto que usted puede establecer variables iguales a los valores de
Message1 a Message4, es un sistema especialmente flexible para una variedad de
mensajes.
Cap 1: La pantalla LCD Serial Parallax · Página 27

El siguiente programa ejemplo también tiene variables que usted puede establecer para
configurar diferentes posiciones de ventana, anchos e incrementos. Después de establecer
estos valores de variables, usted puede entonces hacer una llamada a la subrutina
Scroll_Message, y ella hará el resto del trabajo. He aquí un ejemplo de un bloque de
código que hace que la subrutina despliegue todos los caracteres entre las etiquetas
Message1 y Message2 en los cuatro caracteres centrales de la línea superior de la LCD.

messageStart = Message1: messageEnd = message2


windowLeft = 134: windowRight = 137
increment = 1
GOSUB Scroll_Message

Las direcciones EEPROM inicial y final son guardadas en las variables messageStart y
messageEnd. Las direcciones de los caracteres de la LCD inicial y final que definen la
ventana son guardadas en windowLeft y windowRight. Finalmente pero no por último,
la variable increment se establece al número de caracteres que el texto mueve cada vez
que cambia. Con todos esos valores establecidos, la subrutina Scroll_Message tiene
todo lo que necesita para hacer su trabajo.

Hay tres ejemplos más en la rutina principal del siguiente programa. No todos los
ejemplos asignan valores a todas las variables. Algunos de los ejemplos solo establecen
algunos valores porque son valores que se reciclan y que fueron asignados antes de la
previa llamada de subrutina. Por ejemplo, el valor de la variable increment fue
establecido en 1 antes de la primera llamada de subrutina. Puesto que la subrutina
Scroll_Message no hace cambios a esa variable, el valor 1 no necesita ser reasignado
antes de llamar a la subrutina Scroll_Message nuevamente.

' Cambia los valores de varias variables de configuracion


' y demuestra el efecto sobre la pantalla con cada cambio.
windowLeft = 131: windowRight = 140
GOSUB Scroll_Message

He aquí el ultimo ejemplo en la Rutina Principal. Note que re is the last ejemplo en the
Main Routine. Note que se encarga de buena parte de la segunda linea y avanza dos
caracteres a la vez:
messageStart = Message3: messageEnd = message4
windowLeft = 150: windowRight = 161
increment = 2
GOSUB Scroll_Message
Página 28 · Sensores Inteligentes y sus Aplicaciones

Programa Ejemplo - TestScrollingSubroutine.bs2


√ Revise los bloques de código en la Rutina Principal del programa y prediga qué
tan ancha sera la ventana de avance, qué texto sera desplegado y cuántos
caracteres cambiará el mensaje a la vez.
√ Introduzca, salve y corra TestScrollingSubroutine.bs2.
√ Compare sus predicciones a lo que realmente ocurrio y reconcilie las diferencias.

' -----[ Titulo ]-------------------------------------------------------------


' Sensores inteligentes y sus Aplicaciones - TestScrollingSubroutine.bs2
' Avanza un mensaje de texto a traves de una ventana de 4 caracteres en la LCD

' {$STAMP BS2} ' Directiva BASIC Stamp


' {$PBASIC 2.5} ' Directiva PBASIC

' -----[ directivas DATA]----------------------------------------------------

Message1 DATA @ 2, "Message "


Message2 DATA "again"
Message3 DATA "Larger message, going faster..."
Message4 DATA
' -----[ Definiciones E/S]----------------------------------------------------

LcdPin PIN 14 ' Pin de E/S de la LCD

' -----[ Constantes ]---------------------------------------------------------

T9600 CON 84 ' True, 8-bits, no parity, 9600


LcdCls CON 12 ' Form feed -> limpia pantalla
LcdCr CON 13 ' Retorno de carro
LcdOff CON 21 ' Apaga la pantalla
LcdOn CON 22 ' Enciende la pantalla
Line0 CON 128 ' Linea 0, caracter 0
Line1 CON 148 ' Linea 1, caracter 0

TimeOn CON 250 ' Caracter de tiempo de encendido


TimeOff CON 0 ' Caracter de tiempo de atenuac.

' -----[ Variables ]----------------------------------------------------------

' Variables funcionales para la subrutina Scroll_Message.

cursorStart VAR Byte ' Posicion del primer caracter


head VAR Byte ' Inicio del texto desplegado
tail VAR Byte ' Fin del texto desplegado
pointer VAR Byte ' apuntador de direccion EEPROM
character VAR Byte ' Guarda un caracter
Cap 1: La pantalla LCD Serial Parallax · Página 29

' Variables de configuracion para la subrutina Scroll_Message.

increment VAR Nib ' Caracteres por cambiar


windowRight VAR Byte ' Direccion del caracter de
' extrema derecha
windowLeft VAR Byte ' Direccion del caracter de
' extrema izquierda
messageStart VAR Byte ' Direccion EEPROM para inicio
messageEnd VAR Byte ' Direccion EEPROM para fin

' -----[ Inicializacion ]-----------------------------------------------------


SEROUT LcdPin, T9600, [LcdOn, LcdCls] ' Enciende y limpia pantalla
PAUSE 5 ' Retraso 5 ms

' -----[ Rutina Principal]----------------------------------------------------

' Establece valores de variables de configuracion, luego llama Scroll_Message.

messageStart = Message1: messageEnd = message2


windowLeft = 134: windowRight = 137
increment = 1
GOSUB Scroll_Message

' Cambia los valores de varias variables de configuracion y demuestra el


' efecto en la pantalla con cada cambio.

windowLeft = 131: windowRight = 140


GOSUB Scroll_Message

messageStart = Message1: messageEnd = message3


GOSUB Scroll_Message

messageStart = Message3: messageEnd = message4


windowLeft = 150: windowRight = 161
increment = 2
GOSUB Scroll_Message

END

' -----[ Subrutina - Scroll_Message ]----------------------------------------

Scroll_Message:

cursorStart = windowRight - increment + 1 ' Caracter ExtremaDer en ventan


head = 0 ' Inicializa head y tail
tail = increment - 1 ' del mensaje

' ciclo de avance


Página 30 · Sensores Inteligentes y sus Aplicaciones

DO WHILE tail<(MessageEnd-MessageStart)+(windowRight-windowLeft+increment)

SEROUT LcdPin, T9600, [cursorStart] ' Caracter ExtramaDer en ventana

FOR pointer = head TO tail ' Limpia caracteres anteriores.


SEROUT LcdPin, T9600, [" "]
NEXT

PAUSE timeOff ' Permite atenuacion caracteres

SEROUT LcdPin, T9600, [cursorStart] ' Caracter ExtramaDer en ventana

' Este ciclo FOR...NEXT refresca el mensaje, cambia incrementa caracteres


' a la izquierda todas las veces hasta el fin del mensaje EEPROM.
' Luego, llena la pantalla con caracteres espacios mientras que lo que
' sobra del mensaje sale de la ventana.
FOR pointer = head TO tail
IF (pointer <= (MessageEnd - MessageStart - 1)) THEN
READ pointer + MessageStart, character
ELSE
character = " "
ENDIF
SEROUT LcdPin, T9600, [character]
NEXT

PAUSE timeOn ' Da a caracteres algo de tiempo

' Increment until at window-left


cursorStart = cursorStart - increment MIN windowLeft
tail = tail + increment ' Incrementa apuntador tail

' Increment head pointer if tail pointer > window width.


IF tail > (windowRight - windowLeft) THEN
head = head + increment
ELSE
head = 0
ENDIF
ciclo ' Repite ciclo de avance

RETURN

La ventana corrediza de la subrutina Scroll_Message


Digamos que la ventana de texto en movimiento es de 4 caracteres de ancho en la línea
superior porque hay otros mensajes que deben ser desplegados todo el tiempo en la LCD.
El asunto ahora es recorrer el texto en la ventana pequeña sin sobreescribir cualquiera de
los caracteres desplegados fuera de ella.
Cap 1: La pantalla LCD Serial Parallax · Página 31

La Figura 1-19 muestra el arreglo y Paso 0 de una ventana de 4 caracteres. En el paso de


configuración, nada se despliega en la ventana. Luego, el paso 0 coloca el cursor en la
posición 137 y despliega el carácter 0, esto es, la letra "M".

Figura 1-19: Cambiando Texto a través de la ventana, paso de Configuración y Paso 0

√ La Figura 1-20 muestra los pasos 1 y 2. Después de esperar un momento para


que la "M" sea visible, el cursor tiene que ser colocado en la posición 136 y
luego los caracteres 0 y 1, "Me", podrán ser desplegados. Luego, el cursor se
mueve a la posición 135 y desplegar los caracteres 0 al 2, "Mes".

Figura 1-20: Cambiando Texto a través de la ventana, Pasos 1 y 2


Página 32 · Sensores Inteligentes y sus Aplicaciones

√ La Figura 1-21 muestra los Pasos 3 y 4. El cursor moviéndose a la posición 134


y desplegando los caracteres 0 al 3, "Mess", describe aún la misma secuencia,
pero cuando la "M" abandona la ventana, la secuencia tiene que cambiar. El
punto de inicio del cursor, o apuntador de inicio, no puede avanzar a la
izquierda; debe permanecer en la posición 134. También, en vez de desplegar los
caracteres 0 al 3, los caracteres 1 al 4, "essa", deben ser desplegados.

Figura 1-21: Cambiando Texto a través de la ventana, Pasos 3 y 4

√ La posición de inicio del cursor tiene que mantenerse en 134 mientras que los
caracteres de head (punta) y tail (cola) continúan avanzado: 2 al 5 - "ssag", 3 al 6
- "sage". La ventana se mantiene corriendo y la Figura 1-22 muestra del
penúltimo paso de los caracteres 6 al 9 - "e" seguida por tres espacios, y
finalmen te el último paso, 7 al 10 – cuatro caracteres de espacio.

Figura 1-22: Cambiando Texto a través de la ventana, Pasos 9 y 10


Cap 1: La pantalla LCD Serial Parallax · Página 33

TestScrollingSubroutine.bs2 usa las variables mostradas en la Figura 1-23 para la ventana


corrediza. La variable cursorStart guarda la posición en la que el cursor es colocado
cada momento antes de que empiece a escribir las letras en el mensaje. En la figura,
cursorStart guarda el valor 135. La siguiente vez que el texto cambia a la izquierda,
guardará 134. Dos variables, head y tail, guardan las direcciones de principio y fin del
texto que entrarán en la ventana de mensaje. En la figura, head guarda 0, y tail guarda
2. La variable pointer se usará por el comando READ para obtener la letra adecuada, y
la variable character guardará la letra que el comando READ recupere de la EEPROM.

Figura 1-23: Variables de TestScrollingRoutine.bs2.

En la Figura 1-23, pointer está apuntando a la letra 1 en la secuencia, que es "e". Un


ciclo FOR...NEXT usa la variable pointer para leer cada caracter en la EEPROM, desde
head hasta tail y entonces despliega cada uno con el comando SEROUT. Cada vez que el
texto cambie a la derecha, el nuevo texto debe sobreescribir el texto anterior con el
mismo ciclo head hasta tail.
Página 34 · Sensores Inteligentes y sus Aplicaciones

RESUMEN
La pantalla de cristal líquido (LCD) es usada en una tremenda variedad de productos.
Una pantalla de caracteres simple como la LCD serial Parallax 2X16 puede substituir las
características de la Terminal de Depuración, lo cual es especialmente util cuando la
prueba en campo de su proyecto no está dentro del alcance de un cable serial y una PC.

La LCD Serial Parallax tiene un potenciómetro de ajuste de contraste atrás, junto con dos
interruptores que puede usar para seleccionar de entre 3 diferentes velocidades baud y un
modo de auto-prueba. Hay 3 pins en la parte posterior de la LCD Serial Parallax, ya que
se requieren solo 3 conexiones para operarla: Vdd, RX, y Vss.

La LCD Serial Parallax tiene un conjunto extensor de commandos y una lista completa de
estos commandos se incluye en la Documentación del Producto LCD Serial Parallax
(Apéndice B). Este capítulo presenta comandos para encender y apagar la pantalla,
limpiarla, colocar el cursor, controlar el encendido de la luz de fondo para el modelo con
luz de fondo y para desplegar caracteres.

La LCD Serial Parallax depende de mensajes seriales emitidos desde BASIC Stamp y
que son programados dentro de ella a través del comando SEROUT de PBASIC. Muchas
de las características del comando DEBUG pueden ser usadas con el commando SEROUT,
incluyendo texto entre comillas y formateadotes como DEC, BIN, DIG, etc. Todos estos
tienen resultados en la LCD que son similares a los de la Terminal de Depuración. Los
códigos de control de la LCD son diferentes y más numerosos que los que se usan con la
Terminal de Depuración. En vez de intentar usar CR, CLS, CRSRXY, etc, use los valores de
códigos de control listados en el conjunto de commandos de la LCD. También es buena
idea hacer constanes para estos valores, tales como LcdCls CON 12, LcdClr CON 13,
LcdOn CON 22, LcdOff CON 21, y así sucesivamente.

La LCD Serial Parallax tiene 8 caracteres personalizados, del 0 al 7. Usted puede


desplegar cualquiera de ellos al enviar su valor a la LCD. Por ejemplo, SEROUT 14, 84,
[3] hace que la LCD escriba el Caracter personalizado 3. Los comandos para definir los
caracteres personalizados van del 248 al 255. Enviar un 248 instruye a la LCD para
definir el carácter personalizado 0, 249 define el Caracter Personalizado 1, etc., hasta el
255, lo cual define el Caracter personalizado 7. Después de enviar un comando para
definir un caracter personalizado, los siguientes 8 bytes son valores binarios, cuyos 5 bits
Cap 1: La pantalla LCD Serial Parallax · Página 35

mas bajos definen los pixeles en una determinada línea de pixeles. Un 1 hace al píxel
negro, un 0 lo hace blanco.

Este capítulo también presenta una subrutina para que avance texto de derecha a
izquierda dentro de una ventana. Esta subrutina busca direcciones de inicio y paro que
corresponden a etiquetas de direcciones Símbolo que preceden a directivas DATA que
contienen el texto a ser desplegado. La manera en que se despliega el texto de la
subrutina esta definido por 5 variables: messageStart, messageEnd, windowLeft,
windowRight, e increment. Las variables messageStart y messageEnd guardan las
direcciones EEPROM de inicio y fin del texto a ser desplegado. Las variables
windowLeft y windowRight guardan las direcciones de caracteres en la LCD de inicio y
fin que definen la ventana, la variable increment guarda cuántos caracteres a la vez se
cambian de derecha a izquierda.

Preguntas
1. Mencione 3 dispositivos que usa todos los días que despliegan información con
la LCD.
2. ¿Qué significan el 2 y el 16 en el término 2x16 LCD?
3. ¿Qué comando usa para enviar información a la LCD Serial Parallax?
4. ¿De qué manera son diferentes los comandos DEBUG y SEROUT?
5. ¿En qué posición deben estar los interruptores SW1 y SW2 si necesita escribir
un programa que envíe un mensaje a la LCD Serial Parallax a una velocidad de
19,200 bps?
6. ¿Qué componente ajusta para cambiar el contraste de la pantalla LCD?
7. ¿Qué comando SEROUT limpia la pantalla?
8. ¿Qué consideraciones especiales hay que tomar en cuenta al usar los códigos de
control CR, CLS, y HOME del comando DEBUG con la LCD Serial Parallax?
9. ¿Cuáles son los 3 argumentos que necesita para un comando SEROUT mínimo?
10. ¿Cómo puede hacer que un texto desplegado en la LCD se encienda y apague
intermitentemente?
11. ¿Qué rangos de valores puede enviar a la LCD para colocar el cursor?
12. ¿Qué carácter reside en el carácter personalizado 1 por definición?
13. ¿Cómo despliega un caracter personalizado después de que ha sido definido?
14. ¿Cuáles son algunas aplicaciones de la ventana corrediza?
Página 36 · Sensores Inteligentes y sus Aplicaciones

Ejercicios
1. Haga que el mensaje "Hola" aparezca en la terminal de Depuración sin usar el
comando DEBUG.
2. Despliegue el mensaje "Hola" centrado en la línea superior de la LCD.
3. Haga que el mensaje "Hola" encienda y apague alternadamente cada segundo.
4. Escriba un comando para hacer que el mensaje "Inicio" aparezca al principio de
la línea 0 y el mensaje "Final" aparezca en el lado derecho de la línea 1.
5. Escriba un comando SEROUT para enviar mensajes a la LCD cuando SW1 y
SW2 están ambos encendidos.
6. Escriba un comando SEROUT para enviar un mensaje a la LCD cuando SW1 está
encendido y SW2 está apagado.

Proyectos
1. Escriba un programa que despliegue un mensaje de 6 líneas. Empieza
desplegando las líneas 0 y 1 con una pausa. Luego avanza a las líneas 2 y 3,
nuevamente con una pausa. Finalmente, despliega las líneas 4 y 5.
2. Escriba un programa que imprima 3 copias de un carácter personalizado. Luego,
redefina el caracter personalizado. ¿Qué pasa con las 3 copias de este caracter?
Cap 1: La pantalla LCD Serial Parallax · Página 37

Soluciones
Q1. Reloj de pulsera, calculadora, teléfono (las respuestas pueden variar).
Q2. Dos líneas de texto, cada una con 16 caracteres de ancho.
Q3. El comando SEROUT.
Q4. Cuando use el comando SEROUT debe especificar el número de pin y la velocidad
baud.
Q5. Ambos SW1 y SW2 deben estar en la posición de encendido para 19,200 bps.
Q6. Un potenciómetro.
Q7. El comando SEROUT 14, 84, [12] limpiará la pantalla.
Q8. Las constantes PBASIC pre-definidas como CR, CLS, y HOME no están
necesariamente definidas correctamente para trabajar con la LCD serial.
Q9. SEROUT requiere los argumentos Pin, Baudmode, y DataItem.
Q10. Escriba el texto, luego apague y encienda la pantalla usando los caracteres de
control 21 y 22.
Q11. De 128 a 143 para la línea 0 y 148-163 para la línea 1.
Q12. La contradiagonal.
Q13. Envíe a la LCD el valor del caracter personalizado con el comando SEROUT. Por
ejemplo, SEROUT 14, 84, [4] desplegará el caracter personalizado 4.
Q14. Las pantallas LCD, aún las grandes que hay en estaciones de tren, terminales de
aeropuertos o en eventos deportivos, asi como texto desplazándose en
aplicaciones de Windows y paquetes TCP/IP.

E1. Del archivo de ayuda del Editor de BASIC Stamp: “Para el Puerto serial inter-
construido establezca el argumento Tpin a 16 en el comando SEROUT.”
' Sensores Inteligentes y sus Aplicaciones - Ch1_Ex01.bs2
' {$STAMP BS2}
' {$PBASIC 2.5}

DEBUG "Hola, esto es DEBUG", CR


SEROUT 16, 84, ["Hola – Esto es SEROUT", CR]

E2. Ejemplo de solución:


' Sensores Inteligentes y sus Aplicaciones - Ch1_Ex02.bs2
' {$STAMP BS2}
' {$PBASIC 2.5}

SEROUT 14, 84, [22, 12] ' Enciende y limpia pantalla


' 1234567890123456
SEROUT 14, 84, [" Hello ", CR] ' Centra texto en linea sup.
Página 38 · Sensores Inteligentes y sus Aplicaciones

E3. Ejemplo de solución:


' Sensores Inteligentes y sus Aplicaciones - Ch1_Ex03.bs2
' Hcer que un mensaje encienda y apague una vez por segundo
' {$STAMP BS2}
' {$PBASIC 2.5}

SEROUT 14, 84, [22, 12] ' Enciende y limpia pantalla


' 1234567890123456
SEROUT 14, 84, [" Hello ", CR] ' Centra texto en linea sup.

DO
SEROUT 14, 84, [21] ' Apaga pantalla
PAUSE 500
SEROUT 14, 84, [22] ' Enciende pantalla
PAUSE 500
LOOP

E4. Ejemplo de solución:


' Sensores Inteligentes y sus Aplicaciones - Ch1_Ex04.bs2
' Escribe Inicio empezando la Linea1, Final al final de la Linea2
' {$STAMP BS2}
' {$PBASIC 2.5}

SEROUT 14, 84, [22, 12] ' Enciende y limpia pantalla


SEROUT 14, 84, ["Inicio"] ' Escribe en Linea 0
SEROUT 14, 84, [158] ' Linea2, 6o caracter de der. a izq.
SEROUT 14, 84, ["Final"] ' Escribe en extremo der de la Linea 1

E5. Ejemplo de solución:


' Sensores Inteligentes y sus Aplicaciones - Ch1_Ex05.bs2
' Escribe a 19200 baud
' {$STAMP BS2}
' {$PBASIC 2.5}

SEROUT 14, 32, [22, 12] ' Enciende y limpia pantalla


SEROUT 14, 32, ["Using 19200 bps"] ' Escribe en Linea 0

E6. Ejemplo de solución:


' Sensores Inteligentes y sus Aplicaciones - Ch1_Ex06.bs2
' Escribe a 2400 baud
' {$STAMP BS2}
' {$PBASIC 2.5}

SEROUT 14, 396, [22, 12] ' Enciende y limpia pantalla


SEROUT 14, 396, ["Using 2400 bps"] ' Escribe en Linea 0
Cap 1: La pantalla LCD Serial Parallax · Página 39

P1. Ejemplo de solución:


' Sensores Inteligentes y sus Aplicaciones - Ch1_Project1.bs2
' Despliega un mensaje de 6 lineas
' {$STAMP BS2}
' {$PBASIC 2.5}

LcdPin PIN 14
T9600 CON 84

PAUSE 250
SEROUT 14, 84, [22, 12] ' Enciende y limpia pantalla
PAUSE 5 ' 5 ms retraso para limpiar

SEROUT LcdPin, T9600, ["Nunca deje que "]


SEROUT LcdPin, T9600, ["mi escuela "]
PAUSE 1500
SEROUT LcdPin, T9600, ["obstruyera "]
SEROUT LcdPin, T9600, ["mi educacion. "]
PAUSE 1500
SEROUT LcdPin, T9600, [" -Mark Twain"]
SEROUT LcdPin, T9600, [" 1835-1910 "]

END

P2. ¡Las 3 copias cambiarán al nuevo caracter definido! Es como magia. A


continuación, un programa muestra.
' Sensores Inteligentes y sus Aplicaciones - Ch1_Project2.bs2
' Escribe 3 copias de carácter predefinido, luego redefine caracter.
' {$STAMP BS2} ' Dispositivo objeto = BASIC Stamp 2
' {$PBASIC 2.5} ' Lenguaje = PBASIC 2.5

Line0 CON 128


Line1 CON 148
copies VAR Nib

PAUSE 250
SEROUT 14, 84, [22, 12] ' Enciende y limpia pantalla
PAUSE 5 ' 5 ms retraso para limpiar

SEROUT 14, 84, [248, ' Define Caracter Pers. 0


%00110, ' * *
%00101, ' * *
%00100, ' *
%11111, ' * * * * *
%00100, ' *
%01110, ' * * *
%10101, ' * * *
%00100] ' *
Página 40 · Sensores Inteligentes y sus Aplicaciones

FOR copies = 1 TO 3
SEROUT 14, 84, [0] ' Despliega Caracter Pers. 0
NEXT

PAUSE 1000 ' Permite tiempo para verlo


SEROUT 14, 84, [Line1, "now re-defining"]' Despliega mensaje en Linea 1
PAUSE 1000
SEROUT 14, 84, [Line1, " "]' Limpia mensaje

SEROUT 14, 84, [248, ' Re-define Caracter Pers. 0


%00100, ' *
%10011, ' * * *
%01001, ' * *
%00101, ' * *
%00001, ' *
%00010, ' *
%00100, ' *
%11000] ' * *
END
Capítulo 2: Inclinación con el Acelerómetro Memsic · Page 41

Capítulo 2: El Sensor Ultrasónico de Distancia


Ping)))
El sensor Ping))) interactuando con un BASIC Stamp puede medir qué tan lejos están los
objetos. Con un rango de 3 centímetros a 3.3 metros, es una atracción para cualquier
cantidad de elementos robóticos y proyectos de automatización. Es notablemente preciso
y fácilmente detecta la distancia de un objeto al centímetro.

Figura 2-1
The Sensor Ultrasonico de Distancia
Ping)))™

¿CÓMO TRABAJA EL SENSOR PING)))?


El sensor Ping))) envía un breve silbido con su altavoz ultrasónico y mide el tiempo de
regreso del eco a su micrófono ultrasónico (Figura 2-2). El BASIC Stamp empieza
enviandole un pulso para iniciar la medición. Luego, el sensor Ping))) espera lo suficiente
para que el programa del BASIC Stamp inicie un comando PULSIN. Entonces, al mismo
tiempo que silba un tono de 40 kHz, le envía una señal alta al BASIC Stamp. Cuando
detecta el eco con su micrófono ultrasónico, cambia la señal alta de regreso a señal baja.

Figura 2-2: Como trabaja el sensor the Ping)))


Página 42 · Sensores Inteligentes y sus Aplicaciones

El comando PULSIN del BASIC Stamp usa una variable para guardar cuanto duró la señal
alta del sensor Ping))). El tiempo de esta medición es lo que le tomó al sonido viajar al
objeto de ida y vuelta. Usando esta medición y el dato de la velocidad del sonido en el
aire, usted puede hacer que su programa calcule la distancia al objeto en centímetrosa,
pulgadas, pies, etc.

El silbido del sensor Ping))) no es audible porque 40 kHz es una frecuencia


ultrasónica.
Lo que consideramos sonido es la habilidad de nuestro oído interno para detectar las
variaciones de la presión del aire causada por una vibración. El nivel de estas variaciones
determina el timbre del tono. Tonos de alta frecuencia resultan en sonidos de mayor timbre
y tonos de baja frecuencia resultan en tonos de menor timbre.
La mayoría de las personas pueden oír tonos que van desde los 20 Hz, el cual es un timbre
muy bajo, a 20 kHz, el cual es un timbre muy agudo. Un sonido subsónico es aquel con
frecuencias menores a 20 Hz, y un sonido ultrasónico es aquel con frecuencias por arriba
de 20 kHz. Puesto que los silbidos del sensor Ping))) son a 40 kHz, definitivamente son
ultrasónicos y no audibles.

ACTIVIDAD #1: MEDICIÓN DEL TIEMPO DE ECO


En esta actividad, probará el sensor Ping))) y verificará que le entrega mediciones del
tiempo de eco que corresponden a la distancia de un objeto.

Partes Requeridas
(1) Sensor Ultrasonico de Distancia Ping)))
(3) Cables conectores

Todo lo que necesita es un sensor Ping))) y 3 cables para hacerlo trabajar. El sensor
Ping))) tiene protection interconstruida contra errores de programación (y errors de
cableado), por lo que no necesita usar ninguna resistencia de 220 Ω entre P15 y la
terminal SIG del sensor Ping))).

El Circuito Sensor Ping)))


La Figura 2-3 muestra un diagrama esquemático y de conexiones para probar el sensor
Ping))).

√ Construya el circuito.
Capítulo 2: Inclinación con el Acelerómetro Memsic · Page 43

Figura 2-3: Diagrama esquemático y de conexiones del Sensor Ping)))

Probando el Sensor Ping)))


Como se mencionó antes, el sensor Ping))) necesita un pulso de inicio del BASIC Stamp
para iniciar sus mediciones. Un pulso en P15 de 10 μs (PULSOUT 15, 5) es fácilmente
detectado por el sensor Ping))), y toma solo una pequeña cantidad de tiempo para que el
BASIC Stamp lo mande. Un comando PULSIN que guarda la duración del pulso de eco
del sensor Ping))) (PULSIN 15, 1, time) tiene que venir inmediatamente después del
comando PULSOUT. En este ejemplo, el comando PULSIN guarda en la variable tiempo el
tiempo de viaje redondo para que el silbido del sensor Ping))) llegue al objeto, se refleje y
regrese.

Programa Ejemplo - PingTest.bs2


Puede probar este programa midiendo distancias de algunos objetos cercanos. Para
mediciones cercanas, el sensor Ping))) solo necesita estar de 3 a 4 pulgadas (aprox. de 8 a
10 cm) por encima de la superficie de trabajo. Sin embargo, si está midiendo objetos que
están a mas de medio metro de distancia, podría necesitar elevar su sensor Ping))) para
prevenir ecos del suelo como si fueran objetos detectados.

√ Coloque su tarjeta Board of Education con el circuito del sensor Ping))) sobre
algo que la mantenga al menos 8 cm por encima de la superficie de la mesa.
√ Coloque un objeto (como una botella de agua, una caja o una hoja de papel) a 15
cm del frente del sensor Ping))).
√ Introduzca, salve y corra PingTest.bs2.
√ La Terminal de Depuración debe estar reportando un valor entre 400 y 500.
Página 44 · Sensores Inteligentes y sus Aplicaciones

√ Mueva el objetivo a una distancia de 30 cm del sensor Ping))) y verifique que el


valor de la variable de tiempo aproximadamente se duplicó.
√ Apunte su sensor Ping))) a una variedad de objetos cercanos y lejanos y observe
las mediciones de tiempo.

' Sensores inteligentes y sus Aplicaciones - PingTest.bs2


' Prueba el sensor ultrasonico de distance Ping)))

' {$STAMP BS2}


' {$PBASIC 2.5}

time VAR Word

DO
PULSOUT 15, 5
PULSIN 15, 1, time

DEBUG HOME, "time = ", DEC5 time

PAUSE 100
LOOP

Su Turno – Probando el rango, Angulo y tamaño del objeto


En términos de precisión y utilidad en general, la detección ultrasónica de distancia es
grandiosa, especialmente comparada a otros sistemas de detección de distancia de bajo
costo. Esto no significa que el sensor Ping))) es capaz de medir "todo". La Figura 2-4
muestra algunas situaciones para las que el Ping))) no está diseñado para medir: (a)
distancias mayores a 3 metros, (b) ángulos muy cerrados, y (c) objetos muy pequeños.

Figura 2-4: El Sensor Ping))) no esta diseñado para estas situaciones:

a. b. c.
Capítulo 2: Inclinación con el Acelerómetro Memsic · Page 45

Adicionalmente, como descubrió Ken Gracey de Parallax Inc. durante una demostración
en la escuela de su hijo, algunos objetos con superficies suaves e irregulares (como
animalitos de peluche) en vez de reflejar absorberán el sonido y por lo tanto puede ser
difícil la detección para el sensor Ping))). Los objetos con superficies lisas que fácilmente
reflejan el sonido facilitan la detección del sensor.

√ Intente apuntar el sensor Ping))) a varios objetos a diferentes distancias. ¿Cuál es


el valor más grande que regresa el sensor Ping)))? ¿Qué tanto debe acercar el
objeto antes de que las mediciones empiecen a reducir su valor?
√ Intente colocar el sensor Ping))) a un metro de distancia y apuntando a la pared y
register la medición. Luego, intente apuntar el sensor Ping))) a la pared con
diferentes angulos, como se muestra en la Figura 2-5. ¿Cambian los valores? ¿A
que ángulo deja de detector la pared el sensor Ping)))?

Figura 2-5
Determinando el
Angulo Mínimo de
Detección

√ Intente colgar varios objetos del techo a 1.5 metros de distancia del sensor
Ping))). ¿Qué tan pequeños pueden ser los objetos? ¿Afecta la forma o el
ángulo? ¿Cambia la afectación por el tamaño del objeto a medio metro de
distancia?
√ Intente detectar objetos de tamaño similar pero hechos de diferentes materiales,
como una caja de zapatos de carton o una pantufla suave para ver si tiene un
rango efectivo de detección más corto con objetos que absorben el sonido.
¿Puede encontrar algún objeto invisible para el sensor Ping))), como un cúmulo
de algodón?
Página 46 · Sensores Inteligentes y sus Aplicaciones

ACTIVIDAD #2: MEDICIONES DE CENTÍMETROS


Esta actividad demuestra como usar la velocidad del sonido y el operador de alto nivel
multiplicación de PBASIC ( ** ) para calcular la distancia a un objeto basada en la
medición de tiempo de eco del sensor Ping))).

Calculando Distancias en centímetros con PBASIC


La ecuación para la distancia que el sonido viaja es S = Cair t, where S es la distancia, Cair
es la velocidad del sonido en el aire y t es el tiempo. Puesto que la medición del tiempo
del sensor Ping))) es el tiempo que le toma al sonido en alcanzar al objeto y regresar, la
distancia real al objeto Sobject es la mitad de la distancia total que viaja el sonido.

S = Cair t

S Cair t
Sobject = =
2 2

La velocidad del sonido en el aire está comunmente documentada en metros por segundo
(m/s). Sin embargo, será más conveniente calcular mediciones de centímetros (cm) con
el BASIC Stamp. Puesto que hay 100 centímetros en un metro, usemos el término Sobject-
cm lo cual es simplemente 100 veces Sobject. Las unidades de medición para el valor
Duration de PULSIN en el BASIC Stamp 2 son 2/1,000,000 de segundo (2 μs).
Entonces, en vez de t, el cual tiene que ser una medida en segundos, usaremos tPULSIN-BS2.
Cuando se multiplica por 2/1,000,000 tPULSIN-BS2 nos da el número de segundos. Hay
entonces un par de números 2, uno en el numerador y otro en el denominador, que se
cancelan, y el 100 en el numerador cancelan un par de ceros en el denominador
1,000,000. El resultado de estas sustituciones y cancelaciones es Sobject-cm = (Cair tPULSIN-
BS2)/10,000.

100 Cair t
Sobject-cm =
2

100 Cair tPULSIN-BS2 2


Sobject-cm = ×
2 1,000,000

Cair tPULSIN-BS2
Sobject-cm =
10,000
Capítulo 2: Inclinación con el Acelerómetro Memsic · Page 47

La velocidad del sonido en el aire a temperatura ambiente de 72 °F (22.2 °C) es 344.8


m/s. Dividiendo esto entre 10,000 queda Sobject-cm = 0.03448 tPULSIN-BS2.

344.8 tPULSIN-BS2
Sobject-cm =
10,000

= 0.03448 tPULSIN-BS2

El BASIC Stamp puede usar el operador ** para multiplicar una variable que guarde la
medición Duration del comando PULSIN por un valor fraccional menor que 1. Por
ejemplo, si el comando PULSIN guarda la medición del tiempo de eco en la variable
time, este comando guardará la distancia en centímetros resultante en la variable
cmDistance así:

cmDistance = CmConstant ** time

Con el operador **, CmConstant tendrá que ser 2260, el cual es el equivalente ** de
0.03448. En vez de un denominador decimal, como 10,000 (en el caso de 0.03448), el
operador ** necesita un valor que vaya en el numerador de una fracción con
denominador 65536. Para obtener dicho numerador, multiplique su valor fraccional por
65536.

CmConstant = 0.03448 × 65536 = 2260

Ahora ya tenemos el valor que necesitamos para modificar PingTest.bs2 y así medir
distancias en centímetros. También agregaremos una variable para guardar la distancia
(cmDistance) junto con la constante para guardar el valor 2260 (CmConstant).
CmConstant CON 2260

cmDistance VAR Word

Entonces, el cálculo ** puede ser agregado al DO...LOOP de PingText.bs2 para calcular la


medición de centímetros. El comando DEBUG en el programa puede ser modificado para
mostrar la medición.
cmDistance = CmConstant ** time

DEBUG HOME, DEC3 cmDistance, " cm"


Página 48 · Sensores Inteligentes y sus Aplicaciones

Programa Ejemplo: PingMeasureCm.bs2


√ Introduzca, salve y corra PingMeasureCm.bs2.
√ Mueva el objeto a medir hasta que la medición indique 20 cm.
√ Alinee su regla con esa medición. La marca de 0 cm debe estar en algún punto
del sensor Ping))), típicamente en algún lugar entre el circuito impreso y la parte
más sobresaliente del juego altavoz/micrófono.
√ Ahora, experimente con otras mediciones de distancia.

' Sensores Inteligentes y sus Aplicaciones - PingMeasureCm.bs2


' Mide distancias con el sensor Ping))) y despliega en centimetros.

' {$STAMP BS2}


' {$PBASIC 2.5}

' Constantes de conversion para mediciones a temperatura de cuarto.


CmConstant CON 2260

cmDistance VAR Word


time VAR Word

DO

PULSOUT 15, 5
PULSIN 15, 1, time

cmDistance = CmConstant ** time

DEBUG HOME, DEC3 cmDistance, " cm"

PAUSE 100

LOOP

Su Turno - Verificando los Cálculos


Verifiquemos que el programa esta correctamente calculando la distancia.

√ Modifique PingMeasureCm.bs2 para que muestre los valores de las variables de


tiempo y distancia.
√ Use una calculadora to verify that you get the same result from the distance
equation that you do from el programa.

Sobject-cm = 0.03448 × tPULSIN-BS2


Capítulo 2: Inclinación con el Acelerómetro Memsic · Page 49

ACTIVIDAD #3: MEDICIÓN DE PULGADAS


La mayoría de los dispositivos electrónicos de medición de distancia ofrecen resultados
en sistema métrico o ingles. Por ejemplo, los calibradores como el de la Figura 2-6 tienen
un botón para escoger entre milímetros y pulgadas. Otros dispositivos ofrecen yardas o
metros, o pulgadas o centímetros, etc. Su programa puede desplegar centímetros y
pulgadas, esta actividad presenta nuevamene el operador multiplica-alto ( ** ) para
convertir de centímetros a pulgadas.

Figura 2-6: Calibrador con botón para cambio a mm/in

Una Constante ** para pulgadas


La constante CmConstant usada en cmDistance = tiempo ** CmConstant es una
medición de la velocidad del sonido en cm por unidad de tiempo de PULSOUT. Hay 2.54
cm en cada pulgada. Entonces, la formula de conversion de cm a pulgadas es:
Sin = Scm ÷ 2.54

La forma más facil de convertir a pulgadas es simplemente dividir el valor de


CmConstant entre 2.54 y usar el resultado en otra constante, como InConstant.
Recuerde que las constantes para el operador ** deben ser enteros, así es que redondee el
resultado al entero más cercano.

InConstant = 2260 ÷ 2.54 = 889.76 ≈ 890


Página 50 · Sensores Inteligentes y sus Aplicaciones

Programa Ejemplo: PingMeasureCmAndIn.bs2


√ Inroduzca, salve y corra PingMeasureCmAndIn.bs2.
√ Experimente con las mediciones de distancia y verifique que son correctas en
ambos sistemas.

' Sensores Inteligentes y sus Aplicaciones - PingMeasureCmAndIn.bs2


' Mide distancias con el sensor Ping))) y despliega en centímetros y pulgadas

' {$STAMP BS2}


' {$PBASIC 2.5}

' Constantes de conversion para mediciones a temperatura de cuarto.


CmConstant CON 2260
InConstant CON 890

cmDistance VAR Word


inDistance VAR Word
time VAR Word

DO

PULSOUT 15, 5
PULSIN 15, 1, time

cmDistance = cmConstant ** time


inDistance = inConstant ** time

DEBUG HOME, DEC3 cmDistance, " cm"


DEBUG CR, DEC3 inDistance, " in"

PAUSE 100

LOOP

Su Turno
√ Hay 12 pulgadas en 1 pie. Modifique el programa para que despliegue pies y
pulgadas. Tip: después de calcular inDistance, use / 12 para determinar el
número de pies y // 12 para encontrar el sobrante en pulgadas.
√ Hay 10 centímetros en un decímetro. Repita para decímetros y centímetros.
Capítulo 2: Inclinación con el Acelerómetro Memsic · Page 51

ACTIVIDAD #4: MEDICIONES EN MOVIMIENTO


Esta actividad demuestra el desplegado de mediciones en centímetros y pulgadas del
sensor Ping))) en la sensor's LCD Serial Parallax. Dado que estará usando una batería,
usted puede esconectarse de su computadora y tomar el arreglo a puntos remotos de su
elección.

Conectando el Sensor Ping))) con un Cable Extensión


A fin de hacer espacio para la LCD Serial Parallax en su tarjeta Board of Education,
conecaremos el sensor Ping))) a la tarjeta con un cable extensión. Entonces podrá
sostenerlo y apuntarlo a varios lugares, o usar hardware para montarlo cerca de su tarjeta
Board of Education.

Partes Requeridas
(1) Sensor Ultrasónico Ping)))
(1) LCD Serial Parallax (2×16)
(1) Cable Extensión para la LCD de 14 pulgadas
(3) Cables de conexión

Si esta trabajando con una tarjeta BASIC Stamp HomeWork Board o una tarjeta Board of
Education Rev A o B serial , también necesitará:

(1) cabezal de 3-pines


(3) cables de conexión adicionales

Conexiones del Sensor Ping))) y el Cable LCD


Los esquemáticos mostrados en la Figura 2-7 son, hasta este momento, idénticos a los
que usó para el sensor Ping))) y la LCD Serial Parallax. Ahora cambiaremos la forma en
que estas conexiones eléctricas están hechas agregando un cable, de tal forma que ambos
dispositivos puedan estar convenientemente conectados a su tarjeta al mismo tiempo.
Aún cuando los esquemáticos son lo mismo, las conexiones reales variarán dependiendo
de qué tarjeta educativa BASIC Stamp está usando.
Página 52 · Sensores Inteligentes y sus Aplicaciones

Figura 2-7
Esquemáticos del Sensor
Ping))) y la LCD Serial
Parallax

Conexiones de Cable para tarjetas Board of Education Rev C y USB


Esta sección es para las tarjetas que tienen puertos con un conector jumper Vdd/Vss
enmedio, como las tarjetas Board of Education Rev C y Board of Education USB. Para
todas las demás tarjetas, vaya a Para todas las demás tarjetas educativas BASIC
Stamp en la página 54.

√ Desconecte la energía de su tarjeta.


√ Coloque el jumper entre las terminales servo X4 y X5 a Vdd (+5 V) (Figura 2-8).
El jumper debe cubrir los 2 pines mas cercanos a Vdd, el tercer pin cercano a
Vin debe ser visible.

Figura 2-8
El jumper del Puerto Servo
colocado en Vdd (+5 V)
Capítulo 2: Inclinación con el Acelerómetro Memsic · Page 53

La configuración del jumper Vdd vs. Vin determina qué fuente está conectada a los
puertos X4 y X5. Cuando el Jumper se coloca a Vdd, estos puertos reciben 5 V regulados
desde el regulador de tensión de la tarjeta Board of Education. Si el jumper se coloca a Vin,
el Puerto recibe energía directamente de la betería o de la fuente de poder.

√ Conecte la LCD Serial Parallax como se indica (igual que el capítulo anterior).
√ Conecte una punta del cable extension en el Puerto 15 del cabezal X4,
asegurándose que las etiquetas "Red" y "Black" que están en el lado derecho del
puerto X5 coincidan con los cables rojo y negro.
√ Verifique que su cable está bien conectado asegurándo que el cable blanco es el
más cercano a la etiqueta 15 y que el negro es el más cercano a la etiqueta X4.

Figura 2-9
Puerto Servo y
Conexión del
Jumper de energía
para el Sensor
Ping)))
Página 54 · Sensores Inteligentes y sus Aplicaciones

√ Conecte la otra punta del cable de tal forma que el cable negro esté conectado al
pin GND del modulo Ping))), el cable rojo este conectado al pin 5 V y en cable
blanco esté conectado al pin RX.
√ Vuelva a verificar todas las conexiones, incluyendo la posición del jumper y
asegúrese que son correctas.

¡ATENCION! No conecte la energía a su tarjeta hasta que no esté seguro que todas
las conexiones son correctas. Si comete un error con las conexiones de la LCD Serial
Parallax, esta podría ser permanentemente dañada.

√ Conecte la energía de regreso a la tarjeta.


√ Coloque el interruptor de 3 posiciones de la tarjeta Board of Education en 2.
√ Si tiene una tarjeta Board of Education Rev C, continue en Despliegue de
Distancia en la LCD en la página 57.

También puede conectar la LCD Serial Parallax al puerto 14 con un cable. Las
instrucciones son aproximadamente las mismas que las de conexión del Ping))). Empiece
por desconectar la energía de su tarjeta. El Jumper para Vdd y Vin entre los puertos servo
debe estar colocado en Vdd. El cable tiene que ser conectado en el cabezal X4 de tal forma
que el cable negro sea el mas cercano a la etiqueta X4 y el cable blanco sea el mas
cercano a la etiqueta 14. Cuando conecte la otra punta del cable a la LCD Serial Parallax,
asegúrese que el cable negro se conecte a GND, el cable rojo a 5V, y el cable blanco a RX.

Para todas las demás tarjetas educativas BASIC Stamp


Esta sección es para conectar el sensor Ping))) y la LCD Serial Parallax a alguna de las
siguientes tarjetas educativas BASIC Stamp:

• BASIC Stamp HomeWork Board


• Board of Education Rev A (versión Serial)
• Board of Education Rev B (versión Serial)

√ Desconecte la energía de su tarjeta.


√ Construya las conexiones en la tableta como se muestran en la Figura 2-10.
Capítulo 2: Inclinación con el Acelerómetro Memsic · Page 55

Figura 2-10
Cableado en tableta para la
conexión del cable del Sensor
Ping)))

√ Conecte la LCD Serial Parallax en la tableta como se indica en la Figura 2-11 de


la página 56.
√ Conecte una punta del cable extension en el cabezal de 3 pines, asegurándose
que los cables blanco, rojo y negro se orienten como se indica. El cable negro
debe ser conectado a Vss, el rojo a Vdd, y el blanco a P15.
√ Conecte la otra punta del cable de tal forma que el cable negro esté conectado al
pin GND del Ping))), el cable rojo esté conecado al pin 5 V y el cable blanco esté
conecado al pin RX. Vuelva a verificar todas sus conexiones, incluyendo la
posición del jumper y asegurándose de que todas sean correctas.

¡ATENCION! No conecte la energía a su tarjeta hasta que no esté seguro que todas
las conexiones son correctas. Si comete un error con las conexiones de la LCD Serial
Parallax, esta podría ser permanentemente dañada.

√ Reconecte la energía a su tarjeta.


Página 56 · Sensores Inteligentes y sus Aplicaciones

Figura 2-11: Conexiones en la tableta para el Sensor Ping))) y la LCD Serial Parallax
Capítulo 2: Inclinación con el Acelerómetro Memsic · Page 57

Despliegue de Distancia en la LCD


No es necesario realizar muchos cambios en PingMeasureCmAndIn.bs2 para hacer que
despliegue sus mediciones en la LCD. Primero, una sección de Inicialización tiene que
ser agregada de tal forma que el programa espere a que la fuente de energía se estabilice
y luego encienda y limpie la LCD.
PAUSE 200
SEROUT 14, 84, [22, 12]
PAUSE 5

Después, los comandos DEBUG tienen que sen cambiados por commandos SEROUT. He
aquí los commandos DEBUG para PingMeasureCmAndIn.bs2.
DEBUG HOME, DEC3 cmDistance, " cm"
DEBUG CR, DEC3 inDistance, " in"

Los caracteres de control de la Terminal de Depuración (HOME y CR) tienen que ser
cambiados por códigos de control que coloquen el cursor en la LCD.
SEROUT 14, 84, [128, DEC3 cmDistance, " cm"]
SEROUT 14, 84, [148, DEC3 inDistance, " in"]

Programa Ejemplo: PingLcdCmAndIn.bs2


Este programa es una version modificada de PingMeasureCmAndIn.bs2 de la actividad
anterior. En vez de desplegar las mediciones en la Terminal de Depuración, las muestra
en la LCD Serial Parallax.

√ Conecte una batería a su tarjeta.


√ Introduzca, salve y corra PingLcdCmAndIn.bs2.
√ Desconecte el cable serial y lleve su tarjeta con usted a donde desee probar las
mediciones del sensor Ping))).

' Sensores Inteligentes y sus Aplicaciones - PingLcdCmAndIn.bs2


' Mide la Distancia con el sensor Ping))) y las muestra en la LCD

' {$STAMP BS2}


' {$PBASIC 2.5}

' Constantes de conversion para mediciones a temperatura de cuarto.


CmConstant CON 2260
InConstant CON 890

cmDistance VAR Word


Página 58 · Sensores Inteligentes y sus Aplicaciones

inDistance VAR Word


time VAR Word

PAUSE 200
SEROUT 14, 84, [22, 12]
PAUSE 5
DEBUG CLS, "Program running..."

DO

PULSOUT 15, 5
PULSIN 15, 1, time

cmDistance = cmConstant ** time


inDistance = inConstant ** time

SEROUT 14, 84, [128, DEC3 cmDistance, " cm"]


SEROUT 14, 84, [148, DEC3 inDistance, " in"]

PAUSE 100

LOOP

Su Turno - Personalizando la Pantalla


√ Las mediciones están alineadas a la izquierda. Trate centrarlas.
√ Trate de alinear las mediciones a la derecha y desplegar "Distancia: " antes de la
medición en cm en la línea superior de la LCD.
√ Modifique el programa para que muestre ambas mediciones de distancia en la
linea superior. Luego, muestre el tiempo real de eco en la linea inferior. Lo
puede mostrar en millonésimas de segundo (μs) multiplicando la variable de
tiempo por 2 antes de desplegarla. Antes de que su programa multiplique por 2,
asegúre que espera hasta después de haber hecho sus conversiones de distancia.

ACTIVIDAD #5: EL EFECTO DE LA TEMPERATURA EN LA VELOCIDAD


DEL SONIDO
Esta actividad investiga cambios en la velocidad del sonido causados por cambios en la
temperature del aire. Estos cambios en la velocidad del sonido pueden resultar en
cambios visibles en sus mediciones de distancia.
Capítulo 2: Inclinación con el Acelerómetro Memsic · Page 59

Velocidad del sonido Vs Temperatura y Porcentaje de Error en las mediciones


La velocidad del sonido cambia con la temperatura del aire, humedad y aún con la
calidad del aire. Ni la humedad ni la calidad del aire hacen suficiente diferencia para que
figure en los cálculos de distancia del sensor Ping))). Pero por otro lado, la temperatura
del aire, puede causa errores medibles en la distancia. La velocidad del sonido se
incrementa 0.6 metros por segundo (m/s) por cada grado Celsius (°C) que se incrementa
la temperatura. Puesto que la veloicidad del sonido es aproximadamente 331.5 m/s a 0
°C, podemos usar la siguiente ecuación para calcular la velocidad del sonido a una
temperatura dada.

Cair = 331.5 + (0.6 × TC ) m/s

Convirtiendo de °F a °C y Viceversa
Para converter un grado Fahrenheit a Celsius, reste 32 deTF (la medición Fahrenheit), luego
divida entre 1.8. El resultado sera TC, el equivalente Celsius. Para convertir de Celsius a
Fahrenheit, multiplique TC por 1.8, luego agregue 32. El resultado será TF.
TC = (TF - 32) ÷ 1.8 TF = 1.8 × TC + 32

A continuación hay unos ejemplos de velocidad del sonido a temperaturas de cuarto que,
aún cuando ambas son confortables, son ligeramente diferentes.

Ejemplo 1: Calcule la velocidad del sonido a 22.2 °C, que es aproximadamente 72


grados Fahrenheit (°F).

Cair (22.2°C ) = 331.5 + (0.6 × 22.2 m/s ) = 344.8 m/s

Ejemplo 2: Calcule la velocidad del sonido a 25 °C, que es 77 grados Fahrenheit (°F).

C air (25°C ) = 331.5 + (0.6 × 25 ) m/s = 346.5 m/s

¿Qué tanta diferencia hace esto en sus mediciones de distancia? Podemos calcular el
porcentaje de error que esto propagará con la ecuación de porcentaje de error.
Página 60 · Sensores Inteligentes y sus Aplicaciones

real - predicha
% error = ×100%
predicha

Si la temperatura predicha en el cuarto es 72 °F (22.2 °C) y la temperature real es 77 °F


(25 °C), el error es 0.49 porciento. Medio porciento de error causaría que usted tuviera
que mover el objeto medio centímetro más allá de 100 cm antes de que hubiera cambiado
de 99 a 100 cm.

346.5 - 344.8
% error = ×100%
344.8

= 0.49%

Su Turno - Temperatura de cuarto vs. congelación


√ Calcule el porcentaje de error en la medición que resultaría de asumir que la
temperature ambiente es de congelación (32 °F, 0 °C), pero en realidad es
temperatura de cuarto (72 °F, 22.2 °C).
√ ¿Qué tan alejada habría estado la medición si el objeto estuviera a 1 m de
distancia?
√ Use el procedimiento presentado en la Actividad #2 para calcular la velocidad
del sonido y CmConstant para mediciones a 0 °C.
√ Salve PingMeasureCm.bs2 como PingMeasureCmYourTurn.bs2
√ Corra el programa antes de modificarlo y pruebe la medición de distancia de un
objeto a 1 m.
√ Modifique la directiva cmConstant CON con el valor para 0 °C.
√ Vuelva a probar el programa con un objeto a 1 m. ¿Qué tan cerca estuvo su error
predicho con respecto al error real?
Capítulo 2: Inclinación con el Acelerómetro Memsic · Page 61

RESUMEN
El BASIC Stamp solicita una medición al sensor Ping))) enviando un breve pulso, lo que
causa que este emita un silbido a 40 kHz. Luego, el Ping))) escucha un eco de ese
silbido. Reporta el eco enviando un pulso de regreso al BASIC Stamp que equivale al
tiempo que el toma al sensor Ping))) recibir el eco.

Para calcular la distancia basada en la medición del tiempo de eco, la velocidad del
sonido debe ser convertida en unidades que son convenientes al BASIC Stamp. Esto
involucra convertir metros por segundo a centímegros por unidades de medición PULSIN.
El valor resultado también debe ser convertido a un valor que pueda ser usado con el
operador multiplica-alto ( ** ) multiplicandolo por 65536.

La velocidad del sonido en el aire es cair = 331.5 + (0.6 × TC) m/s. Si bien la velocidad
del sonido cambia con la temperatura, el error en la medición resultante es pequeño,
especialmente a temperatura de cuarto.

Preguntas
1. ¿Cual es el rango de medición del sensor Ping)))?
2. ¿Qué significa ultrasónico?
3. ¿Qué señal manda el sensor Ping))) al BASIC Stamp y cómo corresponde esta a
la medición de distancia?
4. ¿Cuáles son las tres condiciones entre el sensor y el objeto que pueden causar
que el sensor Ping))) regrese una medición de distancia incorrecta?
5. ¿Cuáles son los incrementos de tiempo que regresa el commando PULSIN
cuando se usa un BS2?
6. ¿Cuál es la velocidad del sonido a temperatura de cuarto?
7. ¿Cómo se relaciona CmConstant con lka velocidad del sonido en el aire?
8. ¿Qué tiene que hacer usted al jumper entre los cabezales servo X4 y X5 en la
tarjeta Board of Education para suministra la tensión correcta a dispositivos
como el sensor Ping))) sensor y la LCD Serial Parallax? ¿Qué podría pasar si el
jumper no es colocado correctamente?
9. ¿Qué commandos tienen que ser modificados si quiere hacer que la pantalla
LCD Parallax muestre lo que la Terminal de Depuración esta desplegando?
10. ¿Qué papel juega la temperature del aire en la velocidad del sonido en el aire?
Página 62 · Sensores Inteligentes y sus Aplicaciones

Ejercicios
1. Calcule a cuantos metros de distancia se encuentra un objeto si el tiempo de eco
es 15 ms, y la temperatura es 22.5 °C.
2. Calcule el equivalente en °C de 100 °F.
3. Calcule el equivalente en pies de 30.48 cm.
4. Calcule the porcentaje de error si CmConstant está calculada para 37.8 °C pero
la temperature es 0 °C. Prediga cuál sería la distancia si el objeto fuera colocado
a medio metro de distancia.

Proyectos
1. Agrege un circuit LED a su tarjeta y programe en BASIC Stamp para hacer que
el LED prenda y apague cuando no hay ningún objeto dentro del rango de
medición.
2. Use un piezo altavoz para hacer una alarma que indique cuando una persona pasa
por una puerta. El sensor Ping))) debe ser montado cerca de la puerta de salida,
apuntando a través del camino que la gente usa para entrar o salir.

Soluciones
Q1. De 3 centímetros a 3.3 metros.
Q2. Sonido con frecuencias mayores que 20 kHz.
Q3. Un pulso alto, cuya duración corresponde al tiempo que le toma al silbido de
sonido viajar hasta el objeto y regresar.
Q4. a) Distancia mayor a 3 m, b) Ángulos superficiales, c) objetos muy pequeños.
Q5. Incrementos de 2µs.
Q6. 344.8 m/s.
Q7. CmConstant es el equivalente ** de la velocidad del sonido en el aire dividido
entre 10000, o 0.03448.
Q8. El jumper debe estar colocado en la posición Vdd, o la LCD pudiera dañarse.
Q9. Todos los comandos DEBUG tienen que ser modificados, también los caracteres
de control para que se usen los códigos de control de la LCD.
Q10. Juega un rol muy importante, ya que la velocidad se incrementa 0.6 m/s por cada
grado C que se incrementa la temperatura del aire.
Capítulo 2: Inclinación con el Acelerómetro Memsic · Page 63

E1. El objeto esta a 2.59 m de distancia.


E2. 100 °F = 37.7 °C
E3. 30.48 cm = 1.0 ft.
E4. % error = +/- 6.84%; measured distance = 0.466 m.

P1. Este ejemplo de solución coloca un LED activo alto en P13.


' Sensores Inteligentes y sus Aplicaciones - Ch2_Project1.bs2
' Indica fuera-de- rango con LED destellante. Ajusta MaxDistance
' de medicion.
' {$STAMP BS2}
' {$PBASIC 2.5}

LED PIN 13 ' LED rojo activo en alto


LCD PIN 14 ' LCD Serial Parallax
Ping PIN 15 ' sensor Ping))) Parallax

CmConstant CON 2260 ' Calc tiempo de sonido viaje redondo


InConstant CON 890
MaxDistance CON 361 ' Maximo posible para medir (empirico)
cmDistance VAR Word ' Distancia en centimetros
time VAR Word ' Tiempo de eco en viaje redondo

PAUSE 200 ' Inicializa LCD


SEROUT LCD, 84, [22, 12]
PAUSE 5

DO
LOW LED ' LED off antes de cada medicion
PULSOUT 15, 5 ' Inicia Ping)))
PULSIN 15, 1, tiempo ' Lee tiempo de eco
cmDistance = cmConstant ** tiempo ' Calcula distancia con el tiempo
SEROUT LCD, 84, [128, DEC3 cmDistance, " cm"] ' Muestra distancia en
' la pantalla LCD
IF cmDistance >= MaxDistance THEN HIGH LED ' Cambia LED si esta
' fuera de rango
PAUSE 100
LOOP

P2. Ejemplo de solución:


' Sensores Inteligentes y sus Aplicaciones - Ch2_Project2.bs2
' Hace un sonido cuando alguien pasa por la puerta.

' {$STAMP BS2}


' {$PBASIC 2.5}
' -----[ Definiciones E/S]---------------------------------------------
Ping PIN 15 ' sensor Ping))) Parallax
Speaker PIN 9 ' Altavoz Opcional
Página 64 · Sensores Inteligentes y sus Aplicaciones

' -----[ Constantes ]--------------------------------------------------


InConstant CON 890
Doorjamb CON 35 ' Ancho de puerta es 35 pulgadas

' -----[ Variables ]---------------------------------------------------


inDistance VAR Word
time VAR Word ' Tiempo de eco de viaje redondo
counter VAR Nib

' -----[ Rutina Principal]---------------------------------------------


DO
GOSUB Read_Ping
GOSUB Calc_Distance
IF (inDistance < Doorjamb) THEN
GOSUB Sound_Alarm
ENDIF
LOOP
' -----[ Subrutinas ] ------------------------------------------------
Read_Ping:
PULSOUT 15, 5 ' Inicia Ping)))
PULSIN 15, 1, tiempo ' Lee tiempo de eco
RETURN

Sound_Alarm:
FREQOUT Speaker, 300, 3300 ' Bing
PAUSE 50
FREQOUT Speaker, 450, 2200 ' Bong
RETURN

Calc_Distance:
inDistance = inConstant ** tiempo ' Estas son todas las mediciones
RETURN
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 65

Capítulo 3: El Acelerómetro MEMS de dos ejes


La aceleración es la medición de qué tan rápido cambia la velocidad. De igual manera
que un velocímero es un medidor de velocidad, un acelerómetro es un medidor de
aceleración. Puede usar la habilidad de éste para sensar la aceleración y tomar una
variedad de mediciones que pueden ser muy útiles para proyectos y diseños de
electrónica y robótica. He aquí algunos ejemplos:

• Aceleración
• Pendiente y ángulo de pendiente
• Inclinación
• Rotación
• Vibración
• Colisión
• Gravedad

Los acelerómetros se usan ya en muchos dispositivos diferentes, incluyendo equipos


personales electrónicos, equipo especializado y máquinas. Algunos ejemplos son:

• robots auto-equilibrantes
• Mandos de juego con sensado de inclinación
• Pilotos automáticos para aeromodelismo
• Sistemas de alarmas de autos
• Detección de colisión / sistemas para despliegue de bolsas de aire
• Sistemas para monitoreo de movimiento humano
• Herramientas para nivelación

Hace mucho tiempo, los acelerómeros eran instrumentos grandes, estorbozos y caros que
no se prestaban para proyectos de robótica y electrónica. Todo esto cambió gracias a la
llegada de los sistemas-micro-electrónicos-mecánicos (MEMS por sus siglas en inglés).
La tecnología MEMS es responsable de un número siempre creciente de dispositivos
otrora mecánicos y que ahora están siendo diseñados en circuitos integrados de silicón.
Página 66 · Sensores Inteligentes y sus Aplicaciones

El acelerómetro con el que estará trabajando en este texto es el módulo de acelerómetro


de dos ejes MEMS 2125 Parallax mostrado en la Figura 3-1. Este módulo mide menos de
1
/2” × 1/2” × 1/2”, y el circuito integrado del accelerómetro es menor a 1/4” × 1/4” × 1/8”.
Figura 3-1: Módulo de Accelerómetro y Chip MX2125

Modulo de acelerómetro Chip MX2125

Las personas naturalmente perciben la aceleración en 3 ejes: adelante/atrás,


derecha/izquierda y arriba/abajo. Piense acerca la última vez que estuvo en el asiento del
pasajero en un auto a través de un camino con curvas y colinas. La aceleración
adelante/atrás es la sensación de incrementar la velocidad o de reducirla. La aceleración
izquierda/derecha le permite percibir cuando da vuelta, y la aceleración arriba/abajo es lo
que siente al pasar a traves de las colinas.

En vez de los 3 ejes que la gente percibe, el acelerómetro MX2125 percibe la aceleración
en dos ejes. La aceleración que sensa depende de cómo esté posicionado. Al sostenerlo de
una manera, puede percibir adelante/atrás e izquierda/derecha. Si lo sostiene de manera
diferente, puede sensar arriba/abajo y adelante/atrás. Dos ejes de aceleración son
suficientes para muhcas de las aplicaciones listadas anteriormente. Si bien puede montar
y monitorear un segundo acelerómetro para capturar el tercer eje, también son comunes
los acelerómetros de 3 ejes.

Para un acelerómetro de 3 ejes , pruebe nuestro módulo de aclerómetro Hitachi H48C


Tri-Axial, parte #28026 de Parallax.
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 67

EL ACELERÓMETRO MX2125 – COMO FUNCIONA


El diseño del MX2125 es sorprendentemente simple. Tiene una cámara de gas con un
elemento calefactor en el centro y 4 sensores de temperatura alrededor de sus bordes. Así
como el aire caliente se eleva y el frío se precipita, el mismo principio aplica a gases fríos
y calientes. Si fija firmemente el acelerómetro, todo lo que sensa es la gravidad e
inclinarlo nos da un ejemplo de como sensa la aceleración estática. Cuando mantiene el
acelerómetero nivelado, el gas caliente se eleva hacia el centro-superior en la cámara del
accelerómetro y todos los sensores medirán la misma temperatura. Dependiendo de cómo
incline el acelerómetro, el gas caliente se concentrará más cerca de uno o dos de los
sensores de temperatura.

Figura 3-2: La bolsa de gas caliente del Acelerómetro

A través de la comparación de los sensores de temperatura, ambas aceleraciones estática


(gravedad e inclinación) y dinámica (como un viaje en auto) pueden ser detectadas. Si
fuese a llevar al acelerómetro en un paseo en auto, los gases fríos y calientes se correrían
alrededor de la cámara de manera similar a un contenedor medio lleno de agua, y los
sensores detectarían esto.

En muchas situaciones, hacer que estas mediciones tengan sentido es simple gracias a la
electrónica dentro del MX2125. El MX2125 convierte las mediciones de temperatura en
señales (duraciones de pulsos) que son fáciles para el microcontroller BASIC Stamp de
medir y descifrar.
Página 68 · Sensores Inteligentes y sus Aplicaciones

ACTIVIDAD #1: CONEXIÓN Y PRUEBA DE PENDIENTE CON EL MX2125


En esta actividad conectará el módulo de acelerómetro al BASIC Stamp, correrá un
programa de prueba y verificará que puede ser usado para sensar inclinaciones.

Partes Requeridas
(2) Cables conectores de 3 pulgadas
(2) Resistencias – 220 Ω
(1) Acelerómetro Bi-Axial Mems MX2125

Conexiones Eléctricas y de Señal del Acelerómetro


La Figura 3-3 muestra cómo conectar el módulo acelerómetro a la fuente de energía de la
tarjeta Board of Education, junto con las conexiones de pines de E/S del BASIC Stamp
que necesita hacer para correr el programa ejemplo.

√ Conecte el modulo acelerometro usando como guía la Figura 3-3.

Figura 3-3: Diagrama de conexiones y esquemático del acelerómetro

Escuchando las señales del Acelerómetro con el BASIC Stamp


Los dos ejes que usa el MX2125 para sensar gravedad y aceleración están marcados x y y
en la Figura 3-4. Le será de ayuda colocar su tarjeta en una superficie plana y enfrente de
usted como lo indica la figura. De esa manera, los ejes x y y apuntarán a las mismas
direcciones que apuntan en muchos de las gráficas xy.
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 69

Figura 3-4: Medición de pulso de eje del acelerómetro

Para una prueba a temperatura de cuarto, obtendrá una muy buena indicación de
inclinación con tan solo medir el tiempo de nivel alto de los pulsos enviados por los pines
Xout y Yout del MX2125 usando el comando PULSIN. Dependiendo qué tanto inclina la
tarjeta y en qué dirección, las mediciones de tiempo de PULSIN deben ser entre 1875 a
3125. Cuando la tarjeta esta nivelada, el comando PULSIN debe guardar valores cercanos
a 2500.
Página 70 · Sensores Inteligentes y sus Aplicaciones

√ Asegúrese que su tarjeta está sin inclinación en su mesa, orientada con los ejes x
y y como se muestra en la Figura 3-4.
√ Introduzca y corra SimpleTilt.bs2.

' Sensores Inteligentes y sus Aplicaciones - SimpleTilt.bs2


' Mide inclinación a temperatura de cuarto.

'{$STAMP BS2}
'{$PBASIC 2.5}

x VAR Word
y VAR Word

DEBUG CLS

DO

PULSIN 6, 1, x
PULSIN 7, 1, y

DEBUG HOME, DEC4 ? X, DEC4 ? Y

PAUSE 100

LOOP

√ Asegúrese de que la Terminal de Depuración reporta que las variables x y y


están ambas guardando valores cercanos a 2500 como se muestra en la Figura 3-
5.

Figura 3-5
Salida de la
Terminal de
Depuración
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 71

√ Tome el borde de la tarjeta etiquetado como eje Y y gradualmente levantelo


hacia usted. El valor de y debe incrementar conforme incrementa la inclinación.
√ Continúe inclinando la tarjeta hacia usted hasta que esté en vertical. La terminal
de Depuración debe reportar que la variable y guarda un valor cercano a 3125.
√ Vuelva a poner la tarjeta en plano.
√ Ahora, en vez de inclinar la tarjeta hacia usted, inclínela gradualmente lejos de
usted. El valor de y debe caer por debajo de 2500 y gradualmente decaer hasta
1875 conforme inclina la tarjeta hasta que alcance la vertical.
√ Lay la tarjeta flat again.
√ Repita esta prueba con el eje x. Conforme levante la tarjeta con su mano derecha,
el valor x deberá incrementarse y alcanzar un valor cercano a 3125 cuando la
tarjeta está en vertical. Conforme levane la tarjeta con su mano izquierda, el
valor de x deberá aproximarse a 1875.
√ Finalmente, sostenga su tarjeta frente a usted y enderézela y volteela como si
fuera el volante de su auto.
√ Conforme rota su tarjeta lentamente, los valores de x y y deberán cambiar. Estos
valores serán usados en otra actividad para determinar el ángulo de rotación en
ángulos.

ACTIVIDAD #2: MEDICIONES EN MOVIMIENTO


Esta actividad desplegará las mediciones del acelerómetro Mems en la LCD Serial
Parallax. Dado que está usando una batería, después de programar podrá desconectarse de
su computadora y llevar el arreglo a lugares de su elección.

Conectando ambos Módulos al BASIC Stamp


Ambos, el acelerómetro Mems y la LCD Serial caben en su tarjeta al mismo tiempo, asi
que no hay necesidad de cables de extensión a no ser que haya escogido montar LCD
Serial Parallax cerca de la tarjeta Board of Education o en una caja de proyecto.

Partes Requeridas
(1) Acelerometro Mems 2125
(1) LCD Serial Parallax (2×16)
(5) Cables de conexiones
(2) Resistencias 220 Ω
Página 72 · Sensores Inteligentes y sus Aplicaciones

Construyendo los circuitos del Acelerómetro y la LCD


Los esquemáticos mostrados en la Figura 3-6 son identicos a los que ha usado para el
acelerómetro Mems y la LCD Serial Parallax en actividades anteriores.

Figura 3-6
Esquemáticos para el
acelerómetro
MX2125 y la LCD
Serial Parallax

Los diagramas de alambrado para el acelerómetro Mems y la LCD Serial Parallax se


muestran en la Figura 3-7 y la Figura 3-8 es una combinación de los dos diagramas de
cableado anteriores para los módulos individuales.

√ Construya el diagrama de alambrado mostrado en la figura 3-7 primero.


Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 73

Figura 3-7
Alambrado para el
acelerómetro Mems
y la LCD Serial
Parallax

√ Luego inserte la LCD Serial Parallax como se muestra en la Figura 3-8.

Figura 3-8: Alambrado para el acelerómetro Mems y la LCD Serial Parallax

Desplegado de la inclinación en la LCD


La modificación de cualquiera de los programas ejemplo del acelerómetro en este
capítulo para hacerlos desplegar mediciones en la LCD es típicamente un proceso de 2
pasos. Primero hay que agregar la rutina de inicialización de la LCD, y luego reemplazar
los comandos DEBUG con comandos SEROUT que desplegaran la información en la LCD.
Página 74 · Sensores Inteligentes y sus Aplicaciones

Siempre recuerde agregar esta inicialización, ya sea antes de la rutina principal o en


programas pequeños, antes de la primera palabra DO. Esto evitará que la inicialización sea
repetida una y otra vez en el ciclo DO...LOOP con el resto del programa. Manténgala
fuera del ciclo DO...LOOP principal porque esto podría causar que la pantalla parpadee.
' Inicializa LCD
PAUSE 200
SEROUT 14, 84, [22, 12]
PAUSE 5

Luego, los comandos DEBUG deben ser cambiados por comandos SEROUT. He aquí el
comando DEBUG de SimpleTilt.bs2.
DEBUG HOME, DEC4 ? X, DEC4 ? Y

HOME debe ser reemplazado por 128, que es el caracer de casa para la LCD. La directiva
? despliega el nombre de la variable con un carácter de retorno de carro después.
¿Recuerda del Capítlo 1 que CR es el único caracter de control que es igual tanto para la
Terminal de Depuración como para la LCD Serial Parallax? Debido a esto, podemos
dejar la directiva ? en los comandos SEROUT para la LCD. He aquí un comando SEROUT
que ejecuta el desplegado equivalente en la LCD Serial Parallax.
SEROUT 14, 84, [128, DEC4 ? X, DEC4 ? Y]

Programa Ejemplo: SimpleTiltLcd.bs2


Este programa es una version modificada de SimpleTilt.bs2 de la actividad anterior. En
vez de desplegar sus mediciones en la Terminal de Depuración, las despliega en la LCD
Serial Parallax.

√ Conecte una batería a su tarjeta.


√ Introduzca, salve y corra SimpleTiltLcd.bs2.
√ Desconecte el cable serial y lleve su tarjeta a donde quiera probar las mediciones
del acelerómetro Mems.

' Sensores Inteligentes y sus Aplicaciones - SimpleTiltLcd.bs2


' Mide pendiente a temperatura de cuarto, la muestra en la LCD Serial Parallax

'{$STAMP BS2}
'{$PBASIC 2.5}

x VAR Word
y VAR Word
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 75

' DEBUG CLS

' Inicializa LCD


PAUSE 200
SEROUT 14, 84, [22, 12]
PAUSE 5

DO

PULSIN 6, 1, x
PULSIN 7, 1, y

' DEBUG HOME, DEC4 ? X, DEC4 ? Y


SEROUT 14, 84, [128, DEC4 ? X, DEC4 ? Y]

PAUSE 100

LOOP

Su Turno - Personalizando el Desplegado


El retorno de carro (CR) que está construído dentro del operador ? hace más difícil
desplegar la información después de los valores de las variables x o y. Puede reescribir
los comandos DEBUG y SEROUT para ejecutar las mismas operaciones como sigue.
DEBUG HOME, "x = ", DEC4 x, CR, "y = ", DEC4 y

Este comando SEROUT despliega la misma información en la LCD Serial Parallax. Note
como el the código de control 128 coloca el cursor en la Linea 0, caracter 0. En vez de
un caracter de control CR, 148 coloca al cursor de la LCD en la Linea 1, caracter 0.
SEROUT 14, 84, [128, "x = ", DEC4 x, 148, "y = ", DEC4 y]

Con este comando SEROUT modificado, es más fácil desplegar caracteres después de
cada valor. Por ejemplo, he aquí un comando SEROUT que multiplica cada medición por
2 y despliega "us" después.
SEROUT 14, 84, [128, "x = ", DEC4 (2 * x), " us",
148, "y = ", DEC4 (2 I y), " us"]

Si bien "us" no es realmente lo mismo que "μs" porque estamos usando una u en vez de la
letra griega mu, la mayoría de las personas comprendería el significado. Usted también
puede hacer un caracter personalizado para mu. Esto involucrará agregar un comando
SEROUT al principio del programa que defina un caracter personalizado. Luego, tendrá
que desplegar ese caracter personalizado donde la "u" está siendo desplegada.
Página 76 · Sensores Inteligentes y sus Aplicaciones

ACTIVIDAD #3: DIVISIÓN PROPORCIONAL Y COMPENSACIÓN DE LOS


VALORES DE ENTRADA
Al trabajar con el MX2125 y el BASIC Stamp 2, el rango mediciones de inclinación está
entre 1875 y 3125. Este rango puede tener que ser escalado y compensado por algún
método posible. Por ejemplo, la actividad #4 escala esto a un rango de −100 to 100. La
actividad #5 lo escala a −127 y 127.

Introducir una compensación en un rango de valores es fácil y típicamente implica una


operación de suma o resta. El escalado puede implicar usar trucos, especialmente con un
procesador como el BASIC Stamp que hace todos sus cálculos con números enteros.
Esta actividad presenta el modo más simple y más preciso para escalar un mayor rango
de valores en un rango más pequeño con un programa PBASIC. La técnica de división
proporcional aquí presentada ayuda a prevenir errores que se arrastren en las mediciones
de su sensor con cada cálculo PBASIC sucesivo y será re-utilizada en muchas de las
actividades de este libro.

Ejemplo de escalamiento y compensación


En este primer ejemplo, tomaremos un valor de entrada cualquiera entre 1875 y 3125 y lo
escalaremos y compensaremos a un valor de salida correspondiente que caiga entre −127
y 127 (Figura 3-9). La posición del valor en la escala de salida debe ser proporcional a la
posición del valor en la escala de entrada. Por ejemplo, si el valor de entrada es 2500 (a la
mitad entre 1875 y 3125) el valor de salida es 0 (a la mitad entre −127 y 127).

Figura 3-9: Ejemplo de escalamiento de entrada y salida

Para aplicar escalamiento y compensación en PBASIC, recuerde estos 3 pasos:

1) Aplique compensación para alinear la escala de entrada a cero.


2) Aplique el escalamiento the scale.
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 77

3) Aplique compensación adicional si es necesario en la escala de salida.

La Figura 3-10 muestra cómo aplicar estos pasos con un solo commando PBASIC que
ejecuta escalamiento y compensación. Recuerde que los cálculos en PBASIC trabajan de
izquierda a derecho a no ser que se re-jerarquize con paréntesis. Entonces la primer cosa
que este cálculo hace es restar 1875 al valor de entrada. El nuevo rango ahora es de 0 a
1200 en vez de 1875 to 3215. Luego, ** 13369 divisiona proprcionalmente a 0 - 254.
Después de que el rango ha sido escalado, se le resta 127 y resulta en −127 a 127.

(1875 to 3125)→(0 to 1200)


|
| (0 to 1200)→(0 to 254)
| |
| | (0 to 254)→(-127 to 127)
| | |
value = value - 1875 ** 13369 - 127

Figura 3-10: Escalando el valor de la Variable

Escogiendo la constante ** adecuada para escalar


El valor 13369 usado usado para escalar (0 a 1250) a (0 to 254) fue determinada al
sustituir el número de elementos en las escalas de entrada y salida en la siguiente
ecuación. El número de elementos en la escala de salida es 255, incluyendo al 0, y el
número de elementos en la escala de entrada es 1251, también incluyendo el 0. Use esta
ecuación siempre que necesite ajustar una escala más grande en una más pequeña con el
operador **.

⎡ ⎛ elementos en escala de salida ⎞⎤


Cons tan te de escalamiento = Int ⎢65536 ⎜ ⎟⎥
⎣ ⎝ elementos en escala de entrada − 1 ⎠⎦

⎡ ⎛ 255 ⎞⎤
ScaleCons tan t = Int ⎢65536 ⎜ ⎟⎥
⎣ ⎝ 1251 − 1 ⎠⎦

ScaleCons tan t = Int [13,369.344 ]


Página 78 · Sensores Inteligentes y sus Aplicaciones

ScaleCons tan t = 13369


¡Siempre redondee hacia abajo su ScaleConstant resultante, aún cuando el resultado
ya sea un entero! De lo contrario, el valor mas grande en su escala de entra puede ser un
valor fuera del rango de la escla de salida.

Asegurando el rango de entrada


La mejor forma de asegurar que los valores de salida no exceden el rango de salida es
verificar que los valores de entrada no salen del rango de entrada. Por ejemplo, si no
quiere que la salida de este commando salga fuera de −127 a 127, el método más
conveniente es aseguarse que los valores de entraga no sean menores que 1875 o mayores
que 3125. He aquí una version modificada de value = value - 1875 ** 13369 -
127 que previene este problema.

value = (value MIN 1875 MAX 3125) - 1875 ** 13369 - 127

Antes de restar 1875 a la variable value, este commando usa dos operadores, MIN 1875
y MAX 3125, para asegurarse que value guarda algo en este rango. Si la variable value
está guardando un número en este rango, los operadores MIN y MAX no la alteran. Sin
embargo, si está guardando algo menor que 1875, MIN 1875 cambiará el valor a 1875.
Igualmente, si está guardando algo mayor que 3125, MAX 3125 lo cambiará a 3125.

Programa Ejemplo: TestScaleOffset.bs2


La Figura 3-11 muestra cómo se ve la Terminal de Depuración al probar el siguiente
programa. Cuando introduce valores de entrada (separados por comas) en la ventana de
Transmisión de la Terminal de Depuración, el programa muestra el equivalente escalado
y compensado en la ventana de recepción de la Terminal de Depuración.

√ Introduzca, salve y corra TestScaleOffset.bs2.

' Sensores Inteligentes y sus Aplicaciones - TestScaleOffset.bs2


' Prueba de escalamiento de un rango de entrada de 1875 a 3125 a un rango
' de salida de -127 to + 127.

'{$STAMP BS2}
'{$PBASIC 2.5}

value VAR Word

DEBUG CLS, "Enter valores (1875 to 3125)...", CR


Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 79

DO

DEBUG ">"

DEBUGIN DEC value

value = (value MIN 1875 MAX 3125) - 1875 ** 13369 - 127

DEBUG "scaled to ", SDEC value, CR

LOOP

Figura 3-11: Prueba de escalamiento

Transmit
Windowpane

Receive
Windowpane
Página 80 · Sensores Inteligentes y sus Aplicaciones

√ Posiciónese en la ventana de transmisión de la Terminal de Depuración e


introduzca (incluyendo comas): 1875, 1876, 1879, 1880, 1881, 2496, 2497,
2498, 2499, 2500, 2501, 2502, 2503, 2504, 3119, 3120, 3121, 3124, 3125.
√ Pruebe otros valores en el rango de 1875 a 3125 y verifique con una calculadora
que la posición del valor de salida en el rango de salida es proporcional a la
posición del valor de entrada en el rango de entrada..

Su Turno - PBASIC y los números negativos


El ultimo programa ejemplo usó el modificador DEBUG SDEC para mostrar la variable
value como un número con signo. Recuerde que en PBASIC una variable del tamaño de
una palabra puede retener un valor sin signo en el rango de 0 a 65535 o un valor con
signo de −32768 a +32767. Esto es por el uso del método de complemento a dos para
números con signo. En este sistema, todos los números positvos en binario empiezan con
un 0 y los negativos con un 1. Usando complementos a dos, los valores de 0 a 32767
estan representados por sus equivalentes binarios de 16 bits normales, pero del −1 al
−32768 no lo están. En vez de ello, esos números negativos están representados por los
equivalentes binarios de 32768 a 65535.

Tabla 3-1: Números decimales y binarios


con Complemento a dos
Decimal sin Binario de 16-Bit Decimal con
signo !Bit 15 Bit 0" signed
1 0000000000000001 1
32767 0111111111111111 32767
32768 1000000000000000 -32768
65535 1111111111111111 -1

Visualize una recta numérica (Figura 3-12). Del 0 en adelante, los valores 0 al 32767
están representados por sus equivalents binarios normales de 16 bits: el valor 1 esta
representado por el binario 1, etc., hasta el 32767. Pero el −1 está representado por el
equivalente binario de 65535, que es el valor con mayor tamaño de palabra, que es todo
en 1’s. Yendo hacia atrás con estos valores negativos, sus correspondientes números
binarios que los representan se hacen más pequeños hasta llegar al −32768 representado
por el binario 32768.
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 81

Figura 3-12: Recta numérica de decimales con signo y sus complementos a


dos

(DEC 32767)0111111111111111
|
(DEC 1)0000000000000001 |
| |
-32768...............-1...0...1...............32767
| |
| 1111111111111111(DEC 65535)
|
1000000000000000 (DEC 32768)

El patron es claro si compara un decimal sin signo con sus equivalentes decimal y binario
con signo.

√ Intente correr SignedNumbers.bs2 con algunos valores de x hasta que el patron


le sea claro. Intente: 0, 1, 2, -1, -2.
√ Luego intente 65535, 65534, 32767, 32768, y 32769. ¿Puede ver cómo opera?

' Sensores Inteligentes y sus Aplicaciones - SignedNumbers.bs2


' {$STAMP BS2}
' {$PBASIC 2.5}

x VAR Word
x = 32768 '<<< Introduzca nuevos valores de x, y vuelva a correr

DEBUG "you entered decimal: ", DEC x, CR


DEBUG "signed decimal: ", SDEC x, CR
DEBUG "16-bit binary: ", BIN16 x, CR

Como en PBASIC solo las variables de palabra completa pueden retener números con
signo, todos los números con signo tienen 16 bits. Viendo el bit más hacia la izquierda, el
Bit 15, podemos saber si un número es positivo o negativo. Puede usar value.BIT15
como una variable que le diga si value es un número positivo o negativo. Si
value.BIT15 es igual a 0, el número es positivo. Si es igual a 1, es negativo.

Este es un tip importante, porque algunos operadores PBASIC solo trabajan con enteros
positivos, como division "/" y módulo "//". Cuando se usan estos operadores, es útil
Página 82 · Sensores Inteligentes y sus Aplicaciones

salvar el signo de un número, ejecutar la operación con su valor absoluto y reaplicar el


signo después. De hecho haremos esto más tarde en el Capítulo 4.

Su Turno – Una Mirada más cercana a la constante de escalamiento y al


operador **
Para pequeñas entradas y rangos de salida, podemos revisarlos con una calculadora, lápiz
y papel. Tomemos del 0 al 10 como nuestra escala de entrada y del 0 al 2 como nuestra
escala de salida. El primer paso es visualizar cual sería la constante para la operacíon **
usando la ecuación de la constante de escalamiento (ScaleConstant).

⎡ ⎛ elementos en escala de salida ⎞⎤


Cons tante de escalamiento = Int ⎢65536 ⎜⎜ ⎟⎟⎥
⎣ ⎝ elementos en escala de entrada − 1 ⎠⎦

Hay 3 elementos en la escala de salida, 0, 1 y 2. Hay 11 elementos en la escala de


entrada, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 y 10. Recordando redondear hacia abajo al entero más
próximo, el resultado es 19660 que es la constante a usar con el operador **.

⎡ ⎛ 3 ⎞⎤
ScaleCons tan t = Int ⎢65536 ⎜ ⎟⎥
⎣ ⎝ 11 − 1 ⎠⎦

ScaleCons tan t = Int[19,660.8 ]

ScaleCons tan t = 19660

El término value = value ** 19660 multiplica el valor variable:

19660 ÷ 65536 ≈ 0.29999 → value = value × 0.29999

La Table 3-2 muestra algunos ejemplos de cálculos del BASIC Stamp para cada valor en
el rango de entrada para value = value ** 19660. Considere que es
aproximadamente igual a multiplicar value por 0.29999 con una calculadora. Puesto
que el BASIC Stamp es un procesador matemático de enteros, trunca cualquier resultado
al valor entero, redondeándolo entonces hacia abajo. Note como los primeros 4 valores de
entrada resultan en salida cero. Luego, cuando el valor de entrada es 4 el resultado es
1.19996, que se redondea a 1. Al ejecutar el resto de las operaciones en la tabla, note
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 83

como el valor de escala de salida 2 le corresponden 4 elementos de entrada. Si -1 no se


usara en el denominador le correspondería un elemento de entrada.

√ Complete los calculos en la Table 3-2 para valores de entrada del 5 al 10.

Table 3-2: Tensiones Medidas durante el ciclo de cargae


Constante de Resultado entero
Valor Valor Calculado
escalamiento ** BASIC Stamp
0 x 0.2999 = 0 0
1 x 0.2999 = 0.2999 0
2 x 0.2999 = 0.5998 0
3 x 0.2999 = 0.8997 0
4 x 0.2999 = 1.1996 1
5 x 0.2999 =
6 x 0.2999 =
7 x 0.2999 =
8 x 0.2999 =
9 x 0.2999 =
10 x 0.2999 =

√ Salve TestScaleOffset.bs2 como TestScaleOffsetYourTurn.bs2.


√ Modifique el programa para que pueda probar la Table 3-2 con el BASIC Stamp
y la Terminal de Depuración.
√ Compare los resultados de la Terminal de Depuración con su tabla.

ACTIVIDAD #4: DIVIDIENDO EN 1/100 G


La medición estandar de gravedad en la superficie de la tierra es abreviada "g". Esta
actividad demuestra como usar las técnicas presentadas en la actividad anterior para
desplegar el número de centésimas de una g actuando en los ejes x y y del acelerómetro.

De PULSIN a 1/100 g
La meta aquí es modificar modificar el programa ejemplo de la Actividad #1 para que
despliegue mediciones de los ejes x y y en terminos de 1/100 g en vez de 2 μs units. Es
otro problema de escalamiento y compensación, pero esta vez, queremos ajustar la escala
de entrada de 1875 a 3125 en una escala de salida de −100 a 100 (Figura 3-13).
Página 84 · Sensores Inteligentes y sus Aplicaciones

Figura 3-13: Escalamiento y compensación para 1/100 g.

Su Turno - Desarrollando el Programa


Usaremos las técnicas de escalamiento de la Actividad #3 para modificar el programa de
la Actividad #1 y mostrar las mediciones de los ejes x y y en términos de 1/100 g. La
Figura 3-14 muestra las lecturas aproximadas que debe esperar luego de sus
modificaciones.

Figura 3-14: Lecturas muestra en varias orientaciones (en sentido horario)

a. x = 100 100 y = 0 100 b. x = 0 100 y = 10 0 100

d. x = 0 100 y = −100 100 c. x = −100 100 y = 0 100


Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 85

√ Abra SimpleTilt.bs2 de la Actividad #1 y salvelo como CentigravityTilt.bs2


√ Siga los pasos para escalar de la actividad Actividad #3 y determine las
constantes de escalamiento para la operación **.
√ Agregue lineas de código al programa que divisionen los valores de x y y a
g/100.
√ Modifique el desplegado para que aparezca en la Terminal de Depuración.
√ Pruebe de acuerdo a la Figura 3-14 y corrija si es necesario.

ACTIVIDAD #5: MEDICIÓN DE ROTACIÓN VERTICAL DE 360°


El MX2125 tiene una característica interconstruída que le permite usar la medición de
pendiente en ambos ejes para calcular el ángulo de rotation del acelerómetro en el plano
vertical, como se muestra en la Figura 3-15. Hay muchas aplicaciones donde conocer la
inclinación vertical es útil, incluyendo volantes virtuales para controles de mando de
video juegos y contar revoluciones de una rueda de bicicleta. Esta actividad demuestra
como calcular la inclinación del plano vertical con el operador plane con ATN de PBASIC
.

Figura 3-15
Inclinación en el Plano Vertical

Calculando el Arcotangente con PBASIC


En un triángulo rectángulo, la tangente de un ángulo teta (θ) es la división del lado
opuesto del ángulo (y) entre el lado adyacente (x). Si conoce los valores de x y y, puede
usar la inversa tangente o arcotangente para conocer el ángulo θ. Las notaciones más
comunes para el arcotangente son tan−1 y arctan.
Página 86 · Sensores Inteligentes y sus Aplicaciones

Figura 3-16
y Tangente y Arcotangente
tan θ =
x
⎛y⎞
θ = tan −1 ⎜⎜ ⎟⎟
⎝x⎠

La función arcotangente puede usarse para determinar the ángulo de rotación del
acelerómetro con sus mediciones x y y. PBASIC tiene un operador llamado ATN que
puede usar para calcular tan−1(y/x). Para calcular el arcotangente of y/x y guardarlo en
una variable llamada angle, use el comando angle = x ATN y.

⎛y⎞
θ = tan −1 ⎜⎜ ⎟⎟ → angle = x atn y
⎝x⎠

La Figura 3-17 esta tomada del archivo de ayuda del Editor de BASIC Stamp y muestra
como trabaja el operador ATN. Ambas variables x y y deben ser escaladas a valores entre
−127 y 127. El resultado del operador ATN es el ángulo en radianes binarios, los cuales se
abrevian “brads”. Con los brads, un círculo es dividido en 256 segmentos de la misma
manera que los ángulos lo dividen en 360 segmentos.

Figura 3-17
Círculo Unitario en grados y
Radianes Binarios
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 87

Convirtiendo de Brads a Grados con */


En la actividad anterior usamos el operador ** para dividir proporcionalmente de un
rango más grande a uno más pequeño. Convertir de brads a grados implica escalar una
escala menor (de 0-255) a una mayor (de 0-359). El operator */ de PBASIC está
diseñado para esto.

Cuando usa un commando como value = ScaleConstant */ value, el término


ScaleConstant es la cantidad de 256avos por los cuales desea multiplicar la variable
value. Por ejemplo, digamos que desea multiplicar value por 2.5. Multiplique 2.5 por
256y el resultado es 640. Ahora, si value empieza en 10, el resultado de value = 640
*/ value será 25. Si queremos que value equivalga a 2.5 veces value:

ScaleCons tan t = 2.5 × 256 = 640

value = 640 */value 'multiplica por 2.5

Recuerde:
El operador ** multiplica por un número de 65536avos.

The operador */ multiplies por un número de 256avos.

Las reglas matemáticas de enteros para escalar de una escala a otra aún aplican, aún si
convertimos de una escala más pequeña a una más grande. Lo único que cambiaremos es
la constante de la escala, el cual es un numerador de 256 por */, en vez de 65536 por **.

⎡ ⎛ elementos en la escala de salida ⎞⎤


Cons tan te de escalamiento * / = Int ⎢256 ⎜ ⎟⎥
⎣ ⎝ elementos en la escla de entrada − 1 ⎠⎦

La escala de entrada es de 0-255, la cual tiene 256 elementos y la salida es de 0-359, la


cual tiene 360 elementos. El resultado después de sustituir estos valores en la ecuación de
la constante de escalamiento es 361.
⎡ ⎛ 360 ⎞⎤
* / ScaleCons tan t = Int ⎢256 ⎜ ⎟⎥
⎣ ⎝ 256 − 1 ⎠⎦
* / ScaleCons tan t = Int [361.412 ]
Página 88 · Sensores Inteligentes y sus Aplicaciones

*/ ScaleCons tan t = 361


Esto demuestra que si la variable del ángulo guarda una medida de brads y quiere guardar
una medida en grados, use el commando:
angle = 361 */ angle

Muchos documentos recomiendan angle = 360 */ angle. Sin embargo, usar una
constante */ de 361 es ligeramente mas preciso en los rangos de entrada/salida. Trate
comparar los resultados de esta operación hecha con BASIC Stamp a los hechos con una
hoja de cálculo.
angledegrees = (360/256) × anglebrads
Redondee el resultado de angledegrees al entero más cercano. Si el resultado tiene un
componente fraccional 0.5 o mayor, redondee hacia arriba. De lo contrario, redondee hacia
abajo. Luego comparelo con las 256 posibles salidas de la Terminal de Depuración con 360
*/ angle, luego repita con 361 */ angle. Una hoja de cálculo es útil para esta comparación.
Si lo intenta, verá que el nivel de enteros que empatan es mucho mayor con 361 */ angle.

Programa Ejemplo: TestAtn.bs2


Este programa ejemplo calcula angulos basado en los valores y y x que introduce en la
ventana de Transmisión de la Terminal de Depuración.

Figura 3-18
Tangente y Arcotangente
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 89

Para calcular los valores de x y y a introducer en la Terminal de Depuración, use estas


ecuaciones:

Figura 3-19
Tangente y Arcotangente
y = h sin θ
x = h cosθ

Por ejemplo, si h = 127 y θ = 45°, los valores de x y y a teclear en la Terminal de


Depuración son 90 ambos. Si h = 100 y θ = 315°, el valor y a teclear sera −71, y el valor
de x será 71. Si h = 100 y θ = 180°, y sera 0 y x sera −127.

For h = 127 and θ = 45° For h = 100 and θ = 315° For h = 127 and θ = 180°
y = 127 sin 45° y = 100 sin 315° y = 127 sin 180°
= 89.9 = − 71 =0
≈ 90
x = 127 cos 45° x = 100 cos 315° x = 127 cos 180°
= 89.9 = 71 = − 127
≈ 90

√ Introduzca, salve y corra TestAtn.bs2


√ Haga click en la ventana de transmisión de la Terminal de Depuración. Cuando
se le pida el valor de x, teclée 90 y luego [Enter]. Repita igual para el valor de y.
√ Verifique que el resultado es 32 brads = 45°.
√ Repita para los otros valores de x y y recién discutidos.
√ Use su calculadora para determinar los valores de x y y que correspondan con
algunos valores de h y θ. Compare sus resultados calculados con los de la
Terminal de Depuración.
Página 90 · Sensores Inteligentes y sus Aplicaciones

Algunos valores serán mas bajos que lo que esperaba. Por ejemplo, cuando h = 100 y
θ = 30°, y = 50 y x = 87. La Terminal de Depuración mostrará 21 para el ángulo brad, que
es correcto, pero 29 para el ángulo en grados que no es correcto. Debería ser 30. Esto
pasa ocasionalmente al escalar de un rango menor a uno mayor. La medición de 21 brads
corresponde a 29° y 22 brads corresponden a 31°.

' Sensores Inteligentes y sus Aplicaciones - TestAtn.bs2


' Test BASIC Stamp arctangent calculations.

'{$STAMP BS2}
'{$PBASIC 2.5}

angle VAR Word


x VAR Word
y VAR Word

DO

DEBUG "Enter y: "


DEBUGIN SDEC y
DEBUG "Enter x: "
DEBUGIN SDEC x

angle = x ATN y

DEBUG "brad ", SDEC ? angle

angle = angle */ 361

DEBUG "degree ", SDEC ? angle, CR

LOOP

Su Turno – Probando la Conversion Brad a Grados


Como se mencionó antes, El resultado entero ideal viene de calcular angledegrees =
(360/256) x anglebrands y luego redondear hacia arriba si el valor a la derecha del punto
decimal es de 5 a 9 o hacia abajo si es de 1 a 4. Puede generar una lista de todas las 256
conversiones de brad a grados con el siguiente programa.

' Sensores Inteligentes y sus Aplicaciones - BradsToDegrees.bs2


' Despliega conversiones de brad a grados para */ 360 y */ 361.

'{$STAMP BS2}
'{$PBASIC 2.5}
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 91

angle VAR Word


brads VAR Word

DEBUG CLS, "brads */ 360 */ 361", CR

FOR brads = 0 TO 255

DEBUG DEC3 brads

angle = brads */ 360


DEBUG " ", DEC3 angle

angle = brads */ 361


DEBUG " ", DEC3 angle, CR

NEXT

END

√ Introduzca, salve y corra BradsToDegrees.bs2.


√ Use una hoja de cálculo o calculadora para generar una lista con esta fórmula.

angledegrees = (360 256) × anglebrads

Recuerde redondear hacia arriba si el valor a la derecha del punto decimal es de


5 a 9 o hacia abajo si es de 1 a 4.
√ Compare sus resultados a los desplegados en la Terminal de Depuración.
¿Cuántos empates exactos ocurrieron para */ 360? ¿Cuántos para */ 361?
Página 92 · Sensores Inteligentes y sus Aplicaciones

Midiendo el ángulo de inclinación en el plano Vertical


El ángulo de la rotación de su tarjeta en sentido horario en el plano vertical (θ) es el
arcotangente del efecto de la gravedad en el eje y del MX2125 (Ay) dividido entre su
efecto en el eje x (Ax), como se muestra en la Figura 3-20.

Figura 3-20
Rotación vertical en
sentido antihorario

−1 ⎛ AY ⎞
θ = tan ⎜ ⎟
⎜A ⎟
⎝ X ⎠

A continuación se presentan algunos ejemplos de lo que el acelerómetro detecta y como


lo relaciona al arcotangent de la relación de Ay entre Ax. La Figura 3-21 muestra lo que el
acelerómetro sensa en la marca de 0°. Si θ es 0°, entonces Ay sensa 0-gravedad (g), y Ax
sensa 1 g, el arcotangente de 0/1 is 0°.

Figura 3-21: Acelerómetro Rotated 0°

⎛0⎞
tan −1 ⎜ ⎟ = 0°
⎝1⎠

Cuando el acelerómetro es rotatdo 30° en el sentido horario, como se muestra en la


Figura 3-22, la componente de gravedad actuando en el eje x del acelerómetro es
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 93

aproximadamente √3/2 g. La componente de gravedad actuando en el eje y es 1/2 g, y el


arcotangente de √3/2 ÷ 1/2 is 30°.

Figura 3-22: Acelerómetro rotado 30° en sentido horario

⎛ 1 ⎞
⎜ ⎟
tan −1 ⎜ 2 ⎟ = 30°
⎜ 3 ⎟
⎜ ⎟
⎝ 2 ⎠

Cuando el acelerómetro es rotado a 135° en sentido horario (Figura 3-23), la componente


de gravedad actuando en el eje x del acelerómetro es Ax = -1/√2, y la componente
actuando en su eje y es 1/√2. El arcotangente de 1/√2 ÷ (−1/√2) es 135°.

Figura 3-23: Acelerómetro Rotado 135° en sentido horario

⎛ 1 ⎞
⎜ ⎟
tan −1 ⎜ 2 ⎟ = 135°
⎜ −1 ⎟
⎜ ⎟
⎝ 2⎠
Página 94 · Sensores Inteligentes y sus Aplicaciones

El caso general
El ángulo de rotación (θ) es la inversa-tangente o arcotangente de la componente de
gravedad que actúa sobre el eje de sensado Y del Mems 2125 (AY) dividida entre la
componente de gravedad que actúa sobre el eje de sensado X (AX). La figura abajo
muestra al MX2125 inclinado a un ángulo θ, lo cual rota a ambos ejes de sensado en el
mismo angulo θ. Aplicando un par de identidades geométricas, θ también está dentro de los
dos triángulos que muestran las componentes de gravedad actuando en cada uno de los
ejes de sensado del acelerómetro (xm y ym). La componente de gravedad actuando sobre
xm is AX = g cosθ y la componente actuando sobre ym es AY = g sinθ. Después de aplicar las
identidades trigonométricas mostradas, se demuestra que el ángulo de rotación θ es de
hecho el arcotangente of AY/AX.

AY g sin θ
= = tan θ
AX g cos θ
AY
tan θ =
AX
⎛ A ⎞
tan −1 (tan θ ) = tan − 1 ⎜⎜ Y ⎟⎟
⎝ AX ⎠
⎛ A ⎞
θ = tan −1 ⎜⎜ Y ⎟⎟
⎝ AX ⎠

Programa Ejemplo: VertWheelRotation.bs2


Este programa muestra el ángulo de rotación de su tarjeta como se muestra en la Figura
3-20 al principio de esta actividad, página 92.
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 95

√ Introduzca, salve y corra VertWheelRotation.bs2.


√ Sostenga la board verticalmente frente a usted como si fuera un volante.
√ Rote la tarjeta en sentido horario, y observe crecer el ángulo de medición.
√ Verifique que el ángulo desplegado vaya de 0 a 359.

' Sensores Inteligentes y sus Aplicaciones - VertWheelRotation.bs2


' Monte el acelerometro en un volante vertical y mida
' el angulo de rotacion.

'{$STAMP BS2}
'{$PBASIC 2.5}

angle VAR Word


x VAR Word
y VAR Word

DO

PULSIN 6, 1, x
PULSIN 7, 1, y

x = (x MIN 1875 MAX 3125) - 1875 ** 13369 - 127


y = (y MIN 1875 MAX 3125) - 1875 ** 13369 - 127

angle = x ATN y
angle = angle */ 361

DEBUG HOME, CLREOL, SDEC ? x,


CLREOL, SDEC ? y,
"angle = ", CLREOL,
DEC angle,
176 ' ASCII 176 es el simbolo de grados

PAUSE 100

LOOP

Su Turno – Comportamiento de la Terminal de Depuración


El siguiente comando DEBUG muestra valores con signo de las variables x y y seguidos
por angle y el símbolo de grados (código ASCII 176). La razón por la cual CLREOL viene
antes de cada número es para prevenir que los caracteres no desparezcan a la derecha de
algunas mediciones. Por ejemplo, si una medición es −105 y la siguiente medición es
076, se desplegaría como 0755 si CLREOL no limpiara el valor anterior antes de desplegar
Página 96 · Sensores Inteligentes y sus Aplicaciones

el nuevo. Aún cuando CLS puede arreglar este problema también, el parapdeo resultante
en la Terminal de Depuración no es agadable para la vista. CLREOL borra a la derecha del
cursor en una linea dada. Si bien aún causa un poco de parpadeo con cada valor, es
mucho más facil de ver que con la versión CLS.
DEBUG HOME, CLREOL, SDEC ? x,
CLREOL, SDEC ? y,
"angle = ", DEC3 angle,
176 ' ASCII 176 es el simbolo de grados

√ Salve VertWheelRotation.bs2 como VertWheelDisplayTest.bs2.


√ Reemplace HOME con CLS en el comando DEBUG y corra el programa.
√ Regrese CLS por HOME y corra el programa. ¿Vé alguna mejora en la pantalla?
√ Retire los caracteres de control de CLREOL y note el efecto en la pantalla
mientras que gira la tarjeta. Aparecerán dígitos extra al final de los valores no
negativos.
√ Regrese los caracteres de control de CLREOL y corra el programa otra vez. Los
dígitos extra que no desaparecían antes deben estar eliminados.

Su Turno – La Pantalla LCD


El comando DEBUG tiene 3 lineas de desplegado y el símbolo de grado necesitará un
caracter personalizado. He aquí un commando de inicialización para la LCD que hace 3
cosas: (1) prende la LCD, (2) muestra un texto que no cambia y (3) define al caracter
personalizado 7 como el símbolo de grados “ ° ”.
' Inicializa LCD
PAUSE 200
SEROUT 14, 84, [22, 12]
PAUSE 5

SEROUT 14, 84, [ 130, "angle = ", DEC angle, 7,


150, "x=", SDEC x,
157, "y=", SDEC y ]

SEROUT 14, 84, [255, ' Define caracter personalizado 7


%01000, ' *
%10100, ' * *
%01000, ' *
%00000, '
%00000, '
%00000, '
%00000, '
%00000] '
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 97

Definición de Caracteres Personalizados. Recuerde, 248 define el caracter personalizado


0. 249 define el caracter personalizado 1, etc., hasta 255, que define el caracter
personalizado 7.

El comando DEBUG reemplazado por el comando SEROUT usa 3 lineas en la Terminal de


Depuración. El comando SEROUT aqui abajo usa solo 2. Para minimizar el parpadeo de
pantalla en la LCD, solo los dígitos son borrados antes de que se escriban nuevos. El
SEROUT coloca el cursor en 138 (línea 0, caracter 10), luego sobreescribe la medición
previa con 5 espacios. Después, coloca el cursor en 138 nuevamente y despliega la nueva
medición de ángulo con ángulo DEC. Finalmente, escribe el signo de grado con el caracter
personalizado 7. Esto se repite para las mediciones de x y y, pero solo necesitan ser 4
espacios enre comillas después de que el cursor se posiciona en 152 y 159.
' Rutina de desplegaado en LCD
SEROUT 14, 84, [ 138, " ", 138, DEC angle, 7,
152, " ", 152, SDEC x,
159, " ", 159, SDEC y ]

√ Salve VertWheelRotation.bs2 como VertWheelRotationLcd.bs2.


√ Inserte la rutina de inicialización de la LCD entre las declaraciones de variable y
la palabra DO.
√ Reemplace el comando DEBUG en el DO...LOOP con la Rutina de desplegado en
LCD.
√ Chambie PAUSE 100 a PAUSE 350.
√ Corra el programa y pruebe su desplegado en LCD.

Su Turno - Rotación en la Dirección Opuesta


Los diagramas que muestran al ángulo de rotación incrementando conforme el objeto rota
en sentido anti-horario, como la Figura 3-24, son bastante más comunes que el diagrama
en sentido horario que usamos previamente.

Figura 3-24
Medición de ángulo con
rotación en sentido anti-horario
Página 98 · Sensores Inteligentes y sus Aplicaciones

Para invertir el ángulo de rotación que muestra el programa, solo hay que usar −Ay en
vez de Ay (Figura 3-25). Si gira el acelerómetro en sentido anti-horario, Ay es −1/2 y el
arcotangente resulta ser 330°. Al tomar el arcotangente de −Ay/Ax, el resultado es 30°.

Figura 3-25: Invirtiendo la dirección de rotación con -Ay

⎛ 1 ⎞
⎜ ⎟
⎛ − AY ⎞ ⎜ 2 ⎟
tan −1 ⎜⎜ ⎟ = tan

− 1
⎜ 3 ⎟ = 330 °
⎝ AX ⎠ ⎜⎜ ⎟⎟
⎝ 2⎠
⎛ 1 ⎞
⎜ ⎟
− 1 ⎛ − Ay ⎞ −1 ⎜ 2 ⎟
tan ⎜ ⎜ ⎟ = tan ⎜
⎟ ⎟ = 30 °
⎝ Ax ⎠ ⎜⎜ 3 ⎟⎟
⎝ 2 ⎠

En el programa, solo inserte un signo negativo antes de y en angle = x ATN y.

√ Salve VertWheelRotation.bs2 como VertWheelRotationCounterclockwise.bs2


√ Cambie angle = x ATN y por angle = x ATN −y.
√ Corra el programa y verifique el ángulo de rotación ahora incrementa conforme
gira la tarjeta en sentido anti-horario.

ACTIVIDAD #6: MEDICIÓN DE LA INCLINACIÓN RESPECTO A LA


HORIZONTAL
Esta actividad mide qué tanto la tarjeta Board of Education está inclinada respecto a la
horizontal. La Figura 3-26 muestra la tarjeta Board of Education con el acelerómetro
Mems en la tableta. Los ejes de sensado de aceleración del acelerómetro (xm y ym)
apuntan hacia la parte superior y la parte izquierda de su tarjeta. Esta actividad desarrolla
un programa que despliega el ángulo de inclinación para cada eje. Cuando la tarjeta está
nivelada, el ángulo de inclinación es 0° para ambos ejes xm y ym. Si inclina la tarjeta para
que ym apunte hacia arriba, el programa reportará un ángulo de inclinación positivo para
el eje y. Si la inclina para que ym apunte hacia abajo, reportará un ángulo de inclinación
negativo. Lo mismo aplica para xm; apuntela hacia arriba para un ángulo de inclinación
positivo o hacia abajo para un ángulo de inclinación negativo. Si inclina la tarjeta hacia
una de sus esquinas, el programa reportará inclinación en ambos ejes xm y ym.
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 99

Figura 3-26: Ejes de inclinación en la tarjeta Board of Education

Seno y Coseno
La Figura 3-27 muestra la relación entre los lados de un triángulo rectángulo y las
funciones seno y coseno. El seno de un ángulo es el lado opuesto del triángulo (y)
dividido entre la hipotenusa (h). Si conoce h y y, y quiere conocer el ángulo (θ), use
arcoseno (sin−1). El coseno de un ángulo es el lado adyacente (x) divido entre h. Si
quiere conocer el ángulo conociendo x y h, use arcocoseno (cos−1).

y Figura 3-27
sin θ = Seno y Coseno
h
x
cos θ =
h
Página 100 · Sensores Inteligentes y sus Aplicaciones

Note en las ecuaciones de la Figura 3-27 que el valor x puede ser, a lo mucho, igual a h
cuando θ = 0°. Igualmente, el valor y puede ser, a lo mucho, h cuando θ = 90°. Para
ángulos entre 0 y 90°, la relación de x/h y y/h son ambas menores que 1. No importa que
tan grande es el triángulo, la relación siempre estará entre 1 y 0.

El círculo unitario es un elemento comun para describir las funciones seno y coseno. La
hipotenusa del triangulo se convierte en el radio del círculo. El círculo unitario es
también llamado así porque la longitude de la hipotenusa es 1 (una unidad). Conforme
gira la hipotenusa en sentido anti-horario, el ángulo θ se hace más grande, o más pequeño
si rota en sentido horario. El coseno es determinado dibujando una línea vertical desde el
punto donde la hipotenusa se cruza con el círculo hasta el eje de las x. Cualquiera que sea
el valor de x allí, ese es el coseno. El seno del ángulo es determinado dibujando una linea
horizontal desde el final del radio hasta el eje de las y.

Figura 3-28: Ejemplos de Seno y Coseno en el círculo unitario

a. b. c.

El rango de 0 a 90° es el cuadrante 1 del círculo unitario. Cuando θ está en el cuadrante


1, ambos el seno y el coseno del ángulo serán números positivos. Cuando θ está entre 90
y 180° (cuadrante 2), the coseno se hace negativo pero el seno aún es positivo. En el
cuadrante 3, seno y coseno son negativos, y en el cuadrante 4, el seno aún es negative
pero el coseno es positivo otra vez. Note en la Figura 3-28 (c) que un valor negativo de θ
(entre 0 y −90) puede estar en el cuadrante 4 igual que un valor entre 270 y 360°. Otra
cosa que tener presente es que el valor mínimo para seno y coseno es −1 y que el valor
máximo es 1. Por ejemplo, cuando θ = 0°, cos θ = 1 y sin θ = 0. Si θ = 90°, sin θ = 1 y
cos θ = 0. A θ = 180°, cos θ = −1 y sin θ = 0.

La Figura 3-29 muestra la version de BASIC Stamp de un círculo unitario para sus
operadores SIN y COS. En vez de resultados que van de −1 a 1, los resultados para SIN y
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 101

COS van de −127 a 127. Los ángulos para los operadores SIN y COS están en terminos de
brads. Entonces, en vez de 45° use 32 brads. En vez de 90° use 64 brads, etc. Para
convertir de brads a grados con una calculadora, multiplique el número de brads por
360/256. Para convertir de grados a brads, use 256/360.

Figura 3-29
Operadores Seno y
Coseno en el
círculo unitario de
BASIC Stamp

Programa Ejemplo: SineCosine.bs2


Este programa ejemplo despliega los cálculos enteros de BASIC Stamp para seno y
coseno. Usted puede dividir estos valores entre 127 para obtener una aproximación de los
valores reales de seno o coseno. Convierte grados a brads con ** 46733, obtenido con la
ecuación ScaleConstant de la actividad #3.

√ Introduzca, salve y corra SineCosine.bs2


√ Compare los resultados contra los valores calculados (divididos entre 127) de
seno y coseno.

' Sensores Inteligentes y sus Aplicaciones - SineCosine.bs2


' Despliega valores de seno y coseno de BASIC Stamp.

' {$STAMP BS2}


' {$PBASIC 2.5}

degrees VAR Word


brads VAR Word
sine VAR Word
Página 102 · Sensores Inteligentes y sus Aplicaciones

cosine VAR Word

DEBUG "Degrees Brads Cosine Sine", CR

FOR degrees = 0 TO 359 STEP 15

brads = degrees ** 46733


sine = SIN brads
cosine = COS brads
DEBUG " ",
SDEC3 degrees, " ",
SDEC3 brads, " ",
SDEC3 cosine, " ",
SDEC3 sine, CR

NEXT

END

Su Turno - modificaciones al programa


√ Intente modificar el argumento STEP del ciclo FOR...NEXT para obtener valores
diferentes.
√ Intente modificar el programa para que it prompts you for a degree value con the
DEBUGIN comando y then displays the result.

Subrutinas Arcsine y Arccosine


Mientras que el seno es una razón de y/h para un ángulo dado, arcoseno (sin−1) es la
función inversa (Figura 3-30). Dada la razón y/h, arcoseno le dice el ángulo.
Similarmente, el coseno es la razón x/h para un ángulo dado y arcocoseno (cos−1) es el
ángulo para una razón x/h dada.

y y Figura 3-30
sin θ = θ = sin −1 Seno, Arcoseno, Cosenoy
h h Arcocoseno
x x
cos θ = θ = cos −1
h h

Si bien BASIC Stamp no tiene operadores ASIN y ACOS, Tracy Allen, autor del texto
Sensores Aplicados de la serie Stamps en Class, publicó algunas buenas subrutinas que
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 103

ejecutan estas funciones en su sitio Web www.emesystems.com. El siguiente programa


ejemplo usa versiones modificadas de estas subrutinas.

Recuerde que los operadores SIN y COS regresan valores entre −127 y 127. Si divide el
resultado entre 127, obtendrá un valor entre −1 y 1 que es una aproximación de las
razones reales seno (y/h) o coseno (x/h). Con las subrutinas Arcsine y Arccosine,
puede asignar una variable llamada side a un valor entre −127 y 127 y la subrutina
guardará los resultados de la medición en grados en la variable angle.

Si quiere que las subrutinas Arcsine y Arccosine devuelvan brads en vez de


grados, solo haga 3 cambios:
En la subrutina Arccosine, comente la línea de código que convierte de brads ta grados:
' angle = angle */ 361 ' Convierte brads a degrees
Luego, en IF...THEN cambie 180 a 128 porque ahora usamos un circulo de 256
divisiones:
IF sign = Negative THEN angle = 128 - angle
Igualmente, en la subrutina Arccosine cambie 90 to 64:
angle = 64 - angle

Programa Ejemplo: TestArcsine.bs2


El siguiente programa barre valores de seno desde −127 a 127 y su subrutina Arcsine
convierte estos valores de seno en ángulos en grados. Tenga presente que este es el
inverso de los cálculos del programa ejemplo anterior. El programa ejemplo anterior
desplegaba valores de seno para los ángulos dados. Este despliega angulos para valores
de seno dados.

√ Introduzca, salve y corra TestArcsine.bs2


√ Compare los resultados con los valores de seno calculados en el programa
ejemplo anterior.

' -----[ Title ]--------------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - TestArcsine.bs2
' Prueba arcoseno para valaores de seno de -127 a 127.

' {$STAMP BS2} ' Directiva BASIC Stamp


' {$PBASIC 2.5} ' Directiva PBASIC
Página 104 · Sensores Inteligentes y sus Aplicaciones

' -----[ Constantes ]---------------------------------------------------------

Negative CON 1 ' Signo - .bit15 de variables de palabra


Positive CON 0

' -----[ Variables ]----------------------------------------------------------

sine VAR Word ' seno en circulo r = 127


side VAR Word ' variable de subrutina
angle VAR Word ' resultado angle - degrees
sign VAR Bit ' bit de Signo

' -----[ Inicializacion ]-----------------------------------------------------

DEBUG CLS ' Limpia la Terminal de Depuracion


sine = -128 ' Inicia y en -128

' -----[ Rutina principal ]---------------------------------------------------

DO UNTIL sine = 127 ' Barre desde y = -127 a y = 127


sine = sine + 1 ' Incremento en 1
side = sine ' Coloca side en y
DEBUG "sine = ", SDEC sine, " " ' Muestra el valor de seno
GOSUB Arcsine ' Calcula arcoseno
DEBUG SDEC ? angle ' Muestra el resultado angle
LOOP ' Repite DO...LOOP

END ' Fin de programa

' -----[ Subrutina - Arcsine ]-----------------------------------------------

' Esta subrutina calcula arcoseno basado en la coordenada y en un circulo


' de radio 127. Establezca la variable side igual a su coordenada y antes
' de llamar a esta subrutina.

Arcsine: ' Subrutina Inverso seno


GOSUB Arccosine ' Obtiene inverso coseno
angle = 90 - angle ' seno(angle) = cos(90 - angle)
RETURN

' -----[ Subrutina - Arccosine ]---------------------------------------------

' Esta subrutina calcula arcocoseno basado en la coordenada x en un circulo


' de radio 127. Establezca la variable side igual a su coordenada x antes
' de llamar a esta subrutina.

Arccosine: ' Subrutina Inverso coseno


sign = side.BIT15 ' Guarda el signo de side
side = ABS(side) ' Evalua side positivo
angle = 63 - (side / 2) ' aproximacion inicial al angulo
DO ' Ciclo de approximation sucesiva
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 105

IF (COS angle <= side) THEN EXIT ' Hecho cuando COS angle <= side
angle = angle + 1 ' Incrementa el angulo
LOOP
angle = angle */ 361 ' Convierte brads a grados
IF sign = Negative THEN angle = 180 - angle' Ajusta si el signo es negativo.
RETURN

Su Turno – Probando la Subrutina Arccosine


He aquí algunas modificaciones que puede hacer a TestArcsine.bs2 para hacer que
pruebe la subrutina Arccosine.

√ Salve TestArcsine.bs2 como TestArccosine.bs2.


√ Actualize los comentarios en la sección de título. Los valores de coseno serán
barridos de 127 a −127.
√ Cambie sine VAR Word por cosine VAR Word en la sección de variables.
√ Cambie sine = −128 por cosine = 128 en la sección de Inicialización.
√ Modifique la Rutina principal para que se vea así:
DO UNTIL cosine = -127
cosine = cosine - 1
side = cosine
DEBUG "cosine = ", SDEC cosine, " "
GOSUB Arccosine
DEBUG SDEC ? angle
LOOP

END

√ Corra el programa de prueba modificado. Conforme cosine barra de 127 a 127,


el ángulo debe ser barrido de 0 to 180°.

Desplegando el ángulo de inclinación del acelerómetro


La Figura 3-31 muestra la tarjeta Board of Education con el acelerómetro Mems. La
figura también muestra un acercamiento del módulo del acelerómetro y sus ejes de
sensado de aceleración xm y ym. Estos ejes de sensado detectan componentes de la
aceleración de la tierra debidas a la gravedad. Mientras que inclina un eje hacia la
vertical, mayores son las componentes de 1 g de la tierra actuando sobre ese eje.
Página 106 · Sensores Inteligentes y sus Aplicaciones

Figura 3-31: Inlclinando la tarjeta Board of Education, inclinando el acelerómetro Mems

La Figura 3-32 muestra como el arcoseno puede ser usado para determinar el ángulo.
Viendo de lado el Módulo acelerómetro, la componente de gravedad actuando en su eje
xm es la aceleración en el eje de las x (Ax), que es g × sin θ. Puesto que sin θ equivale a
Ax / g, θx puede ser determinado tomando el arcoseno de Ax / g. En forma de ecuación :
⎛A ⎞
θ X = sin −1 ⎜⎜ X ⎟

⎝ g ⎠
El mismo principio aplica en el eje ym del acelerómetro y el resultado es:
⎛A ⎞
θ X = sin −1 ⎜⎜ Y ⎟

⎝ g ⎠
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 107

Figura 3-32: Determinando el ángulo de inclinación con Arcoseno

AX = g sin θ
AX
= sin θ
g
AX
sin θ =
g
⎛A ⎞
sin −1 (sin θ ) = sin −1 ⎜⎜ X ⎟

⎝ g ⎠
⎛A ⎞
θ = sin −1 ⎜⎜ X ⎟

⎝ g ⎠

Con el MX2125, una medición de 1875 es −1 g, y una medición de 3125 es 1 g. En la


actividad #3, escalamos esto al rango de −127 to 127. Recuerde que −127 es el
equivalente de −1 para la subrutina Arcsine y 127 es el equivalente de 1. Cualquier valor
entre −127 y 127 es el equivalente de una fracción y, en el MX2125, es el seno θ.
Entonces, una vez que la medición del MX2125 ha sido escalada a −127 a 127, todo lo
que tiene que hacer es usar la subrutina Arcsine para determinar el ángulo de
inclinación (el valor de θ).

La forma más simple de escribir un programa de inclinación es empezar con el programa


ejemplo previo, TestArcsine.bs2. Luego, incorporar la medición del acelerómetro y
escalar y compensar tanto los comandos de TestScaleOffset.bs2 como las mediciones del
acelerómetro de VertWheelRotation.bs2. La Rutina Principal de este programa se
condensa en 2 comandos para medir los eje x y y, 2 comandos para escalar y 2 pequeñas
rutinas que llaman a la subrutina Arcsine y despliegan el resultado.
DO

PULSIN 6, 1, x
PULSIN 7, 1, y

x = (x MIN 1875 MAX 3125) - 1875 ** 13369 - 127


Página 108 · Sensores Inteligentes y sus Aplicaciones

y = (y MIN 1875 MAX 3125) - 1875 ** 13369 - 127


side = x
GOSUB Arcsine
DEBUG HOME, "x tilt angle = ", CLREOL, SDEC3 angle, CR

side = y
GOSUB Arcsine
DEBUG "y tilt angle = ", CLREOL, SDEC3 angle

PAUSE 100

LOOP

Programa Ejemplo: HorizontalTilt.bs2


Este ejemplo muestra la inclinación de su tarjeta en grados a partir de la horizontal.

√ Introduzca, salve y corra HorizontalTilt.bs2.


√ Compare varios angulos de inclinación al eje desplegado en la terminal de
Depuración.

' -----[ Titulo ]-------------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - HorizontalTilt.bs2
' Prueba arcsine para valores de sine de -127 a 127.

' {$STAMP BS2} ' Directiva BASIC Stamp


' {$PBASIC 2.5} ' Directiva PBASIC

' -----[ Constantes ]---------------------------------------------------------

Negative CON 1 ' Signo - .bit15 de variables de una palabra


Positive CON 0

' -----[ Variables ]----------------------------------------------------------

x VAR Word ' Medicion del eje x mems


y VAR Word ' Medicion del eje y mems

side VAR Word ' dispara variable de subrutina


angle VAR Word ' resultado angulo - grados
sign VAR Bit ' bit de Signo

' -----[ Inicializacion ]-----------------------------------------------------

DEBUG CLS ' Limpia Terminal de Depuracion

' -----[ Rutina Principal]----------------------------------------------------

DO
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 109

PULSIN 6, 1, x ' medicion del eje x


PULSIN 7, 1, y ' medicion del eje y

' Escala y compensa los valores de los ejes x y y de -127 a 127.


x = (x MIN 1875 MAX 3125) - 1875 ** 13369 - 127
y = (y MIN 1875 MAX 3125) - 1875 ** 13369 - 127

' Calcula y muestra el Arcoseno de la medición del eje x.


side = x
GOSUB Arcsine
DEBUG HOME, "x tilt angle = ", CLREOL, SDEC3 angle, CR

' Calcula y muestra el Arcoseno de la medición del eje y.


side = y
GOSUB Arcsine
DEBUG "y tilt angle = ", CLREOL, SDEC3 angle

PAUSE 100 ' Pausa 1/10 segundo

LOOP ' Repite DO...LOOP

' -----[ Subrutina - Arcsine ]-----------------------------------------------

' Esta subrutina calcula arcoseno en base a la coordenada y en un circulo


' de radio 127. Establezca la variable side igual a su coordenada y antes
' de llamar a esta subrutina.

Arcsine: ' Subrutina seno inverso


GOSUB Arccosine ' Obtiene coseno inverse
angle = 90 - angle ' seno(angle) = cos(90 - angle)
RETURN

' -----[ Subrutina - Arccosine ]---------------------------------------------

' Esta subrutina calcula arcocoseno en base a la coordenada x en un circulo


' de radio 127. Establezca la variable side igual a su coordenada x antes
' de llamar a esta subrutina.

Arccosine: ' Subrutina coseno inverso


sign = side.BIT15 ' Salva el signo de side
side = ABS(side) ' Evalua side positivo
angle = 63 - (side / 2) ' Aproximacion inicial de angulo
DO ' Ciclo de aproximacion sucesiva
IF (COS angle <= side) THEN EXIT ' Hecho cuando COS angle <= side
angle = angle + 1 ' Incrementa angulo
ciclo
angle = angle */ 361 ' Convierte brads a grados
IF sign = Negative THEN angle = 180 - angle' Ajusta si el signo es negativo.
RETURN
Página 110 · Sensores Inteligentes y sus Aplicaciones

Su Turno – Pantalla LCD


Modificar el programa ejemplo para que muestre las mediciones de inclinación en la
LCD Serial Parallax implica aún agregar una rutina de inicialización y cambiar los
comandos DEBUG a comandos SEROUT. Igual que el programa de la actividad #5, este
programa muestra caracteres que no cambian en la rutina de inicialización para prevenir
parpadeo en la pantalla.

√ Salve HorizontalTilt.bs2 como HorizontalTiltLcd.bs2


√ Reemplace el comando DEBUG en la rutina de inicialización con esto:
' Initialize LCD
PAUSE 200
SEROUT 14, 84, [22, 12]
PAUSE 5

SEROUT 14, 84, [128, "x-tilt=",


148, "y-tilt="]

SEROUT 14, 84, [255, ' Define caracter personalizado 7


%01000, ' *
%10100, ' * *
%01000, ' *
%00000, '
%00000, '
%00000, '
%00000, '
%00000] '

√ Reemplace el primer comando DEBUG en el ciclo DO...LOOP de la rutina principal


con el comando SEROUT siguiente. Asegúrese de que hay 4 espacios entre las
comillas. Los 4 espacios se necesitan para borrar un máximo de 4 caracteres que
el comando pudiera enviar a la LCD: un signo negativo, 2 dígitos y el símbolo de
grados en el caracter personalizado 7.
SEROUT 14, 84, [135, " ", 135, SDEC angle, 7]

√ Reemplace el Segundo comando DEBUG en el ciclo DO...LOOP de la rutina


principal con lo siguiente. Nuevamente, asegúrese de poner 4 espacios entre
comillas para borrar el valor previo.
SEROUT 14, 84, [155, " ", 155, SDEC angle, 7]

√ Cambie PAUSE 100 a PAUSE 350.


Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 111

√ Corra el programa y pruebe la pantalla.

Su Turno - Ajustes
Si su pantalla no recorrió 90° cuando mantuvo su tarjeta en un eje vertical en particular,
puede personalizar s escalamiento y compensación para que ajuste. Esto implica
determinar la escala de salida real de su acelerómetro. Si es en realidad 1865 a 3100,
repita los pasos de la actividad #3 para hacer las correcciones de escala y compensación.
Página 112 · Sensores Inteligentes y sus Aplicaciones

RESUMEN
Este capítulo se enfoca en sensar la aceleración debida a la gravedad con el acelerómetro
biaxial Mems 2125. Esto hace posible medir tanto inclinación como rotación. El
acelerómetro Mems transmite pulsos que indican la aceleración actuando en sus ejes x y
y. A temperatura ambiente, los pulsos varían ente 3750 a 6250 μs, lo cual puede ser
usado para medir un rango entre −1 a 1 g con cualquiera de los dos ejes de sensado del
acelerómetro. El comando PULSIN se usa para medir estos pulsos y, puesto que mide el
tiempo en unidades de 2 μs, el rango que los programas tienen que examinar es 1875 a
3125.

Las mediciones del acelerómetro pueden ser desplegadas con la LCD Serial Parallax. Si
el programa ha sido ya probado con la Terminal de Depuración, desplegar mediciones
con la LCD serial es typicamente un asunto de agregar una rutina de inicialización de la
LCD al principio del programa y usar comandos SEROUT en lugar de commands DEBUG.
Los caracteres personalizados on útiles para desplegar el símbolo de grados (°) y la letra
griega mu (μ).

El acelerómetro puede ser usado para medir la rotación en un plano vertical. Para hacer
esto, BASIC Stamp debe calcular el arcotangente de la medición del eje y del
acelerómetro dividido entre su medición del eje x. Las mediciones de los ejes x y y
deben ser escaladas y compensadas para ajustarse en un rango de −127 a 127, que es lo
que el operador ATN de PBASIC necesita para regresar un ángulo, medido en radianes
binarios. Mientras qeu los ángulos dividen al círculo en 360 segmentos, los radianes
binarios lo hacen en 256 segmentos. El operator */ de PBASIC puede ser usado para
convertir una medición dada en radianes binarios a grados.

El acelerómetro puede también ser usado para medir ángulos de inclinación. Puesto que
la componente de gravedad que actúa en caja eje de sensado del acelerómetro es el seno
del ángulo de inclinación, el seno inverso o arcoseno puede ser usado en un eje de
medición para determinar el ángulo de inclinación. Una An subrutina Arcoseno puede ser
usada para calcular el ángulo (en grados) dado un valor que fluctúa entre −127 a 127.
Este rango corresponde a los valores de seno de −1 a + 1.

Puesto que tanto el operador ATN como la subrutina Arcsine esperan un valor entre
−127 y 127, se presentaron técnicas para escalamiento y compensación de las mediciones
del acelerómetro. El rango de mediciones que obtiene BASIC Stamp del acelerómetro
está en una escala de 1875 a 3125. La manera más eficiente de escalar estos valores a un
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 113

rango de −127 a 127 implica restar 1875 para alinear a cero el rango, luego usar el
operator ** para reducir la escala, después restar 127. La línea de código resultante es:
value = (value MIN 1875 MAX 3125) - 1875 ** 13369 - 127. El valor 13369
es determinado por la ecuacion de constante de escala ** en la actividad #2.

Preguntas
1. ¿Cuáles son las 7 cantidades que puede medir con un acelerómetro?
2. ¿Qué significan las siglas MEMS?
3. ¿Qué es lo que se mueve dentro del MX2125 cuando lo inclina?
4. ¿Puede la gravedad ser considerada una forma de aceleración?
5. ¿Que tiene que hacer a un programa que muestra mediciones en la Terminal de
Depuración para que las muestre en una LCD serial?
6. ¿Cómo puede restringir a una variable a un rango de valores?
7. ¿Cómo puede orientar su tarjeta para aplicar 1 g al eje x del acelerómetro?
8. ¿Cómo puede orientar su tarjeta para aplicar 0 g a ambos ejes?
9. ¿Cual es la diferencia entre un radian binario y un grado?
10. ¿Qué rango de valores aceptan los operadores SIN y COS? ¿Qué representan
estos valores?
11. ¿Cómo puede convertir de brads a grados?
12. ¿Qué rango of valores acepta el operador ATN? ¿Qué represent esos valores?
13. ¿Porqué puede usar ATN para calcular el ángulo de rotación de su tarjeta?
14. ¿Qué rango de valores está la subrutina Arccosine diseñada para aceptar? ¿Qué
representan esos valores?
15. ¿Qué rango de valores está la subrutina Arcsine diseñada para aceptar? ¿Qué
representan esos valores?
16. ¿Porqué es necesario usar la subrutina Arcsine para determinar el ángulo de
inclinación?

Ejercicios
1. Escriba un comando that receives the aceleración medición from the
acelerómetro's eje y output pin connected to P10.
2. Escriba un comando that receives the aceleración medición from the
acelerómetro's eje x output pin connected to P9.
3. Escriba un comando que convierta el eje de medición x a microsegundos.
4. Escriba un comando que convierta el eje de medición x a millisegundos.
5. Escriba una linea de código PBASIC que escale un rango de 0 a 100 a un rango
de 20 a 32.
Página 114 · Sensores Inteligentes y sus Aplicaciones

Proyects
1. Diseñe un dispositivo que cuente el número de veces que gira su tarjeta en un
plano vertical. Asuma que empieza en 0˚.
2. Diseñe un dispositivo que muestre un mensaje de alarma cada vez que ha sido
inclinado más allá de 10˚ a partir de la horizontal.
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 115

Soluciones
Q1. Aceleración, inclinación y ángulo de inclinación, pendiente, rotación, vibración,
colisión, gravedad.
Q2. Sistemas micro electromecánicos, de sus siglas en inglés Micro electro-
mechanical systems.
Q3. Una burbuja de gas caliente.
Q4. Si, ya sea estática o dinámica.
Q5. Agregar una rutina de inicialización para la LCD y convertir los comandos
DEBUG a comandos SEROUT.
Q6. Usando los operadores MAX y MIN.
Q7. Inclinarlo hacia arriba sobre su borde más largo, con los puertos servo hacia
arriba. (Como en la Figura 3-14a).
Q8. Colocarla plana sobre una mesa.
Q9. El ángulo divide un círculo en 360 unidades, mientras que un radian binario
divide un círculo en 256 unidades.
Q10. 0 a 255. Representa el ángulo, en brads (radianes binarios).
Q11. Grados = brads * 360 / 256.
Q12. -127 a +127, lo que representa los lados opuesto y adyacente de un triángulo.
Q13. Puesto que el acelerómetro medirá la aceleración actuando en el eje ym Mems,
asi como esa misma sobre su eje xm, ATN de Ay/Ax puede usarse para encontrar
el ángulo de rotación a partir del plano vertical, sobre el que g está actuando.
Q14. De -127 a 127, que representa la longitud del lado x del triángulo.
Q15. De -127 a 127, que representa la longitud del lado y del triángulo.
Q16. Sabemos por geometría que la componente de gravedad que actúa en el
acelerómetro es g sin θ, entonces para obtener el ángulo debemos tomar
arcoseno.

E1. y VAR Word


PULSIN 10, 1, y
E2. x VAR Word
PULSIN 9, 1, x
E3. x = x * 2
E4. x = x * 2 / 1000
-O-
x = x /500
E5. value = (value MIN 0 MAX 100) ** 8519 + 20
Página 116 · Sensores Inteligentes y sus Aplicaciones

P1. Ejemplo de solución:


' Sensores Inteligentes y sus Aplicaciones - Ch3Proj1.bs2
' Basado en VertWheelRotation.bs2, este dispositivo cuenta el numero
' de veces que la tarjeta ha sido girada en el plano vertical.

'{$STAMP BS2}
'{$PBASIC 2.5}

angle VAR Word


angleOld VAR Word
x VAR Word
y VAR Word
turnCount VAR Word

PAUSE 250 ' Inicializa LCD


SEROUT 14, 84, [22, 12]
PAUSE 5

SEROUT 14, 84, [128, DEC5 turnCount]

DO

PULSIN 6, 1, x
PULSIN 7, 1, y

x = (x MIN 1875 MAX 3125) - 1875 ** 13369 - 127


y = (y MIN 1875 MAX 3125) - 1875 ** 13369 - 127

angle = x ATN y
angle = angle */ 361

IF (angle >= 90 y angle < 180) y (angleOld < 90 OR angleOld >= 270) THEN
turnCount = turnCount + 1
angleOld = angle
ENDIF

IF angle >= 270 y (angleOld >= 90 y angleOld < 180) THEN


turnCount = turnCount + 1
angleOld = angle
ENDIF

SEROUT 14, 84, [128, DEC5 (turnCount / 2)]

LOOP

P2. Ejemplo de solución: rutina principal de HorizontalTilt.bs2, modificada


' -----[ Rutina Principal ]---------------------------------------------------

DO
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 117

PULSIN 6, 1, x ' medicion del eje x


PULSIN 7, 1, y ' medicion del eje y

' Escala y compensa valores de los ejes x y y a -127 a 127.


x = (x MIN 1875 MAX 3125) - 1875 ** 13369 - 127
y = (y MIN 1875 MAX 3125) - 1875 ** 13369 - 127

' Calcula y muestra Arcoseno de la medicion del eje x.


side = x
GOSUB Arcsine
DEBUG HOME, "x tilt angle = ", CLREOL, SDEC3 angle, CR

IF ABS(angle) > 10 THEN


DEBUG CRSRXY, 0, 2, "Warning! Check x-axis!"
ELSE
DEBUG CRSRXY, 0, 2, CLREOL
ENDIF

' Calcula y muestra Arcoseno de la medicion del eje y.


side = y
GOSUB Arcsine
DEBUG CRSRXY, 0, 1, "y tilt angle = ", CLREOL, SDEC3 angle

IF ABS(angle) > 10 THEN


DEBUG CRSRXY, 0, 3, "Warning! Check y-axis!"
ELSE
DEBUG CRSRXY, 0, 3, CLREOL
ENDIF

PAUSE 100 ' Pause 1/10 second

LOOP ' Repeat DO...LOOP


Página 118 · Sensores Inteligentes y sus Aplicaciones
Chapter 4: El módulo de brújula Hitachi HM55B · Page 119

Capítulo 4: El Módulo de brújula Hitachi HM55B


El módulo de brújula Hitachi HM55B mide dirección. Puede usarlo junto con su BASIC
Stamp Board of Education y la LCD Serial Parallax para hacer una brújula digital que
trabaje como se muestra en la Figura 4-1. El integrado en el módulo Hitachi HM55B es
una característica más y más común en la electrónica de los automóviles la cual provee
una dirección de brújula al conductor. El módulo de brújula también es una gran
herramienta para robóts móviles, dándoles un sentido de dirección que puede hacer una
diferencia enorme en justas deportivas robóticas así como también en laberintos.

Figura 4-1
módulo de brújula Hitachi en la
tarjeta Board of Education con
una pantalla LCD

Este capítulo usa versiones modificadas de los programas en la documentación del


producto del módulo de brújula Hitachi HM55B para prueba y calibración. También
presenta el promedio como una manera de filtrar el ruido en la medición y demostrar
como modificar los programas ejemplo existentes para mostrar la dirección de la brújula
en la LCD Serial Parallax.

INTERPRETACIÓN DE LAS MEDICIONES DE LA BRÚJULA


La documentación de producto del módulo de brújula Hitachi HM55B tiene programas
ejemplo que usan todos una subrutina llamada Compass_Get_Axes que regresa
mediciones de intensidad de campo magnético en x y y. El valor de x es la componente
del campo magnético de la tierra actuando en el eje xm del sensor (Figura 4-2). El valor
de y es el negativo del campo magnético de la tierra actuando en el eje ym. Si N es el
valor reportado por x o y cuando está alineado con el campo magnético de la tierra,
Página 120 · Sensores Inteligentes y sus Aplicaciones

entonces la medición x en cierto ángulo θ será N cos θ y la medición y será −N sin θ.


Con esto y un par de identidades trigonométricas se verá que θ es el arcotangente de
−y/x. Luego, además de la rotacion del acelerómetro, el ángulo del módulo de la brujula a
partir de norte es otro valor que puede ser determinado usando ATN de PBASIC.

Figura 4-2
Ejes de sensado del módulo de brújula

−N sin θ − y
tan θ = =
N cos θ x

⎛−y⎞
tan −1 (tan θ ) = tan −1 ⎜⎜ ⎟⎟
⎝ x ⎠

⎛−y⎞
θ = tan −1 ⎜⎜ ⎟⎟
⎝ x ⎠

ACTIVIDAD #1: CONEXION Y PRUEBA DEL MÓDULO DE BRÚJULA


Conectará el módulo de brújula al BASIC Stamp y correrá un programa de prueba.
Verificará que las conexiones eléctricas del módulo están correctas y listas para operar.

Conectando el Módulo de brújula


El módulo de brújula Hitachi HM55B necesita conexiones a Vdd y Vss (tensión y tierra)
y 3 conexiones de linea de comunicación hacia el BASIC Stamp.

Partes Requeridas
(1) Módulo de brújula Hitachi HM55B
(6) Cables para conexiones

No se requieren resistencias o capacitores externos; están interconstruídos en el módulo.


Chapter 4: El módulo de brújula Hitachi HM55B · Page 121

Diagramas de cableado y esquemático


El HM55B puede ser conectado con sus pines Dout y Din pins unidos para transmitir y
recibir señales de y al mismo pin de E/S de BASIC Stamp. Otro pin de E/S de BASIC
Stamp es conectado al pin de reloj del dispositivo. El BASIC Stamp enviará pulsos a este
pin mientras que hace que el chip envíe su estado o sus mediciones o reciba comandos.
BASIC también envía señales de nivel bajo al pin Enable del módulo de brújula antes de
intercambiar cualquier dato y para inicializar cada medición de campo magnético.

√ Construya el circuito mostrado en la Figura 4-3.

Figura 4-3: Diagramas de cableado y esquemático del módulo de brújula

Probando el Módulo de brújula


Este programa ejemplo hace una prueba para asegurarse que el módulo de brújula está
bien conectado y trabaja bien. Pueden haber diferencias notables entre el norte magnético
reportado por una brújula mecánica y el reportado por el módulo brújula. Después de los
programas de calibración en las siguientes actividades, todos los errores de medición
aparentes deben desaparecer.

La Figura 4-4 muestra lo que la brújula debe mostrar cuando detecta que apunta a 35° en
sentido horario respecto al norte. No se preocupe ahora de una dirección exacta, el
programa solo está probando que el modulo trabaja. Hasta ahora y si lo usa para una idea
general de ubicación del norte, sur, este y oeste, debe estar funcionando.
Página 122 · Sensores Inteligentes y sus Aplicaciones

Figura 4-4: Salida de la Terminal de Depuración con la brújula apuntando a 35° en sentido
horario respecto al norte.

Programa Ejemplo: TestCompass.bs2

¡Descarga grátis! Este programa está disponible como el archivo gratuito de en la página
de Producto de “Sensores Inteligentes y sus Aplicaciones”, en www.parallax.com.

√ Baje y descomprima el código fuente seleccionado desde la página de producto


de “Sensores Inteligentes y sus Aplicaciones” en www.parallax.com.
√ Abra TestCompass.bs2 con el Editor BASIC Stamp y corra el programa.
√ La Terminal de Depuración debe mostrar las mediciones de los ejes x y y de la
brújula y el ángulo al que apunta, en sentido horario a partir del norte.
√ Si reporta mediciones con menos de 40° de error, está trabajando y está lista para
el programa de calibración presentado en la actividad #2.

' -----[ Titulo ]-------------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - TestCompass.bs2
' Prueba para asegurar que el módulo de brújula Hitachi HM55B esta trabajando.

' {$STAMP BS2}


' {$PBASIC 2.5}

' -----[ Definiciones E/S]----------------------------------------------------


Chapter 4: El módulo de brújula Hitachi HM55B · Page 123

DinDout PIN 2 ' P2 transmite-recibe a/de Din/Dout


Clk PIN 0 ' P0 manda pulsos al reloj de HM55B
En PIN 1 ' P2 controla pin EN(ABLE) de HM55B

' -----[ Constantes ]---------------------------------------------------------

Reset CON %0000 ' comando Reset de HM55B


Measure CON %1000 ' comando de inicio de medicion
Report CON %1100 ' comando para recibir status/valores de ejes
Ready CON %1100 ' 11 -> Hecho, 00 -> no errores
NegMask CON %1111100000000000 ' Para negativos 11-bit a 16-bits

' -----[ Variables ]----------------------------------------------------------

x VAR Word ' datos del eje x


y VAR Word ' datos del eje y
status VAR Nib ' banderas de Status
angle VAR Word ' Guarda medicion de angulo

' -----[ Rutina Principal]----------------------------------------------------

DO ' Ciclo principal

GOSUB Compass_Get_Axes ' Obtiene valores de x y y

angle = x ATN -y ' Convierte x y y a brads


angle = angle */ 361 ' Convierte brads a grados

DEBUG HOME, "x-axis N(-S) = ",SDEC x, ' Muestra ejes y grados


CLREOL, CR, "y-axis W(-E) = ",
SDEC y, CLREOL, CR, CR, "angle = ",
DEC angle, " degrees", CLREOL

PAUSE 150 ' Retraso Debug para alentar PC

LOOP ' Repite ciclo principal

' -----[ Subrutina - Compass_Get_Axes ]--------------------------------------

Compass_Get_Axes: ' subrutina modulo de brujula

HIGH En: LOW En ' Manda comando reset a HM55B


SHIFTOUT DinDout,clk,MSBFIRST,[Reset\4]

HIGH En: LOW En ' HM55B comando inicio medicion


SHIFTOUT DinDout,clk,MSBFIRST,[Measure\4]
status = 0 ' Borra status anterior de banderas

DO ' Ciclo de chequeo de Status de banderas


HIGH En: LOW En ' comando de status medicion
Página 124 · Sensores Inteligentes y sus Aplicaciones

SHIFTOUT DinDout,clk,MSBFIRST,[Report\4]
SHIFTIN DinDout,clk,MSBPOST,[Status\4] ' Obtiene Status
ciclo UNTIL status = Ready ' Deja ciclo cuando status esta listo

SHIFTIN DinDout,clk,MSBPOST,[x\11,y\11] ' Obtiene valores de ejes x & y


HIGH En ' Deshabilita Modulo

IF (y.BIT10 = 1) THEN y = y | NegMask 'Guarda 11-bits como palabra con signo


IF (x.BIT10 = 1) THEN x = x | NegMask ' Repite para el otro eje

RETURN

Su Turno - Experimentos con campos magnéticos


No hay muchos lugares donde el campo magnético de la tierra sea paralelo al suelo. Esto
mas bien ocurre apuntando ya sea hacia arriba o abajo a partir del suelo. El ángulo al cual
el campo magnético de la tierra apunta hacia o desde el suelo es llamado inclinación.

√ Mantenga su tarjeta a nivel y alinee el eje x de su módulo brújula con el norte


magnético. Cuando el eje x esta alineado con el norte, la Terminal de Depuración
debe mostrar el mayor valor de x y en el ángulo debe leer 0 grados.
√ Mantenga apuntando su brújula al norte, pero ahora inclinela arriba y abajo. Es
muy probable que encuentre una medición aún mayor en cierta inclinación que
cuando la sostuvo nivelada. Esto es porque el campo magnético est apuntando
hacia o desde el suelo en su posición.
√ Anote la medición más grande del eje x que pudo conseguir.

La declinación es la cantidad de grados entre el norte magnético y el norte verdadero.


Para los Estados Unidos, puede encontrar información de esta diferencia en
http://nationalatlas.gov. En el momento de escribir este texto se podía encontrar un
artículo con información acerca la inclinación y un mapa de declinaciones en:

http://nationalatlas.gov/articles/geology/a_geomag.html

Uno de los mapas en esta página también muestra la intensidad total del campo
magnético en nanoteslas. La tesla (T) es una medición de la intensidad del campo
magnético, y nanoteslas (nT) son billonésimas de tesla. Las lecturas que regresan los ejes
x y y del módulo brújula están aproximadamente en millonésimas de teslas (µT). De
acuerdo con la hoja de datos del HM55B, las unidades de su modulo brújula podrían estar
entre 1 a 1.6 μT.
Chapter 4: El módulo de brújula Hitachi HM55B · Page 125

√ Encuentre un mapa de intensidad total del campo magnético que muestre su


localidad y luego úselo para calcular las unidades de intensidad del campo
magnético del eje x para su módulo brújula. Si la intensidad total del campo
magnético está listada en nanoteslas, entonces su resultado estará en nanoteslas
por unidad del eje x. Para convertir a microteslas, divida su resultado entre
1000.

total magnetic field intensity


x axis units =
x axis reading

El módulo de brújula puede también sensar campos magnéticos de imanes, ¡pero estos
pueden dañar el sensor! ¡TENGA GUIDADO!

No coloque imanes muy poderosos cerca del módulo brújula!


Mantenga imanes en barra, herradura y electroimanes bastante alejados de su módulo de
brújula hasta que haya determinado una distancia segura usando el procedimiento
siguiente. Asegúrese de nunca acercarlos de tal forma que se produzcan lecturas en los
ejes x y y mayores a ±300, porque podría dañar el módulo.

√ Comience por poner su tarjeta en una mesa y alinear hacia arriba su eje x con el
norte magnético.
√ Sostenga una barra magnética sobre el módulo de brújula con su polo S
apuntando al norte y su polo No apuntando al sur como se muestra en la Figura
4-5. Comience por 1 m por encima y bájela hasta que la Terminal de Depuración
reporte una lectura de 120 en el eje x.
Página 126 · Sensores Inteligentes y sus Aplicaciones

Figura 4-5: Campo magnético de una barra magnética sobre el módulo brújula

√ Mantenga la barra magnética horizontal a la misma altura y rótela para que sus
polos N y S no estén alineados con el norte y sur terrestre. Conforme gira, la
rotación de la barra magnética debe ser fácil de rastrear con la Terminal de
Depuración.

Note como el campo magnético actuando sobre el módulo de brújula fué opuesto a lo que
mostraban los poles en la barra magnética. Esto es debido a la forma en que el campo
magnético da la vuelta del polo norte al sur de la barra magnética. La Figura 4-5 ilustra
esto con lineas de campo magnético que muestran el patrón del campo magnético
alrededor de la barra magnética.
Chapter 4: El módulo de brújula Hitachi HM55B · Page 127

También puede sostener la barra magnética al mismo nivel con el module brújula,
directamente enfrente, como se muestra en la Figura 4-6a. Esta vez los polos del imán
están alineados con el norte y el sur en vez de estar opuestos.

√ Con la barra magnética orientada en la Posición 1 como se muestra en la Figura


4-6b y su tarjeta orientada al norte, encuentre una distancia que cause una
medición x de 120. Empiece a 1 m de distancia nuevamente.
√ Luego, intente colocar la barra magnética en las posiciones 2 a la 6. ¿Puede usar
la Terminal de Depuración para determinar dónde está la barra magnética?

Figura 4-6: Encontrando los límites de la distancia segura

a. b.

Mediciones entre 127 y 300


Recuerde que las entradas del comando ATN pueden variar de −127 a 127. Si sostiene la
barra magnética lo suficientemente cercana al módulo de brújula como para causar
mediciones por encima de 127, necesitará divisonar proporcionalmente las mediciones
antes de usar el comando ATN. El procedimiento de escalado presentado en el capítulo 3,
actividad #3 trabajará bien para estos fines.

La barra magnética de una brújula mecánica tendrá un efecto similar. No se trata de un


imán muy poderoso, asi es que probablemente no habrá problema si se le acerca mucho al
Página 128 · Sensores Inteligentes y sus Aplicaciones

módulo brújula. Con una brújula mecánica, su barra magnética automáticamente se alinea
con el norte, asi es que tendrá que mover el módulo de brújula alrededor de la brújula
mecánica y no al revés.

√ Inténtelo y note cuánta distorsión causa una brújula mecánica cercana sobre las
mediciones del módulo brújula.

Teniendo esta lección presente, asegúrese de mantener brújulas mecánicas muy lejos del
módulo de brújula al ejecutar y probar las calibraciones en las siguientes 2 actividades.

ACTIVIDAD #2: CALIBRACIÓN DEL MÓDULO DE BRÚJULA


El proceso de calibración involucra apuntar el módulo de brújula a direcciones conocidas
y correctas mientras que corre el programa de calibración. El programa de calibración
grabará los valores reportados por el módulo de brújula en una parte no utilizada de la
memoria de programación EEPROM del BASIC Stamp. Cuando corra el programa en la
siguiente actividad, leerá estos valores de la EEPROM y los usará para determinar la
dirección real del módulo brújula. Esto es llamado “calibración en software” porque el
procedimiento no hace ajustes físicos al módulo brújula.

Procedimiento y Configuración de la Calibración


La configuración involucra alinear una impresion de la brújula y pegarla a una superficie
plana. El procedimiento involucra correr el programa ejemplo de esta actividad y seguir
los mensajes mientras que alinea la tarjeta Board of Education a los puntos varios en la
rueda de la brújula.

Configuración
√ Imprima o haga una fotocopia de la Figura 4-7. Si está trabajando con una copia
impresa del libro y no tiene una fotocopiadora a su disposición, solo baje la
version .pdf de este texto de la página del producto Sensores Inteligentes y sus
Aplicaciones en www.parallax.com. Luego, haga una impresión.
Chapter 4: El módulo de brújula Hitachi HM55B · Page 129

Figura 4-7: Brújula de calibración

√ Coloque su copia de la Figura 4-7 sobre una superficie plana, nivelada y no


metálica. Asegúrese que está tan lejos de su monitor como lo permita su cable de
programación. La posición debe ser tan lejos como sea posible de contenedores
metálicos, equipos y cualquier otra fuente potencial de interferencia de campo
magnético. Revise que su mesa no tenga herrajes metálicos por debajo.
√ Antes de completar su posición, coloque su brújula mecánica muy lejos de
cualquier fuente de interferencia magnética y note la direccion. Luego, coloque
Página 130 · Sensores Inteligentes y sus Aplicaciones

la brújula mecánica en su superficie de trabajo. La dirección del norte al que


apunta no debe cambiar. Si cambia, encuentre una posición diferente sin
interferencia magnética.
√ Use la brújula mecánica para alinear la linea de 0° con el norte magnético como
se muestra en la Figura 4-8.
√ Pegue la impresión a al mesa asegurando que no doble la hoja al hacerlo.
√ Coloque la brújula mecánica muy lejos de su impresión.

Figura 4-8
Alineando al Norte
Magnético

Procedimiento
Cuando corra CalibrateCompass.bs2, le pedirá alinear su tarjeta a varios ángulos en la
impresión de la brújula y presionar la tecla enter después de cada uno. Los primeros dos
ángulos (0 y 90°) se muestran en la Figura 4-9.

Figura 4-9: Brújula a 0° y 90°

a. b.
Chapter 4: El módulo de brújula Hitachi HM55B · Page 131

Cuando corra CalibrateCompass.bs2, primero se le pedira hacer click en la ventana de


transmission de la Terminal de Depuración (mostrada en la Figura 4-10), y luego dar
Enter. Después se le pedirá teclear C para calibrar o R para revisar la configuración de la
calibración. Teclear la letra C comenzará la calibración, durante la cual se le pedirá
apuntar la brújula a 0° y 90° como se muestra en la Figura 4-9, y luego a: 180°, 270°, 0°,
22.5°, 45°, 67.5°, 90°, 112.5°, 135°, 157.5°, 180°, 202.5°, 225°, 247.5°, 250°, 292.5°,
315°, y finalmente, 337.5°. Necesitará presionar Enter antes de que mueva su tarjeta a
cada ángulo.

√ Abra y corra CalibrateCompass.bs2.


√ Siga las instrucciones hasta que obtenga el mensaje "CALIBRATION
COMPLETED".
√ Si comete un error reinicie el programa desde el principio. El proceso de
calibración solo toma un minuto o dos vale la pena tener la configuración
correcta en la memoria EEPROM de su BASIC Stamp 2.

Figura 4-10: Ventana de transmisión

Transmit
Windowpane
Página 132 · Sensores Inteligentes y sus Aplicaciones

Programa Ejemplo - CalibrateCompass.bs2

¡Descarga grátis! Este programa esta disponible como descarga grátis .bs2 en la página
del producto de Sensores Inteligentes y sus Aplicaciones en www.parallax.com. Si desea
saber cómo trabaja este programa, lea los comentarios aquí.

' -----[ Titulo ]-------------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - CalibrateCompass.bs2
' Este programa colecta y guarda mediciones del módulo Hitachi HM55B en la
' EEPROM para correcciones de interpolation lineal y compensacion en eje que
' será ejecutada por TestCalibratedCompass.bs2.
'
' {$STAMP BS2}
' {$PBASIC 2.5}
'
' IMPORTANTE: Siga las instrucciones en el capítulo #4, actividad #2 de
' Sensores Inteligentes y sus Aplicaciones. Disponible como
' descarga en la pagina de Sensores Inteligentes y sus
' Aplicaciones en www.parallax.com.

' -----[ Datos EEPROM]--------------------------------------------------------

CompassOffsets DATA @ 0, (4) ' Guardan compensaciones de ejes x y y


CompassLowVal DATA (1) ' Guarda indice del mas bajo angulo
CompassCal DATA (16) ' 16 angulos de referencia para brújula

' -----[ Definiciones de Pin]-------------------------------------------------


DinDout PIN 2 ' P2 transmite-recibe de/a Din/Dout
Clk PIN 0 ' P0 manda pulsos al Reloj de HM55B
En PIN 1 ' P1 controla /EN(ABLE) de HM55B

' -----[ Constantes ]---------------------------------------------------------


Reset CON %0000 ' Comando Reset para HM55B
Measure CON %1000 ' Comando de inicio de medicion
Report CON %1100 ' Comando obtener status/valores de eje
Ready CON %1100 ' 11 -> Hecho, 00 -> no errores
NegMask CON %1111100000000000 ' De negativo 11-bit a 16-bits

Current CON 0 ' Indice para arreglo tabular


Previous CON 1 ' Indice para arreglo tabular

' -----[ Variables ]----------------------------------------------------------


x VAR Word ' Datos del eje x
y VAR Word ' Datos del eje y
status VAR Nib ' Banderas de status
angle VAR Word ' Medicion de Angulo
counter VAR Byte ' Contador de ciclo
index VAR Nib ' Indice EEPROM
character VAR Byte ' Guarda un caracter DEBUGIN
Chapter 4: El módulo de brújula Hitachi HM55B · Page 133

integer VAR Word ' Valores enteros para pantalla


fraction VAR Nib ' Valores fraccionales para pantalla
brads VAR Byte ' Mediciones de radianes binarios
table VAR Byte(2) ' Guarda valores en tabla
temp VAR Word(2) ' Guarda mediciones de ejes
axisOffset VAR Word ' Guarda valor de compensacion de eje

' -----[ Rutina Principal ]---------------------------------------------------

DEBUG "Click the Transmit Windowpane, ", CR, ' Espera al usuario.
"then press Enter... ", CR, CR

DEBUGIN character

DO ' Ciclo principal

DEBUG "Type a character: ", CR, ' Menu


"C - calibrate ", CR,
"R - review calibraciónsettings", CR,
"> "
DEBUGIN Character ' Obtener seleccion del usuario
DEBUG CR

IF character = "c" OR character = "C" THEN ' "c" -> calibrate


GOSUB Compass_Calibrate ' "r" -> review settings
ELSEIF character = "r" OR character = "R" THEN
GOSUB Calibration_Review
ENDIF

DEBUG CR, "Press any key to", ' espera por el usuario
CR, "continue"
DEBUGIN character
DEBUG CR, CR

LOOP ' Repite ciclo principal

' -----[ Subrutina - Compass_Calibrate ]-------------------------------------

Compass_Calibrate:

GOSUB Get_And_Store_Axis_Offsets
GOSUB Get_And_Store_Interpolation
GOSUB Get_And_Store_Low_Value_Address
DEBUG CR, "CALIBRATION COMPLETED...", CR,
"You are now ready to run ", CR,
"TestCalibratedCompass.bs2.", CR
RETURN

' -----[ Subrutina - Get_And_Store_Axis_Offsets ]----------------------------

' Esta subrutina pide al usuario apuntar la brújula a norte, luego este, luego
Página 134 · Sensores Inteligentes y sus Aplicaciones

' sur, luego oeste. Luego promedia los valores maximo y minimo para cada
' eje y guarda ese promedio en el area EEPROM reservada por la directiva
' CompassOffsets DATA .

Get_And_Store_Axis_Offsets:

' El ciclo FOR...NEXT repite para 4 mediciones de eje.


FOR counter = 0 TO 3

' Instruye al usuario apuntar brújula a una direccion particular y espera


' por el caracter ENTER.
DEBUG CR, "Point compass to "
LOOKUP counter, [ 0, 90, 180, 270 ], integer
DEBUG DEC integer
DEBUG " degrees", CR, "then press Enter..."
DEBUGIN character

GOSUB Compass_Get_Axes ' Obtiene mediciones de eje

' Calcula compensacion en base a valores max y min de cada eje y guarda
' en la EEPROM.
SELECT counter
CASE 0 ' Norte
temp(0) = x
CASE 1 ' Este
temp(1) = y
CASE 2 ' Sur
x = x + temp(0)
IF x.BIT15 = 1 THEN
x = ABS(x)/2
x = -x
ELSE
x = x / 2
ENDIF
WRITE CompassOffsets, Word x
CASE 3 ' Oeste
y = y + temp(1)
IF Y.BIT15 = 1 THEN
y = ABS(y)/2
y = - y
ELSE
y = x / 2
ENDIF
WRITE CompassOffsets + 2, Word y
ENDSELECT

NEXT

RETURN

' -----[ Subrutinea - Get_And_Store_Interpolation ]----------------------


Chapter 4: El módulo de brújula Hitachi HM55B · Page 135

' Esta subrutina pide al usuario apuntar la brújula a direcciones separadas


' cada 22.5 grados y guarda el angulo para cada medicion en el area EEPROM
' reservada por la directiva CompassCal DATA.

Get_And_Store_Interpolation:

FOR counter = 0 TO 15
DEBUG CR, "Point brújula to "
LOOKUP counter, [0, 22, 45, 67, 90, 112, 135, 157,
180, 202, 225, 247, 270, 292, 315, 337], integer
LOOKUP counter, [ 0, 5, 0, 5, 0, 5, 0, 5,
0, 5, 0, 5, 0, 5, 0, 5 ], fraction
DEBUG DEC integer
IF fracción = 5 THEN DEBUG ".", DEC fraction
DEBUG " degrees", CR, "then press Enter..."
DEBUGIN character ' Espera al usuario
GOSUB Compass_Get_Axes ' Obtiene valores x y y
GOSUB Compass_Correct_Offsets ' Compensacion de eje correcta
angle = x ATN - y ' Convirte x y y a brads
WRITE CompassCal + counter, angle ' Guarda como valor brad
NEXT

RETURN

' -----[ Subrutina - Get_And_Store_Low_Value_Address ]-----------------------

' Esta subrutina encuentra y guarda la dirección del mas bajo valor en el area
' EEPROM reservada por la directiva CompassCal DATA y la guarda en un byte
' reservado por la directiva CompassLowVal DATA. Esto reduce el código
' en TestCalibratedCompass.bs2.

Get_And_Store_Low_Value_Address:

index = 8
table(current) = 0: table(previous) = 0
DO
index = index + 1
READ CompassCal + index, table(current)
READ CompassCal + (index - 1 & $F), table(previous)
ciclo UNTIL table(current) < table(previous)
WRITE CompassLowVal, index

RETURN

' -----[ Subrutina - Calibration_Review ]------------------------------------

' Muestra valores EEPROM.

Calibration_Review:
Página 136 · Sensores Inteligentes y sus Aplicaciones

DEBUG CR, "Axis Offsets:", CR


READ CompassOffsets, Word x
DEBUG CR, "x-Offset = ", SDEC x
READ CompassOffsets + 2, Word y
DEBUG CR, "y-Offset = ", SDEC y, CR

DEBUG CR, "Index of low value en CompassCal:", CR


READ CompassLowVal, index
DEBUG CR, "Low value ", ? index

DEBUG CR, "TestCalibratedCompass.bs2", CR,


"uses these values to ", CR,
"correct errors:", CR

DEBUG CR, "Brad Angle Degree Angle",


CR, "Ideal Actual Ideal Actual",
CR, "------ ------ ------ ------", CR

FOR counter = 0 TO 15
brads = counter * 16
DEBUG CRSRX, 1, DEC3 brads
READ CompassCal + counter, angle
DEBUG CRSRX, 10, DEC3 angle
LOOKUP counter, [0, 22, 45, 67, 90, 112, 135, 157,
180, 202, 225, 247, 270, 292, 315, 337], integer
LOOKUP counter, [ 0, 5, 0, 5, 0, 5, 0, 5,
0, 5, 0, 5, 0, 5, 0, 5 ], fraction
DEBUG CRSRX, 19, DEC3 integer, ".", DEC fraction
angle = angle */ 361 ' Convierte brads a grados
DEBUG CRSRX, 28, DEC3 angle, CR
PAUSE 50 ' Retardo Debug para alentar PCs
NEXT

DEBUG CR

RETURN

' -----[ Subrutina - Compass_Get_Axes ]--------------------------------------

Compass_Get_Axes: ' subrutina módulo de brújula

HIGH En: LOW En ' Comando envia reset al HM55B


SHIFTOUT DinDout,clk,MSBFIRST,[Reset\4]

HIGH En: LOW En ' Comando HM55B inicia medición


SHIFTOUT DinDout,clk,MSBFIRST,[Measure\4]
status = 0 ' Limpia banderas status previas

DO ' Ciclo de checar status banderas


HIGH En: LOW En ' Comando de status de medicion
SHIFTOUT DinDout,clk,MSBFIRST,[Report\4]
Chapter 4: El módulo de brújula Hitachi HM55B · Page 137

SHIFTIN DinDout,clk,MSBPOST,[Status\4] ' Obten Status


ciclo UNTIL status = Ready ' Fin ciclo si status es listo

SHIFTIN DinDout,clk,MSBPOST,[x\11,y\11] ' Obten valores de ejess x & y


HIGH En ' Deshabilita modulo

IF (y.BIT10 = 1) THEN y = y | NegMask ' Guarda 11-bits,palabra con signo


IF (x.BIT10 = 1) THEN x = x | NegMask ' Repite para el otro eje

RETURN

' -----[ Subrutina - Compass_Correct_Offsets ]-------------------------------

' Esta subrutina corrige interferencia acumulativa del campo magnético que
' puede venir de fuentes como PCB, cables, baterias cercanas o una fuente de
' corriente cercana. Esta subrutina confia en los valores guardados en el
' espacio EEPROM antes reservado por la directiva CompassOffsets DATA.
' Estos valores EEPROM son escritos por este programa durante la calibracion.

Compass_Correct_Offsets:

READ CompassOffsets, Word axisOffset ' Obtiene compensacion eje x


x = x - axisOffset ' corrige eje x
READ CompassOffsets + 2, Word axisOffset ' Obtiene compensacion eje y
y = y - axisOffset ' corrige eje y

RETURN

Su Turno – Revisando la confirguración de la calibración


En la rutina principal, tecleó la letra C para guardar valores de calibración en la
EEPROM de BASIC Stamp. También puede revisar estos valores de calibración
corriendo el programa y tecleando R en vez de C. Esto mostrará una comparación de las
mediciones de ángulo reales vs. ideales en radianes binarios. Estos errores son causados
en parte por la tarjeta o circuito impreso donde el sensor está montado. Algunos de los
materiales en el circuito son magnéticos y no están necesariamente alineados con el
campo magnético de la tierra. Otras fuentes de campo magnético que pueden causar
errores de medición provienen de corrientes eléctricas cercanas, como electrones
fluyendo por las lineas Vdd y Vss para energizar el LED de encendido de su tarjeta.

√ Corra CalibrateCompass.bs2 nuevamente.


√ Haga click en la ventana de Transmisión de la Terminal de Depuración y Enter.
√ Teclee R para revisar la configuración de la calibración.
√ Examine los errores reportados, los cuales el programa ejemplo en la siguiente
actividad usará para hacer correcciones.
Página 138 · Sensores Inteligentes y sus Aplicaciones

ACTIVIDAD #3: PROBANDO LA CALIBRACIÓN


Después de la actividad #2, el programa en esta actividad debería hacer que su brújula
funcione muy bien, lo suficientemente para reconocer correctamente la mayoría de las 64
direcciones en la Figura 4-11. En esta actividad, la Figura 4-11 se usará para probar el
funcionamiento del módulo brújula.

Figura 4-11: Escala de 64 direcciones


Chapter 4: El módulo de brújula Hitachi HM55B · Page 139

Direccionamiento
TestCalibratedCompass.bs2 va y encuentra los valores que CalibrateCompass.bs2 grabó
en la memoria EEPROM del BASIC Stamp. Luego, usa los valores a corregir para
escalar el error, y refina las mediciones usando unaa tecnica llamada interpolación lineal.

√ Imprima o fotocopie la escala mostrada en la Figura 4-11 y siga la configuración


en la actividad #2 para alinearla al norte y fijarla a la mesa.
√ Calcule los ángulos no marcados en la escala.
√ Abra y corra TestCalibratedCompass.bs2.
√ Alinee su tarjeta a los varios ángulos, y compare los ángulos medidos reportados
por el módulo de brújula contra los ángulos reales.

Si esto aún no es suficiente precisión para usted, la siguiente actividad le mostrará cómo
mejorar aún más.

Programa Ejemplo: TestCalibratedCompass.bs2

Descarga Gratis. Este programa está disponible como descarga grátis .bs2 en la página
del producto Sensores Inteligentes y sus Aplicaciones en www.parallax.com. Lea los
comentarios del código para una explicación de cómo funciona.

' -----[ Titulo ]-------------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - TestCalibratedCompass.bs2
' Demuestra la precision del modulo brújula Hitachi HM55B después de
' calibración con CalibrateCompass.bs2.

' {$STAMP BS2}


' {$PBASIC 2.5}
'

' -----[ Descripcion del Programa]--------------------------------------------


'
' Este programa despliega las siguientes mediciones del Sensor brújula
' Hitachi HM55B:
'
' - Mediciones de campo magnético de ejes x y y corregidas en compensacion
' - Angulo en radianes binarios en sentido horario a partir del norte,
' corregidos por tabla de interpolacion lineal
' - angulo en grados en sentido horario a partir del norte,
' corregidos por tabla de interpolacion lineal

' IMPORTANTE: Este programa confia en los valores EEPROM guardados por
' CalibrateCompass.bs2 durante el proceso de calibración.
Página 140 · Sensores Inteligentes y sus Aplicaciones

' Ese proceso de calibración debe ser ejecutado antes de correr


' este programa prueba.
'
' Para instrucciones de como ejecutar el proceso de calibración,
' consulte el Captitulo #4, actividad #2 de Sensores Inteligentes
' y sus Aplicaciones. Esta disponible para descargar en la pagina
' de Sensores Inteligentes y sus Aplicaciones en
' www.parallax.com.

' -----[ EEPROM Data ]--------------------------------------------------------

CompassOffsets DATA @ 0, (4) ' Guarda compensaciones de ejes x y y


CompassLowVal DATA (1) ' Guarda indice del angulo mas bajo
CompassCal DATA (16) ' 16 angulos de referencia para brújula

' -----[ Definiciones de Pines ]----------------------------------------------

DinDout PIN 2 ' P6 transmite-recibe de/a Din/Dout


Clk PIN 0 ' P5 envia pulsos al reloj de HM55B
En PIN 1 ' P4 controla EN(ABLE) de HM55B

' -----[ Constantes ]---------------------------------------------------------

Reset CON %0000 ' Comando Reset para el HM55B


Measure CON %1000 ' Comando de inicio de medicion
Report CON %1100 ' Comando obtener status/valores de eje
Ready CON %1100 ' 11 -> Hecho, 00 -> no errores
NegMask CON %1111100000000000 ' De negativo 11-bit a 16-bits
current CON 0 ' Indice para arreglo tabular
previous CON 1 ' Indice para arreglo tabular

' -----[ Variables ]----------------------------------------------------------


x VAR Word ' Datos del eje x
y VAR Word ' Datos del eje y
status VAR Nib ' Banderas de status
angle VAR Word ' Medicion de Angulo
axisOffset VAR angle ' Compensacion del eje

index VAR Status ' Indice EEPROM


table VAR Byte(2) ' Guarda tabla de valores EEPROM
span VAR x ' Span entre entradas de tabla
angleOffset VAR y ' Compensa entre medido y tabla

' -----[ Inicializacion ]-----------------------------------------------------

DEBUG CLS

' -----[ Rutina Principal ]---------------------------------------------------

DO ' Ciclo principal


Chapter 4: El módulo de brújula Hitachi HM55B · Page 141

GOSUB Compass_Get_Axes ' Obtiene valores x y y


GOSUB Compass_Correct_Offsets ' corrige compensacs de ejes
angle = x ATN -y ' Convierte x y y a brads
DEBUG HOME, "x-axis N(-S) = ",SDEC x, ' Despliega ejes corregidos
CLREOL, CR, "y-axis W(-E) = ",
SDEC y, CLREOL
GOSUB Compass_Interpolate ' Interpolacion Lineal
DEBUG CR, CR, "angle = ", ' Muestra angulo interpolado
DEC angle, " brads", CLREOL ' ... en brads
angle = angle */ 361 ' Convierte brads a grados
DEBUG CR,"angle = ", ' Muestra angulo interpolado
DEC angle, " degrees", CLREOL ' ... en grados
PAUSE 150 ' Retraso de Debug para alentar PCs

LOOP ' Repite ciclo principal

' -----[ Subrutina - Compass_Get_Axes ]--------------------------------------

' Esta subrutina maneja la communication BASIC Stamp - HM55B y guarda las
' mediciones de fuerza de campo magnético regresadas por el dispositivo en
' las variables de ejes x y y.

Compass_Get_Axes: ' subrutina módulo de brújula

HIGH En: LOW En ' Envía comando reset a HM55B


SHIFTOUT DinDout,clk,MSBFIRST,[Reset\4]

HIGH En: LOW En ' Comando inicia medición HM55B


SHIFTOUT DinDout,clk,MSBFIRST,[Measure\4]
status = 0 ' Limpia banderas status previas

DO ' Ciclo de checar status banderas


HIGH En: LOW En ' Comando de status de medicion
SHIFTOUT DinDout,clk,MSBFIRST,[Report\4]
SHIFTIN DinDout,clk,MSBPOST,[Status\4] ' Obten Status
ciclo UNTIL status = Ready ' Fin ciclo si status es listo

SHIFTIN DinDout,clk,MSBPOST,[x\11,y\11] ' Obtiene valores de ejes x & y


HIGH En ' Deshabilita modulo

IF (y.BIT10 = 1) THEN y = y | NegMask ' Guarda 11-bits,palabra con signo


IF (x.BIT10 = 1) THEN x = x | NegMask ' Repite para el otro eje

RETURN

' -----[ Subroutine - Compass_Correct_Offsets ]-------------------------------

' Esta subrutina corrige interferencia acumulativa del campo magnético que
' puede venir de fuentes como PCB, cables, baterias cercanas o una fuente de
' corriente cercana. Esta subrutina confia en los valores guardados en el
' espacio EEPROM antes reservado por la directiva CompassOffsets DATA.
Página 142 · Sensores Inteligentes y sus Aplicaciones

' Estos valores EEPROM son escritos por CalibrateCompass.bs2.

Compass_Correct_Offsets:

READ CompassOffsets, Word axisOffset ' Obtiene compensacion eje x


x = x - axisOffset ' corrige eje x
READ CompassOffsets + 2, Word axisOffset ' Obtiene compensacion eje y
y = y - axisOffset ' corrige eje y

RETURN

' -----[ Subrutina - Compass_Interpolate ]-----------------------------------

' Esta subrutina aplica interpolacion lineal para refinar la medicion de la


' brujula. Este segundo nivel de refinamiento puede ser ejecutado luego de la
' subrutina Compass_Correct_Offsets, y puede corregir flexion axal y otros
' factores inherentes al integrado HM55B.
'
' La subrutina confia en las 16 mediciones de brújula reales que fueron
' guardadas en las 16 localidades EEPROM reservadas por la directiva
' CompassCal DATA. Estas mediciones fueron guardadas por CalibrateCompass.bs2,
' y representan las mediciones de brújula reales para 0, 22.5, 45, 90,...,
' 337.5 grados. La subrutina encuentra las 2 mediciones EEPROM entre las que
' la medición de angulo en curso cae. Entonces actualiza la medicion de
' angulo en base a donde cae la medición de angulo entre los 2 valores
' conocidos de la tabla.

Compass_Interpolate:

' Empieza con el valor mas bajo en la tabla CompassCal.

READ CompassLowVal, index

' Carga los valores de tabla corriente y previo.

READ CompassCal + index, table(current)


READ (CompassCal + (index - 1 & $F)), table(previous)

' El bloque de codigo IF...ELSEIF...ELSE...ENDIF encuentra los 2 valores de


' la tabla EEPROM CompassCal entre los que cae la medicion de angulo en
' curso y calcula la diferencia entre the angulo de medicion en curso y el
' mas bajo de los 2 valores de tabla. Los bloques IF y ELSEIF se encargan de
' valores que son mayores que el mas grande o menores que el mas bajo de los
' valores de la tabla. El bloque ELSE maneja todo entre el mayor y el menor
' de los valores de la tabla.

IF (angle >= table(previous)) THEN


span = (255 - table(previous)) + table(current)
angleOffset = angle - table(previous)
ELSEIF (angle <= table(current)) THEN
Chapter 4: El módulo de brújula Hitachi HM55B · Page 143

span = table(current) + (255 - table(previous))


angleOffset = angle + (255 - table(previous))
ELSE
index = index - 1
READ CompassCal + index, table(current)
DO
table(previous) = table(current)
index = index + 1
READ CompassCal + index, table(current)
IF (angle <= table(current)) y (angle > table(previous)) THEN
span = table(current) - table(previous)
angleOffset = angle - table(previous)
EXIT
ENDIF
ciclo
ENDIF

' Despues de que la compensacion entre la medicion de angulo en curso y la


' medicion de tabla mas proxima hacia abajo ha sido determinada, este bloque
' de codigo la usa junto con la distancia entre los datos de tabla arriba y
' abajo la medicion de angulo para resolver: angle(corrected)= angle(offset)
' * 16 / span. Este bloque tambien redondea arriba o abajo comparando el
' residuo de la division angleOffset / span contra el valor de (span / 2).

angleOffset = angleOffset * 16
angle = (angleOffset / span) + ((angleOffset // span) / (span / 2))
angle = ((index - 1 & $F) * 16) + angle
angle = angle & $ff

RETURN

Su Turno - Desplegando "Grados" como °


El desplegado del símbolo de grados ° en la Terminal de Depuración fue presentado en el
Capítulo #3, actividad #5.

√ Cambie el programa para mostrar grados con el caracter ASCII 176, símbolo °.

ACTIVIDAD #4: MEJORA DE LAS MEDICIONES DE LA BRÚJULA A


TRAVÉS DEL PROMEDIO
Quizá haya notado que las mediciones x y y en la Terminal de Depuración tendieron a
alternar entre 2 or aún 3 valores diferentes. Este es el resultado de varios tipos de
interferencias de varios tipos diferentes que juntos se conocen como ruido. Algunas
fuentes comunes están en dispositivos de AC cercanos y líneas de energía, actividad
digital en el BASIC Stamp y aún actividad digital dentro del integrado HM55B.
Página 144 · Sensores Inteligentes y sus Aplicaciones

Un modo efectivo para eliminar los efectos del ruido es tomando un promedio de las
mediciones de los ejes x y y de la brújujla. Así, si el ruido causa que una medición sea un
poco más alta, la siguiente un poco más baja, y la siguiente correcta, el promedio de todas
las mediciones eliminará los altos y bajos y las establecerá en el valor correcto.

Una de las razones de porqué las actividades de calibración y prueba de calibración


pueden no entregar los mejores resultados es debido al ruido. Esta actividad demuestra
cómo puede modificar cualquiera de los programs ejemplo en este capítulo para tomar
mediciones promediadas y eliminar los efectos del ruido.

Incorporando el Promedio en los Programas de la Brújula


Hay 3 pasos mayores para incorporar el promediado en los programas ejemplo de este
capítulo. Primero, agregue un par de directivas CON a la sección de Constantess:
Negative CON 1 ' Word.bit15 = 1 -> negative
Positive CON 0 ' Word.bit15 = 0 -> positive

Luego, agregue 4 variables a la sección de Variables de los programas.


mCount VAR Nib ' Medición count
xSum VAR Word ' eje x medición accumulator
ySum VAR Word ' eje y medición accumulator
sign VAR Bit ' Sign bit

Finalmente, modifique la subrutina Compass_Get_Axes como se muestra abajo. El


código de la subrutina original Compass_Get_Axes está anidado en un ciclo FOR...NEXT
que mantiene una suma en ejecución de las mediciones de los ejes x y y con las variables
xSum y ySum. Puesto que el promedio de un grupo de mediciones es la suma de las
mediciones dividida entre el número de mediciones tomadas, hay código después del
ciclo FOR...NEXT que hace que x equivalga a xSum ÷ 10 y y equivalga a ySum ÷ 10.
Compass_Get_Axes: ' Subrutina modificada

xSum = 0 ' Acumuladores en cero


ySum = 0

FOR mCount = 1 TO 10 ' Toma 10 mediciones

' *** El codigo Original de la subrutina Compass_Get_Axes va aquí ***

xSum = xSum + x ' Mantiene suma en ejecucion de x


ySum = ySum + y ' Mantiene suma en ejecucion de y

NEXT
Chapter 4: El módulo de brújula Hitachi HM55B · Page 145

' Divide xSum


sign = xSum.BIT15 ' Guarda el signo de xSum
xSum = ABS(xSum) ' Toma el valor absoluto
x = xSum / 10 ' x = la medicion promedidada
IF xSum // 10 >=5 THEN x = x + 1 ' fraccion > .5? Redondea
IF sign = Negative THEN x = - x ' Si xSum es negativo, niega x

sign = ySum.BIT15 ' Guarda el signo de ySum


ySum = ABS(ySum) ' Toma el valor absoluto
y = ySum / 10 ' y = la medicion promedidada
IF ySum // 10 >=5 THEN y = y + 1 ' fraccion > .5? Redondea
IF sign = Negative THEN y = - y ' Si ySum es negativo, niega y

RETURN

Division en PBASIC con números negativos


Los operadores PBASIC para división y módulo (/ y //) son para usarse con numerós
positivos. Si el numerador pudiera ser negativo, la mejor estrategia es salvar el signo del
numerador antes de tomar su valor absoluto (sign = numerator.BIT15). Luego,
ejecute la división. Optionalmente, puede redondear hacia arriba o abajo dependiendo del
residuo de la división. Antes de que termine, revise el signo y si es negativo, haga negativo
al resultado (result = - result).
numerator VAR Word
denominator VAR Word
result VAR Word
sign VAR Bit

Negative CON 1
Positive CON 0

' Rutina de division con un numerador que pudiera ser negativo.


sign = numerator.BIT15
numerator = ABS(numerator)
result = numerator / denominator
IF numerator // denominator >= (denominator / 2) THEN
result = result + 1
ENDIF
IF sign = Negative THEN result = - result

Programa Ejemplo: TestCompassAveraged.bs2

Descarga gratis Este programa está disponible como descarga grátis .bs2 en la página del
producto de Sensores Inteligentes y sus Aplicaciones en www.parallax.com.
Página 146 · Sensores Inteligentes y sus Aplicaciones

El procedimiento para convertir un programa a promediar sus its mediciones de ejes x y y


fue aplicado a TestCompass.bs2, y luego salvado como TestCompassAveraged.bs2.

√ Abra y corra TestCompass.bs2 de la actividad #1.


√ Observe las mediciones de los eje x y y- a algunas direcciones diferentes. Se
espera sean ruidosas, parpadeando entre 2 or 3 valores diferentes.
√ Abra y corra TestCompassAveraged.bs2.
√ Las mediciones deben ser mucho más estables. Deberían parpadear solo cuando
esté muy cerca de la transición entre 2 resultados diferentes.

' -----[ Titulo ]-------------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - TestCompassAveraged.bs2
' Prueba para asegurar que el módulo de brújula Hitachi HM55B esta trabajando.

' {$STAMP BS2}


' {$PBASIC 2.5}

' -----[ Definiciones E/S ]---------------------------------------------------

DinDout PIN 2 ' P2 transmite-recibe a/de Din/Dout


Clk PIN 0 ' P0 manda pulsos al reloj de HM55B
En PIN 1 ' P2 controla pin EN(ABLE) de HM55B

' -----[ Constantes ]---------------------------------------------------------

Reset CON %0000 ' comando Reset de HM55B


Measure CON %1000 ' comando de inicio de medicion
Report CON %1100 ' comando para recibir status/valores de ejes
Ready CON %1100 ' 11 -> Hecho, 00 -> no errores
NegMask CON %1111100000000000 ' Para negativos 11-bit a 16-bits

Negative CON 1 ' Word.bit15 = 1 -> negativo


Positive CON 0 ' Word.bit15 = 0 -> positivo

' -----[ Variables ]----------------------------------------------------------

x VAR Word ' datos del eje x


y VAR Word ' datos del eje y
status VAR Nib ' banderas de Status
angle VAR Word ' Guarda medicion de angulo

mCount VAR Nib ' cuenta de medicion


xSum VAR Word ' acumulador de medicion de eje x
ySum VAR Word ' acumulador de medicion de eje y
sign VAR Bit ' bit de signo

' -----[ Rutina Principal ]---------------------------------------------------


Chapter 4: El módulo de brújula Hitachi HM55B · Page 147

DO ' Ciclo principal

GOSUB Compass_Get_Axes ' Obtiene valores de x y y

angle = x ATN -y ' Convierte x y y a brads


angle = angle */ 361 ' Convierte brads a grados

DEBUG HOME, "x-axis N(-S) = ",SDEC x, ' Muestra ejes y grados


CLREOL, CR, "y-axis W(-E) = ",
SDEC y, CLREOL, CR, CR, "angle = ",
DEC angle, " degrees", CLREOL

PAUSE 150 ' Retraso Debug para alentar PC

LOOP ' Repite ciclo principal

' -----[ Subrutina - Compass_Get_Axes ]--------------------------------------

Compass_Get_Axes: ' subrutina modulo de brujula

xSum = 0 ' Acumuladores a cero


ySum = 0

FOR mCount = 1 TO 10 ' Toma 10 mediciones

HIGH En: LOW En ' Manda comando reset a HM55B


SHIFTOUT DinDout,clk,MSBFIRST,[Reset\4]

HIGH En: LOW En ' HM55B comando inicio medicion


SHIFTOUT DinDout,clk,MSBFIRST,[Measure\4]
status = 0 ' Borra status anterior de banderas

DO ' Ciclo de chequeo de Status de banderas


HIGH En: LOW En ' comando de status medicion
SHIFTOUT DinDout,clk,MSBFIRST,[Report\4]
SHIFTIN DinDout,clk,MSBPOST,[Status\4] ' Obtiene Status
ciclo UNTIL status = Ready ' Deja ciclo cuando status esta
listo

SHIFTIN DinDout,clk,MSBPOST,[x\11,y\11] ' Obtiene valores de ejes x & y


HIGH En ' Deshabilita Modulo

IF (y.BIT10 = 1) THEN y = y | NegMask ' Guarda 11bits como palabra signada


IF (x.BIT10 = 1) THEN x = x | NegMask ' Repite para el otro eje

xSum = xSum + x ' Mantiene una suma en ejecucion de x


ySum = ySum + y ' Mantiene una suma en ejecucion de y

NEXT
Página 148 · Sensores Inteligentes y sus Aplicaciones

sign = xSum.BIT15 ' Guarda signo de xSum


xSum = ABS(xSum) ' Toma valor absoluto
x = xSum / 10 ' x = la medicion promediada
IF xSum // 10 >=5 THEN x = x + 1 ' fraccion >.5? Redondea arriba
IF sign = Negative THEN x = - x ' Si xSum negativo, niega x

sign = ySum.BIT15 ' Guarda signo de ySum


ySum = ABS(ySum) ' Toma valor absoluto
y = ySum / 10 ' y = la medicion promediada
IF ySum // 10 >=5 THEN y = y + 1 ' fraccion >.5? Redondea arriba
IF sign = Negative THEN y = - y ' Si xSum negativo, niega x

RETURN

Su Turno - Promediando los Programas de calibración y Prueba de calibración


Los programas de calibración y prueba de calibración significativamente mejoran la
precisión de su brújula digital. Incorporando el promedio en ambos, la precisión de su
brújula digital se verá mejorada.

√ Siga los pasos en esta actividad para incorporar el promedio en una copia de
CalibrateCompass.bs2. En vez de modificar la subrutina Compass_Get_Axes
del programa solo copie la subrutina modificada de este programa
(TestCompassAveraged.bs2) y péguela sobre la que está en su copia de
CalibrateCompass.bs2.
√ Corra su copia modificada de CalibrateCompass.bs2 y repita los pasos de la
actividad #2.
√ Haga una copia de TestCalibratedCompass.bs2, y modifiquela para que ejecute
el promediado.
√ Repita las pruebas de precisión de la actividad #3. Su brújula digital debe
funcionar realmente bien ahora.

ACTIVIDAD #5: MEDICIONES EN MOVIMIENTO


Esta actividad demuestra cómo reemplazar la Terminal de Depuración con la LCD Serial
Parallax para hacer su brújula digital móvil.

Conectando la LCD Serial Parallax con un Cable Extensión


La LCD Serial Parallax es una fuente definitiva de disturbio del campo magnético y
necesita ser operada bien alejada del módulo brújula. Esto se logra fácilmente con un
cable extensión.
Chapter 4: El módulo de brújula Hitachi HM55B · Page 149

Partes Requeridas
(1) Módulo brújula Hitachi HM55B
(1) LCD Serial Parallax (2×16)
(1) Cable Extension de 14 pulgadas para la LCD
(6) Cables conectores

Si está trabajando con un BASIC Stamp HomeWork Board or una tarjeta serial Board of
Education Rev A o B, también necesitará:

(1) conector de 3 pines


(3) cables conectores aditcionales

Conexiones del Cable para la LCD


Los esquemáticos mostrados en la Figura 4-12 son idénticos a los que han sido usados
para el módulo de brújula y la LCD Serial Parallax hasta este punto. Lo único que
cambiará es la forma en que la LCD es conectada a su tarjeta, con un cable extensión. No
deben hacerse cambios al cableado del módulo brújula.

Figura 4-12
Schematics de la LCD
Serial Parallax y el
módulo de brújula
Página 150 · Sensores Inteligentes y sus Aplicaciones

Conexiones de Cable en Board of Education Rev C y Board of Education USB


Estas instrucciones son para las tarjetas que tienen puertos servo con un jumper Vdd/Vss
enmedio, como los Board of Education Rev C y Board of Education USB. Todas las
demás tarjetas, pasar a Todas las demás tarjetas educativas BASIC Stamp (pág. 151).

√ Desconecte la energía de su tarjeta.


√ Coloque el jumper entre los puertos servo X4 y X5 a Vdd (+5 V) (Figura 4-13).
El jumper debe cubrir los 2 pines mas cercanos a Vdd, y el tercer pin cerca de
Vin debe quedar visible.

Figura 4-13
Colocando el Jumper de los puertos
Servo a Vdd

Configuración de jumper Vdd vs. Vin Determine qué fuente de energía está conectada a
los puertos X4 y X5. Si el jumper esta en Vdd, estos puertos reciben 5 V regulados del
regulador de tensión del Board of Education. Si está en Vin, el puerto recibe energía
directamente de la batería o de la fuente de energía. ¡ASEGÚRESE DE QUE SU JUMPER
ESTÁ PUESTO CORRECTAMENTE A Vdd O DAÑARÁ PERMANENTEMENTE SU LCD!

√ Conecte una punta del cable extensión en el Puerto 14 del cabezal X4,
asegurándose que las etiquetas "Red" y "Black" en el lado derecho del puerto X5
se alineen con los cables rojo y nego del cable extensión.
√ Asegúrese de que el cable blanco sea el más cercado a la etiqueta 14 y que el
cable nego es el más cercano a la etiqueta X4.
√ Conecte la otra punta del cable para que el cable negro esté conectado al pin
GND de la LCD Serial Parallax, el cable rojo esté conectado al pin 5 V, y el
cable blanco esté conectado al pin RX.
√ Vuelva a verificar todas sus conexiones y asegúrese de que son correctas.

¡ATENCIÓN!
No reconecte la energía a su tarjeta hasta que esté seguro de que las conexiones
están correctas. Si comete un error con las conexiones de la LCD, esta será
permanentemente dañada.
Chapter 4: El módulo de brújula Hitachi HM55B · Page 151

Figura 4-14: Conexiones al Puerto Servo de la LCD Serial Parallax

√ Vuelva a conectar la energía en la tarjeta Board of Education.


√ Ponga el switch de 3 posiciones de la Board of Education en la posición 2.
√ Pase a Herraje de montaje opcional para la LCD en la página 153.

Todas las demás tarjetas educativas BASIC Stamp


Esta sección es para conectar el módulo de brújula y la LCD Serial Parallax a una de las
siguientes tarjetas educativas BASIC Stamp:

• BASIC Stamp HomeWork Board


• Board of Education Rev A (versión Serial)
• Board of Education Rev B (versión Serial)

√ Desconecte la energía de su tarjeta.


√ Construya el puerto para cable extensión mostrado en la Figura 4-15.
Página 152 · Sensores Inteligentes y sus Aplicaciones

Figura 4-15
Cableado en tableta
para la conexión de
cable de la LCD Serial
Parallax Cable y el
Módulo brújula

√ Conecte una punta del cable extensión en el conector de 3 pines en la tarjeta


como se muestra en la Figura 4-16. Asegúrese de que los cables blanco, rojo y
negro estén orientados como se muestra. El cable nego debe estar conectado a
Vss, el cable rojo a Vdd y el cable blanco a P14.
√ Conecte la otra punta del cablede tal forma que el cable negro esté conectado al
pin GND de la LCD Serial Parallax, el cable rojo esté conectado al pin 5 V pin, y
the cable blanco esté conectado al pin RX.
Chapter 4: El módulo de brújula Hitachi HM55B · Page 153

Figura 4-16: Módulo de brújula y LCD Serial Parallax Conectados con cable extensión

√ Vuelva a verificar todas sus conexiones y asegúrese de que son correctas.

¡ATENCIÓN!
No reconecte la energía a su tarjeta hasta que esté seguro de que las conexiones
están correctas. Si comete un error con las conexiones de la LCD, esta será
permanentemente dañada.

√ Reconecte la energía a su tarjeta.

Herraje de montaje Opcional para la LCD


Si lo desea, puede montar su LCD a su tarjeta Board of Education o HomeWork Board
con el herraje suministrado en su kit. La lista de partes y las instrucciones se dan en la
siguiente página con la Figura 4-17.
Página 154 · Sensores Inteligentes y sus Aplicaciones

Figura 4-17: Ensamblando el herraje


Opcional de la LCD

Partes Requeridas
(4) ángulos de montaje de 90 grados
(2) espaciadores de nylon redondos de
1/4-pulgada #4
(2) tornillos ½” con cabeza 4-40
(4) tornillos ¼” con cabeza 4-40
(6) tuercas zincadas 4-40

√ Ponga un tornillo de ¼" a través


del barreno externo de un ángulo y
el barreno superior izquierdo de su
tarjeta, asegure con una tuerca.
Repita con el barreno inferior
izquierdode su tarjeta (imagen
superior).
√ Ponga un tornillo de ½" a través
del barreno inferior izquierdo de la
tarjeta de la LCD, un espaciador de
nylon, el barreno interno de un
ángulo y asegúre con una tuerca
(2da imagen, lado izquierdo).
√ Ponga un tornillo de ½" a través
del barreno inferior derecho de la
tarejta de la LCD, un expaciador
de nylon, el barreno externo de un
ángulo y asegure con una tuerca
(2da imagen, lado derecho).
√ Use los restantes tornillos y tuercas
de ¼", una los ángulos de la LCD
a los ángulos en su tarjeta usando
dos tornillos y tuercas de ¼" (3ra
imagen).
Chapter 4: El módulo de brújula Hitachi HM55B · Page 155

Programando la pantalla LCD


Esta rutina de inicialización de la LCD se encarga de los fundamentos de inicialización
de la LCD, define el caracter personalizado 7 para el símbolo °, luego muestra texto
estático (que no cambia mientras que el programa está corriendo).
' Rutina de inicializacion LCD
PAUSE 200 ' Estabiliza la fuente de energia
SEROUT 14, 84, [22, 12] ' Enciende y limpia la LCD
PAUSE 5 ' retraso de 5 ms para limpiar

SEROUT 14, 84, [255, ' Define caracter personalizado 7


%01000, ' *
%10100, ' * *
%01000, ' *
%00000, '
%00000, '
%00000, '
%00000, '
%00000] '

SEROUT 14, 84, [129, "Heading...", ' Caracteres Estáticos


149, "x=",
158, "y="]

El siguiente comando SEROUT coloca el cursor de la LCD, luego imprime espacios para
sobreescribir el valor anterior. Entonces coloca el cursor en la misma localidad de inicio
y escribe el nuevo valor. Esto previene la aparición de caracteres fantasma cuando
cambia el número de dígitos en el valor, pero sin los molectos efectos laterales de
pantalla parpadeante que obtendría si de otra forma se limpiara la pantalla entre cada
medición.
' LCD muestra direccion en grados en la linea superior
' y mediciones x y y en la linea inferior.
SEROUT 14, 84, [139, " ", 139, DEC angle, 7,
151, " ", 151, SDEC X,
160, " ", 160, SDEC y]

Programa Ejemplo: LcdTestCompass.bs2

Descarga gratis Este programa está disponible como descarga grátis .bs2 en la página del
producto de Sensores Inteligentes y sus Aplicaciones en www.parallax.com.
Página 156 · Sensores Inteligentes y sus Aplicaciones

Este programa ejemplo es una versión modificada de TestCompass.bs2 que usa


comandos de la pantalla LCD en vez de comandos de la Terminal de Depuración.

√ Abra LcdTestCompass.bs2 y trate correrlo con el cable serial desconectado.

' -----[ Titulo ]-------------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - LcdTestCompass.bs2
' Prueba para asegurar que el módulo de brújula Hitachi HM55B esta trabajando.

' {$STAMP BS2}


' {$PBASIC 2.5}

' -----[ Definiciones E/S ]---------------------------------------------------

DinDout PIN 2 ' P2 transmite-recibe a/de Din/Dout


Clk PIN 0 ' P0 manda pulsos al reloj de HM55B
En PIN 1 ' P2 controla pin EN(ABLE) de HM55B

' -----[ Constantes ]---------------------------------------------------------

Reset CON %0000 ' comando Reset de HM55B


Measure CON %1000 ' comando de inicio de medicion
Report CON %1100 ' comando para recibir status/valores de ejes
Ready CON %1100 ' 11 -> Hecho, 00 -> no errores
NegMask CON %1111100000000000 ' Para negativos 11-bit a 16-bits

' -----[ Variables ]----------------------------------------------------------

x VAR Word ' datos del eje x


y VAR Word ' datos del eje y
status VAR Nib ' banderas de Status
angle VAR Word ' Guarda medicion de angulo

' -----[ Inicializacion ]-----------------------------------------------------

' Inicializacion de la LCD


PAUSE 200 ' Estabiliza la fuente de energia
SEROUT 14, 84, [22, 12] ' Enciende y limpia la LCD
PAUSE 5 ' retraso de 5 ms para limpiar

SEROUT 14, 84, [255, ' Define caracter personalizado 7


%01000, ' *
%10100, ' * *
%01000, ' *
%00000, '
%00000, '
%00000, '
%00000, '
%00000] '
Chapter 4: El módulo de brújula Hitachi HM55B · Page 157

SEROUT 14, 84, [129, "Heading...", ' Caracteres Estáticos


149, "x=",
158, "y="]

' -----[ Rutina Principal ]---------------------------------------------------

DO ' Ciclo principal

GOSUB Compass_Get_Axes ' Obtiene valores de x y y

angle = x ATN -y ' Convierte x y y a brads


angle = angle */ 361 ' Convierte brads a grados

' LCD muestra direccion en grados en la linea superior


' y mediciones x y y en la linea inferior.
SEROUT 14, 84, [139, " ", 139, DEC angle, 7,
151, " ", 151, SDEC X,
160, " ", 160, SDEC y]

PAUSE 150 ' Retraso Debug para alentar PC

LOOP ' Repite ciclo principal

' -----[ Subrutina - Compass_Get_Axes ]--------------------------------------

Compass_Get_Axes: ' subrutina modulo de brujula

HIGH En: LOW En ' Manda comando reset a HM55B


SHIFTOUT DinDout,clk,MSBFIRST,[Reset\4]

HIGH En: LOW En ' HM55B comando inicio medicion


SHIFTOUT DinDout,clk,MSBFIRST,[Measure\4]
status = 0 ' Borra status anterior de banderas

DO ' Ciclo de chequeo de Status de banderas


HIGH En: LOW En ' comando de status medicion
SHIFTOUT DinDout,clk,MSBFIRST,[Report\4]
SHIFTIN DinDout,clk,MSBPOST,[Status\4] ' Obtiene Status
ciclo UNTIL status = Ready ' Deja ciclo cuando status esta
listo

SHIFTIN DinDout,clk,MSBPOST,[x\11,y\11] ' Obtiene valores de ejes x & y


HIGH En ' Deshabilita Modulo

IF (y.BIT10 = 1) THEN y = y | NegMask ' Guarda 11bits como palabra signada


IF (x.BIT10 = 1) THEN x = x | NegMask ' Repite para el otro eje

RETURN
Página 158 · Sensores Inteligentes y sus Aplicaciones

Su Turno
Intente extender las actividades de la sección “Su Turno” en la actividad #4 ahora con la
LCD Serial Parallax. No se preocupe de agregar funcionalidad de la LCD al programa de
calibración, solo al programa modificado de prueba de calibración de la actividad #3.
Podría necesitar recalibrar para eliminar interferencia magnética causada por la
proximidad de la LCD. Agregue un comando a la Rutina principal de
CalibrateCompass.bs2 que envíe unos cuantos caracteres a la LCD cada vez que haga un
ciclo antes de que lo corra. Para liberar un poco de espacio de código intente remover
unos caracteres de uno de los comandos DEBUG en la subroutine Calibration_Review.
Chapter 4: El módulo de brújula Hitachi HM55B · Page 159

RESUMEN
El módulo de brújula Hitachi HM55B es un sensor bi-axial de campo magnético capaz de
detectar variaciones de microteslas en las componentes del campo magnético de la tierra
actuando en sus ejes x y y. El angle del módulo a partir del norte puede ser determinado
dividiendo la medición del eje x entre la medición del eje y, y luego tomando el
arcotangente del resultado. El módulo de brújula también puede ser usado para detectar
campos magnéticos de barras magnéticas y la inclinación del campo magnético de la
tierra en su localidad.

El BASIC Stamp puede guardar direcciones medidas en la porción no utilizada de su


memoria EEPROM de programación con un programa de calibración. Luego, un
programa de prueba puede accesar estos valores salvados, y usarlos para ejecutar
corrección de escala e interpolación lineal a las mediciones. Estas técnicas de corrección
pueden significativamente mejorar the medición de la dirección. Promediando las
mediciones de los ejes, la medición de dirección puede ser refinada con más
profundidad. La direction puede ser desplegada en formato de texto en la LCD Serial
Parallax agregando una pequeña rutina de inicialización a la sección de Initialización del
programa y un comando SEROUT al ciclo principal DO...LOOP del programa.

Preguntas
1. ¿Cuál es la relación entre el eje x de medición del módulo brújula a un ángulo
dado y la medición cuando el eje x está alineado con el norte magnético?
2. ¿Cuáles son los nombres de cada uno de los pines del módulo brújula que tienen
que ser conecados a los pines E/S del BASIC Stamp?
3. ¿Hacia dónde se incrementa el ángulo a partir del norte en las brújulas
convencionales?
4. ¿Qué es declinación?
5. Si está midiendo un campo magnético cercano a una barra magnética, ¿cómo se
relaciona la dirección del campo magnético con sus marcas N y S?
6. ¿Porqué puede una brújula mecánica cercana causar errores en las mediciones
del módulo brújula?
7. ¿Cómo promediaría 20 mediciones?
8. ¿Qué variables tiene que poner a cero antes de promediar las mediciones de x y
y? ¿Porqué tienen que ser puestas a cero?
9. ¿Cuál es el comando SEROUT para definer el símbolo de grados? ¿Cuántos bytes
envía?
Página 160 · Sensores Inteligentes y sus Aplicaciones

10. Si el número de dígitos en una medición desplegada puede cambiar, ¿cómo


previene que aparezcan caracteres fantasmas a la derecha?

Ejercicios
1. Calcule el ángulo a partir del norte if the x axis lectura is 34 y the eje y lectura is
0.
2. Calcule el ángulo a partir del norte si la lectura del eje x es 16 y la lectura del eje
y is 31.
3. Calcule el número de nanoteslas en 1.6 microteslas.
4. Escriba una rutina que convierta de microteslas a nanoteslas.
5. Escriba una rutina que examine una variable y despliegue si es o no negativa.

Proyectos
1. Despliegue la dirección presente en la LCD serial. Presione y libere un botón
para recordad esa dirección deseada. Si la dirección presente está movida por
más de 5°, emita un sonido de avertencia con un piezo parlante.
2. Diseñe un prototipo que le diga cuando si brújula digital Hitachi HM55B es
sostenida a nivel con la ayuda del Acelerómetro Mems 2125.
Chapter 4: El módulo de brújula Hitachi HM55B · Page 161

Soluciones
Q1. Si N es el valor reportado por x cuando está alineado con el norte magnético,
entonces para un ángulo dado theta, x = Ncosθ.
Q2. Din, Dout, /Enable, y CLK.
Q3. En sentido horario a partir del norte.
Q4. Es la diferencia, en grados, entre el norte magnético y el norte verdadero.
Q5. La dirección del campo parecerá ser opuesta a las marcas N y S, debido a la
forma en que el campo magnético da vuelta.
Q6. La brújula mecánica contiene un pequeño imán que puede afectar el módulo
brújula.
Q7. Con una suma en ejecución de las 20 mediciones y dividir la suma total entre 20.
Q8. La suma en ejecución de x y y debe empezar en cero. Una vez que un cálculo
termine, las sumas contendrán un valor más alto. Para hacer un Segundo cálculo,
debe regresar la suma a cero.
Q9. El comando es 255, segudio por 8 bytes de datos caracter.
SEROUT pinNumber, baudrate, [255, byte0…byte7]
Q10. Primero escriba espacios para sobreescribir (borrar) el valor anterior, luego
coloque el cursor de regreso al punto inicial y escriba el nuevo valor.

E1. θ = 0° grados a partir del Norte, o debido al Norte.


E2. θ = 297.3° a partir del Norte.
E3. 1.6 microtesla = 1.6 x 10-6 T = 1600 x 10-9 T = 1600 nanotesla
E4. Rutina ejemplo:
Convert:
nanoT = 1000 * microT
RETURN
E5. Rutina ejemplo:
value VAR Word

IF (value.BIT15 = 1) THEN
DEBUG "Negative", CR
ELSE
DEBUG "Positive", CR
ENDIF
P1. Ejemplo de solución:
Asumiendo que un botón activo en nivel bajo está conectado a P10 y un piezo
parlante está conectado a P11 (Vea ¿Qué es un Microcontrolador?, Capítulos 3
y 8), LcdTestCompass.bs2 puede ser modificado como sigue:
Agregue estas directivas de pin a la sección de definiciones de E/S:
pushbutton PIN 10
Página 162 · Sensores Inteligentes y sus Aplicaciones

speaker PIN 11

Agregue estas variables a la Sección de Variables:


angleMem VAR Word
difference VAR Word
alarmArm VAR Bit

Modifique el ultimo comando SEROUT en la routine de inicialización:


SEROUT 14, 84, [128, "Alarm Angle Set ", ' Caracteres estaticos
148, "OFF "]

Modifique la rutina principal como se muestra aquí:


' -----[ Rutina Principal ]--------------------------------------------

DO ' Ciclo principal

GOSUB Compass_Get_Axes ' Obtiene valores x y y

angle = x ATN -y ' Convierte x y y a brads


angle = angle */ 361 ' Convierte brads a grados

' LCD muestra direccion en grados en la linea superiory


' mediciones x y y en la linea inferior.
SEROUT 14, 84, [154, " ", 154, DEC angle, 7]

IF PushButton = 1 THEN
angleMem = angle
alarmArm = 1
FREQOUT speaker, 20, 3000
SEROUT 14, 84, [148,"ON " ]
ENDIF

difference = ABS(angle - angleMem)

IF alarmArm = 1 THEN
SEROUT 14, 84, [160, " ", 160, DEC angleMem, 7]
IF difference > 5 y difference < 355 THEN
FREQOUT speaker, 10, 4000
ENDIF
ENDIF

PAUSE 150 ' Retraso de Debug para alentar PCs

LOOP ' Repite ciclo principal


Chapter 4: El módulo de brújula Hitachi HM55B · Page 163

P2. Solution Ejemplo: Ch4_Project2.bs2


Este programa es una combinación de HorizontalTilt.bs2 y TestCompass.bs2.

' -----[ Titulo ]-------------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - Ch4_Project2.bs2
' Muestra la brújula digital y mediciones de inclinacion con un programa.

' {$STAMP BS2} ' Directiva BASIC Stamp


' {$PBASIC 2.5} ' Directiva PBASIC

' -----[ Constantes ]---------------------------------------------------------

Negative CON 1 ' Signo - .bit15 de variables de una palabra


Positive CON 0

' -----[ I/O Definitions ]----------------------------------------------------

DinDout PIN 2 ' P2 transmite-recibe a/de Din/Dout


Clk PIN 0 ' P0 manda pulsos al reloj de HM55B
En PIN 1 ' P2 controla pin EN(ABLE) de HM55B

Reset CON %0000 ' comando Reset de HM55B


Measure CON %1000 ' comando de inicio de medicion
Report CON %1100 ' comando para recibir status/valores de ejes
Ready CON %1100 ' 11 -> Hecho, 00 -> no errores
NegMask CON %1111100000000000 ' Para negativos 11-bit a 16-bits

' -----[ Variables ]----------------------------------------------------------

xTilt VAR Word ' Medicion del eje x mems


yTilt VAR Word ' Medicion del eje y mems

side VAR Word ' dispara variable de subrutina


angleTilt VAR Word ' resultado angulo - grados
sign VAR Bit ' bit de Signo

xCompass VAR Word ' datos del eje x


yCompass VAR Word ' datos del eje y
status VAR Nib ' banderas de Status
angleCompass VAR Word ' Guarda medicion de angulo

' -----[ Inicializacion ]-----------------------------------------------------

DEBUG CLS ' Limpia Terminal de Depuracion

' -----[ Rutina Principal ]---------------------------------------------------

DO
Página 164 · Sensores Inteligentes y sus Aplicaciones

PULSIN 6, 1, xTilt ' medicion del eje x


PULSIN 7, 1, yTilt ' medicion del eje y

' Escala y compensa los valores de los ejes x y y de -127 a 127.


xTilt = (xTilt MIN 1875 MAX 3125) - 1875 ** 13369 - 127
yTilt = (yTilt MIN 1875 MAX 3125) - 1875 ** 13369 - 127

' Calcula y muestra el Arcoseno de la medición del eje x.


side = xTilt
GOSUB Arcsine
DEBUG HOME, "x tilt angle = ", CLREOL, SDEC3 angleTilt, CR

' Calcula y muestra el Arcoseno de la medición del eje y.


side = yTilt
GOSUB Arcsine
DEBUG "y tilt angle = ", CLREOL, SDEC3 angleTilt

GOSUB Compass_Get_Axes ' Obtiene valores de x y y

angleCompass = xCompass ATN -yCompass ' Convierte x y y a brads


angleCompass = angleCompass */ 361 ' Convierte brads a grados

DEBUG CR, "Compass angle = ",


DEC angleCompass, " degrees", CLREOL

PAUSE 150 ' Retraso de Debug para alentar PCs

LOOP ' Repite DO...LOOP

' -----[ Subroutine - Arcsine ]-----------------------------------------------

' Esta subrutina calcula arcoseno en base a la coordenada y en un circulo


' de radio 127. Establezca la variable side igual a su coordenada y antes
' de llamar a esta subrutina.

Arcsine: ' Subrutina seno inverso


GOSUB Arccosine ' Obtiene coseno inverse
angleTilt = 90 - angleTilt ' sin(angle) = cos(90 - angle)
RETURN

' -----[ Subrutina - Arccosine ]---------------------------------------------

' Esta subrutina calcula arcocoseno en base a la coordenada x en un circulo


' de radio 127. Establezca la variable side igual a su coordenada x antes
' de llamar a esta subrutina.

Arccosine: ' Subrutina coseno inverso


sign = side.BIT15 ' Salva el signo de side
side = ABS(side) ' Evalua side positivo
angleTilt = 63 - (side / 2) ' Aproximacion inicial de angulo
DO ' Ciclo de aproximacion sucesiva
Chapter 4: El módulo de brújula Hitachi HM55B · Page 165

IF (COS angleTilt <= side) THEN EXIT ' Hecho cuando COS angle <= side
angleTilt = angleTilt + 1 ' Incrementa angulo
ciclo
angleTilt = angleTilt */ 361 ' Convierte brads a grados
IF sign = Negative THEN ' Ajusta si el signo es negativo.
angleTilt = 180 - angleTilt
ENDIF
RETURN

' -----[ Subroutine - Compass_Get_Axes ]------------------------------------

Compass_Get_Axes: ' Subrutina módulo de brújula

HIGH En: LOW En ' Manda comando reset a HM55B


SHIFTOUT DinDout,clk,MSBFIRST,[Reset\4]

HIGH En: LOW En ' HM55B comando inicio medicion


SHIFTOUT DinDout,clk,MSBFIRST,[Measure\4]
status = 0 ' Borra status anterior de banderas

DO ' Ciclo de chequeo de Status de banderas


HIGH En: LOW En ' comando de status medicion
SHIFTOUT DinDout,clk,MSBFIRST,[Report\4]
SHIFTIN DinDout,clk,MSBPOST,[Status\4] ' Obtiene Status
ciclo UNTIL status = Ready ' Deja ciclo cuando status esta listo

' Obtiene valores de ejes x & y


SHIFTIN DinDout,clk,MSBPOST,[xCompass\11,yCompass\11]
HIGH En ' Deshabilita Modulo
' Guarda 11-bits como palabra con signo para ambos ejes
IF (yCompass.BIT10 = 1) THEN yCompass = yCompass | NegMask
IF (xCompass.BIT10 = 1) THEN xCompass = xCompass | NegMask

RETURN
Página 166 · Sensores Inteligentes y sus Aplicaciones
Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 167

Capítulo 5: Fundamentos de juegos con el


Acelerómetro
El Capítulo 3 le presentó el Acelerómetro bi-axial Mems. Pueden encontrarse
dispositivos similares en muchos HIDs (Dispositivos de Interface Humana), una
categoría que incluye ratones para computadora, teclados, y, en general, lo que posibilita
que interactuemos con los microprocesadores. En una PDA (Asistente Personal Digital)
con espacio limitado (Figura 5-1), el control por inclinación elimina la necesidad de más
botones. En este ejemplo, la inclinación permite le permite moverse en un mapa sin
presionar ningún botón. Este control es también popular en ciertos mandos de juegos.

Figura 5-1:PDA controlada por inclinación

Fotos de RotoView® tilt-controlled PDA interface en acción cortesía de Innoventions®,


www.innoventions.com

Este capítulo tiene 4 actividades que demuestran las varias facetas del uso de inclinación
para controlar una pantalla. He aquí un resumen de cada actividad:

• Actividad #1: Desplegado de Caracteres Graficos PBASIC– Básicos de los


controles de cursor de la Terminal de Depuración y de coordinación de gráfica.
• Actividad #2: Guardado y refrescado de fondo con la EEPROM – Cada vez
que se mueve su caracter de juego, aquello que estaba cubriendo en la pantalla
tiene que ser re-dibujado. Esta actividad demuestra como puede mover su
caracter y refrescar el fondo con la ayuda de la EEPROM del BASIC Stamp.
• Actividad #3: Inclinando la gráfica de burbuja– con un asterisco móvil en una
grafica, esta primera aplicación ilustra como se mueve la bolsa de aire caliente
Página 168 · Sensores Inteligentes y sus Aplicaciones

dentro del MX2125 cuando lo inclina. También establece los fundamentos del
acelerómetro para trabajar en conjunto con las técnicas de la actividad #2.
• Actividad #4: Control de Juego– Ahora está listo para usar la inclinación para
empezar a controlar su carácter de juego. Los caracteres de fondo pueden ser
usados para definir si su caracter de juego está dentro o fuera de los límites.
Diviértase personalizando y expandiendo este video juego por inclinación.

ACTIVIDAD #1: DESPLEGADO DE CARACTERS GRÁFICOS PBASIC


Esta actividad presenta algúnas técnicas de programación que usará para gráficamente
mostrar coordenadas con la Terminal de Depuración. Ciertos elementos de las técnicas
presentadas en esta actividad y la siguiente le serán familiares del acelerómetro y la LCD
en los capítulos anteriores.

CRSRXY y Otros Caracteres de Control


El caracter de control CRSRXY del comando DEBUG puede ser usado para colocar el cursor
en una posición específica en la ventana de Recepción de la Terminal de Depuración.
Por ejemplo, DEBUG CRSRXY, 7, 3, "*" coloca el caracter asterisco 7 espacios a la
derecha y 3 caracteres abajo. En vez de usar constantes como 7 y 3, puede usar variables
para hacer la colocación del cursor ajustable. Digamos que tiene 2 variables llamadas x y
y. Los valores que estas variables guardan pueden controlar la colocación del asterisco en
el comando DEBUG CRSRXY, x, y, "*".

El siguiente programa ejemplo también hace uso del caracter de control CLRDN. DEBUG
CLRDN hace que todas las lineas por debajo de la posición actual del cursor sean borradas.

Mas caracteres de control


Puede averiguar mas acerca de caracteres de control viendo el comando DEBUG en la
Guía de Sintáxis de PBASIC o en el Manual BASIC Stamp. Puede conseguir la primera en
su Editor de BASIC Stamp (v2.0 or más reciente). Solo haga click en Help y seleccione el
Índice. El Manual BASIC Stamp esta disponible como descarga en www.parallax.com.

Programa ejemplo – CrsrxyPlot.bs2


Con este programa puede teclear pares de dígitos en la ventana de transmisión (Figura 5-
2), para colocar asteriscos en la ventana de recepción. Haga click en la ventana de
Transmisión y empiece a escribir. El primer dígito que escribe es el número de espacios a
Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 169

la derecha para colocar el cursor y el segundo es el número de retornos de carro hacia


abajo. Antes de escribir un nuevo par de dígitos, presione la barra espaciadora una vez.
Figura 5-2: Ventanas de Recepción y Transmisión de la Terminal de Depuración

Transmit
Windowpane

Receive
Windowpane

√ Introduzca, salve y corra CrsrxyPlot.bs2.


√ Redimensione la Terminal de Depuración para que halla amplio espacio para
desplegar el área de graficado y los mensajes.
√ Haga Click en la ventana de Transmisión de la Terminal de Depuración y siga
los mensajes para escribir dígitos para colocar asteriscos en el area de graficado.
√ Intente la secuencia 11, 22, 33, 43, 53, 63, 73, 84, 95. ¿Coinciden los asteriscos
en su Terminal de Depuración y los de la Figura 5-2?
√ Trate predecir las secuencias para diversas formas (cuadrado, triángulo, círculo)
√ Introduzca las secuencias para probar sus predicciones.
√ Corrija las secuencias según sea necesario.

' Sensores Inteligentes y sus Aplicaciones – CrsrxyPlot.bs2


' Escriba pares de digitos en Terminal de Depuración para colocar asteriscos.

'{$STAMP BS2}
'{$PBASIC 2.5}

x VAR Word
y VAR Word
temp VAR Byte
Página 170 · Sensores Inteligentes y sus Aplicaciones

DEBUG CLS,
"0123456789X", CR,
"1 ", CR,
"2 ", CR,
"3 ", CR,
"4 ", CR,
"5 ", CR,
"Y ", CR, CR

DO

DEBUG "Type X coordinate: "


DEBUGIN DEC1 x
DEBUG CR, "Type Y coordinate: "
DEBUGIN DEC1 y

DEBUG CRSRXY, x, y, "*"

DEBUG CRSRXY, 0, 10, "Press any key..."


DEBUGIN temp
DEBUG CRSRXY, 0, 8, CLRDN

LOOP

Su Turno – Manteniendo los Caracteres en el Area de trazado


Si escribe 8 en respuesta al mensaje "Type Y coordinate: ", sobreescribirá su texto.
Ocurren problemas similares si escribe 0 para una coordenada X o Y. El asterisco es
trazado sobre el texto que muestra en qué renglón y columna está trazando CRSRXY. Una
forma de arreglar esto es con los operadores MAX y MIN. Solo agregue y = y MAX 5 MIN
1. El operator DEC1 del comando DEBUGIN resuelve el problema para la coordenada X
maxima, puesto que está limitada a un valor de 0 a 9. Así, solo necesitará asegurar el
valor X a x = x MIN 1.

√ Intente escribir valores fuera de los valores límite de la coordenada Y (0 y 6 a 9)


y 0 para la coordenada X. Observe los efectos en el fondo de la pantalla.
√ Modifique CrsrxyPlot.bs2 como se muestra aquí y reinténtelo.
DEBUG CR, "Type Y coordinate: "
DEBUGIN DEC1 y

Y = y MAX 5 MIN 1 ' <--- Add


X = x MIN 1 ' <--- Add

DEBUG CRSRXY, x, y, "*"


Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 171

Escalado y Compensación
Estos conceptos fueron presentados en el Capítulo 3 para manejar valores de entrada del
acelerómetro. En el capítulo 3, usamos el operador ** para escalar (multiplicar) por
valores fraccionales. En este ejemplo, usaremos el operador * porque una variable en el
siguiente programa ejemplo solo necesita ser multiplicada por el valor entero 2.

En la Figura 5-3 se ha trazado en la Terminal de Depuración una gráfica con ejes positivo
y negativo. La horizontal o eje x tiene un espacio entre cada numeral y la vertical eje y
no. A fin de posicionar el cursor en un punto particular usando el comando CRSRXY,
necesitaremos mapear entre los ejes trazados en la Terminal de Depuración y los ejes
usados por el comando CRSRXY.

Figura 5-3: Introduciendo y Desplegando Coordenadas


Página 172 · Sensores Inteligentes y sus Aplicaciones

Por ejemplo, donde los ejes de la gráfica intersectan en las coordenadas (0, 0) es de hecho
la posición CRSRXY 6,3 (compare esto con la Figura 5-2 hasta que perciba como es esto).
Para este programa nos gustría poder escribir “-3-3” en la Terminal de Depuración y
hacer que el asterisco aparezca en la coordenada (-3, -3) de la gráfica, que sería la
posición CRSRXY 0,6. Otro ejemplo, cuando escribe 2,2, CRSRXY de hecho debe posicionar
el asterisco en 10,1. Ahora es momento de entender como hacer esta traslación de mapeo
usando escalado y compensación.

Para valores entre -3 to 3, el valor X tiene que ser multiplicado por 2 y agregarle 6 para
que CRSRXY coloque el asterisco con el número correcto de espacios. Esto es una escala
de 2 y una compensación de 6. Esta es la línea de PBASIC para hacer la conversión de
coordenada X a número de espacios.

x = (x * 2) + 6

El valor Y tiene que ser multiplicado por -1, luego agregarle 3. Esto es una escala de -1 y
una compensación de 3. Esta es la línea de PBASIC para hacer la conversión de
coordenada Y al número de retornos de carro.

y = 3 - y

√ Intente sustituir las coordenadas x y y en el lado correcto de cada una de estas


ecuaciones, haga la matemática y verifique que cada ecuación entrega el número
correcto de espacios y retornos de carro.

Programa ejemplo – PlotXYGraph.bs2


√ Introduzca y corra PlotXYGraph.bs2.
√ Intente introducir esta secuencia: -3-3, -2-2, -1-1, 00, 11, 22, 33, y verifique que
compagina con el ejemplo de la Terminal de Depuración en la Figura 5-3.
√ Try some other sequences and/or drawing shapes by their coordinates.

' Sensores Inteligentes y sus Aplicaciones – PlotXYGraph.bs2


' Coloca el cursor en la grafica interactuando con la Terminal de Depuracion

'{$STAMP BS2}
'{$PBASIC 2.5}

x VAR Word
y VAR Word
temp VAR Byte
Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 173

DEBUG CLS,
" 3| ", CR,
" 2| ", CR,
" 1| ", CR,
"------+------", CR,
"-3-2-1| 1 2 3", CR,
" -2| ", CR,
" -3| ", CR, CR

DO

DEBUG "Type X coordinate: "


DEBUGIN SDEC1 x
DEBUG CR, "Type Y coordinate: "
DEBUGIN SDEC1 y

x = (x * 2) + 6
y = 3 - y

DEBUG CRSRXY, x, y, "*"

DEBUG CRSRXY, 0, 10, "Press any Key..."


DEBUGIN temp
DEBUG CRSRXY, 0, 8, CLRDN

LOOP

Su Turno – Mas acerca mantener los Caracteres en el Area de trazado


Los operadores MAX y MIN fueron presentados anteriormente para prevenir que el
asterisco apareciera fuera del area de trazado. Puede también usar líneas IF…THEN para
manejar valores que estén fuera de los límites. Un ejemplo de cómo puede modificar
PlotXYGraph.bs2 con IF…THEN: en vez de recibir los valores y colocar el asterisco dentro
de los límites permitidos, este programa espera hasta que un valor correcto es tecleado.

Modifique PlotXYGraph.bs2 reemplazando la instrucción DEBUG CRSRXY, x, y, "*"


con el bloque IF...THEN...ELSE...ENDIF siguiente, y luego corralo.
x = (x * 2) + 6
y = 3 – y

IF (x > 12) OR (y > 6) THEN ' <--Agregue código de aquí...


DEBUG CRSRXY, 0, 8, CLRDN, '
"Enter valores from -3 to 3.", CR, '
"Try again" '
'
ELSE '
'
Página 174 · Sensores Inteligentes y sus Aplicaciones

DEBUG CRSRXY, x, y, "*"


'
ENDIF ' <--- hasta aquí

DEBUG CRSRXY, 0, 10, "Press any Key..."


DEBUGIN temp

√ Verifique que este programa no le permite introducir caracteres fueran del rango
de -3 a 3.

¿Qué pasa con los números negativos?


Las condiciones para la línea IF...THEN en su versión modificada de PlotXYGraph.bs2 son
(x > 12) O (y > 6). Esto cubre numeros positivos mayores que 12 o 6, pero también todos
los números negativos. Esto es porque BASIC Stamp usa un sistema llamado complemento
a dos para guardar números negativos. En este, la version sin signo de cualquier valor
negativo es mayor que cualquier valor positivo. Por ejemplo, -1 es 65535, -2 es 65534, etc.,
hasta -32768, que de hecho es 32768. Valores positivos con signo solo van de 1 a 32767.

Algebra para Determinar Escalamiento y Compensación


La gráfica XY mostrada en la Terminal de Depuración es llamada el sistema coordenado
Cartesiano. Llamado así por el matemático del siglo 17 René Descartes, este sistema es la
base de las técnicas de graficación usadas en muchos temas matemáticos. El sistema
Cartesiano de la Figura 5-4a es comunmente desplegado con (0, 0) en el centro de la
gráfica. Sus valores son mayores yendo hacia arriba (eje y) y a la derecha (eje x).
Muchas gráficas se presentan y comportan en forma de pantalla, con la coordenada 0, 0
en la esquina superior izquierda (Figura 5-4b). En esta, el eje x se incrementa hacia la
derecha y el eje y se incrementa hacia abajo.

Figura 5-4: Coordenadas Cartesianas vs. Coordenadas de pantalla

a. Coordenadas Cartesianas b. Coordenadas de pantalla


Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 175

Puede usar una técnica algebráica estandar, resolviendo 2 ecuaciones con 2 incógnitas,
para definir las líneas que necesitará para transformar coordenadas Cartesianas en
coordenadas de pantalla para la Terminal de Depuración. El siguiente ejemplo muestra
cómo se hizo para las líneas que convierten x y y de Cartesianas a coordenadas de
pantalla en PlotXYGraph.bs2.

Agregando un par de comandos DEBUG a PlotXYGraph.bs2, puede mostrar las versiones


de antes y después del valor X que haya introducido.
DEBUG "Type X coordinate: "
DEBUGIN SDEC1 x
DEBUG CR, "Type Y coordinate: "
DEBUGIN SDEC1 y

DEBUG CRSRXY, 0, 12, "x before: ", SDEC x ' <--- Agregue

x = (x * 2) + 6
y = 3 - y

DEBUG CRSRXY, 0, 14, "x after: ", SDEC x ' <--- Agregue

DEBUG CRSRXY, x, y, "*"

√ Salve PlotXyGraph.bs2 bajo otro nombre, como PlotXyGraphBeforeAfter.bs2.


√ Agregue los 2 comandos DEBUG que muestran a x "antes" y "después".
√ Agregue 2 comandos DEBUG para mostrar el "antes" y "después" de y.
√ Introduzca las coordenadas (3,1) y (-2,-2) en la ventana de Transmisión de la
Terminal de depuración. Vea la Figura 5-5.
√ Registre los valores Después en la Tabla 5-1.

Tabla 5-1: valores X Antes y Después


Coordenada Antes Después
(3, 1) 3
(-2, -2) -2
Página 176 · Sensores Inteligentes y sus Aplicaciones

Figura 5-5
Coordenadas de prueba

Cuando se dieseña una pantalla para mostrar coordenadas Cartesianas, ayuda tomar un
par de valores antes y después como los de la Tabla 5-1. Entonces puede usarlos para
resolver la escala (K) y compensación (C) usando 2 ecuaciones con 2 incógnitas.

Xafter = (K × Xbefore ) + C

Los pasos usuales para 2 ecuaciones con 2 incógnitas son:

(1) Substituya sus 2 datos de antes y después en copias separadas de la ecuación.

12 = (K × 3) + C

2 = (K × − 2 ) + C
Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 177

(2) De requerirse, multiplique una de las 2 ecuaciones por un término que iguale los
números de una de las incógnitas en ambas ecuaciones.

No es preciso, el coeficiente de C en ambas ecuaciones es 1.

(3) Reste una ecuación de la otra para anular una de las incógnitas.

12 = (K × 3) + C
− [ 2 = (K × -2) + C ]
10 = K × 5

(4) Resuelva para la incógnita que no se anuló al restar.

10 = K × 5
10
K=
5
K =2

(5) Sustituya el valor que resolvió en el paso 4 en una de las 2 ecuaciones originales.

12 = (2 × 3) + C

(6) Resuelva para la segunda incógnita.

12 = (2 × 3) + C
12 = 6 + C
C = 12 - 6
C =6

(7) Incorpore las incógnitas resueltas en su ecuación.

Xafter = (K × Xbefore ) + C
K = 2 and C = 6
Xafter = (2 × Xbefore ) + 6
Página 178 · Sensores Inteligentes y sus Aplicaciones

Su Turno – Cálculos para el eje y


√ Modifique su programa para que muestre los valores del eje y antes y después.
√ Llene la Table 5-2 para los valores del eje y:

Table 5-2: valores y Antes y Después


Coordenada Antes Después
(3, 1) 1
(-2, -2) -2

Figura 5-6
Coordenadas de prueba

√ Repita los pasos 1 al 7 para la ecuación del eje y. La respuesta correcta es:

yafter = (− 1× ybefore ) + 3
Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 179

ACTIVIDAD #2: GUARDADO Y REFRESCADO DE FONDO CON LA


EEPROM
En un video juego, cuando su caracter de juego no está en la pantalla solo es visible el
fondo. Tan pronto como su caracter entra en escena, tapa parte del fondo. Cuando el
caracter se mueve, debe pasar: (1) el caracter de juego tiene que ser re-dibujado en una
nueva posición, y (2) el fondo que el caracter de juego estaba tapando tiene que ser re-
dibujado. Si no pasa el paso 2 su pantalla se llenará con copias de su carácter de juego.

Las televisiones y los monitores CRT de computadora refrescan cada pixel muchas veces
por segundo. El nivel de refrescado en las televisiones es 30 Hz aproximadamente y
algunos de los niveles de refrescado más comunes en CRTs son 60, 70, y 72 Hz. Otros
dispositivos como algunas pantallas LCD y LED sostienen la imagen automáticamente, o
bien con ayuda de otro microcontrolador. Todo lo que el programa o el microcontrolador
que controla estos dispositivos tiene que hacer es decirles lo que hay que desplegar o
cambiar. Es así también como trabaja la video compresión en su computadora. A fin de
reducir el tamaño del archivo, algunos archivos de video comprimidos guardan los
cambios en vez de guardar todos los pixeles en un cuadro de imagen dado.

Cuando se usa con pantallas que no necesitan ser refrescadas (como la Terminal de
Depuración o una LCD), el BASIC Stamp puede guardar una imagen de un juego o un
fondo de gráfica en su EEPROM. Cuando un caracter de juego se mueve y es redibujado
en una posición diferente, el BASIC Stamp puede leer su EEPROM y redibujar los
caracteres de fondo en la antigua posición del carácter de juego. Para ello, salve las viejas
coordenadas del caracter de juego antes de moverse y use esas coordenadas para
recuperar el caracter de fondo de la EEPROM. Dependiendo de qué tan grande es la
pantalla, esta técnica puede salvar una considerable cantidad de tiempo que el BASIC
Stamp puede necesitar para ejecutar otras tareas.

Esta actividad presenta 3 elementos para caracteres de juego y fondos:

1. Guardar y desplegar el fondo de la EEPROM


2. Rastrear las coordenadas nuevas y viejas de un caracter
3. Redibujar las coordenadas viejas de la EEPROM

Desplegar el fondo de la EEPROM


Esto no tiene que hacerse con un solo comando DEBUG, especialmente si necesita ser
mantenido como fondo con caracteres pasándole por el frente. Es mejor guardar los
Página 180 · Sensores Inteligentes y sus Aplicaciones

caracteres en la EEPROM y luego desplegarlos con un ciclo FOR…NEXT que use los
comandos READ y DEBUG para desplegar los caracteres individualmente (Figura 5-7).

Figura 5-7
Fondo a partir de la
directiva DATA

Puede usar la directiva DATA para guardar un fondo en la EEPROM. Note como estas
directivas DATA guardan 100 caracteres (0 al 99). Note también que cada renglón es de
14 caracteres de ancho cuando agrega el caracter de control CR. La programación es más
fácil si cada renglón es del mismo ancho. De otra forma, encontrar el carácter que desea
se vuelve un problema más complejo.
DATA CLS, ' 0
" 3| ", CR, ' 14
" 2| ", CR, ' 28
" 1| ", CR, ' 42
"------+------", CR, ' 56
"-3-2-1| 1 2 3", CR, ' 70
" -2| ", CR, ' 84
" -3| ", CR, CR ' 98 + 1 = 99

Para desplegar el fondo completo una vez al principio del programa, puede usar un ciclo
FOR…NEXT. Recupera y despliega cada caracter guardado en la EEPROM. Recuerde que,
si bien el efecto neto es el mismo que un comando DEBUG largo, la EEPROM es más
Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 181

flexible porque también puede obtener y desplegar caracteres individuales según se


requiera para refrescar el fondo.
FOR index = 0 TO 99
READ index, character
DEBUG character
NEXT

Programa ejemplo – EepromBackgroundDisplay.bs2


√ Introduzca, salve y corra el programa.
√ Verifique que el desplegado es el mismo que en PlotXyGraph.bs2.

' Sensores Inteligentes y sus Aplicaciones - EepromBackgroundDisplay.bs2


'

'{$STAMP BS2} ' directivas Stamp & PBASIC


'{$PBASIC 2.5}

index VAR Byte ' Variables


character VAR Byte

DATA CLS, ' 0 ' Guarda fondo en EEPROM


" 3| ", CR, ' 14
" 2| ", CR, ' 28
" 1| ", CR, ' 42
"------+------", CR, ' 56
"-3-2-1| 1 2 3", CR, ' 70
" -2| ", CR, ' 84
" -3| ", CR, CR ' 98 + 1 = 99

FOR index = 0 TO 99 ' Recupera y despliega fondo


READ index, character
DEBUG character
NEXT

END

Su Turno – Viewing the EEPROM Caracteres


√ En el Editor BASIC Stamp, haga click en Run y seleccione Memory Map.
√ Haga click en la caja Display ASCII en la esquina inferior izquierda de la
ventana Memory Map.
√ Los dígitos, guiones y barras verticales deben aparecer en el Mapa EEPROM
exactamente como se muestra en la Figura 5-8.
Página 182 · Sensores Inteligentes y sus Aplicaciones

√ Este mapa muestra 16 caracteres por renglón en vez de 14. Revise que tiene en
total 100 caracteres (0 a 99) guardados para fines de pantalla en la EEPROM.

Figura 5-8: Desplegado de Caracteres guardados en la EEPROM

Rastreando Coordenadas nuevas y viejas de un caracter


Digamos que desea rastrear las coordenadas x y y en PlotXYGraph.bs2 original no
modificado de la actividad #1. Esto toma 2 pasos:

(1) Declare un par de variables para guardar los valores viejos, xOld y yOld por
ejemplo.
x VAR Word
y VAR Word

xOld VAR Nib ' <--- Agregue


yOld VAR Nib ' <--- Agregue

temp VAR Byte

(2) Antes de cargar nuevos valores en las variables x y y, guarde el valor presente de x
en xOld y el valor presente de y en yOld.
Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 183

DO

xOld = x ' <--- Agregue


yOld = y ' <--- Agregue

DEBUG "Type X coordinate: "

¿Porqué x y y son palabras mientras que xOld y yOld son nibbles?

Cuando se trabaja con valores con signo, las variables de palabra se guardan con valor y
signo. En el punto particular en que xOld y yOld son usados en el programa, solo guardan
valores que van de 0 a 12, por lo tanto todo lo que necesitamos son variables nibble.

Este es un tercer paso que puede usar para probar y verificar que trabaja:

(3) Agregue oraciones DEBUG para desplegar los valores presentes y previos de x, y.
DEBUG CRSRXY, x, y, "*"

DEBUG CRSRXY, 0, 10, ' <--- Agregue


"Current entry: (",
DEC x, ",", DEC y, ")"
DEBUG CRSRXY, 0, 11, ' <--- Agregue
"Previous entry: (",
DEC xOld, ",", DEC yOld, ")"
DEBUG CRSRXY, 0, 12, "Press any Key..." ' <--- Modifique

DEBUGIN temp

√ Inicie con la version original no modificada de PlotXYGraph.bs2, salvela bajo el


nombre de PlotXYGraphRecall.bs2, e intente las modificaciones recién
discutidas en los pasos (1) a (3) arriba. Considere que ambos valores
desplegados serán en términos de las coordenadas de la Terminal de Depuración.
También considere que en al inicio, las viejas coordenadas serán (0, 0) puesto
que todas las variables se inicializan en cero en PBASIC.

Re-Dibujando el Fondo
Hasta este punto, todos nuestros trazados acumularon asteriscos mientras introducíamos
más valores en la ventana de Transmisión. El efecto neto que queremos para control de
juego es hacer desaparecer el asterisco de su vieja posición y aparecer en su nueva
posición cuando la redefinamos para dar el aspecto de un asterisco moviéndose.
Página 184 · Sensores Inteligentes y sus Aplicaciones

Observe la Figura 5-9. Note que 6 pares ordenados fueron introducidos en la Terminal de
Depuración, pero solo hay un asterisco y corresponde con el último par introducido. Esto
es porque el programa usado aquí hace desaparecer al viejo asterisco tomando las
coordenadas viejas x, y , busca ese caracter de fondo en la EEPROM y luego lo despliega
con DEBUG. Para hacer aparecer el asterisco en su nueva posición, usa un comando DEBUG
con las coordenadas presentes x, y como en los programas ejemplo previos.

Figura 5-9
Pantalla usando
Refrescado de fondo
EEPROM

El programa usado para crear la Figura 5-9 combina la the técnica de fondo definida con
DATA de EepromBackgroundDisplay.bs2 con la técnica de graficado de asterisco y rastreo
de posición de PlotXYGraphRecall.bs2. Esta combinación nos permite redibujar el
caracter de fondo sobre el viejo asterisco con este código:
IF (x <> xold) y (y <> yold) THEN ' Ve si el asterisco se movio
index = (14 * yOld) + xOld + 1 ' Direccion de caracter de fondo
READ index, character ' Obtiene caracter de fondo
DEBUG CRSRXY, xOld, yOld, character ' Muestra caracter de fondo
ENDIF
Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 185

La variable index selecciona el caracter correcto de la EEPROM. El valor x es el número


de espacios encima y el valor y es el número de returnos de carro hacia abajo. Para llegar
a la dirección correcta de un caracter en el tercer renglón, su programa tiene que agregar
todos los caracteres en los primeros 2 renglones. Puesto que cada renglón tiene 14
caracteres, yOld tiene que ser multiplicado por 14 antes de poder ser sumado a xOld. El
1 extra es agregado para brincar CLS que está en la dirección 0.

Sin importar si es una pantalla de computadora, la pantalla de cristal líquido de su celular


o la pantalla de su aplicación de BASIC Stamp, se aplica la misma técnica. El procesador
recuerda 2 imagenes diferentes, la del fondo y la del frente. Según se “mueve” un objeto
del frente, este es desplegado en una posición diferente y el area que deja vacía el objeto
del frente es re-dibujada.

Lo más importante que hay que tener en cuenta en relación de esta técnica de
programación es que se ahorra al procesador mucho tiempo. Solo tiene que recuperar un
caracter de la EEPROM y enviarlo a la Terminal de Depuración. Comparado con 99
caracteres, es un ahorro de tiempo significativo y el BASIC Stamp puede hacer otras
cosas con ese tiempo, como monitorear otros sensores, controlar servos, etc.

Programa ejemplo – EepromBackgroundRefresh.bs2


Este programa toma PlotXYGraph.bs2 combinado con EepromBackgroundDisplay.bs2,
usando las técnicas de desplegado de fondo, coordinación de guardado y re-dibujado de
fondo recién discutidas.

√ Introduzca, salve y corra EepromBackgroundRefresh.bs2.


√ Pruebe y verifique que el asterisco desaparece de su posición vieja y aparece en
la nueva posición que introduce.

' -----[ Titulo ]-----------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - EepromBackgroundRefresh.bs2

'{$STAMP BS2} ' directivas Stamp/PBASIC


'{$PBASIC 2.5}

' -----[ Variables ]-------------------------------------------------------

x VAR Word ' Guarda posicion presente


y VAR Word

xOld VAR Nib ' Guarda posicion previa


yOld VAR Nib
Página 186 · Sensores Inteligentes y sus Aplicaciones

temp VAR Byte ' Variable tonta para DEBUGIN

index VAR Byte ' READ index/caracter storage


character VAR Byte

' -----[ Datos de EEPROM]-----------------------------------------------------

DATA CLS, ' Datos de fondo


" 3| ", CR, ' 14
" 2| ", CR, ' 28
" 1| ", CR, ' 42
"------+------", CR, ' 56
"-3-2-1| 1 2 3", CR, ' 70
" -2| ", CR, ' 84
" -3| ", CR, CR ' 98 + 1 = 99

' -----[ Inicializacion ]--------------------------------------------------

FOR index = 0 TO 99 ' Despliega fondo


READ index, character
DEBUG character
NEXT

' -----[ Rutina Principal ]---------------------------------------------------

DO

xOld = x ' Guarda coordenadas previas


yOld = y

DEBUG "Type X coordinate: " ' Obtiene nuevas coordenadas


DEBUGIN SDEC1 x
DEBUG CR, "Type Y coordinate: "
DEBUGIN SDEC1 y

x = (x * 2) + 6 ' valores Cartesianos a DEBUG


y = 3 - y

DEBUG CRSRXY, x, y, "*" ' Despliega asterisco

IF (x <> xold) y (y <> yold) THEN ' Checa si el asterisco se movio


index = (14 * yOld) + xOld + 1 ' Direccion de caracter de fondo
READ index, character ' Obtiene caracter de fondo
DEBUG CRSRXY, xOld, yOld, character ' Muestra caracter de fondo
ENDIF

DEBUG CRSRXY, 0, 10, "Press any Key..." ' Espera al usuario


DEBUGIN temp
DEBUG CRSRXY, 0, 8, CLRDN ' Limpia informacion vieja

LOOP
Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 187

Su Turno – Redibujando el fondo sin Variables Extra


No siempre es necesario mantener rastreo de la vieja posición de la vieja posición del
caracter de frente. Considere esto: en EepromBackgroundRefresh.bs2 las variables x y y
guardan losvaloresviejos hsta que introduce nuevos valores. Rearreglando el orden en que
se despliegan las variables x y y, puede eliminar la ncesidad de xOld y yOld.

Puede intentar la siguiente Rutina principal de reemplazo en


EepromBackgroundRefresh.bs2. En el momento en que presiona la barra espaciadora su
viejo asterisco desaparece. El nuevo asterisco reaparece cuando escribe la segunda de las
2 coordenadas. Como verá en la siguiente actividad, esta técnica trabaja muy bien cuando
la frecuencia de refrescado es varias veces por segundo con control de inclinación.

√ Salve EepromBackgroundRefresh.bs2 como


EepromBackgroundRefreshYourTurn.bs2.
√ Retire las declaraciones de variables xOld y yOld.
√ Reemplace la rutina principal en EepromBackgroundRefresh.bs2 con la
siguiente.
√ Pruebe y examine el cambio en el comportamiento del programa.

' -----[ Rutina Principal]---------------------------------------------

DO

index = (14 * y) + x + 1 ' Re-despliega fondo


READ index, character
DEBUG CRSRXY, x, y, character

DEBUG CRSRXY, 0, 8, ' Obtiene nuevas coordenadas


"Type X coordinate: "
DEBUGIN SDEC1 x
DEBUG CR, "Type Y coordinate: "
DEBUGIN SDEC1 y

x = (x * 2) + 6 ' Valores de cartesiano a DEBUG


y = 3 - y

DEBUG CRSRXY, x, y, "*" ' Despliega asterisco

DEBUG CRSRXY, 0, 10, "Press any Key..." ' Espera al usuario


DEBUGIN temp
DEBUG CRSRXY, 0, 8, CLRDN ' Limpia informacion vieja

LOOP
Página 188 · Sensores Inteligentes y sus Aplicaciones

Animación y Redibujado de Fondo


He aquí un ejemplo de algo que puede hacer si usa caracteres individuales, pero no
trabajará si intenta redibujar toda la pantalla con un comando DEBUG.

√ Salve EepromBackgroundRefresh.bs2 como ExampleAnimation.bs2.


√ Reemplace la rutina principal en el programa con la que se muestra aquí.
√ Corralo y observe el efecto.
DO
FOR y = 0 TO 6
FOR temp = 1 TO 2
FOR x = 0 TO 12
IF (temp.BIT0 = 1) THEN
DEBUG CRSRXY, x, y, "*"
ELSE
index = (14 * yOld) + xOld + 1
READ index, character
DEBUG CRSRXY, xOld, yOld, character
xOld = x
yOld = y
ENDIF
PAUSE 50
NEXT
NEXT
NEXT
LOOP

ACTIVIDAD #3: INCLINANDO LA GRÁFICA DE BURBUJA


Esta actividad combina los conceptos de gráficos presentados en las actividades 1 y 2 con
las técnicas de medición de inclinación del acelerómetro (capítulo 3). El resultado es un
asterisco “burbuja” que ilustra el movimiento de la bolsa de gas dentro del MX2125. La
Figura 5-11 en la siguiente página muestra lo que despliega la Terminal de Depuración en
esta actividad cuando el acelerómetro es inclinado hacia arriba y hacia la izquierda.

Parts Required
(2) Cables conectores de 3 pulgadas
(2) Resistencias – 220 Ω
(1) Acelerómetro Bi-axial Mems MX2125

√ Conecte the móduló de acelerómetro usando la Figura 5-10 como guía.


Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 189

Figura 5-10: Diagrama de cableado y Esquemático del Acelerómetro

Figura 5-11: Posición del Gas caliente del Acelerómetro

Asterisk Indicates
Hot Gas Location
Página 190 · Sensores Inteligentes y sus Aplicaciones

La Figura 5-12 muestra una leyenda para las diversas formas que puede inclinar la tarjeta
en sus ejes junto con cada efecto de la inclinación en la posición de la bolsa de gas.

Tilt Hot Gas Center

Level (0, 0)

Tilt
(-3, 0)
Right

Figura 5-12:
Inclinación del
Acelerómetro y
Posición del
Tilt
(3, 0) Cursor
Left

Tilt
(0, -3)
Down

Tilt
(0, 3)
Up
Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 191

Control de inclincación para el Despliegue del asterisco


BubbleGraph.bs2 actualiza la posición del punto más caliente dentro de la cámara del
acelerómetro 8 veces por segundo aproximadamente (8 Hz). Después de desplegar el
fondo (ejes X y Y) en la Terminal de Depuración, repite los mismos pasos una y otra
vez.

• Reemplaza el asterisco con el caracter de fondo y hace pausa por el parpadeo.


• Obtiene la inclinación del eje x del acelerómetro.
• Obtiene la inclinación del eje y del acelerómetro.
• Ajusta el valor para que encaje en el eje X de graficación.
• Ajusta el valor para que encaje en el eje X de graficación.
• Despliega el asterisco y hace pausa nuevamente por el parpadeo.

Cada uno de estos pasos es discutido con más detalle en la sección que sigue al programa
ejemplo.

Programa ejemplo – BubbleGraph.bs2


√ Introduzca y corra BubbleGraph.bs2.

' -----[ Titulo ]-------------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - BubbleGraph.bs2
' La posicion de la burbuja en el sensor se grafica en Terminal de Depuracion

'{$STAMP BS2} ' Stamp/PBASIC directives


'{$PBASIC 2.5}

' -----[ Datos EEPROM]--------------------------------------------------------

' Guarda fondo en EEPROM ' Direccion del ultimo caracter en el renglon

DATA CLS, ' 0


" 5^Y ", CR, ' 22
" 4| ", CR, ' 44
" 3| ", CR, ' 66
" 2| ", CR, ' 88
" 1| X", CR, ' 110
"----------+--------->", CR, ' 132
"-5-4-3-2-1| 1 2 3 4 5", CR, ' 154
" -2| ", CR, ' 176
" -3| ", CR, ' 198
" -4| ", CR, ' 220
" -5| ", CR ' 242
Página 192 · Sensores Inteligentes y sus Aplicaciones

' -----[ Variables ]----------------------------------------------------------

x VAR Word ' Guarda posición presente


y VAR Word

index VAR Word ' READ index/caracter storage


char VAR Byte

' -----[ Inicializacion ]-----------------------------------------------------

FOR index = 0 TO 242 ' Lee y despliega fondo


READ index, char
DEBUG char
NEXT

' -----[ Rutina Principal ]---------------------------------------------------


DO ' Inicia rutina principal

' Reemplaza asterisco con caracter de fondo.


index = (22 * y) + x + 1 ' Coordenadas -> Direcc. EEPROM
READ index, char ' Obtiene caracter de fondo
DEBUG CRSRXY, x, y, char ' Muestra caracter de fondo
PAUSE 50 ' Pause por parpadeo

' Mide inclinacion.


PULSIN 6, 1, x ' Obtiene Ax y Ay
PULSIN 7, 1, y

' Calcula posicion del cursor.


x = (x MIN 1875 MAX 3125) - 1875 ** 1101 ' Calcula posicion x
y = (y MIN 1875 MAX 3125) - 1875 ** 576 ' Calcula posicion y
y = 10 - y

' Despliega asterisco en la nueva posicion del cursor.


DEBUG CRSRXY, x, y, "*" ' Despliega asterisco
PAUSE 50 ' Pausa nuevamente por parpadeo

LOOP ' Repite rutina principal

√ Sostenga su tarjeta como se muestra en la imagen superior de la Figura 5-12.


√ Practique controlar el asterisco inclinando la tarjeta.
√ Adicionalmente, intente sostenerla verticalmente y rotarla en un círculo. El
asterisco debe viajar en un arco circular alrededor de la gráfica conforme usted
lo hace.
Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 193

Como trabaja BubbleGraph.bs2


Primero, la rutina principal despliega el caracter de fondo en la posición presente del
cursor. Con una pausa de 50 ms, completa la porción “off” de un asterisco que parpadea.
' Reemplaza asterisco con caracter de fondo.
index = (22 * y) + x + 1 ' Coordenadas -> direccion EEPROM
READ index, char ' Obtiene caracter de fondo
DEBUG CRSRXY, x, y, char ' Despliega caracter de fondo
PAUSE 50 ' Pausa por parpadeo

Enseguida, el programa obtiene la inclinación x y y.


' Mide tilt.
PULSIN 6, 1, x ' Obtiene Ax y Ay
PULSIN 7, 1, y

El programa necesita escalar y compensar las mediciones de inclinación de los ejes x y y


para que el asterisco sea correctamente colocado en la Terminal de Depuración. Para esto
se aplica el mismo escalamiento y compensación presentado en el Capítulo 3, actividad
#3. Para el eje x, los valores de pulso del acelerómetro (de 1875 a 3125) tienen que ser
escalados a posiciones de asterisco de 0 a 20. Restando 1875 a la medición del
acelerómetro antes de escalar, tenemos una escala de entrada de 0 a 1250 (1251
elementos) y una escala de salida de 0 a 20 (21 elementos). La constante de escala ** es:

ScaleConstant = Int[65536(elementos escala salida)/(elementos escala entrada - 1)]

Substituyendo el número de elementos en las escalas de entrada y salida nos da una


constante de escala ** de 1101.

ScaleConstant = Int[65536(21/(1251-1))]
ScaleConstant = Int[65536(21/1250)]
ScaleConstant = Int[1101.0048]
ScaleConstant = 1101

Un proceso similar resulta en una constante de escala ** de 576 para el eje y, y el código
resultante para escalar y compensar ambos ejes es:
' Calcula posicion del cursor.
x = (x MIN 1875 MAX 3125) - 1875 ** 1101 ' Calcula posicion x
y = (y MIN 1875 MAX 3125) - 1875 ** 576 ' Calcula posicion y
y = 10 - y
Página 194 · Sensores Inteligentes y sus Aplicaciones

Si las mediciones del acelerómetro están ligeramente fuera de la escala de 1875 a 3125,
puede causar síntomas extraños. Los operadores MIN y MAX previenen esto. También se
resta 1875 a cada eje antes de que sea escalado con el operador **. El resultado para el
eje x es que 0 a 1250 es escalado a 0 a 20. Para el eje y, 0 a 1250 es escalado a 0 a 10.

Al disminuir las mediciones de eje e inclinación, la posición hacia abajo del cursor tiene
que incrementar. Entonces en vez de ajustar de 1875 a 3125 en 0 a 10, el programa tiene
que ajustar en 10 a 0. La oración y = 10 - y resuelve esto. Si y es 0, después de escalar
se vuelve 10. Igualmente, si y es 10 después de escalar se vuelve 0. Si es 9 después de
escalar se vuelve 1, si es 8 después de escalar se vuelve 2, etc.

Los últimos pasos antes de repetir el ciclo en la rutina principal son desplegar el nuevo
asterisco en sus nuevas coordenadas x y y, luego pausar por otros 50 ms para completar
la porción “on” del asterisco parpadeante.
' Despliega el asterisco en la nueva posicion del cursor.
DEBUG CRSRXY, x, y, "*"
PAUSE 50

Su Turno – Una burbuja más grande


Pueden desplegarse y borrarse un grupo de asteriscos como se muestra en la Figura 5-13,
pero comparado con un solo caracter, requiere un poco mas de trucos. El programa tiene
que asegurar que ninguno de los asteriscos será desplegado fuera del area de trazado.
También tiene que asegurar que todos los asterisks serán sobrescritos con los caracteres
correctos de la EEPROM. He aquí un ejemplo de cómo modicar BubbleGraph.bs2 para
desplegar un indicador de coordenada de 5 asteriscos:

√ Salve BubbleGraph.bs2 como BubbleGraphYourTurn.bs2.


√ Agregue esta declaration de variable a la sección de variables del programa:
temp VAR Byte

√ Reemplace la rutina “Reemplaza asterisco con caracter de fondo” con esta:


' Reemplaza asterisco con caracter de fondo (modificado).
FOR temp = (x MIN 1 – 1) TO (x MAX 19 + 1)
index = (22 * y) + temp + 1
READ index, char
DEBUG CRSRXY, temp, y, char
NEXT

FOR temp = (y MIN 1 – 1) TO (y MAX 9 + 1)


Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 195

index = (22 * temp) + x + 1


READ index, char
DEBUG CRSRXY, x, temp, char
NEXT
PAUSE 50

√ Reemplace la rutina “ Despliega asterisco en la nueva posicion del cursor” con


esta:
' Despliega asterisco en la nueva posicion del cursor (modificado).
DEBUG CRSRXY, x, y, "*",
CRSRXY, x MAX 19 + 1, y, "*",
CRSRXY, x, y MAX 9 + 1, "*",
CRSRXY, x MIN 1 - 1, y, "*",
CRSRXY, x, y MIN 1 - 1, "*"
PAUSE 50

√ Corra el programa y pruébelo. Pruebe para asegurarse que no ocurren problemas


al forzar a salir del area de trazado a uno de los asteriscos más hacia fuera.

Figura 5-13
Grupo de Asteriscos
con Refrecado de Fondo
Página 196 · Sensores Inteligentes y sus Aplicaciones

MIN y Números Negativos


Un error típico que hay que evitar del complemento a dos es restar 1 de 0 y luego colocar el
valor MIN. Recuerde del Capítulo 3 que el sistema de complemento a dos guarda el valor
con signo -1 como 65535. Por eso el valor MIN fue colocado a 1 antes de restar 1. El
resultado es entonces un mínimo correcto de 0. La misma técnica fue usada para establecer
los valores MAX aún cuando no hay ningún problema con y + 1 MAX 10.

ACTIVIDAD #4: CONTROL DE JUEGO


Estas son las reglas del juego-ejemplo controlado por inclinación de esta actividad
(Figura 5-14). Incline su tarjeta para controlar el asterisco. Si sale del laberinto y coloca
el asterisco en cualquiera de los caracteres "WIN", se desplegará la pantalla "YOU WIN".
Si choca con cualquier signo "#" antes del final del laberinto, se desplegará la pantalla
"YOU LOSE". Al navegar por el laberinto, intente mover su caracter de juego asterisco
sobre los signos de dólares "$" para obtener más puntos.

Convirtiendo BubbleGraph.bs2 en TiltObstacleGame.bs2


TiltObstacleGame.bs2 es irrefutablemente una version de BubbleGraph.bs2 con más
aspiraciones. He aquí una lista de los cambios y adiciones más importantes:

• Cambia la gráfica por un laberinto.


• Agrega 2 fondos para ganador y perdedor a los datos EEPROM.
• Le da a cada fondo un nombre símbolo.
• Escribe un bloque de código del jugador que detecta qué caracter de fondo está
en frente del caracter de juego y usa esa información para seguir las reglas del
juego.
Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 197

Figura 5-14: Juego de Curso de


obstáculos

fondo de laberinto del juego (izquierda)


Pantalla “You Win” (izquierda abajo)
Pantalla “You Lose” (derecha abajo)
Página 198 · Sensores Inteligentes y sus Aplicaciones

Intente primero el juego y luego veremos con más detalle como funciona.

Programa ejemplo – TiltObstacleGame.bs2

Descarga gratis Este programa está disponible como descarga grátis .bs2 en la página del
producto de Sensores Inteligentes y sus Aplicaciones en www.parallax.com.

√ Abra (o introduzca) y salve TiltObstacleGame.bs2.


√ Antes de que corra el programa, asegúrese de que su tarjeta está nivelada.
Asegúrese de sostenerla igual que en la actividad 3, con la tableta cercana a
usted, y el cable serial lejos.
√ Si quiere refrescar los caracteres “$”, haga click en el botón Run del Editor de
BASIC Stamp. Si solo quiere practicar navegar y no preocuparse de los puntos,
presione y libere el botón Reset en su tarjeta.

' -----[ Titulo ]-------------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - TiltObstacleGame.bs2
' Guie el cursor por el laberinto con el acelerómetro,reuna $ en la Terminal
' de Depuracion

'{$STAMP BS2} ' directivas Stamp/PBASIC


'{$PBASIC 2.5}

' -----[ Datos EEPROM ]-------------------------------------------------------


' Guarda fondo en EEPROM ' 3 fondos usados en el juego

Maze DATA @0, HOME, ' Fondo de laberinto


"#####################", CR,
"###### $ ########", CR,
"## ### ###", CR,
"# ########### ###", CR,
"#$ # ####", CR,
"##### # $ #####WIN", CR,
"# ## ## $ #", CR,
"# $ ########### # #", CR,
"# ##$## # #", CR,
"# ######## #", CR,
"#####################", CR

YouLose DATA @243, HOME, ' Fondo YouLose


"#####################", CR,
"#####################", CR,
"### ####### ####", CR,
"### ####### ####", CR,
"#####################", CR,
Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 199

"########## ##########", CR,


"#####################", CR,
"### ####", CR,
"### YOU LOSE ####", CR,
"### ####", CR,
"#####################", CR

YouWin DATA @486, HOME, ' Fondo YouWin


" ########### ", CR,
" ################# ", CR,
"##### ##### #####", CR,
"#### ### ####", CR,
"# ### ##### ### #", CR,
"# ############### #", CR,
"## ########### ##", CR,
"## ##", CR,
" #### YOU WIN #### ", CR,
" #### #### ", CR,
" ######### ", CR

' -----[ Variables ]----------------------------------------------------------


x VAR Word ' coordenadas de grafica e inclinacs. x & y
y VAR Word

index VAR Word ' Direccion EEPROM y caracter


char VAR Byte

symbol VAR Word ' Direccion simbolo para EEPROM DATA


points VAR Byte ' Puntaje durante el juego

' -----[ Inicializacion ]-----------------------------------------------------


x = 10 ' Inicia caracter de juego en medio
y = 5

DEBUG CLS ' Limpia pantalla

' Despliega laberinto.


symbol = Maze ' Establece Symbol en laberinto de EEPROM DATA

FOR index = 0 TO 242 ' Despliega laberinto


READ index + symbol, char
DEBUG char
NEXT

' -----[ Rutina Principal ]---------------------------------------------------


DO

' Despliega fondo en la posición del cursor.


index = (22 * y) + x + 1 ' Coordenadas -> Direccion EEPROM
READ index + symbol, char ' Obtiene caracter de fondo
DEBUG CRSRXY, x, y, char ' Muestra caracter de fondo
Página 200 · Sensores Inteligentes y sus Aplicaciones

PAUSE 50 ' Pausa por parpadeo

' Mide inclinación y calcula posicion del cursor.


PULSIN 6, 1, x ' Obtiene Ax y Ay
PULSIN 7, 1, y

x = (x MIN 1875 MAX 3125) - 1875 ** 1101 ' Calcula posicion x


y = (y MIN 1875 MAX 3125) - 1875 ** 576 ' Calcula posicion y
y = 10 - y

' Despliega asterisco en la nueva posicion.


DEBUG CRSRXY, x, y, "*" ' Despliega asterisco
PAUSE 50 ' Pausa nuevamente por parpadeo

' Despliega puntaje


DEBUG CRSRXY, 0, 11, ' Despliega puntaje
"Score: ", DEC3 points

' ¿Movió el asterisco sobre un$, W, I, N, o #?


SELECT char ' Checa caracter de fondo
CASE "$" ' Si es "$"
points = points + 10 ' Agrega puntos
WRITE index, "%" ' Escribe "%" sobre "$"
CASE "#" ' Si es "#",hace Symbol a YouLose
symbol = YouLose
CASE "W", "I", "N" ' Si W,I,o N, Symbol -> YouWin
symbol = YouWin
ENDSELECT

' Esta rutina es ignorada mientras que symbol se mantenga = Maze. Si symbol
' fue cambiada a YouWin o YouLose, despliega el nuevo fondo y fin de juego.
IF (symbol = YouWin) OR (symbol = YouLose) THEN
FOR index = 0 TO 242 ' 242 caracteres
READ index + symbol, char ' Obtiene caracter
DEBUG char ' Muestra caracter
NEXT ' Siguiente iteracion del ciclo
END ' Fin de juego
ENDIF ' Fin de bloque symbol-if

LOOP ' Repite ciclo principal

Como trabaja – From BubbleGraph.bs2 to TiltObstacleGame.bs2


Dos de las características opcionales de la directiva DATA fueron usadas aquí. A cada uno
de los 3 fondos le fue dado un nombre Símbolo, Maze, YouWin, y YouLose. Estos
nombres Símbolo le hacel fácil al programa seleccionar qué fondo desplegar. El operador
opcional @Address también fue usado para establecer la dirección EEPROM inicial de
cada directiva. En el fondo de BubbleGraph.bs2, el primer caracter es CLS para limpiar la
pantalla. El problema con CLS en estas directivas DATA es que borra toda la Terminal de
Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 201

Depuración, incluyendo el marcador, que es desplegado abajo del fondo. Sustituyendo


HOME por CLS, los fondos completos pueden ser dibujados y redibujados sin borrar el
marcador.
Maze DATA @0, HOME,
"#####################", CR,
"###### $ ########", CR,
·
·
·
YouLose DATA @243, HOME,
"#####################", CR,
"#####################", CR,
·
·
·
YouWin DATA @486, HOME,
" ########### ", CR,
" ################# ", CR,
·
·

Verificando Valores Símbolo


Intente comandos como DEBUG DEC YouWin para verificar que YouWin guarda 486.

Dos variables fueron agregadas, symbol para dar seguimiento de qué fondo se recuperan
caracteres y points para dar seguimiento al marcador del jugador.
symbol VAR Word
points VAR Byte

Los valores iniciales de x y y tienen que empezar enmedio del curso de obstáculos.
Puesto que todas las variables inicializan en cero en PBASIC, una falla en su
inicialización causaría que el caracter de juego empezara en la esquina superior izquierda
en vez de a la mitad.
x = 10
y = 5

La variable symbol se establece en Maze antes de ejecutar el ciclo FOR…NEXT que


despliega el fondo. Puesto que todas las variables son inicializadas en cero en PBASIC,
esto pasa de cualquier manera. Sin embargo, si fuse a insertar una directiva DATA antes
del fondo Maze, sería crucial tener esta línea.
' Display maze.
Página 202 · Sensores Inteligentes y sus Aplicaciones

symbol = Maze

El bloque de código que sigue a la inicialización de variables es el desplegado del fondo.


Observe el comando READ. Ha sido cambiado de READ index, char a READ index +
symbol, char. Puesto que la variable symbol fue establecida para guardar Maze, todos
los caracteres en el primer fondo serán desplegados. Si symbol guardado es YouLose,
todos los caracteres en el segundo fondo serán desplegados. Si guardó YouWin, todos los
caracteres en el tercer fondo serán desplegados. Puesto que "You Lose" o "You Win"
serán desplegados, esta rutina será usada de nuevo mas tarde en el programa.
FOR index = 0 TO 242
READ index + symbol, char
DEBUG char
NEXT

Tienen que ser agregadas 3 rutinas al DO...LOOP en la Rutina Principal. La primera


simplemente despliega el marcador del jugador:
' Despliega puntaje
DEBUG CRSRXY, 0, 11, ' Despliega puntaje
"Score: ", DEC3 points

La segunda rutina es crucial; es una linea SELECT…CASE que sigue las reglas del juego.
La línea SELECT…CASE ve el caracter de fondo en la posición presente del asterisco. Si el
asterisco esta sobre un espacio " ", la línea SELECT…CASE no necesita cambiar nada y el
DO…LOOP de la Rutina Principal solo se mantiene repitiéndose, revisándo las mediciones
del acelerómetro y actualizando la posición del asterisco. Si el asterisco se mueve sobre
un "$", el programa tiene que agregar 10 a la variable points, y escribir un caracter "%"
sobre el "$" en la EEPROM. Esto previene que el programa sume 10 points varias veces
por segundo mientras que el asterisco is sostenido sobre "$". Si el asterisco es movido
sobre un "#", el símbolo YouLose es guardado en la variable symbol. Si el asterisco se
mueve sobre cualquiera de las letras "W" "I" o "N", YouWin se guarda en symbol.
' ¿Movió el asterisco sobre un$, W, I, N, o #?
SELECT char ' Checa caracter de fondo
CASE "$" ' Si es "$"
points = points + 10 ' Agrega puntos
WRITE index, "%" ' Escribe "%" sobre "$"
CASE "#" ' Si es "#",hace Symbol a YouLose
symbol = YouLose
CASE "W", "I", "N" ' Si W,I,oN, Symbol -> YouWin
symbol = YouWin
ENDSELECT
Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 203

Al navegar su asterisco sobre " ", "$", or "%", la siguiente rutina es ignorada porque
symbol aún guarda Maze. La línea SELECT…CASE solo cambia esto cuando el asterisco es
movido sobre "#", "W", "I", o "N". Siempre que la línea SELECT…CASE cambie symbol
a YouWin o YouLose, esta rutina despliega el fondo correspondiente, luego termina el
juego.
' Esta rutina es ignorada mientras que symbol se mantenga = Maze. Si symbol
' fue cambiada a YouWin o YouLose, despliega el nuevo fondo y fin de juego.
IF (symbol = YouWin) OR (symbol = YouLose) THEN
FOR index = 0 TO 242 ' 242 caracteres
READ index + symbol, char ' Obtiene caracter
DEBUG char ' Muestra caracter
NEXT ' Siguiente iteracion del ciclo
END ' Fin de juego
ENDIF ' Fin de bloque symbol-if

Su Turno – Modificaciones y Depuraciones


El juego no refresca los símbolos "$" cuando se vuelve a correr con el botón de Reset de
la tarjeta Board of Education. Solo trabaja cuando hace click en el botón Run del Editor
BASIC Stamp. Esto es porque la directiva DATA solo escribe a la EEPROM cuando el
programa es bajado. Si el programa es reiniciado con the botón Reset, el Editor del
BASIC Stamp no tiene oportunidad de guarder los espacios, signos de dolar, etc, y los
signos de porciento que fueron escritos en la EEPROM aún están allí. Para resolver el
problema, todo lo que tiene que hacer es checar cada caracter que es leído de la
EEPROM durante la inicialización. Si ese caracter resulta ser un "%", usa el comando
WRITE para regresarlo a "$".

√ Salve TiltObstacleGame.bs2 como TiltObstacleGameYourTurn.bs2


√ Modifique el ciclo FOR...NEXT en la inicialización que despliega el laberinto:
FOR index = 0 TO 242 ' Despliega laberinto
READ index + symbol, char
IF(char = "%") THEN ' <--- Agregue
char = "$" ' <--- Agregue
WRITE index + symbol, char ' <--- Agregue
ENDIF ' <--- Agregue
DEBUG char
NEXT

√ Verifique que tanto el botón Run del Editor BASIC Stamp y el botón Reset de la
tarjeta Board of Education se comportan igual después de esta modificación.
Página 204 · Sensores Inteligentes y sus Aplicaciones

Si el jugador cambia rapidamente la inclinación de la tarjeta es posible brincarse las


paredes de "#". Hay 2 formas de arreglarlo. Una sería agregar una animation de brinco y
llamarla "característica". Otra forma sería permitir al asterisco moverse solo 1 caracter
en cualquier dirección X o Y. Para arreglarlo, el programa necesitará mantener el rastro
de la posición previa. Esto es un trabajo para las variables xOld y yOld presentadas en la
actividad #2.

√ Agregue estas declaraciones de variables en la sección de Variables de


TiltObstacleGameYourTurn.bs2:
x VAR Word ' coordenadas de grafica e inclinacs. x & y
y VAR Word

xOld VAR Word ' <--- Agregue


yOld VAR Word ' <--- Agregue

√ Agregue líneas de inicialización para xOld y yOld.


x = 10 ' Inicia caracter de juego en medio
xOld = 10 ' <--- Agregue
y = 5
yOld = 5 ' <--- Agregue

√ Modifique la rutina principal para que x solo pueda ser mayor que o menor que
xOld por un incremento o decremento de 1. Repita para y y yOld.

y = 10 - y ' Compensa Cartesiano -> Depuracion

IF (x > xOld) THEN x = xOld MAX 19 + 1 ' <--- Agregue


IF (x < xOld) THEN x = xOld MIN 1 - 1 ' <--- Agregue

IF (y > yOld) THEN y = yOld MAX 9 + 1 ' <--- Agregue


IF (y < yOld) THEN y = yOld MIN 1 - 1 ' <--- Agregue

' Display asterisco at new posición.


DEBUG CRSRXY, x, y, "*" ' Despliega asterisco
PAUSE 50 ' Pausa nuevamente por parpadeo

xOld = x ' <--- Agregue


yOld = y ' <--- Agregue

' Despliega puntaje

√ Corra y pruebe su programa modificado y verifique que el asterisco no pueda


más brincar las paredes de "#".
Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 205

RESUMEN
La actividad #1 presenta los caracteres de control, técnicas para mantener los caracteres
dentro de los límites del trazado y el álgebra para mapear coordenadas a trazado. Los
ejemplos de caracteres de control incluyeron CRSRXY y CLRDN. Los ejemplos de límites de
trazado incluyeron los operadores MIN y MAX y una técnica IF…THEN. Las técnicas de
mapeo incluyeron ecuaciones PBASIC simples para cambiar los valores de las
coordenadas x y y de Cartesianas a sus equivalentes de Terminal de Depuración.

La actividad #2 presentó medios para guardar, desplegar y refrescar una imagen


desplegada de un caracter de fondo de la EEPROM. Esto es un ingrediente útil para
muchas pantallas de productos, y también es de utilidad para pantallas y juegos con
control de inclinación. Se puede escribir un desplegado completo de un fondo con ciclo
FOR…NEXT. Un comando READ en el ciclo depende de la variable index del ciclo
FOR…NEXT para direccionar el siguiente caracter en la secuencia. Después de que el
comando READ carga el siguiente caracter en la variable, el comando DEBUG puede ser
usado para enviar el caracter a la Terminal de Depuración. Para borrar las huellas
dejadas por un caracter en movimiento sobre el fondo, la posición previa del caracter
puede ser guardada en una o más variables. La información de la posición previa es
entonces usada junto con el comando READ para buscar el caracter que debería
reemplazar el caracter en movimiento después de que se ha movido a su siguiente
posición.

La actividad #3 demostró cómo las mediciones del acelerómetro del Capítulo 3 pueden
ser combinadas con las técnicas de posicionado de cursor y llamado de caracter de la
actividad #2 para crear una pantalla controlada por inclincación. Se usaron mediciones
simples PULSIN para medir la inclinación y los ejes x y y del acelerómetro. Los valores
de inclinación fueron escalados y compensados usando las técnicas presentadas en el
Capítulo 3, actividad #3. Los valores modificados x y y dictaron el posicionado del
cursor para escribir el asterisco en la Terminal de Depuración. La posición del asterisco
relativa al plano Cartesiano desplegado en el fondo representó el centro de la bolsa de
aire caliente dentro de la cámara del MX2125. Al moverse el asterisco, el fondo de su
posición previa fue redibujado usando las técnicas presentadas en la actividad #2.

La actividad #4 presentó un control de juego por inclinación. Las reglas de juegos


simples pueden ser implementadas con líneas SELECT...CASE que usan el caracter en el
fondo en la posición del caracter de juego para decidir qué acción es la siguiente. Pueden
Página 206 · Sensores Inteligentes y sus Aplicaciones

ser incorporados fondos múltiples en un juego haciendo uso de los operadores opcionales
@Address y nombre Símbolo de las directivas DATA. Puesto que el nombre Símbolo es en
realidad la dirección EEPROM al principio de una directiva DATA determinada, su
programa puede accesar elementos en diferentes fondos agregando el valor de Symbol al
argument de dirección del comando READ.

Preguntas
1. ¿Qué significan las siglas HID?
2. ¿Qué caracter de control causa que todas las líneas por debajo de la posición
presente del cursor sean borradas?
3. ¿Qué comando y qué formateador puede usar para guardar en la variable X un
solo dígito que teclee en la ventana de Transmisión Terminal de Depuración?
4. ¿Existen otras técnicas de programación que pueda usar con otros operadores
para prevenir que el valor que guarda una variable exceda un valor máximo o
mínimo?
5. ¿Cuáles son los niveles de refrescado para los monitores CRT de computadora
comunes?
6. ¿Qué clase de rutina necesita para desplegar todos los caracteres de fondo
guardados en una directiva DATA?
7. ¿Porqué son necesarias las variables de una palabra para guardar valores con
signo en PBASIC?
8. Cuando inclina el acelerómetro a la izquierda, ¿hacia dónde viaja el asterisco
burbuja?
9. Si las coordenadas del asterisco empiezan en (-5, 0), y terminan en (5, 0), ¿ que
piensa que le pasó al acelerómetro?
10. ¿Qué eje fue el fulcrum si el acelerómetro empezó en (2, 2) y terminó en (-2, 2)?
11. Si las lecturas del acelerómetro viajan de (0, 5) a (0, -5), de nuevo y
repetidamente, ¿que secuencia de movimiento es la que probablemente ocurre?
12. ¿Cuál es el valor de YouWin?
13. ¿Qué comando puede usar para checar el valor de un nombre Símbolo de una
directiva DATA?
14. Si cambia el operador @Address de la directiva Maze DATA de 0 a 10, ¿qué
tendría que hacer a las otras directivas DATA en el programa?
15. En TiltObstacleGame.bs2, ¿qué clase de bloque de código hace mandatorias las
reglas del juego?
16. ¿Qué comando cambia los valores "%" de regreso a valores "$" en la EEPROM?
Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 207

Exercises
1. Escriba un comando DEBUG que coloque el cursor 5 espacios arriba, 7 espacios
abajo, y luego imprima el mensaje “* esta es la coordenada (5, 7) en laTerminal
de Depuración”.
2. Escriba un comando DEBUG que despliegue un sistema coordenado cartesiano de
-2 a 2 en los ejes x y y.
3. Calcule el escalamiento y compensación que necesitará para desplegar pares
ordenados introducido en la ventana de Transmisión de la Terminal de
Depuración en un sistema coordenado cartesiano que vaya de -5 a 5 en ambos
ejes x y y.
4. Escriba una rutina que dibuje un rectángulo con asteriscos. Esta rutina debiera
ser de 15 asteriscos de ancho y 5 asteriscos de alto.
5. Si su fondo es de 5 caracteres de ancho por 3 caracteres de alto, prediga el
tamaño de variable mínimo que puede usar para establecer la dirección para su
comando READ y explique su selección. ¿Tendrá espacio para caracteres
adicionales como CLS?

Projects
1. Modifique CrsrXYPlot.bs2 para que redibuje el fondo antes de graficar el
asterisco.
2. Modifique PlotXYGraph.bs2 para que despliegue las coordenadas del asterisco
mas recientemente colocado a la derecha del area de trazado.
Página 208 · Sensores Inteligentes y sus Aplicaciones

Soluciones
Q1. Dispositivo de interface humana (en inglés Human interface device).
Q2. CLRDN.
Q3. DEBUGIN DEC1 x.
Q4. Si, también puede usar las líneas IF…THEN para checar si los valores están fuera
de los límites.
Q5. 60, 70, y 72 Hz.
Q6. Puede usar un ciclo FOR…NEXT, con líneas para recuperar y desplegar cada
caracter guardado. Las variables de palabra guardan el valor y el signo.
Q7. Las variables de palabra guardan el valor y el signo.
Q8. La burbuja se mueve a la derecha.
Q9. Fue de una posición inclinada a la derecha a otra inclinada a la izquierda.
Q10. El eje Y, o el más largo eje de la tarjeta Board of Education.
Q11. Inclinar la tarjeta arriba y abajo repetidamente.
Q12. Dirección 486 de la EEPROM.
Q13. Puede usar el comando DEBUG como lo haría para desplegar el valor de
cualquier otra cantidad numérica, use el modificador DEC.
DEBUG DEC symbol
READ index + symbol, char
Q14. Necesitaría agregar 10 a cada valor símbolo, entonces su programa sería:
YouLose DATA @253…
YouWin DATA @496 …
Q15. Una línea SELECT…CASE.
Q16. El comando WRITE.
E1. Solución ejemplo:
DEBUG CRSRXY, 5, 7,
"* esta es la coordenada (5,7) en la Terminal de Depuración"
E2. Solución ejemplo:
DEBUG CLS,
" 2| ", CR,
" 1| ", CR,
"----+----", CR,
"-2-1| 1 2", CR,
" -2| ", CR, CR

E3. El escalamiento del eje X es 2 y su compensación es 10; para el eje Y, el


escalamiento es -1 y la compensación es 5.
E4. Solución ejemplo:
x VAR Byte
y VAR Byte
Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 209

FOR x = 1 TO 15
FOR y = 1 TO 5
DEBUG CRSRXY, x, y, "*"
NEXT
NEXT
E5. El número de caracteres a guardar equivale a 5 x 3 = 15. El mínimo tamaño de
variable a usar sería un Nibble (4 bits), con lo cual las direcciones pueden ir de 0
a 15. Habría espacio solo para un (1) caracter adicional.
P1. La clave para resolver este problema es mover la gráfica dentro del DO…LOOP y
cambiar CLS a HOME. Puede haber otras formas de solución. Solución ejemplo:
DO
DEBUG HOME,
"0123456789X", CR,
"1 ", CR,
"2 ", CR,
"3 ", CR,
"4 ", CR,
"5 ", CR,
"Y ", CR, CR
DEBUG "Type X coordinate: "
DEBUGIN DEC1 x
DEBUG CR, "Type Y coordinate: "
DEBUGIN DEC1 y
DEBUG CRSRXY, x, y, "*"
DEBUG CRSRXY, 0, 10, "Press any key..."
DEBUGIN temp
DEBUG CRSRXY, 0, 8, CLRDN
LOOP
P2. Modifique PlotXYGraph.bs2 para que despliegue las coordenadas del asterisco
mas recientemente colocado a la derecha del area de trazado. Para desplegar
adecuadamente las coordenadas negativas, use el modificador SDEC.
DO
DEBUG "Type X coordinate: "
DEBUGIN SDEC1 x
DEBUG CR, "Type Y coordinate: "
DEBUGIN SDEC1 y
DEBUG CRSRXY, 15, 3, "(X,Y) = (",
SDEC x, ",", SDEC y, ")", CLREOL
x = (x * 2) + 6
y = 3 - y
DEBUG CRSRXY, x, y, "*"
DEBUG CRSRXY, 0, 10, "Press any Key..."
DEBUGIN temp
DEBUG CRSRXY, 0, 8, CLRDN
LOOP
Página 210 · Sensores Inteligentes y sus Aplicaciones
Capítulo 6: Más Proyectos con el Acelerómetro · Page 211

Capítulo 6: Más Proyectos con el Acelerómetro


Hay 3 tipos de proyectos en este capítulo. El primero es una aplicación directa del
hardware y los programas de los capítulos previos. El segundo requiere registrar las
mediciones de aceleración, y por ello varias actividades están dedicadas para un
programa registrador. El tercero requiere registrar para ver qué clase de mediciones
reportará el acelerómetro. Luego, según los resultados registrados, podrá escribir un
programa que haga que el dispositivo trabaje confiablemente.

ACTIVIDAD #1: MEDICIÓN DE ALTURA DE EFICIOS, ÁRBOLES, ETC.


Subir a la punta de un objeto para medir su altura no siempre es conveniente, práctico o
incluso seguro. Esta actividad presenta una nueva forma de usar algunas de las
mediciones del acelerómetro desarrolladas en el capítulo 3 para hacer mediciones de
altura desde un punto seguro en el suelo.

Mirando la Cima y Determinando la Altura


La Figura 6-1 muestra un esquema para medir la altura de un objeto, usando el
acelerómetro y la pantalla LCD como una línea de visión con ángulo. Primero, mire la
cima del objeto con el borde de su tarjeta y registre el ángulo medido. Luego, mida la
distancia entre el punto donde tomó su medición y el objeto, que es el lado adyacente
(Figura 6-1). La distancia adyacente, el ángulo θ y la altura del acelerómetro sobe el suelo
son las 3 piezas de información que necesita para calcular la altura del objeto.

Figura 6-1: Determinando la altura con la línea de visión


Página 212 · Sensores Inteligentes y sus Aplicaciones

Partes Requeridas
Use la lista de partes y circuito del Capítulo 3, actividad #2 en la página 71 para su línea
de visión.

Programa Ejemplo
Use el programa ejemplo VertWheelRotation.bs2 from de la página 95 (Capítulo 3,
actividad #5) junto con las modificaciones de pantalla LCD en la sección Su Turno –
Pantalla LCD en la página 96.

Procedimiento
√ Use su tarjeta línea de visión a la cima del objeto y registre el ángulo.
√ Mida la distancia entre su punto de observación y el objeto (lado adyacente en la
Figura 6-1).
√ Mida la altura a la cual sostuvo el acelerómetro.
√ Use los siguienes calculos para determinar la altura del objeto.

Cálculos
Sabemos de capítulos previos que θ equivale al lado opuesto dividido entre el lado
adyacente de un triángulo rectángulo. Multiplicar ambos lados por la distancia adyacente
resulta en una expresión para resolver la altura opuesta. Es la distancia adyacente
multiplicada por la tangente del ángulo.

opposite
tan θ =
adjacent

opposite = adjacent tan θ

Luego de determinar la altura opuesta (mostrada en la Figura 6-1), todo lo que tiene que
hacer es agregarle la altura a la que sostuvo el acelerómetro cuando tomó la medición.

object height = opposite + accelerome ter height


object height = adjacent tan θ + accelerometer height
Capítulo 6: Más Proyectos con el Acelerómetro · Page 213

Ejemplo
Digamos que la distancia adyacente a un objeto es 10 m, y que a esa distancia el
acelerómetro fué sostenido a 1.5 m del piso para tener una linea de visión a la cima de un
objeto. El ángulo reportado por el acelerómetro fue 61°. Con esto podemos estimar la
altura del objeto en 19.54 m, como se indica a continuación.

Adjacent distance = 10 m
Accelerome ter measured θ = 61°
Accelerome ter height = 1.5 m

opposite = adjacent tan θ


= 10 m tan θ
= (10 m )(1.804 )
= 18.04

object height = opposite + accelerome ter height


= 18.04 m + 1.5 m
= 19.54 m

ACTIVIDAD #2: GRABACIÓN Y REPRODUCCIÓN


Con proyectos del acelerómetro es frecuentemente neceasario grabar y reproducir muchas
mediciones del mismo. En algunos, grabar el valor es la función deseada, como registrar
cómo resuelve una curva un auto. En otros casos, como detectar el caminado humano,
será necesario entender de qué orden son las mediciones antes de que pueda escribirse un
programa que siga sus pasos. De cualquier modo, grabar y reproducir las mediciones de
aceleración es un ingrediente necesario. Esta actividad presenta un programa con
subrutinas que demuestran cómo grabar, reproducir y borrar valores guardados en la
porción no usada de la Memoria de programación EEPROM de BASIC Stamp.

Guardado en la EEPROM con DATA, WRITE y READ


Si bien no se requieren para mediciones de grabación y reproducción, las directivas DATA
pueden ser usadas para apartar trozos de memoria de programación no usada. El nombre
Página 214 · Sensores Inteligentes y sus Aplicaciones

Símbolo opcional de la directiva DATA es especialmente útil para mantener registros. La


directiva Records DATA no guarda por sí misma ningún valor en las direcciones 0 a 9 de
la EEPROM. Solo reserva estos bytes para su código PBASIC y le da un nombre a la
dirección del primer byte: Records. La directiva RecordsEnd DATA reserva un solo byte
en la dirección 10 de la EEPROM.
Records DATA (10)
RecordsEnd DATA

Los nombres Símbolo (Records y RecordsEnd) se convierten en constantes que


guardan la dirección de inicio de las directivas DATA EEPROM a las que ellos preceden.
La Table 6-1 muestra como trabaja para las dos directivas DATA. Puesto que Records es
la primera directiva DATA, aparta los primeros 10 bytes (direcciones 0 a 9). Puesto que la
dirección 0 es la dirección de inicio, Records se convierte e una constante para el valor 0
en el programa. De igual manera, puesto que la directiva RecordsEnd DATA aparta un
byte en la dirección 10, RecordsEnd se convierte en el valor constante 10 en el
programa.

Table 6-1: DATA directivas y EEPROM Addresses


Byte
00 00 00 00 00 00 00 00 00 00 00 00
Contents
Addresses 0 1 2 3 4 5 6 7 8 9 10 11

 Records = 0 RecordsEnd = 10

Los bytes de la EEPROM no necesariamente contienen cero. Con el comando


Records DATA (10), cualesquiera valores que ya estén allí no serán cambiados. Si
quiere inicializar los valores EEPROM en cero, use Records DATA 0 (10). Esto
guardará 0 en las direcciones EEPROM 0 a 9. El Editor BASIC Stamp solo lo hace cuando
descarga el programa. Si presiona y libera su botón Reset de su tarjeta o desconecta y
reconecta la energía, no se escriben valores en esas direcciones EEPROM. Esta es una
característica útil, como verá en la siguiente actividad.

La subrutina Clear_Data en el siguiente programa ejemplo tiene un ciclo FOR...NEXT que


se repite de Records a RecordsEnd (0 to 10). Cada vez a través del ciclo, la variable
eeIndex se incrementa en 1, y así WRITE eeIndex, 100 guarda un 100 en cada byte de
la EEPROM, de la dirección 0 a la dirección 10.
Capítulo 6: Más Proyectos con el Acelerómetro · Page 215

Clear_Data:
FOR eeIndex = Records TO RecordsEnd
WRITE eeIndex, 100
NEXT
DEBUG CR, "Records cleared."
PAUSE 1000
RETURN

La subrutina Record_Data en el siguiente programa ejemplo colecta los valores que


introdujo en la Ventana de Transmisión de la Terminal de Depuración. En la siguiente
actividad, esta subrutina será modificada para guardar lecturas del acelerómetro. El ciclo
FOR...NEXT inicia nuevamente en Records y se repite hasta que eeIndex excede
RecordsEnd. Cada pasada en el ciclo, la variable value recibe un número decimal con
signo de from la Ventana de Transmisión de la Terminal de Depuración y lo guarda en la
dirección EEPROM seleccionada por eeIndex con WRITE eeIndex, value.
Record_Data:
DEBUG CR, "Enter valores from -100 to 100", CR
FOR eeIndex = Records TO RecordsEnd
DEBUG "Record ", DEC eeIndex, " >"
DEBUGIN SDEC value
value = value + 100
WRITE eeIndex, value
NEXT
DEBUG CR, "End of records.",
CR, "Press Enter for menu..."
DEBUGIN char
RETURN

Salvando espacio con value = value + 100


Antes de que cada contenido de la variable value sea copiado a la EEPROM, se le agrega
100. Entonces en vez de un valor entre −100 y 100, se le guarda un valor entre 0 y 200.
Esto es porque cada celda de memoria EEPROM puede guardar un valor entre 0 y 255 de
un byte de largo. Guardar números negativos requiere espacio de una palabra de largo.
Los valores de una palabra también pueden ser guardados con directivas DATA si coloca el
modificador Word antes que DataItem. Por ejemplo WRITE eeIndex, Word
value. Considere que este comando usa 2 bytes EEPROM para guardar el valor de
tamaño de palabra, entonces eeIndex tendrá que ser incrementado por 2 antes que el
siguiente valor sea escrito. Agregando 100, salvamos una celda de tamaño de byte por
escritura.

Para recuperar y desplegar los valores que fueron guardados, la subrutina Display_Data
tiene un ciclo FOR...NEXT con READ eeIndex, value. Puesto que 100 fué agregado a
Página 216 · Sensores Inteligentes y sus Aplicaciones

cada valor antes de ser guardado con el comando WRITE, se resta 100 a la variable value
después del comando READ para regresar a value en la escala de −100 a 100.
Display_Data:
DEBUG CR, "Index Record",
CR, "----- ------",
CR
FOR eeIndex = Records TO RecordsEnd
READ eeIndex, value
value = value - 100
DEBUG DEC eeIndex, CRSRX, 7, SDEC value, CR
NEXT
DEBUG CR, "Press Enter for menu..."
DEBUGIN char
RETURN

Programa Ejemplo: EepromDataStorage.bs2


Este programa ejemplo despliega un menu de 3 opciones en la ventana de Recepción de
la Terminal de Depuración (Figura 6-2). Tecleando C en la ventana de Transmisión, los
valores apartados para almacenaje en la EEPROM se limpian. Si se teclea R, el programa
graba valores en la EEPROM que introduce en la ventana de Recepción. Si se teclea D,
los valores que fueron guardados en la EEPROM son desplegados.

Transmit
Windowpane
Figura 6-2
Introduciendo valores
para
EepromDataStorage.
Receive bs2
Windowpane

√ Introduzca, salve y corra EepromDataStorage.bs2.


√ Haga click en la ventana de Transmisión de la Terminal de Depuración.
√ Teclee R, y luego introduzca 11 valores entre −100 y 100. Presione Enter cuando
se le pida luego del valor 11 para regresar al menu.
Capítulo 6: Más Proyectos con el Acelerómetro · Page 217

√ Teclee D y verifique que los valores que introdujo son desplegados


correctamente. Presione Enter para regresar al menu.
√ Teclee C para limpiar la memoria.
√ Teclee D para verificar que los valores de memoria han sido limpiados (puestos
en cero).

' -----[ Titulo ]-------------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - EepromDataStorage.bs2
' Demuestra guardar, recuperar y borrar valores en la memoria EEPROM.

'{$STAMP BS2}
'{$PBASIC 2.5}

' -----[ Directivas DATA]----------------------------------------------------

Records DATA (10)


RecordsEnd DATA

' -----[ Variables ]----------------------------------------------------------

char VAR Byte


eeIndex VAR Word
value VAR Word

' -----[ Rutina Principal ]---------------------------------------------------

DO

DEBUG CLS,
"Type C, R or D", CR,
"C - Clear records", CR,
"R - Record records", CR,
"D - Display records", CR,
">"

DEBUGIN char
DEBUG CR

SELECT char
CASE "C", "c"
GOSUB Clear_Data
CASE "R", "r"
GOSUB Record_Data
CASE "D", "d"
GOSUB Display_Data
CASE ELSE
DEBUG CR, "Not a valid entry.",
CR, "Try again."
PAUSE 1500
Página 218 · Sensores Inteligentes y sus Aplicaciones

ENDSELECT

LOOP

' -----[ Subrutina - Clear_Data ]--------------------------------------------

Clear_Data:
FOR eeIndex = Records TO RecordsEnd
WRITE eeIndex, 100
NEXT
DEBUG CR, "Records cleared."
PAUSE 1000
RETURN

' -----[ Subrutina - Record_Data ]-------------------------------------------

Record_Data:
DEBUG CR, "Enter valores from -100 to 100", CR
FOR eeIndex = Records TO RecordsEnd
DEBUG "Record ", DEC eeIndex, " >"
DEBUGIN SDEC value
value = value + 100
WRITE eeIndex, value
NEXT
DEBUG CR, "End of records.",
CR, "Press Enter for menu..."
DEBUGIN char
RETURN

' -----[ Subrutina - Display_Data ]------------------------------------------

Display_Data:
DEBUG CR, "Index Record",
CR, "----- ------",
CR
FOR eeIndex = Records TO RecordsEnd
READ eeIndex, value
value = value - 100
DEBUG DEC eeIndex, CRSRX, 7, SDEC value, CR
NEXT
DEBUG CR, "Press Enter for menu..."
DEBUGIN char
RETURN

Su Turno - ¿Cuántos Bytes desea guardar?


EepromDataStorage.bs2 usa Records y RecordsEnd para todos los ciclos que ejecutan
operaciones READ y WRITE. Por ello, puede cambiar el número of valores que el
Capítulo 6: Más Proyectos con el Acelerómetro · Page 219

programa guarda simplemente cambiando el número de elementos en la directiva


Records DATA.

√ Intente cambiando el número de elementos que el programa guarda de 11 to 7.


Todo lo que tiene que hacer es cambiar Records DATA (10) a Records
DATA (6).
√ Pruebe y verifique que funciona.

En la actividad #4, usaremos esta característica para cambiar el número de registros que
el programa guarda a 1000 con Records DATA (1000). 11

ACTIVIDAD #3: USO DE LA EEPROM PARA CAMBIO DE MODOS


Esta actividad presenta un truco con la EEPROM que puede usar para convertir el botón
Reset de la Board of Education en un switch para elegir diversos modos de un programa.

Código que Transforma el botón Reset en un Selector de Modo


Si aparta un byte de la EEPROM, le puede posibilitar seleccionar entre 256 modos de
programa diferentes. En el siguiente programa ejemplo, solo usaremos 2: a modo menu y
un modo que brinca a registrador de datos luego de un breve retraso. He aquí una
directiva DATA que nombre a un byte EEPROM Reset e inicializa el valor guardado por
este byte en cero.
Reset DATA 0

La forma más simple de inicialización es una configuración de switch on/off. Es aquí


donde se lee el valor del byte EEPROM Reset, se le agregua un 1 y luego el valor
modificado es escrito en el byte Reset. El valor modificado también es examinado para
ver si es par o impar con IF value // 2 = 0 THEN...

READ Reset, value


value = value + 1
WRITE Reset, value
IF value // 2 = 0 THEN END

En este ejemplo, si esa condición es verdad, el programa termina aquí. La siguiente vez
que presione y libere su botón Reset, value será impar, la condición será falsa y el
bloque de código no detendrá el programa antes de que alcance la Rutina Principal. Si el
botón Reset es presionado y liberado nuevamente, el bloque de código detenderá el
Página 220 · Sensores Inteligentes y sus Aplicaciones

programa nuevamente. La siguiente vez no lo detendrá, etc. Entonces el programa utiliza


el botón de su tarjeta Board of Education como un botón de cambio on/off.

A continuación hay un ejemplo que usa el bloque de código en un modo diferente. En


vez de detener o permitir que continue el programa, el bloque de código IF...THEN es
brincado la primera vez que corre el programa, luego ejecuta la segunda vez que corre el
programa (luego de presionar y liberar el botón Reset). Es brincado la siguiente vez y
ejecutado nuevamente la vez después de ello. El efecto neto es que el programa o cuenta
y brinca a la subrutina Record_Data, o continúa al menu principal del programa,
dependiendo si su botón Reset has been presionado/liberado un número de veces par o
impar.
' -----[ Inicialización ]---------------------------------------

READ Reset, value


value = value + 1
WRITE Reset, value

IF value // 2 = 0 THEN

FOR char = 15 TO 0
DEBUG CLS, "Datalogging starts", CR,
"in ", DEC2 char, " seconds",
CR, CR,
"Press/release Reset", CR,
"for menu..."
FREQOUT 4, 50, 3750
PAUSE 950
NEXT

GOTO Record_Data

ENDIF

Programa Ejemplo: EepromDataStorageWithReset.bs2


Este programa demuestra cómo usar una dirección en EEPROM para controlar el
comportamiento del programa, dependiendo si el programa ha sido corrido o vuelto a
correr un número de veces par o impar. El número de veces que el programa ha sido
corrido será controlado por el botón Reset después de ser descargado. Si el botón Reset
ha sido presionado/liberado un número par de veces, el programa empieza con the menu
de la actividad previa. Si ha sido presionado/liberado un número impar de veces, ejecuta
un conteo regresido y luego llama a la subrutina Record_Data.
Capítulo 6: Más Proyectos con el Acelerómetro · Page 221

√ Introduzca y corra EepromDataStorageWithReset.bs2.


√ Verifique que puede cambiar el modo de inicio del programa pressionando y
liberando el botón Reset.
√ Pruebe las propiedades del programa y asegúrese que todas trabajan.

' -----[ Titulo ]-------------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - EepromDataStorageWithReset.bs2
' Demuestra guardar, recuperar y borrar valores en la memoria EEPROM.

'{$STAMP BS2}
'{$PBASIC 2.5}

' -----[ Directivas DATA]----------------------------------------------------

Reset DATA 0
Records DATA (10)
RecordsEnd DATA

' -----[ Variables ]----------------------------------------------------------

char VAR Byte


eeIndex VAR Word
value VAR Word

' -----[ Inicialización ]---------------------------------------

READ Reset, value


value = value + 1
WRITE Reset, value

IF value // 2 = 0 THEN

FOR char = 15 TO 0
DEBUG CLS, "Datalogging starts", CR,
"in ", DEC2 char, " seconds",
CR, CR,
"Press/release Reset", CR,
"for menu..."
FREQOUT 4, 50, 3750
PAUSE 950
NEXT

GOTO Record_Data

ENDIF

' -----[ Rutina Principal]----------------------------------------------------

DO
Página 222 · Sensores Inteligentes y sus Aplicaciones

DEBUG CLS,
"Press/Release Reset", CR,
"to arm datalogger ", CR, CR,
" - or - ", CR, CR,
"Type C, R or D", CR,
"C - Clear records", CR,
"R - Record records", CR,
"D - Display records", CR,
">"

DEBUGIN char
DEBUG CR

SELECT char
CASE "C", "c"
GOSUB Clear_Data
CASE "R", "r"
GOSUB Record_Data
CASE "D", "d"
GOSUB Display_Data
CASE ELSE
DEBUG CR, "Not a valid entry.",
CR, "Try again."
PAUSE 1500
ENDSELECT

LOOP

' -----[ Subrutina - Clear_Data ]--------------------------------------------

Clear_Data:
FOR eeIndex = Records TO RecordsEnd
WRITE eeIndex, 100
NEXT
DEBUG CR, "Records cleared."
PAUSE 1000
RETURN

' -----[ Subrutina - Record_Data ]-------------------------------------------

Record_Data:
DEBUG CR, "Enter valores from -100 to 100", CR
FOR eeIndex = Records TO RecordsEnd
DEBUG "Record ", DEC eeIndex, " >"
DEBUGIN SDEC value
value = value + 100
WRITE eeIndex, value
NEXT
DEBUG CR, "End of records.",
CR, "Press Enter for menu..."
Capítulo 6: Más Proyectos con el Acelerómetro · Page 223

DEBUGIN char
RETURN

' -----[ Subrutina - Display_Data ]------------------------------------------

Display_Data:
DEBUG CR, "Index Record",
CR, "----- ------",
CR
FOR eeIndex = Records TO RecordsEnd
READ eeIndex, value
value = value - 100
DEBUG DEC eeIndex, CRSRX, 7, SDEC value, CR
NEXT
DEBUG CR, "Press Enter for menu..."
DEBUGIN char
RETURN

Su Turno – Direccionado EEPROM Automático de la Directiva DATA


¿Notó que cambiaron los números registrados en este programa? En vez de 0 a 10, fueron
1 al 11. Intente mover la directiva Reset DATA después de las otras dos. Luego, corra el
programa modificado y examine el resultado. Haga tablas similares a la Table 6-1 que
ilustre los valores guardados por Reset, Records, y RecordsEnd. Haga la primera tabla
para ilustrar el programa original, y la segunda para illustrar el programa modificado en
el que cambió el orden de las directivas DATA.

ACTIVIDAD #4: REGISTRO REMOTO DE LA ACELERACIÓN


En esta actividad agregará un piezo parlante al circuito acelerómetro existente. Luego,
modificará el programa para que le provea con una herramienta de registrado remoto que
sea fácil de operar. El piezo parlante será útil para indicar conteo regresivo, inicio y paro.
El circuito de acelerómetro será al mismo usado en el capítulo #3, y el piezo parlante será
agregado debajo al acelerómetro en la tableta.

Parts Required
(1) Acelerómetro Mems 2125
(2) resistencias 220 Ω
(1) piezo parlante
(4) cables conectores
Página 224 · Sensores Inteligentes y sus Aplicaciones

Circuito
√ Construya los circuitos de acelerómetro y piezo parlante de la Figura 6-3.

Figura 6-3
Acelerómetro y Piezo parlante,
esquemático (Izquierda) y
Diagrama de conexiones (abajo)

Modificaciones al Programa
El siguiente programa ejemplo, DatalogAcceleration.bs2, es una expansión de
EepromDataStorageWithReset.bs2. Ha sido modificado para que pueda iniciar, parar y
reiniciar el registro con el botón Reset de su tarjeta. Puede desconectar la tarjeta de su
computadora para ejecutar el registro de datos, y reconectarla para desplegar las
mediciones en la Terminal de Depuración. Esta es una característica crucial para tomar
mediciones de campo y luego desplegarlas más tarde.

DatalogAcceleration.bs2 tiene una sección de inicialización modificada que hace que el


piezo parlante suene cada segundo por diez segundos antes de empezar a registrar datos.
' -----[ inicialización ]----------------------------------------------

Init:
.
.
Capítulo 6: Más Proyectos con el Acelerómetro · Page 225

.
FOR char = 10 TO 0
.
.
.
FREQOUT 4, 50, 3750
PAUSE 950
NEXT
.
.
.

DatalogAcceleration.bs2 tiene una subrutina modificada Record_Data que otiene los


valores de x y y del acelerómetro, los escala a (-100 a 100) y los escribe en la EEPROM.
Los incrementos del ciclo FOR...NEXT son en pasos de 2 con el argumento STEP 2 puesto
que cada vez dentro del ciclo, la rutina salva 2 bytes. La subrutina Display_Data tiene
modificaciones similares para que despliegue los valores de x y y en una tabla.

Record_Data:

FREQOUT 4, 75, 4000


PAUSE 200
FREQOUT 4, 75, 4000

DEBUG CLS, "Recording..."

FOR eeIndex = Records TO RecordsEnd STEP 2

PULSIN 6, 1, x
PULSIN 7, 1, y

x = (x MIN 1875 MAX 3125) - 1875 ** 10538


y = (y MIN 1875 MAX 3125) - 1875 ** 10538

WRITE eeIndex, x
WRITE eeIndex + 1, y

NEXT

FREQOUT 4, 200, 4000

DEBUG CR, "End of records.",


CR, "Press Enter for menu..."
DEBUGIN char
RETURN

The piezo parlante también suena dos veces con un sonido más alto al principo del
registrado de datos. Una característica importante de este contador regresivo es que puede
Página 226 · Sensores Inteligentes y sus Aplicaciones

detener el registro antes de que inicie solo con presionar y liberar el botón Reset de su
tarjeta. Para reiniciar el conteo regresivo, solo presione y libere el botón Reset otra vez.

Programa Ejemplo: DatalogAcceleration.bs2

Descarga gratis Este programa está disponible como descarga grátis .bs2 en la página del
producto de Sensores Inteligentes y sus Aplicaciones en www.parallax.com.

Este programa toma y guarda 500 mediciones de ejes x y y del acelerómetro en alrededor
de 15 segundos. Esto equivale a un nivel de muestreo de cerca de 33 mediciones por
segundo. Esto es bueno para una variedad de mediciones. Para medir procesos más largos
y lentos, la subrutina Record_Data puede ser alentada con un comando PAUSE.

√ Abra y corra DatalogAcceleration.bs2.


√ Haga Click the la ventana de Transmisión de la Terminal de Depuración's.
√ Teclee R para empezar a grabar e incline su acelerómetro por 15 segundos.
√ Cuando se le pida, presione Enter para regresar al menu del programa.
√ Teclee D para desplegar las mediciones. Reviselas y verifique que corresponden
a la forma en que inclinó el acelerómetro.
√ Desconecte su tarjeta del cable serial. Si empieza a sonar, presione y libere el
botón reset para hacer que se detenga.

Cuando esté listo para empezar a inclinar the acelerómetro por 15 segundos, presione y
libere el botón Reset. El registrador sonará durante la cuenta regresiva de 10 segundos,
luego terminará con 2 pitidos más altos indicando el inicio del registrador. Hará un solo
pitido más alto cuando haya terminado.

√ Presione y libere el botón reset. Espere los 10 segundos, luego incline su


acelerómetro en un patrón que pueda recordar, por 15 segundos.
√ Conecte su acelerómetro de regreso a su computadora. Si empieza a sonar,
presione y libere el botón reset para parar la cuenta regresiva.
√ Haga click en el botón Run del Editor del BASIC Stamp para bajar el programa
al BASIC Stamp y refrescar la pantalla Menu de la Terminal de Depuración.
√ Teclee D para desplegar las mediciones registradas.
√ Comparelas con las direcciones en que inclinó la tarjeta y asegúrese que
correspondan.
Capítulo 6: Más Proyectos con el Acelerómetro · Page 227

' -----[ Titulo ]------------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - DatalogAcceleration.bs2
' Registra 500 mediciones de aceleracion en los ejes x y y.

'{$STAMP BS2}
'{$PBASIC 2.5}

' -----[ Directivas DATA]----------------------------------------------------

Reset DATA 0
Records DATA (1000)
RecordsEnd DATA

' -----[ Variables ]----------------------------------------------------------

char VAR Byte


eeIndex VAR Word
value VAR Word
x VAR value
y VAR Word

' -----[ inicialización ]-----------------------------------------------------

Init:

READ Reset, value


value = value + 1
WRITE Reset, value

IF value // 2 = 0 THEN

FOR char = 10 TO 0
DEBUG CLS, "Datalogging starts", CR,
"in ", DEC2 char, " seconds",
CR, CR,
"Press/release Reset", CR,
"for menu..."
FREQOUT 4, 50, 3750
PAUSE 950
NEXT

GOSUB Record_Data

ENDIF

' -----[ Rutina Principal]----------------------------------------------------

DO

DEBUG CLS,
"Press/Release Reset", CR,
Página 228 · Sensores Inteligentes y sus Aplicaciones

"to arm datalogger ", CR, CR,


" - or - ", CR, CR,
"Type C, R or D", CR,
"C - Clear records", CR,
"R - Record records", CR,
"D - Display records", CR,
">"

DEBUGIN char
DEBUG CR

SELECT char
CASE "C", "c"
GOSUB Clear_Data
CASE "R", "r"
GOSUB Record_Data
CASE "D", "d"
GOSUB Display_Data
CASE ELSE
DEBUG CR, "Not a valid entry.",
CR, "Try again."
PAUSE 1500
ENDSELECT

LOOP

' -----[ Subrutina - Clear_Data ]--------------------------------------------

Clear_Data:
DEBUG CR, "Clearing..."
FOR eeIndex = Records TO RecordsEnd
WRITE eeIndex, 0
NEXT
DEBUG CR, "Records cleared."
PAUSE 1000
RETURN

' -----[ Subrutina - Record_Data ]-------------------------------------------

Record_Data:

FREQOUT 4, 75, 4000


PAUSE 200
FREQOUT 4, 75, 4000

DEBUG CLS, "Recording..."

FOR eeIndex = Records TO RecordsEnd STEP 2

PULSIN 6, 1, x
PULSIN 7, 1, y
Capítulo 6: Más Proyectos con el Acelerómetro · Page 229

x = (x MIN 1875 MAX 3125) - 1875 ** 10538


y = (y MIN 1875 MAX 3125) - 1875 ** 10538

WRITE eeIndex, x
WRITE eeIndex + 1, y

NEXT

FREQOUT 4, 200, 4000

DEBUG CR, "End of records.",


CR, "Press Enter for menu..."
DEBUGIN char

RETURN

' -----[ Subrutina - Display_Data ]------------------------------------------

Display_Data:

DEBUG CR, "Index x-axis y-axis",


CR, "----- ------ ------",
CR
FOR eeIndex = Records TO RecordsEnd STEP 2
READ eeIndex, x
x = x - 100
READ eeIndex + 1, y
y = y - 100
DEBUG DEC eeIndex, CRSRX, 7, SDEC x, CRSRX, 14, SDEC y, CR
NEXT
DEBUG CR, "Press Enter for menu..."
DEBUGIN char
RETURN

Su Turno – Registrando el Ángulo de Rotación


El Capítulo 3, actividad #5 presentó mediciones de rotación verticales con el
acelerómetro. Puesto que los radianes binario son valores de 0 a 255, puede guardar una
sola medición de ángulo en un byte de EEPROM. Esto duplicará el número de
mediciones que tomará la aplicación. Solo requiere algunas modificaciones para que
DatalogAcceleration.bs2 guarde el ángulo de rotación:

√ Salve DatalogAccleration.bs2 como DatalogAngle.bs2.


√ Actualice los comentarios en la seccion de Título.
Página 230 · Sensores Inteligentes y sus Aplicaciones

√ Remueva el argumento STEP 2 de los ciclos FOR...NEXT en las subrutinas


Record_Data y Display_Data.
√ En la subrutina Record_Data, reemplace estos 2 comandos WRITE:
WRITE eeIndex, x
WRITE eeIndex + 1, y

...con esta operation ATN y este comando WRITE:


value = x ATN y
WRITE eeIndex, value

√ Modifique el encabezado de pantalla en la subrutina Display_Data así:


DEBUG CR, "Index angle ",
CR, "----- ------",
CR

√ Reemplace estos 4 comandos:


READ eeIndex, x
x = x - 100
READ eeIndex + 1, y
y = y - 100

...con estos 2:
READ eeIndex, value
value = value */ 361

√ Salve sus cambios y pruebe el programa modificado.

ACTIVIDAD #5: ESTUDIO DE LA ACELERACIÓN EN UN AUTO DE


RADIO CONTROL
Esta actividad demuestra como usar el programa DatalogAcceleration.bs2 de la actividad
previa para analizar las fuerzas de aceleración en un carro de radio-control (RC) durante
una variedad de maniobras. Esta actividad también demuestra cómo estas fuerzas de
aceleración registradas pueden ser usadas para seguir y trazar la posición y velocidad del
carro. Aún cuando el equipo real y los cálculos son de alguna manera más completos, la
derivación de la posición a partir de mediciones de aceleración succesivas es un
componente de los sistemas de guía inercial empleados en los cohetes y las naves
espaciales. Estos sistemas usan una combinación de una version triaxial de las
Capítulo 6: Más Proyectos con el Acelerómetro · Page 231

mediciones de aceleración cubiertas en esta actividad junto con giroscopios que miden la
rotación del vehículo.

Partes, Equipo y Diagramas de Circuito


Además de las partes para la actividad #4, necesitará un carro RC y su controlador, no
incluídos en el Kit de Partes de Sensores Inteligentes y sus Aplicaciones. Los diagramas
del circuito a armar en su tableta están al principio de la actividad #4 en este capítulo.

Hardware y Configuración
La Figura 6-4a muestra un carro RC económico que puede ser obtenido en muchas
tiendas de pasatiempos y tiendas de electrónica. La Figura 6-4b muestra cómo la tarjeta
fue montada. Se fijaron patitas de goma por debajo de la tarjeta de tal forma que ninguna
de sus conexiones eléctricas estuviera en contacto con alguna de las partes metálicas del
carro RC. Otra opción hubiera sido usar cinta adhesiva de doble cara para fijar la tarjeta
al techo plástico del carro. La tarjeta fue orientada con la tableta hacia el frente del carro.

Figura 6-4: Carro RC con el registrador de aceleración

a. b.

Evite corto circuitos accidentales. Asegúrese que su tarjeta está montada en el carro de
tal forma que el metal expuesto debajo de la tarjeta no tenga forma de entrar en contacto
con cualquier parte de metal del carro RC o sus conexiones eléctricas.

Como Trabaja
La Figura 6-5 muestra una gráfica de las mediciones del eje y del acelerómetro al acelerar
el carro hacia enfrente, desacelerado para detenerlo y luego acelerado en reversa. Las
Página 232 · Sensores Inteligentes y sus Aplicaciones

mediciones fueron adquiridas con DatalogAcceleration.bs2 de la actividad #4. Luego de


desplegarlas en la Terminal de Depuración, fueron sombreadas, copiadas y pegadas en
Windows Notepad. Una vez allí, fueron importadas en el programa de hoja de cálculo
Microsoft Excel y luego graficadas.

Accelerate
Decelerate
Backward
RC Car Forw ard and Backw ard

30

20

10
Figura 6-5
gravity/100

0
0 50 100 150 200 250 300 Mediciones del eje y del
-10
Acelerómetro en el Carro
-20 RC
-30
Stop
-40
seconds/30

Decelerate
Accelerate
Forward

La razón de que la aceleración al frente sea negativa es porque el eje de sensado ym esta
apuntando a la parte posterior del carro RC como se muestra en la Figura 6-6. Entonces,
al ir acelerando el carro al frente, la aceleración es negativa. Cuando un carro reduce su
velocidad, de hecho está acelerando hacia atrás. Esto se muestra en la Figura 6-5.
Primero, el carro acelera al frente, luego aplicó frenos y perdió velocidad (desaceleró).
La medición y fue positiva, luego la aceleración fué negativa. Después de un breve paro,
el carro aceleró en reversa. Note que y es nuevamente positiva. Entonces, cuando pierde
velocidad (desacelera) de su velocidad en reversa para detenerse nuevamente, el carro
esta, en efecto, acelerando al frente, y la medición y es negativa otra vez.
Capítulo 6: Más Proyectos con el Acelerómetro · Page 233

Figura 6-6
Aceleración del Carro RC
vs Ejes de Sensado del
Acelerómetro

a. b.

Si está manejando un carro, cuando el carro acelera al frente puede sentir que el asiento le
empuja al frente. Si da una vuelta súbita a la derecha el lado izquierdo del carro le empuja
a la derecha. Eso es porque está acelerando a la derecha al ir dando la vuelta. Esto se
muestra en la Figura 6-7, que ilustra cómo un objeto puede viajar al frente a una
velocidad constante, y para hacer que dé vuelta, siempre tiene que ser acelerado hacia el
centro del círculo en el que está viajando.

Figura 6-7
Viajando en un Círculo

Esto causa aceleración


continua hacia el centro.

La Figura 6-8 muestra una gráfica de las mediciones del eje x del acelerómetro al
manejar el carro RC en círculos dando vueltas a la izquierda, luego en círculos dando
vueltas a la derecha. Note como la medición del eje x muestra aceleración positiva
cuando el carro RC da vuelta a la izquierda, y aceleración negativa cuando el carro RC
da vuelta a la derecha.
Página 234 · Sensores Inteligentes y sus Aplicaciones

Left Turn Straighten


Circles Out
RC Car Left then Right

60

40

20 Figura 6-8
0 Mediciones del
gravity/100

-20
0 100 200 300 400 500 600
Acelerómetro en el Carro
-40 RC mientras se maneja
-60 en círculos
-80

-100
seconds/30

Right Turn
Circles

La Figura 6-9 muestra cómo está orientado el eje x del acelerómetro y la aceleración que
mide. Para una vuelta a la izquierda, el carro está acelerando a la izquierda, lo que para el
acelerómetro es una medición de aceleración en el eje x positiva. Cuando da vuelta a la
derecha, la aceleración es en la dirección opuesta del eje x positivo, entonces la medición
en el eje x es negativa.

Figura 6-9: Sensando la aceleración durante las vueltas

a. b.
Capítulo 6: Más Proyectos con el Acelerómetro · Page 235

Procedimiento
El procedimiento para medir y luego graficar la aceleración del carro RC es como sigue.

√ Adhiera su tarjeta al carro RC.


√ Descarge DatalogAcceleration.bs2 en el BASIC Stamp.
√ Coloque el carro en una area abierta y presione/libere botón Reset de la tarjeta.
√ Espere a que el conteo regresivo indique que el registrado de datos ha empezado.
√ Maneje el carro con las siguientes maniobras, en aproximadamente 15 segundos:
o Acelere el carro hacia al frente, luego deténgalo.
o Acelere el carro hacia atrás, luego deténgalo.
o Manejelo en una figura de ocho.
√ Cuando la tarjeta suene nuevamente (después de unos 15 segundos) querra decir
que termino el registradote datos. Conecte la tarjeta de regreso a su PC.
√ Corra DatalogAcceleration.bs2 nuevamente.
√ Haga Click en la Ventana de Transmisión de la Terminal de Depuración.
√ Escriba D para desplegar los datos.
√ Use su mouse para sombrear el encabezado de tabla y todas las mediciones en la
ventana azul de Recepción de la Terminal de Depuración. (excepto el menu.)
√ Presione CTRL + C para copiar los registros.
√ Abra Notepad.
√ Haga Click en Edit y seleccione Paste.
√ Salve el archivo.

Las siguientes instrucciones explican como importar el archivo .txt en Microsoft Excel
2002 y graficarlo. Si está usando un programa de hoja de cálculo diferente, las palabras
clave como espacio delimitado, trazado disperso XY pueden darle pistas de cómo hacerlo
en su software de hoja de cálculo particular.

√ En Excel, haga click en File y seleccione Open.


√ En el campo de tipo de archivo, seleccione All files (*.*).
√ Encuentre el archivo .txt de notepad, seleccionelo y haga click en el botón Open.
√ En Text Import Wizard paso 1, haga click en Delimited radio y luego en Next.
√ De Click en el recuadro a un lado de Space ya que el archivo está delimitado en
espacio.
√ Marque el recuadro "Treat consecutive delimiters as one", luego click en Next.
√ Asegúrese que el está seleccionado el botón ratio en General column data format,
luego haga click en Finish.
Página 236 · Sensores Inteligentes y sus Aplicaciones

√ Su hoja de cálculo debe ser de 3 columnas (ancho) y como 503 renglones (largo)

El siguiente paso, que también se ha documentado para Microsoft Excel 2002, es correr
la herramienta de gráfico y decirle qué tipo de gráfica y cómo quiere que se vea.

√ Coloque el cursor en una celda a la derecha cerca de sus 3 columnas de datos.


√ Haga click en Insert y seleccione Chart.
√ En la pestaña de tipos estandar, seleccione XY (Scatter, dispersa). También haga
click en la gráfica que la configura en "Scatter with data points connected to
smoothed Lines without markers". Luego, haga click en Next.
√ Assumiendo que sus datos del eje y empiezan en C3 y terminan en C503, escriba
C3..C503 en Data range. Haga Click el botón ratio cercano a las columnas para
indicar que la serie de datos está en una columna. Luego, haga click en Next.
√ Complete con la información del eje y en chart title, luego haga click en Finish.
√ Repita para el eje x.

Solo partes de cda gráfica son relevantes. Considere que los datos que tendrán sentido
para el eje y es la porción de tiempo en que el carro aceleró hacia delante y en reversa. Del
mismo modo, la parte de la gráfica que tendrá sentido para el eje x es la porción cuando el
carro estaba dando vuelta.

Graficando la Posición del Carro y la Velocidad


Si conoce la posición inicial y la velocidad de un objeto, puede usar la aceleración
durante un período de tiempo para calcular su posición. Estos cálculos pueden hacerse
iterativamente en una hoja de cálculo para graficar la velocidad y la ruta del carro RC.

Descargando la hoja de cálculo. Las hojas de cálculo de MS Excel usadas para trazar
estas gráficas están disponibles como descarga en la página de Sensores Inteligentes y sus
Aplicaciones en www.parallax.com. Descargue la hoja de cálculo y examine las ecuaciones
en las columnas junto con las configuraciones para cada trazado.

Por ejemplo, la gráfica de aceleración en la Figura 6-10 muestra un trazado para el carro
RC al acelerar adelante y atrás. (La hoja de cálculo fué modificada para que los valores
positivos indiquen aceleración al frente y los valores negativos indiquen aceleración atrás
o desaceleración.) Entonces, esta gráfica muestra que el carro aceleró hacia adelante a un
promedio de unos 0.16 g por poco menos de 2 seconds. Luego, desaceleró a un promedio
Capítulo 6: Más Proyectos con el Acelerómetro · Page 237

de unos 1.4 g por poco más de 2 segundos. Entonces descansó como por 1 segundo.
Después, aceleró en reversa y desaceleró (aceleró en reversa) para un segundo paro.

Figura 6-10: Gráfica de aceleración modificada con valores positivos indicando hacia adelante

Seleccionando Datos a Graficar. Haga click derecho sobre la linea en la gráfica con el
título "RC Car acceleration for Forward and Backward.” Luego seleccione source data y
haga click en la pestaña Series. Note que la serie que está siendo ploteada es de F229 a
F492. Esta es la segunda de 2 pruebas adelante/atrás que fueron ejecutadas durante la
sesión de registro de datos. Lo mismo aplica a las gráficas de velocidad y posición.

Se agregó una columna con una ecuación la hoja de cálculo que calcula el cambio en la
velocidad para cada medición de aceleración. La ecuación para la velocidad en una linea
recta es v = v0 + at. Esto es, la velocidad inicial (v0) más el producto de la aceleración
(a) y la duración de esa aceleración (t). Agregar una columna a la hoja de cálculo que
recalcula la velocidad entre cada medición de aceleración hace posible graficar la
velocidad como se muestra en Figura 6-11. Como se esperaba, cuando el carro acelera al
frente, su velocidad se incrementa. Luego, cuando se va deteniendo, su velocidad
decrece. Al volver a acelerar, su velocidad decrece aún más (incrementa en dirección
negativa). Entonces, al irse deteniendo de su movimiento en reversa, su velocidad regresa
a casi cero.
Página 238 · Sensores Inteligentes y sus Aplicaciones

Figura 6-11: Gráfica de velocidad derivada de los datos de posición inicial y aceleración

Los cálculos para esta gráfica se hicieron en la columna F de la hoja de cálculo. Si hace
click en la celda F-17 de la hoja de cálculo, esta ecuación debe aparecer en el campo de
función:

=F16 + (0.03*9.8*E17/100)

In este caso, F16 is la celda justo arriba F17, y tiene la velocidad previa. Esta velocidad
previa es usada como V0 para el intervalo muestra. 0.03 es t, el tiempo entre muestras, y
9.8 * E17 / 100 toma la medición E17, que está en centésimas de una g y la convierte a
metros por segundo (m/s2). Al dividir entre 100 se toma el valor de centésimas de g a g y
luego al multiplicar por 9.8 la convierte de g a m/s2. Esto es porque 1 g es
aproximadamente 9.8 m/s2.

Con las columnas en la hoja de cálculo para aceleración y velocidad, ahora es posible
seguir la posición del carro usando la ecuación s = s0 + v0t + 1/2 at2. Esto es, la posición
del carro (s) es igual a la posición inicial (s0) mas el producto de la velocidad inicial y el
tiempo (v0t), mas el semiproducto de la aceleración y el cuadrado del tiempo (1/2 at2). La
resultante gráfica de posición mostrada en la Figura 6-12 is sorpresivamente exacta. El
carro de hecho fue hacia al frente unos 3.5 metros antes de parar. Luego, regresó y se
paró casi a un metro detrás de donde empezó.
Capítulo 6: Más Proyectos con el Acelerómetro · Page 239

Figura 6-12: Gráfica de posición a partir de la posición y velocidad iniciales y la aceleración

La ecuación que calcula la posición en la celda G17 es:

=G16+(F16*0.03)+((0.5*E17*9.8/100)*(0.03^2))

G16 es la posición después de la muestra previa, que es S0, la posición inicial. F16*0.03
es v0t, velocidad inicial multiplicada por el tiempo. (0.5*E17*9.8/100)*(0.03^2) es 1/2
at2, donde t es nuevamente 0.03 segundos.

Mientras que esta técnica es bastante exacta en períodos cortos de tiempo, varias fuentes
de error se arrastran en cada medición. Las superficies no lisas y la vibración afectarán
las mediciones de aceleración. Las ecuaciones asumen que la aceleración entre cada
medición es constante, pero en muchos casos la aceleración cambiará durante el tiempo
entre cada muestra. Además, cada medición del acelerómetro tiende a ser erronea en un
pequeño porcentaje dada la naturaleza del MX2125. La hoja de datos del MX2125's
(disponible en el sitio - www.memsic.com) explica estos errores, los mayores de ellos son
llamados compensación de cero y sensitividad. Variarán de un integrado a otro y también
son influenciados por la temperatura. Tomar mediciones de precisión con el MX2125
involucra un convertidor A/D, a coprocesador de punto flotante, y datos obtenidos de
pruebas de calibración. Este procedimiento de calibración esta fuera del alcance de este
texto. Para averiguar más acerca de este tema, consulte #AN-00MX-002 Thermal
Acceleromters Temperature Compensation, disponible en el sitio web de Memsic.
Página 240 · Sensores Inteligentes y sus Aplicaciones

Su Turno – Registrando la Aceleración, Velocidad y Posición de su Carro RC


Como se mencionó antes, las hojas de cálculo de MS Excel usadas para trazar estas
gráficas están disponibles como descarga en la página de Sensores Inteligentes y sus
Aplicaciones en www.parallax.com. Descarge la hoja de cálculo y examine las
ecuaciones en las diferentes columnas junto con la configuración de cada gráfica. Luego,
experimente y grafique con los datos obtenidos de su vehículo RC. Calesquiera datos
grafique debería empezar de una posición conocida con el carro parado. De esta manera
conocerá la posición inicial (s0), y lo más importante, la velocidad inicial, v0 es 0 m/s.

ACTIVIDAD #6: ESTUDIO DE LA ACELERACIÓN EN UN TRUCO CON


PATINETA
Esta actividad observa un segundo ejemplo de estudio de aceleración. Registra datos de
un truco de patineta llamado “ollie”. La configuración para registrar los datos del ollie
(Figura 6-13) consta de una tarjeta BASIC Stamp HomeWork adherida con cinta de uso
rudo por debajo de una patineta.

¡Esta actividad fué incluída con fines de ilustración – no se espera que el lector se
suba a una patineta! Este es solo un ejemplo de como el lector puede usar el
acelerómetro para hacer estudios del movimiento con sus propios pasatiempos o
actividades deportivas; ocurre que el autor sabe usar una patineta. Para todas sus
aplicaciones BASIC Stamp, use el sentido común y equipo de protección adecuado y
conduzca los experimentos bajo su propio riesgo (vea la Desvinculación de
Responsabilidad al reverso de la página inicial).

Figura 6-13: Tarjeta BASIC Stamp HomeWork adherida a la patineta del Autor
Capítulo 6: Más Proyectos con el Acelerómetro · Page 241

Acerca del Ollie


El primer ollie documentado fue hecho por Alan (Ollie) Gelfand a finales de los 70s.
Gelfand lo inició en pistas cóncavas. La versión en piso evolucionó a principios de los
80s. Cuando el patinador hace un ollie, brinca y parece que su patineta está pegada a sus
pies. Sin importar la pista o el estilo, muchos trucos de hoy son variaciones del ollie.

La Mecánica del Ollie


La Figura 6-14 muestra la mecánica de un ollie. Al brincar el ejecutante, (a) sus 2 pies
empujan la patineta hacia abajo. Justo antes de volar en el aire (b), levanta su pie frontal y
al mismo tiempo extiende su pie trasero hasta quedar con la punta del mismo, y la parte
posterior de la patineta golpea el concreto. El momentum del frente de la patineta la
mantiene elevándose (c), el patinador despega su pie trasero y patea con su pie frontal
hacia adelante. Esto causa que se levante la parte posterior de la patineta (d) y se mueva
ligeramente hacia enfrente. Mientras que la cubierta encuentra al pie trasero (e), el
patinador aplica justo la suficiente presión para mantener la patineta contra sus pies al ir
regresando al piso (f). El más alto ollie a la fecha, ejecutado por Danny Wainwright, fué
superior a los 5 pies de alto.

Figura 6-14: Mecánica del Ollie


Página 242 · Sensores Inteligentes y sus Aplicaciones

Graficando la Aceleracíon del Ollie


La Figura 6-15 muestra una gráfica del eje y del acelerómetro para los primeros 2 ollies
que fueron registrados con el siguiente programa ejemplo. Cada paso de la Figura 6-14
está marcado en la gráfica.

Acceleration vs Tim e for First Ollie

3.5

3
f
2.5

1.5
gravity (g)

1 Figura 6-15
0.5 Aceleración durante un
0
170 190 210 230 250 270
Ollie
-0.5

-1

-1.5
tim e (m s)

a, b c, d e

El primer ollie fue un poco deficiente en los pasos b y c de la Figura 6-14, asi que la parte
posterior de la patineta no se encontró con el pie posterior en el paso e. Note que el
impacto de la tarjeta durante el paso f fué 3.5 g. Los puntos altos y bajos que siguen al
paso fse asemejan a las oscilaciones cuando se toca una campana. Esto es partialmente
debido a la vibration de la patineta y parcialmente debido a la turbulencia del gas dentro
del acelerómetro causada por el impacto.

La Figura 6-16 muestra los datos para un ollie un poco mejor. Fue un poco más alto y el
paso e se hizo con gracia. Note que el paso de a a b es más pronunciado, y llega a -1.25 g
antes de subir por encima de 1 g para los pasos c y d. Estos valores, que son mayores que
los de la gráfica anterior, indican un ollie mayor. Note también que el impacto fue menor
a 3 g, porque el patinador no estaba intentando de recuperar con la patineta en su camino
hacia abajo.
Capítulo 6: Más Proyectos con el Acelerómetro · Page 243

Acceleration vs Time for Second Ollie

3.5

2.5 f
2

1.5

gravity, (g)
1 Figura 6-16
0.5 Gráfica de un Ollie
0
775 795 815 835 855 875
ligeramente mejor
-0.5

-1

-1.5
tim e (ms)

a, b c, d
e

Registrando un Ollie
La Figura 6-17 muestra cómo el eje y de sensado del acelerómetro esta alineado para
sensar varias inclinaciones y rotaciones de la patineta. Este es el único eje que queremos
registrar en el siguiente programa ejemplo.

Figura 6-17
Acelerómetro’s Sensing
Axes on the patineta

El programa de la actividad #4 fue modificado para guardar solo las mediciones


primarias del eje y del acelerómetro sin escalamiento ni compensación. El valor de y
estará entre 1875 a 3125 (para ± 1 g) si no se involuca una aceleración. Cuando la
medición de la aceleración es 3.5 g, resulta en una medición de 4687. en cualquier
evento, estos son valores de una palabra, y entonces el comando WRITE en la subrutina
Record_Data tiene que sermodificado para que guarde variables de una palabra. Puesto
que una palabra toma 2 bytes, the ciclo FOR...NEXT aún tiene que contar en pasos de 2.
FOR eeIndex = Records TO RecordsEnd STEP 2

PULSIN 7, 1, y

WRITE eeIndex, Word y

NEXT
Página 244 · Sensores Inteligentes y sus Aplicaciones

Se hacen modificaciones similares para el ciclo FOR...NEXT en la subrutina


Display_Data mostrada aquí.

FOR eeIndex = Records TO RecordsEnd STEP 2

READ eeIndex, Word y


DEBUG DEC eeIndex, CRSRX, 7, SDEC y, CR

NEXT

Programa Ejemplo: DatalogYaxisUnscaled.bs2


El siguiente programa ejemplo fué usado para registrar los datos graficados en las Figura
6-15 yFigura 6-16. Le da unos 10 segundos de registro, suficiente para 2 o 3 ollies. El
traslado de datos a una hoja de cálculo y su grafica está basado en el procedimiento de la
actividad #5. La hoja de cálculo fue modificada para generar las gráficas mostradas en
esta actividad agregando una columna con una fórmula que toma los datos del eje y, les
resta 2500 y los divide entre 625. Esto da una medición en unidades de gravedad (g).

' -----[ Titulo ]-------------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - DatalogYaxisUnscaled.bs2
' Registra 500 mediciones de aceleracion en el eje y de tamaño de una palabra.

'{$STAMP BS2}
'{$PBASIC 2.5}

' -----[ Directivas DATA]----------------------------------------------------

Reset DATA 0
Records DATA (1000)
RecordsEnd DATA

' -----[ Variables ]----------------------------------------------------------

char VAR Byte


eeIndex VAR Word
value VAR Word
x VAR value
y VAR Word

' -----[ Inicializacion ]-----------------------------------------------------

Init:

READ Reset, value


value = value + 1
WRITE Reset, value
Capítulo 6: Más Proyectos con el Acelerómetro · Page 245

IF value // 2 = 0 THEN

FOR char = 10 TO 0
DEBUG CLS, "Datalogging starts", CR,
"in ", DEC2 char, " seconds",
CR, CR,
"Press/release Reset", CR,
"for menu..."
FREQOUT 4, 50, 3750
PAUSE 950
NEXT

GOSUB Record_Data

ENDIF

' -----[ Rutina Principal]----------------------------------------------------

DO

DEBUG CLS,
"Press/Release Reset", CR,
"to arm datalogger ", CR, CR,
" - or - ", CR, CR,
"Type C, R or D", CR,
"C - Clear records", CR,
"R - Record records", CR,
"D - Display records", CR,
">"

DEBUGIN char
DEBUG CR

SELECT char
CASE "C", "c"
GOSUB Clear_Data
CASE "R", "r"
GOSUB Record_Data
CASE "D", "d"
GOSUB Display_Data
CASE ELSE
DEBUG CR, "Not a valid entry.",
CR, "Try again."
PAUSE 1500
ENDSELECT

LOOP

' -----[ Subrutina - Clear_Data ]--------------------------------------------

Clear_Data:
Página 246 · Sensores Inteligentes y sus Aplicaciones

DEBUG CR, "Clearing..."

FOR eeIndex = Records TO RecordsEnd


WRITE eeIndex, 0
NEXT

DEBUG CR, "Records cleared."


PAUSE 1000

RETURN

' -----[ Subrutina - Record_Data ]-------------------------------------------

Record_Data:

FREQOUT 4, 75, 4000


PAUSE 200
FREQOUT 4, 75, 4000

DEBUG CLS, "Recording..."

FOR eeIndex = Records TO RecordsEnd STEP 2

PULSIN 7, 1, y

WRITE eeIndex, Word y

NEXT

FREQOUT 4, 200, 4000

DEBUG CR, "End of records.",


CR, "Press Enter for menu..."
DEBUGIN char

RETURN

' -----[ Subrutina - Display_Data ]------------------------------------------

Display_Data:

DEBUG CR, "Index x-axis y-axis",


CR, "----- ------ ------",
CR

FOR eeIndex = Records TO RecordsEnd STEP 2

READ eeIndex, Word y


DEBUG DEC eeIndex, CRSRX, 7, SDEC y, CR
Capítulo 6: Más Proyectos con el Acelerómetro · Page 247

NEXT

DEBUG CR, "Press Enter for menu..."


DEBUGIN char

RETURN

Su Turno - ¿Qué es lo que logra un Ollie alto?


Sería interesante registrar y comparar ollies de diferentes patinadores. La mejor manera
de hacerlo sería tomar un video de cada ollie, y entonces ver el video y examinar la
gráfica al mismo tiempo. Otra cosa que puede medirse es el tiempo en el aire, que es el
tiempo entre los pasos a y f en las gráficas.

ACTIVIDAD #7: DISTANCIA DE RECORRIDO DE UNA BICICLETA


La Figura 6-18 en la siguiente página muestra cómo la tarjeta y acelerómetro pueden ser
montados dentro de una rueda de bicicleta, a fin de medir la distancia de recorrido de la
misma. Al levantar la bicicleta, esto podría parecer en principio como un problema del
ángulo of rotation, como en el Capítulo 3, actividad #5. Sin embargo, también hay
aceleración hacia el centro de la rueda que medirán los ejes. Esto es porque el
acelerómetro esta viajando en una ruta circular, justo como el carro RC de la actividad
previa. Esta aceleración hacia el centro de la rueda será diferente a diferentes velocidades
y resultará en mediciones de ángulo inclinadas. Las mediciones del acelerómetro también
serán afectadas cuando ciclista aplique los frenos, acelere y se incline en las vueltas.
Además, ¿qué criterio debe ser usado para agregar un uno al número de círculos
completos que ha dado la rueda? Esta actividad presenta la histéresis como un modo de
medir la rotación de la rueda. También demuestra como pueden ser usadas las técnicas de
registro usadas en las actividades anteriores para examinar cada uno de estos asuntos y
para probar la confiabilidad del prototipo.

No permita que el metal en el lado inferior de su tarjeta entre en contacto con los
rayos. Use un material aislante como plástico, cartón o espuma esd para aislar la parte
inferior de la tarjeta de los rayos.
Página 248 · Sensores Inteligentes y sus Aplicaciones

Figura 6-18
HomeWork Board con el
acelerómetro montada en
una rueda de bicicleta

a. b.

Contando Revoluciones de la rueda con Histéresis


Un problema para contar las revoluciones de la rueda es asegurar que el programa no
avance el conteo si la rueda no ha dado una vuelta completa. El error más común se hace
cuando para medir las revoluciones se establece un solo punto límite. ¿Qué pasa si el
ciclista está esperando en un semáforo y está moviendo su bicicleta hacia adelante y atrás
1 o 2 pulgadas? Si hay un solo punto límite, el contador de revoluciones de rueda seguirá
incrementando cada vez que el ciclista se balancee hacia adelante y atrás.

El siguiente programa ejemplo demuestra una forma de resolver este problema con
histéresis. Histéresis es el proceso de fijar 2 valores de umbral diferentes que deben ser
cruzados antes de que occurra un cambio de estado. En nuestro caso, el cambio de estado
es un incremento en el contador de revoluciones de la rueda. Con histéresis, la medición
debe caer por debajo de un valor de umbral bajo, y luego el programa espera hasta que se
halla levantado hasta por encima de un valor más alto antes de reconocer un cambio.
Luego, la medición tiene que ir debajo del valor de umbral bajo nuevamente antes de
reconocer un cambio de estado alto a bajo. Cada vez que el programa reconoce que la
medición fué menor que el valor bajo y luego arriba del valor alto, incrementa el contador
de revoluciones en 1.

He aquí un código que ejecuta histéresis. En el primero de los dos bloques anidados
DO...LOOP, el programa espera hasta que eje y sube por encima de 2650. Luego, el
segundo de los dos comandos anidados DO...LOOP espera hasta que la medición del eje y
cae por debajo de 2350. Solo entonces sumará un 1 a la variable counter. Luego de
esto, el programa hará que suene el piezo parlante y entonces repite el DO...LOOP exterior.
En este punto, el programa regresa a esperar la medición del eje y, que fue menor que
Capítulo 6: Más Proyectos con el Acelerómetro · Page 249

2350 para levantarse nuevamente por encima de 2650 otra vez. Considere que no es
necesariamente la forma optima de medir revoluciones de rueda. Eso lo determinará
usted.
DO

DO UNTIL y > 2650


PULSIN 7, 1, y
ciclo

DO UNTIL y < 2350


PULSIN 7, 1, y
ciclo

counter = counter + 1
FREQOUT 4, 200, 3750

LOOP

Banda muerta (Deadband): El rango entre 2350 y 2650 en el bloque de código anterior es
referido como banda muerta.

Programa Ejemplo: TestWheelCounter.bs2


√ Monte su tarjeta dentro de una rueda de bicicleta como se muestra en la Figura 6-
18. Asegúrese de mantener un buen aislante entre los rayos y la parte inferior de
la tarjeta.
√ Introduzca, salve y corra TestWheelCounter.bs2.
√ Gire la rueda y verifique que alerta una vez por revolución.

' Sensores Inteligentes y sus Aplicaciones - TestWheelCounter.bs2


' Rastrea revoluciones de rueda de una bicicleta.

'{$STAMP BS2}
'{$PBASIC 2.5}

x VAR Word
y VAR Word
counter VAR Word

DEBUG CLS

DO

DO UNTIL y > 2650


Página 250 · Sensores Inteligentes y sus Aplicaciones

PULSIN 7, 1, y
ciclo

DO UNTIL y < 2350


PULSIN 7, 1, y
ciclo

counter = counter + 1
FREQOUT 4, 200, 3750

LOOP

Registrando Varias Condiciones de Operación


En este punto podría parecer que la aplicación está lista para un código que convierta las
revoluciones en distancia y quizá una pantalla LCD y un par de botones para seleccionar
elementos de menu en LCD. El problema aquí es que solo hemos examinado a la rueda
girando en 2 velocidades. ¿Qué ocurre cuando el ciclista se inclina en vueltas cerradas? –
¿cambia entonces la aceleración? ¿Qué pasa a temperaturas altas y bajas? – ¿causarán
que las mediciones sean diferentes? Ciertamente no serviría tener un producto en el
mercado que solo rastreara la distancia de vuelta de bicicleta en parte del tiempo. El
producto obtendría una mala reputación muy rapidamente.

La Figura 6-19 muestra un estudio de aceleración registrado para la bicicleta a dos


velocidades ligeramente diferentes. El area alrededor de 400 ms es donde la rueda fue
desacelerada. El hecho importante que hay que notar en esta gráfica es la diferencia de las
mediciones de los ejes x y y. A la mayor velocidad, la señal del eje y varió entre 1 y −0.5
g mientras que las mediciones del eje x variaron entre −1.5 y 0.25 g. Después de reducir
la velocidad de la rueda, la medición del eje y varió entre 1 y -1 g, mientras que la
medición del eje x varió entre 0.7 y −1.3 g aproximadamente.

La Figura 6-19 es tan solo una gráfica de dos velocidades diferentes. Es cierto, el código
de histéresis de TestWheelCounter.bs2 trabaja bajo ambas de estas condiciones, pero
¿trabaja bajo TODAS las condiciones? Con esta clase de preguntas, los ingenieros
pueden aplicar algunas ecuaciones para predecir las aceleraciones bajo varias condiciones
extremas que ellos anticipan. Un software de simulación podría tambien ser usado para
verificar los imprevistos. Aún cuando esta clase de especialización está disponible, el
producto aún tiene que ser probado en una variedad de conditions "de la vida real",
especialmente para eliminar la posibilidad de suposiciones incorrectas de parte de los
ingenieros. Es aquí donde el registro de datos regresa a la escena. El prototipo real aún
tiene que ser llevado a través de las diversas condiciones que pudiera experimentar en la
Capítulo 6: Más Proyectos con el Acelerómetro · Page 251

bicicleta de cualquier persona antes de que sea seguro hacer la inversión en cajas
plásticas y un diseño electrónico más refinado que presente partes de bajo costo,
producción en masa y costos de inventarios.

Figura 6-19: Estudio de aceleración de rueda de bicicleta


Accelerometer
y-axis

Bike Wheel at Tw o Different Speeds

1.5

0.5
gravity, g

0
0 100 200 300 400 500 600 700 800 900 1000
-0.5

-1

-1.5

-2
tim e, m s

Accelerometer
x-axis

Con esto en mente, regresamos a ejecutar estudios de aceleración, bajo tantas situaciones
diferentes como sea posible. He aquí el programa que fue usado para registrar los datos
para la gráfica en la Figura 6-19. Note que está registrando valores de tamaño de una
palabra para las mediciones de los dos ejes x y y. La hoja de cálculo ha tomado el trabajo
de cambiar las mediciones primarias del acelerómetro PULSIN a mediciones de gravedad.

Programa Ejemplo: BikeWheelAcceleration.bs2


A modo de proyecto, pruebe el medidor de bicicleta en diferentes temperaturas y
condiciones de manejo, vueltas, cuesta arriba, cuesta abajo, lento, rápido, etc. Busque
una secuencia de cambios en mediciones que pueda ser rastreada sin importar las
condiciones. Si no hay un rango de histéresis para todas las condiciones, su código puede
necesitar periódicamente actualizar los valores alto y bajo más recientes y luego buscar
una histéresis dentro de ese rango.
Página 252 · Sensores Inteligentes y sus Aplicaciones

' -----[ Titulo ]-------------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - BikeWheelAcceleration.bs2
' Registra 500 mediciones de aceleracion en los ejes x y y.

'{$STAMP BS2}
'{$PBASIC 2.5}

' -----[ Directivas DATA]----------------------------------------------------

Reset DATA 0
Records DATA (1000)
RecordsEnd DATA

' -----[ Variables ]----------------------------------------------------------

char VAR Byte


eeIndex VAR Word
value VAR Word
x VAR value
y VAR Word

' -----[ Inicialización ]-----------------------------------------------------

Init:

READ Reset, value


value = value + 1
WRITE Reset, value

IF value // 2 = 0 THEN

FOR char = 10 TO 0
DEBUG CLS, "Datalogging starts", CR,
"in ", DEC2 char, " seconds",
CR, CR,
"Press/release Reset", CR,
"for menu..."
FREQOUT 4, 50, 3750
PAUSE 950
NEXT

GOSUB Record_Data

ENDIF

' -----[ Rutina Principal ]--------------------------------------------------

DO

DEBUG CLS,
Capítulo 6: Más Proyectos con el Acelerómetro · Page 253

"Press/Release Reset", CR,


"to arm datalogger ", CR, CR,
" - or - ", CR, CR,
"Type C, R or D", CR,
"C - Clear records", CR,
"R - Record records", CR,
"D - Display records", CR,
">"

DEBUGIN char
DEBUG CR

SELECT char
CASE "C", "c"
GOSUB Clear_Data
CASE "R", "r"
GOSUB Record_Data
CASE "D", "d"
GOSUB Display_Data
CASE ELSE
DEBUG CR, "Not a valid entry.",
CR, "Try again."
PAUSE 1500
ENDSELECT

LOOP

' -----[ Subrutina - Clear_Data ]--------------------------------------------

Clear_Data:
DEBUG CR, "Clearing..."
FOR eeIndex = Records TO RecordsEnd
WRITE eeIndex, 0
NEXT
DEBUG CR, "Records cleared."
PAUSE 1000
RETURN

' -----[ Subrutina - Record_Data ]-------------------------------------------

Record_Data:

FREQOUT 4, 75, 4000


PAUSE 200
FREQOUT 4, 75, 4000

DEBUG CLS, "Recording..."

FOR eeIndex = Records TO RecordsEnd STEP 4

PULSIN 6, 1, x
Página 254 · Sensores Inteligentes y sus Aplicaciones

PULSIN 7, 1, y

WRITE eeIndex, Word x


WRITE eeIndex + 2, Word y

NEXT

FREQOUT 4, 200, 4000

DEBUG CR, "End of records.",


CR, "Press Enter for menu..."
DEBUGIN char

RETURN

' -----[ Subrutina - Display_Data ]------------------------------------------

Display_Data:

DEBUG CR, "Index x-axis y-axis",


CR, "----- ------ ------",
CR
FOR eeIndex = Records TO RecordsEnd STEP 4
READ eeIndex, Word x
READ eeIndex + 2, Word y
DEBUG DEC eeIndex, CRSRX, 7, SDEC x, CRSRX, 14, SDEC y, CR
NEXT
DEBUG CR, "Press Enter for menu..."
DEBUGIN char
RETURN

Su Turno
Otra cosa por examinar es como se ejecutan las mediciones de rotación en el plano
vertical bajo las diversas condiciones de rueda de bicicleta.

√ La sección Su Turno de la actividad #4 registra mediciones de brads. Usela para


registrar la rotación de rueda de su bicicleta en brads.
√ Grafique la rotation en el tiempo bajo las diversas condiciones de manejo
discutidas en esta actividad.

¿Hay un comportamiento del ángulo medición para el cual la histéresis pueda ser
aplicada bajo todas las condiciones de manejo?
Capítulo 6: Más Proyectos con el Acelerómetro · Page 255

RESUMEN
Este capítulo presentó una variedad de aplicaciones del acelerómetro y de las técnicas de
registro de datos que pueden ser usadas para estudiar las mediciones del acelerómetro en
varias condiciones, y en algunos casos, para refinar sus programas. Cuando se observa la
cima de un objeto, las mediciones de rotación en un plano vertical pueden ser usadas con
la distancia al objeto y algo de trigonometría para determinar la altura del objeto.

Se presentaron directivas DATA con nombres Símbolo opcionales como una forma de
simplificar el mantener los registros en los programas de registro de datos. Pueden ser
usadas para definir rangos de Memoria de programación EEPROM no usada. Puesto que
los nombres Símbolo guardan la dirección de inicio de las directives DATA, son útiles en
ciclos FOR...NEXT que ejecutan operationes READ/WRITE sobre el rango de los bytes
EEPROM definidos por las directives DATA de inicio y fin.

También se presentó una técnica para usar una directiva DATA para apartar un byte para
establecer el modo del programa. Cada vez que el programa inicia, una rutina de
inicialización lee el byte, le agrega un uno y reemplaza el valor viejo en la EEPROM con
el valor modificado. Cada vez que el programa es reiniciado presionando y liberando el
botón Reset de la tarjeta, el programa puede usar el nuevo valor en EEPROM para
seleccionar entre diferentes modos. Para cambiar el estado on y off de una característica
en el programa, se usó una línea IF...THEN que examina si el residuo del valor dividido
entre 2 es cero. Esto hace posible iniciar y parar el registro de datos sin estar conectado a
la computadora.

Las aplicaciones del acelerómetro con registrado de datos incluyen la aceleración de un


carro RC, mediciones de trucos en patineta y mediciones de rueda de bicicleta. Cada una
de estas empleó un programa que fue una variación del programa de registrado remoto
presentado en la actividad #4. Los datos desplegados en la Terminal de Depuración
fueron sombreados, copiados y pegados en archivos de texto. Los archivos de texto
fueron entonces importados en un programa de hoja de cálculo y graficados. Las gráficas
fueron analizadas para examinar las aceleraciones, inclinaciones y ángulos involucrados
en los movimientos del carro RC, la patineta y la bicicleta.

Preguntas
1. ¿Cuáles son las 3 piezas de información que necesita para medir la altura de un
edificio a distancia?
Página 256 · Sensores Inteligentes y sus Aplicaciones

2. ¿Cuál es la diferencia entre DATA (100) y DATA 20 (100)?


3. ¿Qué esta mal con este comando? WRITE eeIndex, 1000. ¿Cómo lo puede
arreglar?
4. ¿Qué otras directivas y comandos tienen que estar presentes para que IF value
// 2 = 0 THEN... haga posible cambiar modos de programa con el botón Reset
de su tarjeta?
5. ¿Qué hace el piezo parlante en DatalogAcceleration.bs2?
6. ¿Cómo puede modificar una directiva DATA para hacer que aparte más valores?
7. ¿Cómo difiere la aceleración al frente de la desaceleración al frente?
8. Cuando se maneja en círculos a una velocidad y radio constante, ¿en qué
dirección es la acceleration?
9. ¿En qué difieren el programa registrador que mide un ollie de un patinador y el
programa que mide los movimientos de un carro RC? ¿En qué son similares?

Ejercicios
1. La cima de un edificio se divisó a 75° desde un punto de observación a 15 m del
edificio y a 1 m a partir del piso. ¿Cuál es la altura del edificio?
2. Escriba un par de directivas DATA que reserve 1501 bytes. Use nombres símbolo.
3. Escriba un ciclo FOR...NEXT que recupere 751 palabras. Asuma que sus nombres
Simbolo de la directiva DATA son StartData y EndData.
4. Modifique un bloque de código en DatalogAcceleration.bs2 para que su cuenta
regresiva sea 5 segundos.

Proyectos
1. Use Google para encontrar el valor de la pendiente por encima de la cual la nieve
fácilmente forma una avalancha. Haga un prototipo de un dispositivo que le
advierta si una pendiente es demasiado pronunciada. Este dispositivo puede ser
usado para reemplazar un dispositivo mecánico comúnmente usado en areas de
ski.
2. Diseñe un prototipo de pedómetro (contador de pasos).
Capítulo 6: Más Proyectos con el Acelerómetro · Page 257

Soluciones
Q1. (1) La altura a partir de la cual la medición es tomada, (2) la distancia a partir de
la base del edificio, y (3) el ángulo a partir de la horizontal al cual se divisa la
cima del edificio.
Q2. DATA (100) reserva 100 bytes en EEPROM; mientras que, DATA 20
(100)guarda el valor 20 en cada uno de los 100 bytes.
Q3. Los comandos WRITE guardan valores byte. Para arreglar este comando, tendría
que insertar el modificador Word antes del valor 1000. Considere que tendrá que
incrementar eeIndex en 2 antes de guardar el siguiente valor.
Q4. Necesitaría: Reset DATA 0; value VAR Word; READ Reset, value, value
= value + 1; WRITE Reset, value
Q5. Le permite al usuario saber en qué modo esta operando el dispositivo emitiendo
chirridos (tonos de cierta duración y frecuencia). El conteo antes de registrar
datos involucra 11 tonos de 50 ms y 3.75 kHz seguidos por 2 tonos más
pronunciados y agudos (75 ms y 4 kHz). Después de registrar datos, el piezo
parlante emite un chirrido más largo (200 ms y 4 kHz) para decirle al usuario
que el registrado de datos esta completo.
Q6. Incrementa el valor entre paréntesis que sigue la palabra clave DATA.
Q7. Si está viajando hacia al frente y desacelera es lo mismo que acelerar en reversa,
que es acelerar en la dirección opuesta a adelante.
Q8. Hacia el centro de un círculo.
Q9. Esta es una comparación de 2 programas ejemplo, DatalogAcceleration.bs2
contra DatalogYaxisUnscaled.bs2. DatalogAcceleration.bs2 guarda valores x y
y que son proporcionalmente divididos a 0 a 200 con 100 como 0 g.
DatalogYaxisUnscaled.bs2 no solo guarda la version sin escalar, no aplica
ninguna compensación tampoco. Es solo la medición primaria del eje y, que va
de 1875 a 3125. En ambos programas se requiere un valor de una palabra para
guardar cada medición. En DatalogAcceleration.bs2, es una palabra (2 bytes) la
que guarda las mediciones de los ejes x y y escaladas y compensadas. En
DatalogYaxisUnscaled.bs2, cada valor del eje y toma una palabra entera. Aún
cuando el tiempo que toma guarder los bytes es el mismo en ambos programas,
se salva algo de tiempo entre mediciones con DatalogYaxisUnscaled.bs2 porque
no toma ningún tiempo para un comando PULSIN que hubiera de otra manera
leido el eje x.
E1. Altura del objeto = opuesto + altura del acelerómetro
= (adyacente × tan (75˚)) m + 1 m
= (15 × 3.73) m + 1 m
Página 258 · Sensores Inteligentes y sus Aplicaciones

= 56.98 m
E2.
StartSymbol DATA (1500)
EndSymbol DATA
E3.
' Asume que StartData y EndData han sido definidas correctamente
FOR counter = StartData TO EndData
READ counter, dataItem
DEBUG dataItem ' Formato no especificado, no se usa algo como DEC.
' Si DEC dataItem was used, aun estaria correcto
' porque es lo que los textos ejemplos usaron.
NEXT
E4.
FOR char = 4 TO 0
DEBUG CLS, "Datalogging starts", CR,
"in ", DEC2 char, " seconds",
CR, CR,
"Press/release Reset", CR,
"for menu..."
FREQOUT 4, 50, 3750
PAUSE 950
NEXT
P1. Palabras clave usadas: avalanche prediction slope
Artícule de ayuda resultante usado: http://en.wikipedia.org/wiki/Avalanche
Information clave: La sección Terrain indica que una inclinación abajo de 25˚ o
ariba 60˚ presenta bajo riesgo y que el riesgo más alto está en pendientes entre
35 a 45˚.

El hardware podría involucrar un acelerómetro, una LCD, botones para


seleccionar el modo y un piezo parlante para una alarma. La clave para el
prototipe sería demostrar que el dispositivo puede detectar ciertos niveles de
riesgo a partir de, digamos, la base de la pendiente. Se pueden agregar
características asumiendo que el prototipo está aprobado.

Nota: Los complejos de Ski regularmente mantienen sus pendientes tomando


estas mediciones y luego lanzando cargas explosivas en las laderas para crear
pequeñas avalanchas, y así prevenir una avalancha mayor. Entonces aún cuando
podría parecer riesgoso medir a partir de la base de la pendiente, estamos
hablando de una pendiente que es regularmente mantenida para prevenir
avalanchas.

El prototipo involucra usar su tarjeta para ver la cima de la pendiente desde la


base, que resulta ser una simple modificación de la aplicación discutida en la
Capítulo 6: Más Proyectos con el Acelerómetro · Page 259

actividad #1 de este capítulo. Una línea SELECT…CASE puede ser agregada a la


version modificada de VertWheelRotation.bs2 que despliegue mensajes
diferentes en la LCD basado en el ángulo medido. La línea SELECT…CASE
pudiera ser como esta cuando esté completa:
SELECT angle
CASE 0 to 25
GOSUB Display_Pretty_Safe
CASE 25 to 35, 45 to 60
GOSUB Display_Some_Danger
CASE 35 to 45
GOSUB Display_Max_Danger
ENDSELECT

Cada subrutina desplegaría un mensaje indicando riesgo después de cada ángulo.

P2. Cargue y corra DatalogYaxisUnscaled.bs2. Fije la tarjeta a su cinturón en su


cintura de tal forma que el eje y esté vertical. Presione y libere el botón reset de
su tarjeta y camine durante el período de registro de datos. Siga las instrucciones
en la actividad #5 para graficar sus puntos registrados. Probablemente quisiera
graficar 200 de las 1001 mediciones. Busque un patrón, con cada paso la gráfica
debe exceder algun valor e ir por debajo de algún otro. Se presenta un ejemplo.
Note que cada aceleración de cada paso cae debajo de 2900 y luego excede 3300.

Ejemplo de gráfica de caminado:


x-axis ------

3900

3700

3500

3300
x-axis ------
3100

2900

2700

2500
1 16 31 46 61 76 91 106 121 136 151 166 181 196 211 226 241
Página 260 · Sensores Inteligentes y sus Aplicaciones

Use aquellos valores para definir las constantes StepLow y StepHigh en el


siguiente programa:
' Sensores Inteligentes y sus Aplicaciones - Ch6_Project2.bs2

' IMPORTANTE, siga las instrucciones para poder colocar sus propios
' valores. Las encontrará en la sección Soluciones del Capítulo 6.
' Examine la solucion del Proyecto 2 para información de como
' determinar sus propias constantes StepLow y StepHigh.

' {$STAMP BS2}


' {$PBASIC 2.5}

StepLow CON 2900


StepHigh CON 3300

y VAR Word
yOld VAR Word
stepCnt VAR Word

yOld = 3300

PAUSE 250 ' Estabiliza la fuente de energia


SEROUT 14, 84, [22, 12] ' Inicia LCD & limpia la pantalla
PAUSE 5 ' Pausa 5 ms para limpiar pantalla

DO

PULSIN 7, 1, y

IF (y <= 2900 y yOld >= 3300) OR (y >= 3300 y yOld <= 2900) THEN
yOld = y
stepCnt = stepCnt + 1
ENDIF

SEROUT 14, 84, [128, DEC5 stepCnt / 2]

LOOP
Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 261

Capítulo 7: Graficos de Barra en LCD para


Distancias e inclinaciones
La definición y desplegado de caracteres personalizados con la LCD Serial Parallax fue
presentado en el Capítulo 1, actividad #4. Este capítulo presenta más técnicas de
caracteres personalizados y las aplica a pantallas de gráfico de barra. Estas pantallas
indicarán la distancia a un objeto del sensor ultrasónico Ping))) y la inclinación del
Acelerómetro bi-axial Memsic 2125.

ACTIVIDAD #1: INTERCAMBIO DE CARACTERES PERSONALIZADOS


La LCD Serial Parallax puede desplegar hasta 8 caracteres personalizados en cualquier
momento. Sin embargo, pueden haber muchos más que 8 caracteres personalizados en su
aplicación, porque los caracteres personalizados pueden ser definidos y redefinidos según
se requiera. El único límite es que solo 8 pueden ser desplegados simultaneamente, y 8 es
bastante para muchos proyectos.

El lugar donde puede definir y guardar una librería de mas de 8 definiciones de caracteres
personalizados es en una parte de la memoria EEPROM BASIC Stamp que no se use
para almacenaje de programa. Puesto que los programas PBASIC raramente llenan toda
la memoria EEPROM, típicamente hay espacio para todas las definiciones de caracteres
personalizados que una aplicación pueda necesitar.

Una técnica poderosa es usar solo 1 de los 8 espacios para caracteres personalizados de la
LCD para desplegar una secuencia de definiciones de caracteres personalizados que está
guardada en la EEPROM. Esto es especialmente útil para animación, pero también es
importante para desplegar gráficas de barra. Esta actividad da un ejemplo de animación.

De Almacenado en EEPROM a Memoria de Caracteres LCD


El siguiente programa ejemplo demuestra una forma conveniente de guardar definiciones
de caracteres personalizados en la EEPROM del BASIC Stamp. A continuación se
muestran 2 de las 15 definiciones de caracteres personalizados del programa. Cada
definición tiene un único nombre Símbolo, como Char0, Char1, etc., hasta Char14.
Cada uno de estos nombres Símbolo representan la dirección EEPROM del primer byte
en la directiva DATA. La subrutina que transfiere las definiciones de la EEPROM al
espacio de memoria del caracter personalizado en la LCD usa estos nombres Símbolo
Página 262 · Sensores Inteligentes y sus Aplicaciones

como un punto de referencia para leer los bytes de la EEPROM. Después de leer cada
byte de la EEPROM, la subrutina lo manda a la LCD serial.
.
.
.
Char4 DATA %11111, ' * * * * *
%00011, ' 0 0 0 * *
%11011, ' * * 0 * *
%11011, ' * * 0 * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111 ' * * * * *
.
.
.
Char9 DATA %11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11011, ' * * 0 * *
%11011, ' * * 0 * *
%11000, ' * * 0 0 0
%11111 ' * * * * *
.
.
.
El siguiente programa ejemplo obtiene las definiciones de los caracteres personalizados
de la EEPROM y las manda a la LCD serial usando una subrutina llamada
Def_Cust_Char. Lo que tiene que hacer antes de llamar a la subrutina es fijar el valor
de 2 variables: custChar y charBase. custChar es para seleccionar qué caracter
personalizado se va a definir (0, 1, 2...7). charBase es usada para decirle a la subrutina
dónde buscar el inicio de la definición del caracter en la EEPROM. Por ejemplo, use
estos 3 comandos para transferir la definición Char9 en la EEPROM del BASIC Stamp al
caracter personalizado 5 en la memoria de caracteres de la LCD Serial Parallax:
custChar = 5
charBase = Char9
GOSUB Def_Cust_Char

Si su programa tiene que escoger entre muchas definiciones de caracteres personalizados


diferentes, puede reemplazar charBase = Char9 con un comando LOOKUP. Ahora, un
ejemplo que escoge 1 de las 3 diferentes definiciones de caracteres personalizados en el
siguiente programa ejemplo con un comando LOOKUP. Dependiendo del valor de
counter, Char0, Char1 o Char2 será copiado a la variable charBase.
Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 263

DO
counter = counter + 1
counter = counter // 3

' Define caracter personalizado.


custChar = 5
LOOKUP counter,
[Char0, Char1, Char2],
charBase
GOSUB Def_Cust_Char
.
.
.
LOOP

Como hacer que counter cuente 0, 1, 2, 0, 1, 2, ... sin FOR...NEXT

El bloque de código arriba está en un DO...LOOP, y por ello se repite indefinidamente. La


variable del contador se incrementa en 1 cada vez que pasa por el ciclo. El comando
counter = counter // 3 usa el operador módulo // de PBASIC para calcular el
residuo de counter ÷ 3. Al hacer counter igual al residuo de counter ÷ 3, counter solo
cuenta hasta 2 antes de regresar a 0. La secuencia resultante de valores guardados por
counter es 0, 1, 2, 0, 1, 2, 0, 1, 2, ...

Para desplegar el caracter personalizado en un cierto caracter, el siguiente programa


ejemplo tiene una subrutina Disp_Cust_Char. Esta depende de 3variables, line,
custChar, y cursor. line debe ser puesta en Line0 o Line1, que están definidos en la
sección Constantes del programa ejemplo. Nuevamente, custChar es un valor entre 0 y
7, que selecciona un caracter personalizado en la memoria de caracter de la LCD.
cursor puede ser un valor de 0 a 15 dependiendo qué tan lejos de la izquierda de la LCD
quiere que se escriba el caracter. Por ejemplo, para escribir el caracter personalizado 5 en
la Línea 0 caracter 8 de la LCD, use estos comandos:
custChar = 5
line = Line0
cursor = 8
GOSUB Disp_Cust_Char

Puesto que el siguiente programa ejemplo está sólo animando un caracter, puede usarse
un ciclo FOR...NEXT para accesar cada una de las directivas DATA del caracter
personalizado. La dirección de inicio de cada directiva DATA será 8 bytes después de la
siguiente. Se puede actualizar la LCD con cada definición de caracter en la secuencia de
Página 264 · Sensores Inteligentes y sus Aplicaciones

directivas DATA con un ciclo FOR...NEXT que dé pasos de 8, que comience en Char0 y
termine en Char14.
DO

FOR charBase = Char0 TO Char14 STEP 8


GOSUB Def_Cust_Char
cursor = 7
GOSUB Disp_Cust_Char
PAUSE 200 '- charBase
NEXT

PAUSE 1000

LOOP

Programa Ejemplo: EepromPixelWorm.bs2

Descarga gratis Este programa está disponible como descarga grátis .bs2 en la página del
producto de Sensores Inteligentes y sus Aplicaciones en www.parallax.com.

EepromPixelWorm.bs2 crea un gusano de pixeles, arrastrándose a través de un caracter.

√ Examine las definiciones de caracter EEPROM y prediga cómo se verá la


animación corra el programa.
√ Abra y corra EepromPixelWorm.bs2.
√ Compare sus results esperados con la pantalla LCD.

' -----[ Tiutlo ]------------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - EepromPixelWorm.bs2
' Despliega un gusano de pixel animado en un solo caracter LCD

' {$STAMP BS2} ' Dispositivo Objeto = BASIC Stamp 2


' {$PBASIC 2.5} ' Lenguaje = PBASIC 2.5

' -----[ Datos EEPROM]--------------------------------------------------------

Char0 DATA %11111, ' * * * * *


%01111, ' 0 * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 265

%11111 ' * * * * *

Char1 DATA %11111, ' * * * * *


%00111, ' 0 0 * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111 ' * * * * *

Char2 DATA %11111, ' * * * * *


%00011, ' 0 0 0 * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111 ' * * * * *

Char3 DATA %11111, ' * * * * *


%00011, ' 0 0 0 * *
%11011, ' * * 0 * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111 ' * * * * *

Char4 DATA %11111, ' * * * * *


%00011, ' 0 0 0 * *
%11011, ' * * 0 * *
%11011, ' * * 0 * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111 ' * * * * *

Char5 DATA %11111, ' * * * * *


%10011, ' * 0 0 * *
%11011, ' * * 0 * *
%11011, ' * * 0 * *
%11011, ' * * 0 * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111 ' * * * * *

Char6 DATA %11111, ' * * * * *


%11011, ' * * 0 * *
%11011, ' * * 0 * *
%11011, ' * * 0 * *
Página 266 · Sensores Inteligentes y sus Aplicaciones

%11011, ' * * 0 * *
%11011, ' * * 0 * *
%11111, ' * * * * *
%11111 ' * * * * *

Char7 DATA %11111, ' * * * * *


%11111, ' * * * * *
%11011, ' * * 0 * *
%11011, ' * * 0 * *
%11011, ' * * 0 * *
%11011, ' * * 0 * *
%11011, ' * * 0 * *
%11111 ' * * * * *

Char8 DATA %11111, ' * * * * *


%11111, ' * * * * *
%11111, ' * * * * *
%11011, ' * * 0 * *
%11011, ' * * 0 * *
%11011, ' * * 0 * *
%11001, ' * * 0 0 *
%11111 ' * * * * *

Char9 DATA %11111, ' * * * * *


%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11011, ' * * 0 * *
%11011, ' * * 0 * *
%11000, ' * * 0 0 0
%11111 ' * * * * *

Char10 DATA %11111, ' * * * * *


%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11011, ' * * 0 * *
%11000, ' * * 0 0 0
%11111 ' * * * * *

Char11 DATA %11111, ' * * * * *


%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11000, ' * * 0 0 0
%11111 ' * * * * *

Char12 DATA %11111, ' * * * * *


Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 267

%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11100, ' * * * 0 0
%11111 ' * * * * *

Char13 DATA %11111, ' * * * * *


%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11110, ' * * * * 0
%11111 ' * * * * *

Char14 DATA %11111, ' * * * * *


%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111 ' * * * * *

' -----[ Pines E/S]-----------------------------------------------------------

LcdPin PIN 14 ' pin E/S conectado a RX de la LCD

' -----[ Constantes ]---------------------------------------------------------

T9600 CON 84 ' True, 8-bits, no parity, 9600

LcdCls CON 12 ' Form feed -> limpia pantalla


LcdCr CON 13 ' Retorno de carro
LcdOff CON 21 ' Apaga la pantalla
LcdOn CON 22 ' Enciende la pantalla
Line0 CON 128 ' Linea 0, caracter 0
Line1 CON 148 ' Linea 1, caracter 0
Define CON 248 ' direccion define caract pers 0

' -----[ Variables ]----------------------------------------------------------

custChar VAR Nib ' selector de carcter personalizado


index VAR Nib ' variable indice Eeprom
charBase VAR Byte ' Caracter base para READ
dotLine VAR Byte ' linea punteada de 5-pixel
cursor VAR Nib ' Colocacion de Cursor
counter VAR Nib ' variable de conteo ciclo ppal.
line VAR Byte ' Linea0 o Linea1
Página 268 · Sensores Inteligentes y sus Aplicaciones

' -----[ Inicialización ]-----------------------------------------------------

PAUSE 100 ' Estabiliza fuente de poder


SEROUT LcdPin, T9600, [LcdOn, LcdCls] ' Inicializa LCD
PAUSE 5 ' 5 ms retraso para limpiar pantalla

custChar = 2 ' Selecc caracter personalizado 2


line = Line0 ' BarGraph en Linea 0.

' -----[ Rutina Principal ]---------------------------------------------------

DO ' Ciclo Principal

FOR charBase = Char0 TO Char14 STEP 8 ' Va los 10 caracteres personal.


GOSUB Def_Cust_Char ' Define el caracter
cursor = 7 ' Coloca the cursor
GOSUB Disp_Cust_Char ' Imprime el caracter
PAUSE 200 '- charBase ' charbase mayor - pausa menor
NEXT ' Repite FOR charbase...

PAUSE 1000 ' Pausa 1 segundo

LOOP ' Repite ciclo principal

' -----[ Subrutina - Def_Cust_Char ]-----------------------------------------

' Esta subrutina define uno de los 8 caracteres personalizados de LCD. Hace la
' variable charBase igual a 1 de los nombres simbolo que precede la directiva
' DATA del character personalizado. Establece la variable custChar en un valor
' entre 0 y 7 para escoger uno de los 8 caracteres personalizados de la LCD.

Def_Cust_Char:
SEROUT LcdPin, T9600, ' Define caracter personalizado
[Define + custChar]
FOR index = 0 TO 7 ' 7 bytes, define 7 lineas punteadas
READ charBase + index, dotLine ' Obtiene byte para linea punteada
SEROUT LcdPin, T9600, [dotLine] ' Lo manda a la LCD
NEXT

RETURN

' -----[ Subrutinas - Disp_Cust_Char ]---------------------------------------

' Esta subrutina muestra un caracter personalizado. La variable linea puede


' hacerse ya sea Line0 o Line1, y la variable cursor puede establecerse en un
' valor entre 0 y 15. La variable custChar selecciona uno de los caracteres
' personalizados de la LCD y debe ser puesta a un valor entre 0 y 7.

Disp_Cust_Char:
SEROUT LcdPin, T9600, ' Escribe caracter personalizado
Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 269

[line + cursor, custChar]


RETURN

Dentro de las Subrutinas - Def_Cust_Char y Disp_Cust_Char


Hechemos un vistazo a la subrutina Def_Cust_Char (abajo). El primer comando,
SEROUT LcdPin, T9600, [Define + custChar] envía un valor entre 248 y 255 a la
LCD. Esto es porque Define esta definido en 248 en la sección Constantes. 248 es el
valor que le dice a la LCD que defina el caracter personalizado 0. Si quiere definir el
caracter personalizado 1, es 249, etc., hasta el caracter personalizado 7, que es 255. El
término Define + custChar puede ser 248 si custChar guarda 0, o 249 si custChar
guarda 1, etc., hasta 255 si custChar guarda 7.
Def_Cust_Char:

SEROUT LcdPin, T9600, ' Define caracter personalizado


2
[Define + custChar]
FOR index = 0 TO 7 ' 7 bytes, define 7 lineas punteadas
READ charBase + index, dotLine ' Obtiene byte para linea punteada
SEROUT LcdPin, T9600, [dotLine] ' Lo manda a la LCD
NEXT

RETURN

Después de que la LCD recibe un valor entre 248 y 255 espera recibir 8 bytes mas, cada
uno conteniendo una de las 8 líneas punteadas que hacen la definición de un caracter
personalizado. El FOR...NEXT en Def_Cust_Char lee cada byte en la EEPROM,
empezando en charBase. Considere que la rutina principal establece a charBase en el
nombre Símbolo de una de las directives DATA, que es una constante igual a la dirección
de inicio de los datos. READ charBase + index, dotLine lee un byte de la definición
de caracter y lo guarda en la variable dotLine. La primera vez al pasar por el ciclo
FOR...NEXT, index es 0, entonces el primer byte en la definición de caracter es traída de la
EEPROM y guardada en la variable dotLine. Luego, el valor guardado por dotLine es
enviado a la LCD con el comando SEROUT LcdPin, T9600, [dotLine]. La segunda
vez el pasar por el ciclo FOR...NEXT, index es ahora 1, y entonces el segundo byte es
leído de la EEPROM y enviado a la LCD. La tercera vez, el tercer byte en la definición
de caracter es traída y enviada, etc., hasta el octavo byte cuando index llega a 7.

La subrutina Disp_Cust_Char tiene solo un comando, SEROUT LcdPin, T9600,


[line + cursor, custChar]. Envía 2 valores a la LCD. El primero es line +
Página 270 · Sensores Inteligentes y sus Aplicaciones

cursor, que coloca el cursor donde el caracter personalizado va a ser escrito. line
contiene ya sea Line0 o Line1. Line0 es el valor constante 128, que apunta a caracter 0
Línea 0. Line1 es el valor constante 148, que apunta a caracter 0 Línea 1. Al sumar
cursor (un valor entre 0 y 15) le da control sobre en qué línea y caracter es colocado el
cursor. La variable custChar, que contiene un valor entre 0 y 7, causará que el caracter
personalizado sea escrito donde el cursor ha sido puesto. El segundo valor que envía el
comando SEROUT es custChar, que contiene un valor entre 0 y 7. Este valor hace que la
LCD escriba un caracter personalizado donde el cursor fue puesto.
Disp_Cust_Char:

SEROUT LcdPin, T9600,


[line + cursor, custChar]
RETURN

Su Turno - ¿Copias Múltiples de Caracteres personalizados?


Si tiene muchos caracteres personalizados diferentes, pero solo quiere desplegar uno en
cierto momento, solo necesita una de las definiciones de caracter personalizado de la
LCD. Sin embargo, si quiere que más de un caracter personalizado diferente sea
desplegado por la LCD al mismo tiempo, use más de una de las diferentes definiciones de
caracter personalizado en la memoria de caracteres de la LCD.

√ Salve CustomEepromCharacters.bs2 as CustomEepromCharactersYourTurn.bs2


√ Agregue este bloque de código a la sección de inicialización del programa.
custChar = 5
line = Line0
cursor = 9
GOSUB Disp_Cust_Char
line = Line1
GOSUB Disp_Cust_Char
cursor = 8
GOSUB Disp_Cust_Char

√ Corra el programa, y observe el resultado desplegado en la LCD.

El DO...LOOP principal esta solo actualizando la Línea 0, caracter 8, ¡pero las otras 3
instancias del caracter personalizado 5 también están cambiando! ¿Porqué? Cuando la
definición del caracter personalizado 5 cambia, todos los caracteres personalizados 5s
en la pantalla son automaticamente actualizados.
Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 271

En algunos casos, esto es deseable. Por ejemplo, puede lograr algunos efectos visuales
interesantes al hacer 32 copias de un caracter personalizado y luego repetidamente
actualizar la definición del caracter. Para situaciones donde desee desplegar más de un
caracter personalizado al mismo tiempo, simplemente use más de un caracter
personalizado. En otros casos, cuando quiera que la LCD despliegue más de un caracter
personalizado diferente al mismo tiempo, use diferentes definiciones de caracteres
personalizados.

Resumen del desplegado de caracteres personalizados:

• Si tiene muchos caracteres personalizados diferentes pero solo quiere desplegar


uno en un momento dado, use un solo caracter personalizado y actualice su
definición para cambiar el caracter.
• Si quiere desplegar mas de un caracter personalizado en la LCD al mismo
tiempo, use más de una definición de los diferentes caracteres personalizados en
la memoria de caracteres de la LCD.

Respecto a la segunda regla, acerca tener más de un caracter personalizado en la pantalla


al mismo tiempo, la siguiente actividad provee un ejemplo en operación.

ACTIVIDAD #2: GRAFICOS DE BARRAS HORIZONTALES PARA


DISTANCIA CON PING)))
Este primer ejemplo de gráfico de barra demuestra cómo desplegar gráficamente una
medición del sensor Ping))) de la distancia en centímetros a un objeto.

Partes y Equipo
Vea el Capítulo #2, actividad #4.

Una gráfica de barra Horizontal


Para probar la gráfica de barra horizontal del programa del siguiente ejemplo , introducirá
valores en la Ventana de Transmisión de la Terminal de Depuración, y la LCD
desplegará el resultado en formato de gráfica de barra como se muestra en la Figura 7-1.
Cada renglón en la LCD tiene 80 columnas de líneas puntueadas verticales. Si introduce
un 1, la columna en la izquierda extrema del character más a la izquierda se obscurecerá.
Si introduce un 2 causará que 2 columns se obscurezcan. Con un 29 se obscurecerán 29
columnas. Puesto que cada caracter es de 5 columnas de ancho, el valor 29 se muestra
como5 caracteres obscurecidos y the sexto caracter con 4 columnas obscurecidas.
Página 272 · Sensores Inteligentes y sus Aplicaciones

Figura 7-1: Gráfica de barra Horizontal con caracteres personalizados

Transmit
Windowpane

Receive
Windowpane

LCD
Bar Displays

El siguiente programa ejemplo usa las 2 reglas para desplegar caracteres personalizados
que discutimos en la sección Su Turno de la actividad previa. Dependiendo del valor que
es desplegado, el programa guarda una de las 5 diferentes definiciones de caracter en el
caracter personalizado 2. Sin embargo, a diferencia de CustomEepromCharacters.bs2,
este programa no guarda definiciones de caracteres personalizados en la EEPROM del
BASIC Stamp. En vez de ello, las definiciones son derivadas durante la ejecución del
programa, según el valor de la variable que está siendo expresada por la gráfica de barra.

La Figura 7-2 muestra cómo las definiciones van de vacío (Char0) a 4 columnas
verticales negras (Char4). Estas definiciones serán guardadas en la EEPROM y usadas
una por una para redefinir el caracter 2, puesto que solo una es necesaria en un momento
Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 273

dado. Pero el programa puede necesitar desplegar copias múltiples de un caracter todo de
negro para números mayores a 10; para esto se usa el caracter personalizado 3.

Figura 7-2
Libreria de Definiciones
para el caracter
personalizado 2

Programa Ejemplo: HorizBarGraph.bs2


√ Introduzca, salve y corra HorizBarGraph.bs2.
√ Haga Click en la Ventana de Transmisión de la Terminal de Depuración.
√ Escriba un 8, luego presione Enter.
√ Revise la gráfica de barra y asegúrese que el caracter mas a la izquierda esta
negro y que el siguiente muestra Char3.
√ Intente los valores mostrados en la Figura 7-1.
√ Intente 45, 46, 47, 48, 49, 50, 51, 52.
√ Experimente con los límites como 0, 80.
√ Intente valores fuera de los límites. ¿Qué pasa?

' -----[ Titulo ]-------------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - HorizBarGraph.bs2
' Despliega valores introducidos en la Ventana de Recepcion de la Terminal de
' Depuracion como datos de una grafica de barra horizontal en la LCD.

' {$STAMP BS2} ' Dispositivo Objeto = BASIC Stamp 2


' {$PBASIC 2.5} ' Lenguaje = PBASIC 2.5

' -----[ Pines E/S]-----------------------------------------------------------

LcdPin PIN 14 ' pin E/S conectado a RX de la LCD


Página 274 · Sensores Inteligentes y sus Aplicaciones

' -----[ Constantes ]---------------------------------------------------------

T9600 CON 84 ' True, 8-bits, no parity, 9600

LcdCls CON 12 ' Form feed -> limpia pantalla


LcdCr CON 13 ' Retorno de carro
LcdOff CON 21 ' Apaga la pantalla
LcdOn CON 22 ' Enciende la pantalla
Line0 CON 128 ' Linea 0, caracter 0
Line1 CON 148 ' Linea 1, caracter 0
Define CON 248 ' direccion define caract pers 0

' -----[ Variables ]----------------------------------------------------------

custChar VAR Nib ' selector de carcter personalizado


index VAR Nib ' variable indice Eeprom
dotLine VAR Byte ' linea punteada de 5-pixel
cursor VAR Nib ' Colocacion de Cursor
value VAR Byte ' Valor a ser graficado
charCnt VAR Byte ' variable para conteo Caracter
line VAR Byte ' Linea0 o Linea1

' -----[ inicialización ]-----------------------------------------------------

PAUSE 100 ' Estabiliza fuente de poder


SEROUT LcdPin, T9600, [LcdOn, LcdCls] ' Initializa LCD
PAUSE 5 ' 5 ms retraso para limpiar pantalla

custChar = 3 ' Selecciona caracter personalizado 3


dotLine = %11111 ' Oscurece todos los pixeles en cada linea
GOSUB Def_Horiz_Bar_Char ' Subrutina define Caracter

line = Line0 ' BarGraph en Linea 0.

DEBUG "Enter valores (0 to 80)", CR

' -----[ Main Rutina ]-------------------------------------------------------

DO ' Ciclo Principal

DEBUG ">"
DEBUGIN DEC value ' Valor en ventana de Transmision
GOSUB Bar_Graph ' Despliega como grafica de barra

LOOP ' Repite ciclo principal

' -----[ Subrutina - Bar_Graph ]----------------------------------------------

Bar_Graph:

' Llena desde la izquierda con barras negras


Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 275

value = value MAX 80 ' valor Limite - 0 a 80


charCnt = value / 5 ' número de barras negras
custChar = 3 ' Escoge caracter pers. negro

IF charCnt > 0 THEN ' Si escribe barras negras…


FOR cursor = 0 TO charCnt - 1 ' Escribe charCnt - 1 barras negras
GOSUB Disp_Cust_Char ' Escribe la barra negra
NEXT
ENDIF

' Despliega caracter pers. 2 con cierto número de columnas negras.

cursor = charCnt ' Coloca cursor


custChar = value // 5 ' ¿Cuantos quintos de barra?
' Escoge patron de bits para la definicion de caracter personalizado
LOOKUP custChar,
[%00000, %10000, %11000, %11100, %11110],
dotLine
custChar = 2 ' Establece caracter personalizado en 2
GOSUB Def_Horiz_Bar_Char ' Define el caracter personalizado
GOSUB Disp_Cust_Char ' Despliega el caracter personalizado

' Sobreescribe todo a la derecha con espacios.

IF (charCnt + 1) < 15 THEN ' ¿Caracteres Parciales a la izq de char 15?


FOR cursor = (charCnt + 1) TO 15 ' Llena a la derecha con " "
SEROUT LcdPin, T9600,
[line + cursor, " "]
NEXT
ELSEIF value = 80 THEN ' Caso especial: value = 80
SEROUT LcdPin, T9600,
[line + cursor, 3]
ELSEIF charCnt = 14 THEN ' Caso especial: 75 <= value <= 80
SEROUT LcdPin, T9600, [line + 15, " "]
ENDIF

RETURN

' -----[ Subrutina - Def_Horiz_Bar_Char ]------------------------------------

Def_Horiz_Bar_Char:

SEROUT LcdPin, T9600, ' Define caracter personalizado


[Define + custChar]
FOR index = 0 TO 7 ' 7 bytes, define 7 lineas punteadas
SEROUT LcdPin, T9600, [dotLine] ' Manda a la LCD
NEXT

RETURN
Página 276 · Sensores Inteligentes y sus Aplicaciones

' -----[ Subrutinas - Disp_Cust_Char ]---------------------------------------

' Esta subrutina despliega un caracter personalizado. La variable line puede


' establecerse en Line0 o Line1, y la variable cursor puede establecerse a un
' valor entre 0 y 15. La variable custChar selecciona uno de los caracteres
' personalizados de la LCD y debe ser establecida a un valor entre 0 y 7.

Disp_Cust_Char:

SEROUT LcdPin, T9600, ' Escribe caracter personalizado


[line + cursor, custChar]
RETURN

Como trabaja HorizBarGraph.bs2


El caracter personalizado 2 de la LCD es reservado para desplegar una de las 5 diferentes
definiciones de caracteres personalizados, pero el caracter personalizado 3 siempre usará
la misma definición, tener todos sus pixeles negros. Con esto en mente, un bloque de
código fue agregado a la sección de inicialización que define el caracter personalizado 3
de la LCD usando la subrutina Def_Horiz_Bar_Char. Esta subrutina hace 8 copias
idénticas del renglón de 5 pixeles guardados por la variable dotLine para construir el
caracter personalizado. Después de esto, la variable line se establece para colocar el
cursor en el renglón de arriba y el programa despliega un aviso al usuario "Enter values
(0 to 80)", seguido de un retorno de carro.
custChar = 3 ' Selecciona caracter personalizado 3
dotLine = %11111 ' Oscurece todos los pixeles en cada linea
GOSUB Def_Horiz_Bar_Char ' Subrutina define Caracter

line = Line0 ' BarGraph en Linea 0.

DEBUG "Enter valores (0 to 80)", CR

La Rutina Principal es un DO...LOOP que repetídamente despliega el aviso ">", y luego


obtiene valores decimales introducids en la Ventana de Transmisión de la Terminal de
Depuración. Luego llama a la subroutine Bar_Graph.
' -----[ Rutina Principal ]--------------------------------------------

DO ' Ciclo Principal

DEBUG ">"
DEBUGIN DEC value ' Valor en ventana de Transmision
GOSUB Bar_Graph ' Despliega como grafica de barra

LOOP ' Repite ciclo principal


Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 277

La subrutina Bar_Graph toma lo que esté guardado en la variable value y lo representa


en la LCD con una pantalla de gráfico de barra. Esta subrutina confía en las subrutinas
Def_Cust_Char y Disp_Cust_Char de la actividad previa. La subrutina Bar_Graph
consiste en 3 pasos mayores:

1. Llena cualesquiera caracteres negros de izquierda a derecha. Por ejemplo, si la


variable value es establecida en 28, 5 caracteres LCD (con 5 lineas negras
verticales cada uno) deben ser oscurecidos.
2. En el ejemplo, el sexto caracter LCD tendrá 3 líneas verticales. Recuerde, el
caracter personalizado 2 es usado para desplegar 1 de las 5 definiciones de
caracter (Figura 7-2). El número de columnas negras en el caracter es el residuo
de value // 5. Este resultado selecciona un patrón de bits a partir de una tabla
LOOKUP y lo copia a la dotLine. Luego, custChar es igualada a 2 y la subrutina
Def_Horiz_Bar_Char copia este patrón de bits a los 8 renglones en el caracter.
Ya que el caracter fue redefinido puede ser entonces escrito.
3. Todos los caracteres no necesarios para representar el valor en la gráfica de barra
tienen que ser limpiados con el caracter espacio " ". En este ejemplo value =
28, esto es, limpiar todo entre la derecha del sexto caracter y el 15avo caracter.
Si bien esto es sola y absolutamente necesario si value anterior es menor que
value actual, el programa lo hace todo el tiempo a través del ciclo.

El primer paso en la subrutina Bar_Graph es llenar caracteres negros. value primero es


forzada a 80 o menos. Luego, charCnt guarda el número de caracteres negros que tienen
que ser escritos, que es 1/5 de value. custChar tiene que ser igualada a 3, puesto que el
caracter personalizado 3 guarda el carácter negro. Si charCnt es mayor que 0, significa
que habrán algunos caracteres completamente negros que tienen que ser escritos, y un
FOR...NEXT repetídamente llama a la subrutina Disp_Cust_Char. Recuerde, esta
subrutina depende de 2 variables: cursor y custChar. El valor de charCnt fué
establecido antes del ciclo FOR...NEXT, y la variable cursor es la variable index del ciclo
FOR...NEXT. Cada vez que se cumple el ciclo FOR...NEXT, cursor se incrmenta en 1, lo
que causa que la subrutina Disp_Cust_Char coloque el cursor un paso a la derecha cada
vez que es llamada, y por lo tanto llenando caracteres negros de izquierda a derecha.
' -----[ Subrutina - Bar_Graph ]-----------------------------------

Bar_Graph:

' Llena desde la izquierda con barras negras


Página 278 · Sensores Inteligentes y sus Aplicaciones

value = value MAX 80 ' valor Limite - 0 to 80


charCnt = value / 5 ' número de barras negras
custChar = 3 ' Escoge caracter pers. negro

IF charCnt > 0 THEN ' Si escribe barras negras…


FOR cursor = 0 TO charCnt - 1 ' Escribe charCnt - 1 barras negras
GOSUB Disp_Cust_Char ' Escribe la barra negra
NEXT
ENDIF

El segundo paso es desplegar el caracter que está parcialmente negro. cursor =


charCnt asegura que el cursor ahora está justo a la derecha de los caracteres negros que
fueron escritos con un FOR...NEXT en el paso anterior. Luego, custChar = value // 5
establece custChar en el residuo de value ÷ 5. Por ejemplo, si value es 28, el residuo de
28 ÷ 5 es 3. Si custChar = 3, una tabla lookup guarda %11100 en dotLine. La
subrutina Def_Horiz_Bar_Char necesita saber 2 cosas: dotLine y custChar. Estamos
usando y re-usando el caracter personalizado 2 para definir y redefinir el caracter
parcialmente oscurecido. Entonces, antes de llamar a Def_Horiz_Bar_Char, custChar
necesita ser cambiada de 3 a 2 con custChar = 2. Entonces, Def_Horiz_Bar_Char
puede ser llamada para definir el caracter personalizado, seguida por Disp_Cust_Char
para desplegarla.
' Despliega caracter pers. 2 con cierto número de columnas negras.

cursor = charCnt ' Coloca cursor


custChar = value // 5 ' ¿Cuantos quintos de barra?
' Escoge patron de bits para la definicion de caracter personalizado
LOOKUP custChar,
[%00000, %10000, %11000, %11100, %11110],
dotLine
custChar = 2 ' Establece caracter personalizado en 2
GOSUB Def_Horiz_Bar_Char ' Define el caracter personalizado
GOSUB Disp_Cust_Char ' Despliega el caracter personalizado

La subrutina Def_Horiz_Bar_Char que es llamada después de que se establece el valor


de las variables dotLine y custChar hace innecesario que se guarden caracteres
personalizados en la EEPROM. Por esta razón, si quiere crear un caracter personalizado
con varias columnas de pixeles negros, todo lo que tiene que hacer es enviar a la LCD el
mismo valor binario, 8 veces en un reglón. La variable dotLine es la que guarda la
definición binaria para los renglones en el caracter personalizado parcialmente llenado. Si
dotLine es %11000, las 2 columnas izquierdas de pixeles se harán negras. Si dotLine
es %11100, las 3 columnas izquierdas de pixeles se harán negras, etc.
Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 279

Def_Horiz_Bar_Char:

SEROUT LcdPin, T9600, ' Define caracter personalizado


[Define + custChar]
FOR index = 0 TO 7 ' 7 bytes, define 7 lineas punteadas
SEROUT LcdPin, T9600, [dotLine] ' Manda a la LCD
NEXT

RETURN

Sobreescribir cualesquiera caracteres negros a la derecha del caracter desplegado en el


paso 2 no involucra más caracteres personalizados puesto que el caracter espacio " " hace
un buen trabajo para borrar las cosas. En la mayoría de los casos, un ciclo FOR...NEXT que
escriba de (charCnt + 1) TO 15 limpia todo a la derecha. Sin embargo, hay algunas
circunstancias especiales que ocurren cuando el 15avo caracter tiene una o más columnas
negras. Si value = 80, una parte anterior del programa imprimirá un carácter negro en
la posición-0. Si la posición-0 fuera negra, el bloque de código ELSEIF value = 80
reemplaza ese caracter vacío con uno negro. También, si charCnt es 14, un solo caracter
vacío tiene que ser escrito en la posición 15.
' Sobreescribe todo a la derecha con espacios.

IF charCnt + 1 < 15 THEN ' ¿Caracteres Parciales a la izq de char 15?


FOR cursor = (charCnt + 1) TO 15 ' Llena a la derecha con " "
SEROUT LcdPin, T9600,
[Line0 + cursor, " "]
NEXT
ELSEIF value = 80 THEN ' Caso especial: valor = 80
SEROUT LcdPin, T9600,
[Line0 + cursor, 3]
ELSEIF charCnt = 14 THEN ' Caso especial: 75 <= valor <= 80
SEROUT LcdPin, T9600, [Line0 + 15, " "]
ENDIF

RETURN

Su Turno - Desplegado Gráfico de la Distancia al Sensor Ping)))


Es sencillo desplegar una gráfica de barra horizontal que indique hasta 80 cm con el
sensor Ping))) y la LCD Serial Parallax. El truco es tomar componentes de
PingMeasureCm.bs2 e incorporarlos en una copia de HorizBarGraph.bs2 de esta
actividad.

√ Siga las instrucciones para conectar el sensor Ping))) y la LCD Serial a su tarjeta
(Capítulo 2, actividad #4, página 51).
Página 280 · Sensores Inteligentes y sus Aplicaciones

√ Abra PingMeasureCm.bs2 (Capítulo 2, actividad #2 página 48) en el Editor de


BASIC Stamp.
√ Abra HorizBarGraph.bs2 (esta actividad), y sálvelo como PingBarGraph.bs2.
√ Sombree y copie las directivas CON y VAR de PingDistance.bs2, y péguelas en las
secciones CON y VAR en PingBarGraph.bs2.
√ Reemplace los comandos DEBUG y DEBUGIN en el DO...LOOP de la Rutina
principal de PingBarGraph.bs2 con los comandos en el DO...LOOP de
PingMeasureCm.bs2.
√ Agrege un comando justo antes de GOSUB Bar_Graph que iguale la variable
value a cmDistance.
√ Mueva el comando PAUSE 100 para que quede justo antes del ciclo.

Ahora, la rutina principal en PingBarGraph.bs2 debe verse así:


' -----[ Rutina Principal ]--------------------------------------------

DO ' Ciclo Principal

PULSOUT 15, 5
PULSIN 15, 1, time

cmDistance = CmConstant ** time

DEBUG HOME, DEC3 cmDistance, " cm"

value = cmDistance

GOSUB Bar_Graph ' Despliega como grafica de barra

PAUSE 100

LOOP ' Repite ciclo principal

√ Salve el programa modificado, pruébelo, y verifique que trabaja.

También puede reemplazar el comando DEBUG con un comando SEROUT que despliegue
las mediciones en la línea inferior. Recuerde que tendrá que enviar a la LCD un código
de control para colocar el cursor en la Línea 1 caracter-0, en vez de usar HOME.

√ ¡Inténtelo!
Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 281

ACTIVIDAD #3: GRAFICA DE BARRA DE DOS EJES PARA


INCLINACIÓN DEL ACELERÓMETRO
Esta actividad desarrolla una gráfica de barra de dos ejes que es útil para desplegar
gráficamente las mediciones de inclinación del acelerómetro.

Partes y Equipo
Use el circuito del Capítulo 3, actividad #2, page 71.

Caracteres personalizados de Gráfica de Barra Vertical


La subrutina Def_Vert_Bar_Char en el siguiente programa ejemplo define cualquiera
de los 16 diferentes caracteres de barra vertical personalizados. La Figura 7-3 muestra
como cada caracter de barra corresponde a un valor.

Figura 7-3
Valores de gráfica de
barra vertical con
Caracteres

Las definiciones de caracteres personalizados (Figura 7-3) siguen una secuencia que se
relaciona directamente a los valores que representan, entonces las definiciones pueden ser
calculadas según se requiera en vez de ser guardadas en la EEPROM. Puesto que cada
definición de caracter personalizado toma 8 bytes, eliminar 16 definiciones salvará 128
bytes de memoria de programación.

La subrutina Def_Vert_Bar_Char define los caracteres de la Figura 7-3. La variable


value define cual de los 0 a 15 caracteres será desplegado. Cada bit en la variable
rowMap determina si uno de los renglones en el caracter personalizado es blanco o negro.

Def_Vert_Bar_Char:

SEROUT LcdPin, T9600,


[Define + custChar]
Página 282 · Sensores Inteligentes y sus Aplicaciones

rowMap = %1111111100000000 >> (value & %1111)

FOR index = 0 TO 7
IF rowMap.LOWBIT(index) = 1 THEN
SEROUT LcdPin, T9600, [%11111]
ELSE
SEROUT LcdPin, T9600, [%00000]
ENDIF
NEXT

RETURN

El comando rowMap = %1111111100000000 >> (value & %1111) recorre los ocho
bits 1 de %1111111100000000 hacia la derecha tantos lugares como lo indique la
variable value. El término (value & %1111) es llamado una mascara de bits y hace
posible usar valores de 16 a 31 para darle los mismos resultados que de 0 a 15. Si value
es 3, el comando rowMap = %1111111100000000 >> (value & %1111) guarda
%0001111111100000 en la variable rowMap. Puesto que rowMap es una variable de solo
un byte, solo guarda los 8 bits más bajos del término, o sea %11100000. Comparelo con
el caracter personalizado para 3 en la Figura 7-3. Si value es 4, el resultado del byte
bajo de la variable rowMap es %11110000. Ahora, observe el caracter 4 en la Figura 7-3.
Inténtelo para cada valor (0 al 15) y verá que el patron de bits en el byte rowMap coincide
con el patrón de los renglones con pixeles negros en la Figura 7-3.

Definir un caracter personalizado involucra enviar 8 bytes. Los valores binarios en cada
byte sucesivo define cada uno de los 8 renglones en el caracter, de arriba a abajo. El ciclo
FOR...NEXT en la subrutina Def_Vert_Bar_Char tiene un bloque de código IF...THEN que
usa el operator.LOWBIT para revisar cada bit en la variable rowMap y lo usa para definir
un renglón de 5 pixeles blancos o negros en el caracter personalizado. Digamos que
value es 3, entonces rowMap es %11100000. La primera vez en el ciclo FOR...NEXT,
index es 0 y entonces la línea IF...THEN examina rowMap.LOWBIT(0), el bit más a la
derecha. Puesto que es 0, la línea IF...THEN manda un byte que contiene %00000 a la
LCD, que hace que todos los pixeles sean blancos. La sexta vez en el ciclo FOR...NEXT,
rowMap.LOWBIT(5) = 1, entonces la línea IF...THEN manda un comando SEROUT con un
byte conteniendo %11111. Entonces, los renglones sexto, séptimo y octavo serán negros,
que resulta en el caracter mostrado en la Figura 7-3.

SEROUT 14, 84, [%11111] de hecho manda el byte %00011111, y los 5 bits más
bajos son los que usa la LCD para definir sus renglones de 5 pixeles de ancho.
Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 283

Programa Ejemplo: TestVerticalBars.bs2


Este programa ejemplo despliega los 16 diferentes caracteres personalizados de la barra
vertical en la Línea 0, carácter 8 de la LCD Parallax. Lo hace en rápida sucesión, una y
otra vez. También despliega el número que value guarda en la Terminal de Depuración.

√ Abra TestVerticalBars.bs2 en el Editor del BASIC Stamp.


√ Córralo y verifique que todos los caracteres de la Figura 7-3 son desplegados.
√ Incremente el argumento Duration del comando PAUSE.
√ Vuelva a correr el programa y verifque que las barras en la LCD representan
correctamente los números desplegados en la Terminal de Depuración.

' -----[ Titulo ]-------------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - TestVerticalBars.bs2
' Despliega 16 caracteres de barra vertical diferentes en Linea 0, caracter-8
' de la LCD Serial Parallax.

' {$STAMP BS2} ' Dispositivo Objeto = BASIC Stamp 2


' {$PBASIC 2.5} ' Lenguaje = PBASIC 2.5

' -----[ Pins E/S]-----------------------------------------------------------

LcdPin PIN 14 ' pin E/S conectado a RX de la LCD

' -----[ Constants ]----------------------------------------------------------

T9600 CON 84 ' True, 8-bits, no parity, 9600

LcdCls CON 12 ' Form feed -> limpia pantalla


LcdOn CON 22 ' Enciende la pantalla
Line0 CON 128 ' Linea 0, caracter 0
Line1 CON 148 ' Linea 1, caracter 0
Define CON 248 ' direccion define caract pers 0

' -----[ Variables ]----------------------------------------------------------

custChar VAR Byte ' selector de carcter personalizado


index VAR Nib ' variable indice Eeprom
rowMap VAR Byte ' linea punteada de 5-pixel
cursor VAR Byte ' Colocacion de Cursor
value VAR Byte ' Valor a ser graficado
line VAR Byte ' Linea0 o Linea1

' -----[ Inicialización ]-----------------------------------------------------

' LCD initializiation.


PAUSE 100 ' Estabiliza fuente de poder
Página 284 · Sensores Inteligentes y sus Aplicaciones

SEROUT LcdPin, T9600, [LcdOn, LcdCls] ' Inicializa LCD


PAUSE 5 ' 5 ms retraso para limpiar pantalla

' subrutina valores Caracter personalizado.


custChar = 3 ' Use caracter personalizado 3
line = Line0 ' Cursor a Linea0
cursor = 7 ' Cursor a 8avo caracter

' -----[ Rutina Principal ]---------------------------------------------------

DO ' Ciclo Principal

FOR value = 0 TO 16 ' value cuenta de 0 a 16


DEBUG ? value ' Muestra value en Terminal de Depuración
GOSUB Def_Vert_Bar_Char ' Define caracter de grafica de barra
GOSUB Disp_Cust_Char ' Muestra caracter en la LCD
PAUSE 50 ' Hace lento al ciclo
NEXT

DEBUG CR, CR ' espacios antes sig. secuencia


PAUSE 500 ' Retraso antes sig. secuencia

LOOP ' Repite ciclo principal

' -----[ Subrutina - Def_Vert_Bar_Char ]-------------------------------------

' Define un caracter de grafica de barra vertical basado en la variable value


' (0 to 15) y la variable custChar, que selecciona los caracteres
' personalizados de la LCD Serial Parallax entre 0 y 7.

Def_Vert_Bar_Char:
' Inicia definicion de caracter personalizado
SEROUT LcdPin, T9600,
[Define + custChar]

' Selecciona un mapa de renglon para el caracter personalizado segun value.


rowMap = %1111111100000000 >> (value & %1111)

' Manda 8 bytes, cada uno definiendo un renglón punteado en el caracter


' personalizado. Cada renglon es definido examinando un bit en la variable
' rowMap y luego enviando %11111 si el bit es 1 o %00000 si el bit es 0.
FOR index = 0 TO 7 ' Repite 7 veces, index cuenta
IF rowMap.LOWBIT(index) = 1 THEN ' Examina siguiente bit en rowMap
SEROUT LcdPin, T9600, [%11111] ' Si 1, envia %11111
ELSE
SEROUT LcdPin, T9600, [%00000] ' De lo contrario, envia %00000
ENDIF
NEXT
' Regresa de la subrutina.
RETURN
Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 285

' -----[ Subrutinas - Disp_Cust_Char ]---------------------------------------

' Esta subrutina despliega un caracter personalizado. La variable line puede


' ser establecida en Line0 o Line1 y la variable cursor puede ser establecida
' en un valor entre 0 y 15. La variable custChar selecciona uno de los
' caracteres personalizados de la LCD y debe estar en un valor entre 0 y 7.

Disp_Cust_Char:
SEROUT LcdPin, T9600, ' Escribe caracter personalizado
[line + cursor, custChar]
RETURN

Su Turno - 31 Niveles cubriendo 2 renglones y Agregando un eje Horizontal


El comando que establece el patron de bits en la variable rowMap fué
rowMap = %1111111100000000 >> (value & %1111). El cálculo value & %1111
resultará 0 si value es 16, en 1 si value es 17, etc., hasta 15 si value es 31. Este patron
continuará sin importer que tan grande es value. Puesto que la gráfica de barra se
comportará de la misma forma para valores entre 16 y 31 como lo hace para valores entre
0 y 15, la gráfica de barra puede ser colocada en la línea superior o en la inferior para
indicar en qué rango cae la variable value. El rango real de desplegado es de 1 a 31, con
el 16 mostrando ninguna barra.

Modificar el programa para mostrar los caracteres en esta forma involucra solo unos
pocos cambios a la Rutina Principal. Primero, los argumentos StartValue y EndValue
del ciclo FOR...NEXT tienen que ser cambiados de (0 a 15) a (1 a 31). También, un
comando SEROUT tiene que ser agregado para sobreescribir los caracteres personalizados
previos con espacios en blanco. Luego, puede ser agregado un bloque de código
IF...THEN...ELSE que posicione el cursor en la Linea 0 o la Linea 1. Debe colocar el
cursor en la Linea 0 si value es mayor a 16, o en la línea inferior si es menor o igual a 16.

√ Salve TestVerticalBars.bs2 como TestVerticalBarsYourTurn.bs2.


√ Modifique el DO...LOOP en la rutina principal como se muestra a continuación.
√ Corra el programa y verifique que la gráfica de barra ahora despliega 31 niveles
diferentes, del 1 al 31.
DO

FOR value = 1 TO 31
SEROUT 14, 84, [Line0 + cursor, " ",
Line1 + cursor, " "]
IF value <= 16 THEN
Página 286 · Sensores Inteligentes y sus Aplicaciones

line = Line1
ELSE
line = Line0
ENDIF
DEBUG ? value
GOSUB Def_Vert_Bar_Char
GOSUB Disp_Cust_Char
PAUSE 50
NEXT

DEBUG CR, CR
PAUSE 500

LOOP

Puede también anidar el ciclo FOR value = 1 TO 31...NEXT dentro de un ciclo FOR
cursor = 0 TO 15...NEXT y causar que la gráfica de barra se mueva a través de la
pantalla cada vez que se repite. Controlando asi la compensación del cursor, la gráfica de
barra puede desplegar 2 ejes con valores verticales de 1 a 31 y valores horizontales de 0 a
15.

√ ¡Inténtelo!

Una pantalla de dos ejes


Si bien la anterior sección Su Turno demostró como desplegar caracteres en 2 ejes, una
pantalla completamente en blanco no comunica realmente que el valor está a la mitad de
su rango. Una mejor forma de hacer llegar el mensaje es haciendo que aparezcan 2
caracteres personalizados uno junto al otro. La Figura 7-4 muestra cómo trabaja esto. Los
primeros 2 ejemplos de pantalla no están a la mitad ni del rango horizontal ni del vertical
y entonces se despliegan caracteres simples. El tercer ejemplo está a la mitad del rango
horizontal (8), y entonces la medición vertical se despliega con dos caracteres adyacentes.
El cuarto ejemplo muestra que la medición está a la mitad de su rango vertical, y
entonces los renglones en el carácter de arriba y abajo del valor tienen pixeles negros.
Cuando the medición está centrada en ambas la horizontal y la vertical el quinto ejemplo
muestra cómo se debería ver. Estas características son especialmente importantes para
graficamente indicar cuando uno o los dos ejes del acelerómetro están nivelados.
Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 287

Figura 7-4
Puntos trazados en la
gráfica de barra de dos
ejes

Si bien las características mostradas en la Figura 7-4 hacen que la pantalla esté un poco
menos cifrada, el programa tiene que tomar muchas más decisiones. En el siguiente
programa ejemplo, las subrutinas Bar_Graph_H_V y Horizontal_Placement se encarga
de todas las decisiones que apoyan estas características adicionales.

Programa Ejemplo: TwoAxisBarDisplay.bs2

Descarga gratis Este programa está disponible como descarga grátis .bs2 en la página del
producto de Sensores Inteligentes y sus Aplicaciones en www.parallax.com.

Puede probar este programa ejemplo introduciendo coordenadas horizontales y verticales


en la Ventana de Transmisión de la Terminal de Depuración.

√ Abra y corra TwoAxisBarDisplay.bs2 con the Editor del BASIC Stamp.


√ Introduzca valores en el rango de 0 a 16 para valores horizontales y de 1 a 31
para verticales, y observe los resultados desplegados por la LCD.
Página 288 · Sensores Inteligentes y sus Aplicaciones

√ Intente los valores de la Figura 7-4 y verifique que concuerdan con las pantallas.
√ Pruebe los valores horizontales 0, 8, y 16 para varios valores verticales.
√ Pruebe los valores verticales 1, 16, y 31 para varios valores horizontales.

Otra forma de probar la pantalla es con la Rutina principal alterna mostrada a


continuación. Tiene ciclos FOR...NEXT anidados que prueban toda la variable value en
todos los valores posibles de la variable cursor.

√ Salve una copia de TwoAxisBarDisplay.bs2 como TwoAxisBarDisplayTest.bs2.


√ Corra el programa modificado y observe para asegurarse que todos los valores
son desplegados correctamente.
' -----[ Rutina Principal ]--------------------------------------------

DO
FOR cursor = 0 TO 16
FOR value = 1 TO 31
GOSUB Bar_Graph_H_V
PAUSE 200
NEXT
SEROUT 14, 84, [LcdCls]
PAUSE 500
NEXT
LOOP

' -----[ Titulo ]-------------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - TwoAxisBarDisplay.bs2
' Despliega un caracter que cambia vertical y horizontalmente.

' {$STAMP BS2} ' Dispositivo Objeto = BASIC Stamp 2


' {$PBASIC 2.5} ' Lenguaje = PBASIC 2.5

' -----[ Pins E/S]-----------------------------------------------------------

LcdPin PIN 14 ' pin E/S conectado a RX de la LCD

' -----[ Constants ]----------------------------------------------------------

T9600 CON 84 ' True, 8-bits, no parity, 9600

LcdCls CON 12 ' Form feed -> limpia pantalla


LcdCr CON 13 ' Retorno de carro
LcdOff CON 21 ' Apaga la pantalla
LcdOn CON 22 ' Enciende la pantalla
Line0 CON 128 ' Linea 0, caracter 0
Line1 CON 148 ' Linea 1, caracter 0
Define CON 248 ' direccion define caract pers 0
Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 289

' -----[ Variables ]----------------------------------------------------------

custChar VAR Byte ' selector de carcter personalizado


index VAR Nib ' variable indice Eeprom
rowMap VAR Byte ' linea punteada de 5-pixel
cursor VAR Byte ' Colocacion de Cursor
value VAR Byte ' Valor a ser graficado
line VAR Byte ' Linea0 or Linea1

' -----[ Inicialización ]-----------------------------------------------------

PAUSE 100 ' Estabiliza fuente de poder


SEROUT LcdPin, T9600, [LcdOn, LcdCls] ' Inicializa LCD
PAUSE 5 ' 5 ms retraso para limpiar pantalla

' -----[ Rutina Principal ]---------------------------------------------------

DO ' Ciclo Principal

DEBUG "Enter horizontal", ' Pide posicion de caracter


CR, "value (0 TO 16)"
DEBUGIN DEC cursor ' Obtiene posicion de caracter
DEBUG "Enter vertical",
CR, "value (1 TO 31)" ' Pide al usuario valor
DEBUGIN DEC value ' Obtiene valor
GOSUB Bar_Graph_H_V ' Llama a Bar_Graph_H_V

LOOP ' Repite ciclo principal

' -----[ Subrutinas - Bar_Graph_H_V ]---------------------------------------

' Define y despliega caracteres de gráfica de barra de 2 ejes segun valor de


' cursor (0 to 16) y value (1 to 31). Llama a Def_Vert_Bar_Char y a
' Horizontal_Placement.

Bar_Graph_H_V:

SEROUT 14, 84, [LcdCls] ' Limpia trazado previo


PAUSE 5 ' Retraso 5 ms para limpiar pantalla

' Decide whether to display on Line 0 or Line 1.


IF value >= 16 THEN line = Line0 ELSE Line = Line1

GOSUB Def_Vert_Bar_Char ' Define caracter personalizado


GOSUB Horizontal_Placement

IF value = 16 THEN ' Caso especial: value = 16

value = 1 ' Linea 0 display


custChar = 2
Página 290 · Sensores Inteligentes y sus Aplicaciones

GOSUB Def_Vert_Bar_Char
line = Line0
GOSUB Horizontal_Placement

value = 15 ' Linea 1 Display


custChar = 3
GOSUB Def_Vert_Bar_Char
line = Line1
GOSUB Horizontal_Placement

value = 16 ' Restaura value

ENDIF

RETURN

' -----[ Subroutine - Def_Vert_Bar_Char ]-------------------------------------

' Define un caracter de gráfica vertical de barra segun la variable value (0 a


' 15) y la variable custChar, la cual selecciona los caracteres personalizados
' entre 0 y 7 de la LCD Serial Parallax.

Def_Vert_Bar_Char:

' Inicia definicion de caracter personalizado


SEROUT LcdPin, T9600,
[Define + custChar]

' Selecciona un mapa de renglon para el caracter personalizado según value.


rowMap = %1111111100000000 >> (value & %1111)

' Manda 8 bytes, cada uno definiendo un renglón punteado en el caracter


' personalizado. Cada renglon es definido examinando un bit en la variable
' rowMap y luego enviando %11111 si el bit es 1 o %00000 si el bit es 0.
FOR index = 0 TO 7 ' Repite 7 veces, index cuenta
IF rowMap.LOWBIT(index) = 1 THEN ' Examina siguiente bit en rowMap
SEROUT 14, 84, [%11111] ' Si 1, envia %11111
ELSE
SEROUT 14, 84, [%00000] ' De lo contrario, envia %00000
ENDIF
NEXT
' Regresa de la subrutina.
RETURN

' -----[ Subrutinas - Horizontal_Placement ]---------------------------------

' Coloca la gráfica de barra vertical en una de las 16 columnas verticales de


' la LCD 2X16 de Parallax. La variable cursor puede poner la posicion
' horizontal en valores entre 0 y 16 (centro en 8). Llama a Disp_Custom_Char.

Horizontal_Placement:
Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 291

SELECT cursor ' Cursor 0 a 7, sin cambios


CASE 0 TO 7
GOSUB Disp_Cust_Char
CASE 8 ' Cursor 8, despliega en 7 & 8
cursor = 7
GOSUB Disp_Cust_Char
cursor = 8
GOSUB Disp_Cust_Char
CASE 9 TO 16 ' Cursor 9 a 16, despliega 1 izq
cursor = cursor - 1
GOSUB Disp_Cust_Char
cursor = cursor + 1
ENDSELECT

RETURN

' -----[ Subrutinas - Disp_Cust_Char ]---------------------------------------

' Esta subrutina despliega un caracter personalizado. La variable line puede


' ser establecida en Line0 o Line1 y la variable cursor puede ser establecida
' en un valor entre 0 y 15. La variable custChar selecciona uno de los
' caracteres personalizados de la LCD y debe estar en un valor entre 0 y 7.

Disp_Cust_Char:

SEROUT LcdPin, T9600, ' Escribe caracter personalizado


[line + cursor, custChar]
RETURN

Su Turno - Desplegado Gráfico de inclinación en dos ejes


Indicar la inclinación con TwoAxisBarDisplay.bs2 involucra comandos PULSIN para
obtener las mediciones del acelerómetro en los ejes x y y. También require escalar y
compensar para ajustar las mediciones del acelerómetro en una escala vertical de 31 y
una escala horizontal de 17.

La escala horizontal también tiene que ser invertida. La Figura 7-5 muestra cómo los ejes
x y y del acelerómetro se relacionan con los ejes horizontal y vertical de la LCD. Note
que la dirección positiva del eje y apunta a la dirección contraria en la que los valores del
eje horizontal de la LCD se incrementan. Cuando el valor escalado del eje y sea 16, la
pantalla debiera mostrar 0 y cuando el valor escalado del eje y sea 0, la pantalla debiera
mostrar 16. La manera de corregir esto es usar un comando que reste a 16 el valor
escalado del eje y. Esencialmente, esto es cursor = 16 − (valor escalado de y).
Página 292 · Sensores Inteligentes y sus Aplicaciones

Figura 7-5: Ejes x y y del acelerómetro

La forma más fácil de convertir TwoAxisBarDisplay.bs2 en una herramienta de


nivelación bi-axial es tomar prestados los bloques de código del Capítulo 3 y ajustarlos
según se requiera. Las variables de los ejes x y y, comandos PULSIN y los comandos
para escalamiento y compensación de HorizontalTilt.bs2 en el Capítulo 3, actividad #6
proveen un punto de inicio. Los comandos PULSIN y escalamiento pueden reemplazar
los comandos DEBUG y DEBUGIN en la Rutina Principal de TwoAxisBarDisplay.bs2. La
subrutina Bar_Graph_H_V usa las variables value y cursor para graficar en la LCD.
Antes de que pueda ser llamada, value necesita ser igualada al valor escalado del eje x y
cursor necesita ser igualada al valor escalado del eje y, restado a 16.

Obtener las constantes de escalamiento ** se dejan como ejercicios al final del ejercicio.

√ Salve TwoAxisBarDisplay.bs2 como TwoAxisBarTiltDisplay.bs2.


√ Agregue estas 2 declaraciones a la sección de Variables del programa.
X VAR Word ' eje x del Acelerómetro
y VAR Word ' eje y del Acelerómetro

√ Reemplace el DO...LOOP más externo en la rutina principal con:


Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 293

DO ' Ciclo Principal

PULSIN 6, 1, x
PULSIN 7, 1, y

value = (x MIN 1875 MAX 3125) - 1875 ** 1625 + 1


cursor = 16 - ((y MIN 1875 MAX 3125) - 1875 ** 891)

GOSUB Bar_Graph_H_V ' Llama a Bar_Graph_H_V

LOOP ' Repite ciclo principal

√ Salve y corra el programa y pruébelo bajo una variedad de circunstancias de


inclinación.
Página 294 · Sensores Inteligentes y sus Aplicaciones

RESUMEN
La mediciones de distancia e inclinación se prestan para desplegarlas en gráficas de barra.
La mayoría de las gráficas de barra pueden hacerse usando solo uno o dos de los 8
espacios de memoria para caracteres personalizados de la LCD Serial Parallax. Las
definiciones de caracter personalizado para las gráficas de barra pueden ser guardadas en
la EEPROM del BASIC Stamp, o definidas por código que relacione el valor que está
siendo graficado al número de lineas o columnas de pixeles que necesitan ser
desplegados.

Guardar caracteres personalizados en la EEPROM involucra directivas DATA que


contengan 8 bytes cada una. Los 5 bits más bajos de cada byte guardan el patron de bits
para cada una de las 8 lineas (de 5 pixeles de ancho) que componen un caracter.
Nombres Símbolo precediendo directivas DATA hacen posible copiar la dirección inicial
de los bytes de una directiva DATA determinada en una variable. Una subrutina puede usar
la variable que guarda la dirección de inicio para operaciones READ que secuencialmente
copia bytes a una variable, luego envía el contenido de esa variable a la LCD.

Desplegar gráficas de barra es típicamente mas eficiente con la memoria si los caracteres
pueden ser generados en base al valor. Cuando la gráfica de barra es horizontal, un
comando LOOKUP es útil para guardar valores binarios que correspondan con el número
de columnas que tendrán pixeles negros en un caracter personalizado determinado. Para
gráficas verticales, los bits pueden ser cambiados en una variable. En cualquier caso, las
subrutinas pueden examinar los bits en una variable, luego oscurecer pixeles en un cierto
número of renglones o columnas en un caracter.

Preguntas
1. ¿Qué parte de las directivas DATA hace posible encontrar la dirección de inicio de
una definición de caracter?
2. ¿Cómo le dicen los programas en este capítulo a la subrutina Def_Cust_Char
qué caracter definir y dónde encontrar la definición de caracter? ¿Cómo
especifica una posición de caracter para la subrutina Disp_Cust_Char? Si
quiere desplegar 2 caracteres personalizados diferentes al mismo tiempo, ¿puede
usar la misma definición de caracter personalizado? ¿Porqué?
3. ¿Cómo guarda información HorizBarGraph.bs2 acerca de qué columnas en un
caracter personalizado deben tener pixeles blancos o negros?
Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 295

4. ¿Porqué puede usar solo un byte en vez de 8 para definir un caracter


personalizado con ciertas columnas negras?
5. ¿Qué es lo que hace la instrucción IF rowMap.LOWBIT(index) = 1 THEN... do
en TestVerticalBars.bs2?
6. ¿Porqué puede usar solo un byte en vez de 8 para definir un caracter
personalizado con ciertas columnas negras?
7. ¿Qué es lo que hace la instrucción IF rowMap.LOWBIT(index) = 1 THEN... do
en el programa TestVerticalBars.bs2?

Ejercicios
1. Escriba una directiva DATA para caracter personalizado para un caracter con
todas las líneas horizontales.
2. Derive el valor 1625 en el comando value = (x MIN 1875 MAX 3125) -
1875 ** 1625 + 1.

Proyectos
1. Modifique PingBarGraph.bs2 para que despliegue la medición de distancia en
centímetros en la línea inferior.
2. Modifique TwoAxisBarTiltDisplay.bs2 para que despliegue barras que
correspondan con el ángulo de inclinación. Recuerde que ese ángulo es una
función de la gravedad sensada por cada uno de los ejes del acelerómetro. Tip:
Use el código de ejemplo del Capítulo 3, actividad #6 para cálculos del ángulo
de inclinación.
Página 296 · Sensores Inteligentes y sus Aplicaciones

Soluciones
Q1. El nombre Símbolo.
Q2. Los programas tienen que establecer 2 variables antes de hacer la llamada a
la subrutina Def_Cust_Char: custChar y charBase. La variable
custChar debe guardar el valor que el programa usará para decirle a la
LCD que despliegue el caracter personalizado. Las definiciones de
caracteres personalizados de la LCD pueden ser un valor de 0 a 7 y
entonces custChar tiene que caer en ese rango. El nombre Símbolo en la
directiva DATA del caracter personalizado tiene que ser guardada en la
variable charBase. Puesto que variable = SymbolName guarda la
dirección EEPROM del primer byte en una directiva DATA definida por
SymbolName como variable, hace posible pasar la dirección de inicio de una
directiva DATA de un caracter personalizado a la subrutina
Def_Cust_Char.
Q3. Establece el valor de las variables cursor y line antes de llamar a la
subrutina. The rutina Disp_Cust_Char posicionara al cursor usando estas
2 variables antes de decirle a la LCD que despliegue el caracter
personalizado en esa posición.
Q4. No, porque todas las instancias del mismo caracter personalizado
actualmente desplegado por la LCD será actualizado tan pronto como la
definición de caracter sea actualizada.
Q5. La variable dotLine termina guardando uno de 5 valores: %00000,
%10000, %11000, %11100, o %11110. Cada dígito corresponde a una de
las 5 columnas verticales de pixeles en un caracter personalizado. Si el
valor es 1, los pixeles en esa columna serán puestos en negro. Si es 0, serán
dejados en blanco.
Q6. Cada uno de los 8 renglones en la definición del caracter personalizado
tendrá el mismo patrón, entonces el programa solo tiene que enviar el
mismo byte de renglón 8 veces para definir cada renglón del caracter
personalizado.
Q7. Cuando la condición IF…THEN evalúa a 1, los pixeles para el renglón se
establecen en negro con SEROUT 14, 84, [%11111]; de otra forma, se
establecen en blanco con SEROUT 14, 84, [%00000].
E1. Ejemplo de solución:
Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 297

Stripes DATA %11111, ' * * * * *


%00000, '
%11111, ' * * * * *
%00000, '
%11111, ' * * * * *
%00000, '
%11111, ' * * * * *
%00000 '

E2. El objetivo de la expresión value = (x MIN 1875 MAX 3125) - 1875 **


1625 + 1 en la actividad #3 es escalar el valor del eje x del acelerómetro, que
debe estar en algún punto entre 1875 y 3125, a un valor entre 1 a 31. Esto eligirá
una de las 31 posibles variantes de gráfica de barra vertical para la subrutina
Bar_Graph_H_V. Para cuando el operator ** es alcanzado, 1875 ha sido restado,
entonces el rango es 0 a 1250 (1251 elementos en la escala de entrada), y
queremos escalarlo al rango de 1 a 31 (31 elementos en la escala de salida). Del
Capítulo 3, actividad #3, sabemos que ** ScaleConstant = Int[65536 ×
(elementos en la escala de salida ÷ (elementos en la escala de entrada – 1))].
Entonces, Int[65536 × (31 ÷ (1251 – 1))] = Int[65536 × (31 ÷ 1250)] = Int[65536
× 0.0248] = Int[1625.2928] = 1625.

P1. Solution Ejemplo– Rutina principal modificada de PingBarGraph.bs2.


' -----[ Rutina Principal ]--------------------------------------------

DO ' Ciclo Principal

PULSOUT 15, 5
PULSIN 15, 1, time

cmDistance = CmConstant ** time

DEBUG HOME, DEC3 cmDistance, " cm"

value = cmDistance

GOSUB Bar_Graph ' Despliega como gráfica de barra

SEROUT 14, 84, [Line1, DEC4 value, ' Despliega medición cm


" cm"] ' en Linea 1

PAUSE 100

LOOP ' Repite ciclo principal


Página 298 · Sensores Inteligentes y sus Aplicaciones

P2. Solution Ejemplo– Vea los comentarios en la sección Titulo par aver cómo fue
construído este programa a partir de programas ejemplo previos y cálculos
explicados en el texto:

' -----[ Titulo ]-------------------------------------------------------------


' Sensores Inteligentes y sus Aplicaciones - Ch7Proj2.bs2
' Despliega un caracter que cambia vertical y horizontalmente según el ángulo
' de inclinación del MX2125 en grados. Este programa es una combinacion de
' HorizontalTilt.bs2 del Capítulo 3, actividad #6 y TwoAxisBarTiltDisplay.bs2
' del Capítulo 7, actividad #3. La medición del eje x tiene que ser cambiada
' de -90 a +90 grados a un valor de 1 a 31 usando la equation de constante de
' escalamiento **. De igual forma, la medición angular del eje y de -90 a +90
' tiene que ser cambiada a un valor de 0 a 16. Los calculos con comentados y
' mostrados en la rutina principal justo antes su uso con los operadores **.

' {$STAMP BS2} ' Dispositivo Objeto = BASIC Stamp 2


' {$PBASIC 2.5} ' Lenguaje = PBASIC 2.5

' -----[ Pines E/S]-----------------------------------------------------------

LcdPin PIN 14 ' pin E/S conectado a RX de la LCD

' -----[ Constants ]----------------------------------------------------------

T9600 CON 84 ' True, 8-bits, no parity, 9600

LcdCls CON 12 '


Form feed -> limpia pantalla
LcdCr CON 13 '
Retorno de carro
LcdOff CON 21 '
Apaga la pantalla
LcdOn CON 22 '
Enciende la pantalla
Line0 CON 128 '
Linea 0, caracter 0
Line1 CON 148 '
Linea 1, caracter 0
Define CON 248 '
direccion define caract pers 0
Negative CON 1 ' Signo - .bit15 de variables de palabra
Positive CON 0

' -----[ Variables ]----------------------------------------------------------

custChar VAR Byte ' selector de carcter personalizado


index VAR Nib ' variable indice Eeprom
rowMap VAR Byte ' linea punteada de 5-pixel
cursor VAR Byte ' Colocacion de Cursor
value VAR Byte ' Valor a ser graficado
line VAR Byte ' Linea0 or Linea1
x VAR Word
y VAR Word
sine VAR Word ' seno en circulo r = 127
side VAR Word ' variable para disparo de subrutinas
angle VAR Word ' resultado angulo - grados
sign VAR Bit ' bit de signo
Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 299

' -----[ inicialización ]-----------------------------------------------------

PAUSE 100 ' Estabiliza fuente de poder


SEROUT LcdPin, T9600, [LcdOn, LcdCls] ' Inicializa LCD
PAUSE 5 ' 5 ms retraso para limpiar pantalla
' -----[ Main Rutina ]-------------------------------------------------------

DO ' Ciclo Principal

PULSIN 6, 1, x
PULSIN 7, 1, y

x = (x MIN 1875 MAX 3125) - 1875 ** 13369 - 127


y = (y MIN 1875 MAX 3125) - 1875 ** 13369 - 127

side = x
GOSUB Arcsine
' Int[65536 * (31 / (181 - 1))] = 11286
value = angle + 90 ** 11286 + 1

side = y
GOSUB Arcsine
' Int[65536 * (17 / (181 - 1))] = 6189
cursor = 16 - (angle + 90 ** 6189)

GOSUB Bar_Graph_H_V ' Llama Bar_Graph_H_V

LOOP ' Repite ciclo principal

' -----[ Subrutinas - Bar_Graph_H_V ]---------------------------------------

' Define y despliega caracteres de gráfica de barra de 2 ejes según el valor


' de cursor (0 to 16) y value (1 to 31). Llama Def_Vert_Bar_Char y
' Horizontal_Placement.

Bar_Graph_H_V:

SEROUT 14, 84, [LcdCls] ' Limpia trazado previo


PAUSE 5 ' Retraso 5 ms para limpiar pantalla

' Decide si escribe en la Linea 0 o en la Linea 1.


IF value >= 16 THEN line = Line0 ELSE Line = Line1

GOSUB Def_Vert_Bar_Char ' Define caracter personalizado


GOSUB Horizontal_Placement

IF value = 16 THEN ' Caso especial: value = 16


Página 300 · Sensores Inteligentes y sus Aplicaciones

value = 1 ' Despiega Linea 0


custChar = 2
GOSUB Def_Vert_Bar_Char
line = Line0
GOSUB Horizontal_Placement

value = 15 ' Despiega Linea 1


custChar = 3
GOSUB Def_Vert_Bar_Char
line = Line1
GOSUB Horizontal_Placement

value = 16 ' Restaura value

ENDIF

RETURN

' -----[ Subrutina - Def_Vert_Bar_Char ]-------------------------------------

' Define un caracter de gráfica vertical de barra segun la variable value (0 a


' 15) y la variable custChar, la cual selecciona los caracteres personalizados
' entre 0 y 7 de la LCD Serial Parallax.

Def_Vert_Bar_Char:

' Inicia definicion de caracter personalizado


SEROUT LcdPin, T9600,
[Define + custChar]

' Selecciona un mapa de renglon para el caracter personalizado según value.


rowMap = %1111111100000000 >> (value & %1111)

' Manda 8 bytes, cada uno definiendo un renglón punteado en el caracter


' personalizado. Cada renglon es definido examinando un bit en la variable
' rowMap y luego enviando %11111 si el bit es 1 o %00000 si el bit es 0.
FOR index = 0 TO 7 ' Repite 7 veces, index cuenta
IF rowMap.LOWBIT(index) = 1 THEN ' Examina siguiente bit en rowMap
SEROUT 14, 84, [%11111] ' Si 1, envia %11111
ELSE
SEROUT 14, 84, [%00000] ' De lo contrario, envia %00000
ENDIF
NEXT
' Regresa de la subrutina.
RETURN

' -----[ Subrutinas - Horizontal_Placement ]---------------------------------

' Coloca la gráfica de barra vertical en una de las 16 columnas verticales de


' la LCD 2X16 de Parallax. La variable cursor puede poner la posicion
' horizontal en valores entre 0 y 16 (centro en 8). Llama a Disp_Custom_Char.
Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 301

Horizontal_Placement:

SELECT cursor ' Cursor 0 a 7, sin cambios


CASE 0 TO 7
GOSUB Disp_Cust_Char
CASE 8 ' Cursor 8, despliega en 7 & 8
cursor = 7
GOSUB Disp_Cust_Char
cursor = 8
GOSUB Disp_Cust_Char
CASE 9 TO 16 ' Cursor 9 a 16, despliega 1 izq
cursor = cursor - 1
GOSUB Disp_Cust_Char
cursor = cursor + 1
ENDSELECT

RETURN

' -----[ Subrutinas - Disp_Cust_Char ]---------------------------------------

' Esta subrutina despliega un caracter personalizado. La variable line puede


' ser establecida en Line0 o Line1 y la variable cursor puede ser establecida
' en un valor entre 0 y 15. La variable custChar selecciona uno de los
' caracteres personalizados de la LCD y debe estar en un valor entre 0 y 7.

Disp_Cust_Char:

SEROUT LcdPin, T9600, ' Escribe caracter personalizado


[line + cursor, custChar]
RETURN

' -----[ Subrutina - Arcsine ]-----------------------------------------------

' Esta subrutina calcula el arcoseno segun la coordenada y en un circulo de


' radio 127. Establezca la variable side igual a su coordenada y antes de
' llamar a esta subrutina.

Arcsine: ' Subrutina Seno Inverso


GOSUB Arccosine ' Obtiene coseno inverso
angle = 90 - angle ' sin(angle) = cos(90 - angle)
RETURN

' -----[ Subrutina - Arccosine ]---------------------------------------------

' Esta subrutina calcula arcocoseno basado en la coordenada x en un circulo


' de radio 127. Establezca la variable side igual a su coordenada x antes
' de llamar a esta subrutina.

Arccosine: ' Subrutina Inverso coseno


sign = side.BIT15 ' Guarda el signo de side
Página 302 · Sensores Inteligentes y sus Aplicaciones

side = ABS(side) ' Evalua side positivo


angle = 63 - (side / 2) ' aproximacion inicial al angulo
DO ' Ciclo de approximation sucesiva
IF (COS angle <= side) THEN EXIT ' Hecho cuando COS angle <= side
angle = angle + 1 ' Mantiene incrementando angulo
LOOP
angle = angle */ 361 ' Convierte brads a grados
IF sign = Negative THEN angle = 180 - angle' Ajusta si el signo es negativo.
RETURN
Apéndice A: Tabla de caracteres ASCII· Page 303

Apéndice A: Tabla de caracteres ASCII

Tabla ASCII (primeros 128 caracteres)


Dec Hex Char Nombre / Función Dec Hex Char Dec Hex Char Dec Hex Char
0 00 NUL Null 32 20 space 64 40 @ 96 60 `
1 01 SOH Start Of Heading 33 21 ! 65 41 A 97 61 a
2 02 STX Start Of Text 34 22 " 66 42 B 98 62 b
3 03 ETX End Of Text 35 23 # 67 43 C 99 63 c
4 04 EOT End Of Transmit 36 24 $ 68 44 D 100 64 d
5 05 ENQ Enquiry 37 25 % 69 45 E 101 65 e
6 06 ACK Acknowledge 38 26 & 70 46 F 102 66 f
7 07 BEL Bell 39 27 ' 71 47 G 103 67 g
8 08 BS Backspace 40 28 ( 72 48 H 104 68 h
9 09 HT Horizontal Tab 41 29 ) 73 49 I 105 69 i
10 0A LF Line Feed 42 2A * 74 4A J 106 6A j
11 0B VT Vertical Tab 43 2B + 75 4B K 107 6B k
12 0C FF Form Feed 44 2C , 76 4C L 108 6C l
13 0D CR Carriage Return 45 2D - 77 4D M 109 6D m
14 0E SO Shift Out 46 2E . 78 4E N 110 6E n
15 0F SI Shift In 47 2F / 79 4F O 111 6F o
16 10 DLE Data Line Escape 48 30 0 80 50 P 112 70 p
17 11 DC1 Device Control 1 49 31 1 81 51 Q 113 71 q
18 12 DC2 Device Control 2 50 32 2 82 52 R 114 72 r
19 13 DC3 Device Control 3 51 33 3 83 53 S 115 73 s
20 14 DC4 Device Control 4 52 34 4 84 54 T 116 74 t
21 15 NAK Non Acknowledge 53 35 5 85 55 U 117 75 u
22 16 SYN Synchronous Idle 54 36 6 86 56 V 118 76 v
23 17 ETB End Transmit Block 55 37 7 87 57 W 119 77 w
24 18 CAN Cancel 56 38 8 88 58 X 120 78 x
25 19 EM End Of Medium 57 39 9 89 59 Y 121 79 y
26 1A SUB Substitute 58 3A : 90 5A Z 122 7A z
27 1B ESC Escape 59 3B ; 91 5B [ 123 7B {
28 1C FS File Separator 60 3C < 92 5C \ 124 7C |
29 1D GS Group Separator 61 3D = 93 5D ] 125 7D }
30 1E RS Record Separator 62 3E > 94 5E ^ 126 7E ~
31 1F US Unit Separator 63 3F ? 95 5F _ 127 7F delete

Note que los códigos de control (los 32 caracteres ASCII más bajos) no tienen símbolos
de pantalla estandarizados. Los caracteres listados para ellos son solo nombres usados en
referencia a estos códigos. Por ejemplo, para mover el cursor al principio de la siguiente
línea de una impresora o terminal frecuentemente se requiere enviar los códigos line feed
y carriage return. Este par es comúnmente referido como "LF/CR."
Página 304 · Sensores Inteligentes y sus Aplicaciones
Apéndice B: Documentación de la pantalla LCD Serial Parallax · Page 305

Apéndice B: Documentación de la pantalla LCD


Serial Parallax

599 Menlo Drive, Suite 100 General: info@parallax.com


Rocklin, California 95765, USA Técnico: support@parallax.com
Office: (916) 624-8333 Web Site: www.parallax.com
Fax: (916) 624-8003 Educacional: www.stampsinclass.com

Version 2.0

LCD Serial Parallax


2 renglones x 16 caracteres sin luz de fondo (#27976)
2 renglones x 16 caracteres con luz de fondo (#27977)
4 renglones x 20 caracteres con luz de fondo (#27979)

Introducción
Las pantallas LCDs Seriales Parallax son muy funcionales y de bajo costo y pueden ser
fácilmente controladas por un microcontrolador BASIC Stamp®. Las LCD son de 2 o de
4 renglones por 16 caracteres y proveen ajuste básico del texto para que su texto esté
completo en pantalla. También le dan control completo sobre todas sus características
avanzadas, permitiéndole mover el cursor a cualquier parte de la pantalla con una sola
instrucción y apagarla y encenderla en cualquier configuración. Soportan los mismos
caracteres visibles que la Terminal de Depuración del Editor de BASIC Stamp (ASCII
Dec 32-127). Además, puede definir hasta 8 caracteres personalizados para desplegar en
cualquier lugar de la LCD.

Ideas de Aplicaciones
¿Qué puede hacer una una LCD Serial Parallax? Si bien hay muchas posibilidades, esta
es una pequeña lista de ideas con una LCD Serial y el BASIC Stamp de Parallax:

• Una muy profesional interface de texto con el usuario en cualquier aplicación de


microcontrolador
• Una forma fácil de implementar la depuración de programas via serie sin una PC
• Datos de salida en tiempo real en aplicaciones robóticas autónomas (Boe-Bot®,
Toddler®, SumoBot®)
Página 306 · Sensores Inteligentes y sus Aplicaciones

Cables de Extensión para la LCD


Las LCDs Seriales Parallax son compatible con nuestros cables Extension para LCD de
14-pulgadas, parte #805-00012, en venta por separado en www.parallax.com. Este cable
de 3 pines hembra-hembra viene con un conector de 3 pines y fácilmente lo puede
conectar su LCD a su tableta de proyectos.

Código Muestra
Se pueden buscar por número de parte en www.parallax.com:
2x16 LCD Serial: búsqueda “27976”
2x16 LCD Serial: (con luz de fondo): búsqueda “27977”
4x20 LCD Serial: (con luz de fondo) búsqueda “27979”

Características
• Despliega el juego de caracteres ASCII directamente a la pantalla
• Ajusta a la siguiente línea automáticamente para fácil despliegue de cadenas de
texto
• Trabaja a 2400, 9600, y 19,200 baud
• Muevee el cursor a cualquier punto en la pantalla con un solo comando
• Limpia toda la pantalla con un solo comando
• Le permite definer hasta 8 caracteres personalizados

Conexiones
Conectar la LCD Serial al BASIC Stamp es una operation directa, requiere solo 3 pines
de E/S. Véa la figura B-1 y B-2 para detalles de conexiones electricas. Vea las Figuras
B-3 y B-4 en las siguienes páginas para etalles de tamaño y montaje mecánico.

Figura B-1

Conexiones de la
LCD Serial para la
Rev D y
anteriores.
Apéndice B: Documentación de la pantalla LCD Serial Parallax · Page 307

Figura B-2

Conexiones de la
LCD Serial para la
Rev E y
posteriores.

La tabla abajo lista los requerimientos de voltaje y corriente de la LCD Serial, con la luz
de fondo encendida y apagada. Puesto que en cada caso la corriente que toma excede la
capacidad de todos los módulos BASIC Stamp, debe energizar la LCD Serial de una
fuente externa de 5 V. Asegúrese de que la fuente tiene un nivel de corriente adecuado
para energizar la LCD Serial y el BASIC Stamp.

Estado de la LCD Serial Voltaje Corriente


Todos los modelos, luz de fondo apagada 5 VDC 20 mA
Luz de fondo encendida 27977 / 27979 5 VDC 80 mA

Figura B-3 Especificaciones de Tamaño y Montaje para los modelos 27976, 27977.
Precaucion: Las dimensiones pueden variar.
Página 308 · Sensores Inteligentes y sus Aplicaciones

Figura B-4 Especificaciones de Tamaño y Montaje para el modelo 27979. Precaucion: Las
dimensiones pueden variar.

Notas Técnicas
Característica Descripción
Tipo de pantalla LCD STN, YG, positive, transflective
Dirección de observación 6H
Luz de fondo YG LED
Temperatura de Operación -4°F~158°F (-20°C~70°C)
Temperatura de almacenaje -22°F~176°F (-30°C~80°C)
Tolerancia dimensional ±.02” (.5mm)

Configuración de la velocidad Baud


Después de conectar la LCD Serial, necesitará seleccionar la velocidad baud a la cual va
a enviar datos. Tiene 3 opciones: 2400, 9600, y 19,200 baud. Para establecer esta
velocidad, mueva los interruptores dip switch en la parte posterior de la LCD a las
posiciones correctas de acuerdo a la tabla cercana a los interruptores, que aquí se copia:

MODE SW1 SW2


Test OFF OFF
2,400 ON OFF
9,600 OFF ON
19.200 ON ON
Apéndice B: Documentación de la pantalla LCD Serial Parallax · Page 309

Como puede ver, hay una cuarta opción llamada Test. Ya que conectó la energía, use este
modo para confirmar que están correctamente conectados la energía y tierra a la LCD
antes de que envíe algún dato. Mueva los interruptores a Test y encienda la energía. La
pantalla LCD se debe encender con la luz de fondo encendida (modelos 27977, 27979) y
desplegando el siguiente texto:

Parallax, Inc.
www.parallax.com

Si no ve esto al principio, trate ajustar el contraste de la LCD girando el potenciómetro


“Increase Contrast” con un desarmador. Gírelo en dirección de la flecha para hacer que
los caracteres se muestren más claros. Si aún no los ve, revise sus conexiones eléctricas e
intente de nuevo. Una vez que haya completado exitosamente el modo prueba, mueva los
interruptores a las posiciones correctas para seleccionar la velocidad baud a la que quiere
para su aplicación.

Displegando Texto
Ahora que la LCD está configurada, es hora de empesar a enviar texto a la pantalla. Para
desplegar un caracter de texto en la LCD Serial, simplemente envíe el código ASCII de
ese caracter a la LCD Serial por el puerto serial a la velcidad baud correcta.

Cuando un caracter es recibido, la LCD Serial despliega ese caracter en la posición actual
del cursor y luego mueve el cursor una posición a la derecha. Cuando enciende la LCD,
el cursor esta en la posición extrema izquierda de la línea superior, como podría esperar.
La pequeña barra en la parte baja del caracter muestra dónde está posicionado el cursor.

Una vez que ha enviado una línea completa de caracteres a la LCD, notará que el cursor
automáticamente ajusta a la posición extrema izquierda de la segunda línea, como el texto
en un libro. El texto se ajustará así al final de cada línea, con el final de la línea inferior
ajustándose a la línea superior de la LCD. El texto nunca “saldrá” de la pantalla; siempre
verá todos los caracteres que envíe.

Intente el siguiente código en su BASIC Stamp 2 para enviar una cadena de texto a la
pantalla LCD. Primero, configure la velocidad baud en su LCD Serial a 19,200. Luego,
cargue el código siguiente en su BASIC Stamp 2 y córralo. Verá la cadena de texto
aparecer y ajustarse a la segunda línea de la pantalla.
Página 310 · Sensores Inteligentes y sus Aplicaciones

En todo su código para la LCD Serial, debe hacer una pausa de 100 ms al inicio para
darle tiempo para initializar. También debe configurar el pin de Puerto serie en el BASIC
Stamp a ALTO antes del retraso de 100 ms para arranque, dado que este es el estado
normal de un puerto serie cuando no está enviando ningún dato.

' {$STAMP BS2}

TxPin CON 0
Baud19200 CON 32

HIGH TxPin ' Establece pin alto para ser Puerto serie
PAUSE 100 ' Pause para inicializar la LCD Serial
SEROUT TxPin, Baud19200, ["Hello, this text will wrap."]

Moviendo el Cursor
Cuando envía un caracter a la LCD Serial, siempre se despliega en la posición acual del
cursor. Hay algunos modos diferentes para mover el cursor en la pantalla LCD Serial.
Después de cada caracter que envía, el cursor automáticamente se mueve una posición.
Junto con esto, hay un juego estándar de comandos para movimiento de que incluye
Backspace, Carriage Return, y Line Feed.

El comando Backspace/Left (Dec 8) mueve el cursor una posición a la izquierda y el


comando Right (Dec 9) mueve el cursor una posición a la derecha. Esto puede ser útil
para mover el cursor para sobreescribir texto existente. Estos comandos ajustan a la
siguiente line de la pantalla si es necesario. El comando Line Feed (Dec 10) mueve el
cursor a la siguiente línea de la pantalla sin cambiar la posición horizontal del cursor. El
comando Carriage Return (Dec 13) también mueve el cursor a la siguiente línea, pero
también mueve el cursor a la posición extrema izquierda en esa línea. El comando Form
Feed (Dec 12) limpia toda la pantalla y mueve el cursor a la posición extrema izquierda
en la Línea 0, como cuando enciende la pantalla. Necesitará hacer una pausa de 5mS en
su código después de enviar el comando Form Feed, para darle a la LCD Serial tiempo
para limpiar la pantalla. A excepción de Form Feed, ninguno de estos de comandos
movimiento afecta los caracteres en la pantalla.

También hay comandos de movimiento directo que puede usar para mover el cursor a
cualquier posición en la pantalla con un solo comando. Los comandos en el rango Dec
128 a 143 y Dec 148 a 163 mueven el cursor a las 16 diferentes posiciones en cada una
de las 2 líneas de los modelos 27976 y 27977. Los comandos en el rango Dec 128 a 207
Apéndice B: Documentación de la pantalla LCD Serial Parallax · Page 311

mueven el cursor a las 20 diferentes posiciones en cada una de las 4 líneas del modelo
27979 LCD.

Controlando la Pantalla
También tiene control sobre los diversos modos de pantalla de la LCD Serial. El
comando display-off (Dec 21) apaga la pantalla y todos los caracteres desaparecen. Los
caracteres no son borrados de la pantalla, e incluso puede escribir nuevos caracteres a la
pantalla cuando está apagada. Un truco para hacer que mucho texto aparezca de golpe,
aún a una baja velocidad baud rate, es apagar la pantalla y enviar todo su texto. Entonces,
cuando la encienda de nuevo, todo el texto aparece instantaneamente.

Los comandos display-on (DEC 22 to 25) encienden nuevamente la pantalla y también


controlan si desea o no desplegar el cursor y/o hacer que el caracter del cursor parpadee.
El cursor es la pequeña barra que se muestra abajo del caracter en la at posición actual del
cursor. La opción de parpadeo hace que ese caracter encienda y apague repetidamente.
Puede encender o apagar el cursor o su parpadeo en cualquier combinación como se lista
en la tabla de juego de comandos. Puede cambiar el modo de cursor y parpadeo aún si la
pantalla ya está encendida; no necesita apagarla y volverla a encender.

Con los modelos 27977 y 27979, puede también controlar la luz de fondo de la pantalla.
Esta ilumina la pantalla para facilitar su lectura en la oscuridad. Hay comandos para
encenderla (Dec 17) y apagarla (Dec 18).

Caracteres personalizados
La LCD Serial tiene la capacidad de guardar hasta 8 caracteres personalizados definidos
por el usuario. Los caracteres personalizados son guardados en RAM y por ello necesitan
ser redefinidos si desconecta la energía. Puede despegar los caracteres personalizados
enviando los comandos Dec 0 a 7, como se muestra en la tabla de juego de comandos. El
caracter personalizado se desplegará en la posición actual del cursor.

Los caracteres personalizados son de 5 pixeles de ancho por 8 pixeles de alto. Cada uno
de los caracteres es guardado como una serie de datos de 8 bytes donde los 5 bits más
bajos de cada byte representan una linea de pixeles en el caracter. Los 3 bits más altos de
cada bytes son ignorados. Un valor 1 en el bit enciende ese pixel (lo hace negro). La
línea de pixeles de hasta abajo se deja normalmente en blanco (todo ceros) para poder ver
el cursor.
Página 312 · Sensores Inteligentes y sus Aplicaciones

Para definir un caracter personalizado, enviará un total de 9 bytes a la LCD Serial. El


primer byte necesita ser un comando valido define-caracter-personalizado (Dec 248 a
255) y debe ser seguido por 8 bytes de datos que definen los pixeles del caracter. La
LCD serial siempre usará los siguientes 8 bytes que reciba para configurar los pixeles del
caracter. Los bytes de datos definen el caracter empezando en el renglón de pixeles
extremo superior, como se muestra en el código ejemplo.

Defina un caracter personalizado usando el código ejemplo siguiente. Primero, configure


la velocidad baud en su LCD Serial a 19,200. Luego, cargue el siguiente código en su
BASIC Stamp 2 y córralo. Verá un caracter de diamante aparecer en la pantalla.

' {$STAMP BS2}

TxPin CON 0
Baud19200 CON 32

HIGH TxPin ' Establece pin en alto para ser un puerto serial
PAUSE 100 ' Pausa para que LCD Serial inicialize

SEROUT TxPin, Baud19200, [250] ' Define caracter personalizado 2


' Ahora envia los 8 bytes de datos
SEROUT TxPin, Baud19200, [0] ' 0 = %00000
SEROUT TxPin, Baud19200, [4] ' 4 = %00100 *
SEROUT TxPin, Baud19200, [14] ' 14 = %01110 * * *
SEROUT TxPin, Baud19200, [31] ' 31 = %11111 * * * * *
SEROUT TxPin, Baud19200, [14] ' 14 = %01110 * * *
SEROUT TxPin, Baud19200, [4] ' 4 = %00100 *
SEROUT TxPin, Baud19200, [0] ' 0 = %00000
SEROUT TxPin, Baud19200, [0] ' 0 = %00000
SEROUT TxPin, Baud19200, [2] ' Despliega el nuevo caracter personalizado 2

Conjunto de Comandos
Las tablas a continuación listan todos los comandos válidos de la LCD Serial. Los
comandos marcados como N/A son invalidos y son ignorados. Las lineas de la pantalla
LCD están numeradas desde 0, siendo la Linea 0 la de hasta arriba. Las posiciones de
caracter en cada línea están numeradas empezando desde 0, siendo la posición 0 la de la
extrema izquierda en la línea.
Apéndice B: Documentación de la pantalla LCD Serial Parallax · Page 313

Dec Hex Acción


0 00 Despliega el caracter personalizado 0
1 01 Despliega el caracter personalizado 1
2 02 Despliega el caracter personalizado 2
3 03 Despliega el caracter personalizado 3
4 04 Despliega el caracter personalizado 4
5 05 Despliega el caracter personalizado 5
6 06 Despliega el caracter personalizado 6
7 07 Despliega el caracter personalizado 7
Backspace / Left - El cursor es movido una posición a la izquierda. El comando no
8 08
borra el caracter.
Right - El cursor es movido una posición a la derecha. El comando no borra el
9 09
caracter.
Line Feed - El cursor es movido hacia abajo una línea. Para los modelos LCD de 2
10 0A líneas, si está en la línea 0 va a la línea1. Si está en la línea 1, se ajusta a la línea
0. La posición horizontal se mantiene igual.
11 0B N/A
Form Feed - El cursor es movido a la posición 0 en la línea 0 y toda la pantalla es
12 0C
limpiada. Los usuarios deben hacer una pausa de 5mS depués de este comando.
Carriage Return – En LCDs de 2 líneas, si está en línea 0 el cursor se mueve a la
13 0D
posición 0 en la linea 1. Si está en la línea 1 se ajusta a la posición 0 en la línea 0.
14 - 16 0E - 10 N/A
17 11 Enciende la pantalla (solo los modelos 27977, 27979)
18 12 Apaga la pantalla (Default)
19 - 20 13 - 14 N/A
21 15 Apaga la pantalla
22 16 Enciende la pantalla, con cursor apagado y sin parpadeo
23 17 Enciende la pantalla, con cursor apagado y con parpaedo de caracter
24 18 Enciende la pantalla, con cursor encendido y sin parpadeo (Default)
25 19 Turn the display on, con cursor encendido y con parpaedo de caracter
26 - 31 1A - 1F N/A
32 - 127 20 - 7F Despliega caracteres ASCII. Vea la tabla de juego de caracteres ASCII.
128 80 Mueve el cursor a la línea 0, posición 0
129 81 Mueve el cursor a la línea 0, posición 1
130 82 Mueve el cursor a la línea 0, posición 2
131 83 Mueve el cursor a la línea 0, posición 3
132 84 Mueve el cursor a la línea 0, posición 4
133 85 Mueve el cursor a la línea 0, posición 5
134 86 Mueve el cursor a la línea 0, posición 6
Página 314 · Sensores Inteligentes y sus Aplicaciones

Dec Hex Action


135 87 Mueve el cursor a la línea 0, posición 7
136 88 Mueve el cursor a la línea 0, posición 8
137 89 Mueve el cursor a la línea 0, posición 9
138 8A Mueve el cursor a la línea 0, posición 10
139 8B Mueve el cursor a la línea 0, posición 11
140 8C Mueve el cursor a la línea 0, posición 12
141 8D Mueve el cursor a la línea 0, posición 13
142 8E Mueve el cursor a la línea 0, posición 14
143 8F Mueve el cursor a la línea 0, posición 15
144 90 Mueve el cursor a la línea 0, posición 16 (solo el modelo 27979)
145 91 Mueve el cursor a la línea 0, posición 17 (solo el modelo 27979)
146 92 Mueve el cursor a la línea 0, posición 18 (solo el modelo 27979)
147 93 Mueve el cursor a la línea 0, posición 19 (solo el modelo 27979)
148 94 Mueve el cursor a la línea 1, posición 0
149 95 Mueve el cursor a la línea 1, posición 1
150 96 Mueve el cursor a la línea 1, posición 2
151 97 Mueve el cursor a la línea 1, posición 3
152 98 Mueve el cursor a la línea 1, posición 4
153 99 Mueve el cursor a la línea 1, posición 5
154 9A Mueve el cursor a la línea 1, posición 6
155 9B Mueve el cursor a la línea 1, posición 7
156 9C Mueve el cursor a la línea 1, posición 8
157 9D Mueve el cursor a la línea 1, posición 9
158 9E Mueve el cursor a la línea 1, posición 10
159 9F Mueve el cursor a la línea 1, posición 11
160 A0 Mueve el cursor a la línea 1, posición 12
161 A1 Mueve el cursor a la línea 1, posición 13
162 A2 Mueve el cursor a la línea 1, posición 14
163 A3 Mueve el cursor a la línea 1, posición 15
164 A4 Mueve el cursor a la línea 1, posición 16 (solo el modelo 27979)
165 A5 Mueve el cursor a la línea 1, posición 17 (solo el modelo 27979)
166 A6 Mueve el cursor a la línea 1, posición 18 (solo el modelo 27979)
167 A7 Mueve el cursor a la línea 1, posición 19 (solo el modelo 27979)
168 A8 Mueve el cursor a la línea 2, posición 0 (solo el modelo 27979)
169 A9 Mueve el cursor a la línea 2, posición 1 (solo el modelo 27979)
170 AA Mueve el cursor a la línea 2, posición 2 (solo el modelo 27979)
171 AB Mueve el cursor a la línea 2, posición 3 (solo el modelo 27979)
172 AC Mueve el cursor a la línea 2, posición 4 (solo el modelo 27979)
173 AD Mueve el cursor a la línea 2, posición 5 (solo el modelo 27979)
174 AE Mueve el cursor a la línea 2, posición 6 (solo el modelo 27979)
175 AF Mueve el cursor a la línea 2, posición 7 (solo el modelo 27979)
176 B0 Mueve el cursor a la línea 2, posición 8 (solo el modelo 27979)
177 B1 Mueve el cursor a la línea 2, posición 9 (solo el modelo 27979)
178 B2 Mueve el cursor a la línea 2, posición 10 (solo el modelo 27979)
179 B3 Mueve el cursor a la línea 2, posición 11 (solo el modelo 27979)
180 B4 Mueve el cursor a la línea 2, posición 12 (solo el modelo 27979)
Apéndice B: Documentación de la pantalla LCD Serial Parallax · Page 315

Dec Hex Action


181 B5 Mueve el cursor a la línea 2, posición 13 (solo el modelo 27979)
182 B6 Mueve el cursor a la línea 2, posición 14 (solo el modelo 27979)
183 B7 Mueve el cursor a la línea 2, posición 15 (solo el modelo 27979)
184 B8 Mueve el cursor a la línea 2, posición 16 (solo el modelo 27979)
185 B9 Mueve el cursor a la línea 2, posición 17 (solo el modelo 27979)
186 BA Mueve el cursor a la línea 2, posición 18 (solo el modelo 27979)
187 BB Mueve el cursor a la línea 2, posición 19 (solo el modelo 27979)
188 BC Mueve el cursor a la línea 3, posición 0 (solo el modelo 27979)
189 BD Mueve el cursor a la línea 3, posición 1 (solo el modelo 27979)
190 BE Mueve el cursor a la línea 3, posición 2 (solo el modelo 27979)
191 BF Mueve el cursor a la línea 3, posición 3 (solo el modelo 27979)
192 C0 Mueve el cursor a la línea 3, posición 4 (solo el modelo 27979)
193 C1 Mueve el cursor a la línea 3, posición 5 (solo el modelo 27979)
194 C2 Mueve el cursor a la línea 3, posición 6 (solo el modelo 27979)
195 C3 Mueve el cursor a la línea 3, posición 7 (solo el modelo 27979)
196 C4 Mueve el cursor a la línea 3, posición 8 (solo el modelo 27979)
197 C5 Mueve el cursor a la línea 3, posición 9 (solo el modelo 27979)
198 C6 Mueve el cursor a la línea 3, posición 10 (solo el modelo 27979)
199 C7 Mueve el cursor a la línea 3, posición 11 (solo el modelo 27979)
200 C8 Mueve el cursor a la línea 3, posición 12 (solo el modelo 27979)
201 C9 Mueve el cursor a la línea 3, posición 13 (solo el modelo 27979)
202 CA Mueve el cursor a la línea 3, posición 14 (solo el modelo 27979)
203 CB Mueve el cursor a la línea 3, posición 15 (solo el modelo 27979)
204 CC Mueve el cursor a la línea 3, posición 16 (solo el modelo 27979)
205 CD Mueve el cursor a la línea 3, posición 17 (solo el modelo 27979)
206 CE Mueve el cursor a la línea 3, posición 18 (solo el modelo 27979)
207 CF Mueve el cursor a la línea 3, posición 19 (solo el modelo 27979)
208 - 247 D0 – F7 N/A
248 F8 Define caracter personalizado 0. 8 bytes de datos deben seguir al comando.
249 F9 Define caracter personalizado 1. 8 bytes de datos deben seguir al comando.
250 FA Define caracter personalizado 2. 8 bytes de datos deben seguir al comando.
251 FB Define caracter personalizado 3. 8 bytes de datos deben seguir al comando.
252 FC Define caracter personalizado 4. 8 bytes de datos deben seguir al comando.
253 FD Define caracter personalizado 5. 8 bytes de datos deben seguir al comando.
254 FE Define caracter personalizado 6. 8 bytes de datos deben seguir al comando.
255 FF Define caracter personalizado 7. 8 bytes de datos deben seguir al comando.
Página 316 · Sensores Inteligentes y sus Aplicaciones

Juego de Caracteres ASCII


La siguiente tabla muestra todos los caracteres ASCII como se despliegan en la LCD
Serial. Todos los caracteres ASCII (Dec 32 to 127) son caracteres ASCII estandar,
excepto por la contradiagonal ‘\’ (Dec 92) y el tilde ‘~’ (Dec 126). Para su facilidad, la
LCD Serial viene pre-programada con estos caracteres en los primeros 2 caracteres
personalizados. Entonces, para desplegar una contradiagonal, use el comando Dec 0 y
para desplegar un tilde, use el comando Dec 1. Por supuesto, siempre puede sobreescribir
estos caracteres con sus propios caracteres personalizados.
Apéndice C: Definiciones de Caracteres Hexadecimales · Page 317

Apéndice C: Definiciones de Caracteres


Hexadecimales
Muchas notas de aplicaciones de la LCD y documentación usan números hexadecimales
en vez de números binarios para definir comandos y caracteres. En PBASIC, escribir un
signo de exclamación es tan simple como un comando SEROUT con un signo de
exclamaciío entre comillas.
SEROUT 14, 84, ["!"]

No todos los lenguajes de programación para controladores soportan este uso nativo de
caracteres escribibles. En algunos casos, sobre todo en lenguaje ensamblador, se usa el
código ASCII para el signo de exclamación. El código ASCII para este signo es 33, y aún
en PBASIC, el comando SEROUT 14, 84, [33] realiza la misma tarea. En lenguaje
ensamblador, los valores hexadecimales son algunas veces el número base preferido
porque hace ciertas tareas más fáciles. Debido a esto, mucha documentación para LCD
lista sus comandos LCD como valores hexadecimales.

The equivalente hexadecimal de decimal-33 es hexadecimal-21. Esto es (2 × 16) + 1.


Puede usar el operator $ para especificar que un valor es hexadecimal, lo que haría que el
comando para desplegar un signo de exclamación fuera: SEROUT 14, 84, [$21].

He aquí un ejemplo de un comando SEROUT que define una barra en una gráfica de barra.
Llena la parte de abajo del caracter con pixeles negros y deja la parte mitad superior en
blanco:
SEROUT 14, 84, [250,
%00000, '
%00000, '
%00000, '
%00000, '
%11111, ' * * * * *
%11111, ' * * * * *
%11111, ' * * * * *
%11111] ' * * * * *

He aquí un comando equivalente usando valores hexadecimales. Si bien salva mucho


espacio, no es tan fácil de entender como definir un caracter personalizado con números
binarios. Siendo así, verá programas de aplicaciones PBASIC escritos de esta manera de
Página 318 · Sensores Inteligentes y sus Aplicaciones

vez en vez, principalente por la prevalecencia de valores hexadecimal en documentación


para LCD.
SEROUT 14, 84, [250, $00, $00, $00, $00, $1F, $1F, $1F, $1F]

La Table 7-1 cuenta a 15 en decimal, hexadecimal y binario. En términos de convertir de


hexadecimal a binary y viceversa, esta tabla es todo lo que necesitará. La razón es porque
cada dígito hexadecimal suelto corresponde a un grupo de 4 dígitos binarios.

Table 7-1: Valores Decimales, Hexadecimales y Binarios


Base
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
10
Base
0 1 2 3 4 5 6 7 8 9 A B C D E F
16
Base 00 00 00 00 01 01 01 01 10 10 10 10 11 11 11 11
2 00 01 10 11 00 01 10 11 00 01 10 11 00 01 10 11

Ejemplo: Convierta $8FE6 a binario.


Solución: Cada dígito hexadecimal se convierte en un grupo de 4 números binarios,
entonces el valor binario puede ser escrito con la ayuda de la Table 7-1:

Hexadecimal 8 F E 6
Binario 1000 1111 1110 0110

$8FE6 = %1000111111100110

Ejemplo: Convierta %1100011000001001 a hexadecimal.


Solución: Arregle el número binario en grupos de 4 dígitos, luego use la Table 7-1:

Binario 1100 0110 0000 1001


Hexadecimal C 6 0 9

%1100011000001001 = $C609

Programa Ejemplo: ConvertBinaryToHexadecimal.bs2


Por supuesto, puede también hacer que el BASIC Stamp lo haga por usted. Simplemente
use el operador % para definir el número binario y entonces usar el formateador HEX en
un comando SEROUT para desplegar el valor.
Apéndice C: Definiciones de Caracteres Hexadecimales · Page 319

√ Inténtelo y vea si la LCD coincide con nuestros cálculos

' Sensores Inteligentes y sus Aplicaciones - ConvertBinaryToHexadecimal.bs2

' {$STAMP BS2}


' {$PBASIC 2.5}

PAUSE 250 ' Estabiliza la fuente de energia


SEROUT 14, 84, [22, 12] ' Enciende y limpia la pantalla
PAUSE 5 ' Retraso de 5 ms para limpiar

SEROUT 14, 84, ["Value = ", HEX %1100011000001001]

END

Su Turno – Convierta de Hexadecimal a Binario


Convertir de hexadecimal a binario es un asunto de usar el formateador BIN en vez de
HEX y using el operator $ para decirle al Editor del BASIC Stamp que le está dando un
valor hexadecimal (en vez de % para binario). Si está conviertiendo 4 dígitos
hexadecimal a binario, el resultado será un número de 16 dígitos. Entonces, el comando
SEROUT también debe ser modificado para desplegar el resultado comenzando al incio de
la segunda línea.

√ Comente la línea de código existente que ejecuta la conversion de binario a


hexadecimal.
SEROUT 14, 84, ["Value = ", 148, BIN $8FE6]
Página 320 · Sensores Inteligentes y sus Aplicaciones
Apéndice D: Listado de Partes · Page 321

Apéndice D: Listado de Partes


Requerimientos del sistema de Cómputo :
• PC con Windows 2000/XP
• Un puerto serie disponible o puerto USB. Si necesita un adaptador USB a
Serie, recomendamos el Parallax parte #800-00030.
• Acceso a Internet

Requerimientos de Software:
• Editor BASIC Stamp para Windows v2.0 o más reciente (Descarga gratis en
www.parallax.com)
• Programas ejemplo seleccionados (Descarga gratis en www.parallax.com)
• Microsoft Notepad y Microsoft Excel 2002 o más reciente (para estudios de
aceleración del Capítulo 6)

Requerimientos de Hardware:
• Uno de los siguientes kits que incluye una plataforma de programación BASIC
Stamp 2, más la fuente de energía adecuada o las baterías:
o Board of Education Full Kit Serial (#28102) o USB (#28802)
o Boe-Bot Robot Kit Serial (#28132) o USB (#28832)
o BASIC Stamp activity Kit* (incluye HomeWork Board) (#90005)
• Sensores Inteligentes y sus Aplicaciones, Partes y Texto (#28029) o Kit de
partes (#130-28029)

Items de casa requeridos:


• Pequeña barra magnética
• Brújula Mecánica (para calibrar el Modulo de brújula, Capítulo 4)
• Carro RC y Controlador, con baterías (para Capítulo 6, actividad #5)
• Rueda de bicicleta (para Capítulo 6, actividad #6)

*Todas las actividades en este texto son compatibles con la tarjeta BASIC Stamp
HomeWork mientras que esté usando la LCD sin luz de fondo incluída en el kit de partes
de Sensores Inteligentes. Si está usando una LCD con luz de fondo, use también una
tarjeta Board of Education para proteger su LCD.
Página 322 · Sensores Inteligentes y sus Aplicaciones

Sensores Inteligentes y sus Aplicaciones, Partes y Texto #28029 (Sin libro, #130-28029)
Partes y cantidades sujetas a cambio sin previo aviso
Parallax Parte # Descripción Cantidad
122-28029 Libro Sensores Inteligentes y sus Aplicaciones 1
150-01020 Resistenciass 220 Ω, ¼ watt 5% 2
27976 LCD Serial Parallax 2 x 16 sin luz de fondo 1
28015 Sensor de Distancia Ultrasónico Ping))) 1
28017 Acelerómetro Memsic Bi-axial 1
29123 Módulo de brújula Hitachi 1
451-00303 Conector de 3 pines macho/macho 3
700-00003 4-40 tuercas zincadas-plateadas 6
700-00028 Tornillos de 1/4” 4-40 pan-head 4
710-00006 Tornillos de1/2“ 4-40 pan-head 2
713-00005 Espaciador #4 de 1/4” circular de nylon 2
720-00011 Herrajes para montaje universal de 90 grados 4
800-00016 Bolsa con 10 cables conectores de 3 pulgadas 2
805-00002 Cable Extension para Servo/LCD 2
900-00001 Piezo parlante 1

Puede encontrar algunos componentes electrónicos extra en su kit que no se usan en el libro
Sensores Inteligentes y sus Aplicaciones. Si quiere usar estas para construir sus propios
circuitos, aprenda acerca los capacitores electrolíticos y sus requerimientos de seguridad
antes de proceder PRECAUCIÓN: El uso incorrecto de capacitores electrolíticos puede
causar que exploten. Siga las siguienes reglas de seguridad para evitar cualquier daño

Los capacitores electrolíticos tienen una terminal positiva (+) y una


Símbolo del
negativa (-). El voltaje en la terminal (+) del capacitor debe ser siempre mayor
Capacitor
que el voltaje en su terminal (-). Use la imagen (derecha) para identificar las
terminales (+) y (-). Siempre asegúrese de conectar estas terminales
exactamente como se muestra en diagramas confiables. Conectar uno de
estos capacitores incorrectamente puede dañarlo. En algunos circuitos
conectar este tipo de capacitor incorrectamente y luego energizar puede
10 µF
causar su ruptura e incluso explotar. Vss es el voltaje más bajo (0 V) en las
tarjetas Board of Education y BASIC Stamp HomeWork. Al conectar la
terminal negativa del capacitor a Vss asegurará que la polaridad a través de
las terminales del capacitor siempre será correcta.
SEGURIDAD
Siempre apague la energía antes de construir o modificar los circuitos.
Siempre observe la polaridad cuando conecte capacitores electrolíticos.
Nunca invierta la polaridad de la fuente en cualquier capacitor polar.
- +
Use lentes de seguridad cuando use estos capacitores.
Mantenga sus manos y cara lejos de estos capacitores al energizarlos.
Índice · Page 323

Índice
-A- bicycle distance measurement, 247
binary radians (brads), 101
acceleration, 65
converting to degrees, 87
on a circular path, 233
RC car study, 230
-C-

skateboard trick study, 240 capacitor safety, 322


Cartesian coordinates, 174
accelerometer Celsius to Fahrenheit conversion, 59
and LCD tilt bubble graph, 188 clamping input range, 78
CLREOL, 96
measuring height, 211
collision, 65
MX2125 design (picture), 67 compass (drawing), 129
schematic and wiring diagram, 68 compass module, Hitachi HM55B, 119
three-axis, 66 calibration, 128

animation interpreting measurements, 119

flashing text, 11 magnet cautions, 125

pixel worm custom characters, 264 schematic and wiring diagram, 121
sensing axes, 120
arccosine, 99
arcsine, 99 testing, 121
arctangent, 92
computer system requirements, 321
ATN, 85, 127
contrast adjustment for LCD, 7
-B- conversion
bar graph binary radians to degrees, 87

horizontal, 271 Fahrenheit to Celsius temperature, 59

two-axis, 291 coordinate systems, 174


vertical, 281
COS, 100
counting wheel revolutions, 248
bar magnet, 125 CR, 10
baud rate, 7 CRSRXY, 8, 168
baud rate switches for LCD, 6 custom characters
Page 324 · Smart Sensors y Applications

hourglass animation, 24 -L-


pixel worm animation, 264 LCD
predefined in Parallax Serial LCD, 19 and accelerometer tilt bubble graph, 188
swapping, 261 baud rate switches, 6
-D- cautions for older models, 4
DATA, 180, 213, 223 contrast adjustment, 7
deadband, 249 control codes, 9
declination, 124
degree symbol in ASCII, 143 creating custom characters, 264
display coordinates, 174 defining custom characters, 20
-E- horizontal bar graph, 271

EEPROM, 262 mounting brackets, 153

-F- Parallax Serial LCD Documentation, 305


predefined custom characters, 19
Fahrenheit to Celsius conversion, 59
scrolling text, 25
-G-
scrolling text in window, 30
Gelfand, Alan (Ollie), 241
graphic character display, 168 two-axis bar graph, 291
gravity, 65 vertical bar graph, 281
-H- -M-
hardware requirements, 321 MIN, 196
hexadecimal, 22, 317
-N-
hexadecimal to binary conversion, 319
HIDs (Human Interface Devices), 167 negative numbers and PBASIC, 174
horizontal bar graph, 271 negative numbers in PBASIC
household items required, 321 division, 145
hysteresis, 248
-O-
-I-
ollie, 241
inclination, 124 oscillations, 242
incline, 65
input range clamping, 78 -P-
Parts Kit component listing, 322
Índice · Page 325

percent error measurements, 59 LcdTimer.bs2, 17


Ping))) sensor, 41 PingLcdCmAndIn.bs2, 57
and bar graph LCD display, 271 PingMeasureCm.bs2, 48
distance measurements, centimeter, 46 PingMeasureCmAndIn.bs2, 50
distance measurements, inches, 49 PingTest.bs2, 43
extension cable connections, 51 PlotXYGraph.bs2, 172
schematic and wiring diagram, 43 PredfinedCustomCharacters.bs2, 20
Predefined Custom Characters, 20 SignedNumbers.bs2, 81
Programs
SimpleTilt.bs2, 70
BikeWheelAcceleration.bs2, 251
SimpleTiltLcd.bs2, 74
BradsToDegrees.bs2, 90
SineCosine.bs2, 101
BubbleGraph.bs2, 191
TestArcsine.bs2, 103
CalibrateCompass.bs2, 132
TestAtn.bs2, 89
ConvertBinaryToHexadecimal.bs2, 318
TestCalibratedCompass.bs2, 139
CrsrxyPlot.bs2, 169
TestCompass.bs2, 122
CursorPositions.bs2, 15
TestCompassAveraged.bs2, 146
DatalogAcceleration.bs2, 226
TestScaleOffset.bs2, 78
DatalogYaxisUnscaled.bs2, 244
TestScrollingSubroutine.bs2, 28
EepromBackgroundDisplay.bs2, 181
TestVerticalBars.bs2, 283
EepromBackgroundRefresh.bs2, 185
TestWheelCounter.bs2, 249
EepromDataStorage.bs2, 216
TiltObstacleGame.bs2, 198
EepromDataStorageWithReset.bs2, 221
TwoAxisBarDisplay.bs2, 287
EepromPixelWorm.bs2, 264
VertWheelRotation.bs2, 95
HorizBarGraph.bs2, 273
PULSIN, 69
HorizontalTilt.bs2, 108
-R-
Hourglass.bs2, 23
RC car acceleration, 230
LcdTestCompass.bs2, 155
READ, 213
LcdTestMessage.bs2, 10 Reset button as program switch, 219
LcdTestNumbers.bs2, 12 rotation, 65, 85, 229
Page 326 · Smart Sensors y Applications

-S- tesla (T), 124


tilt game controller, 196
scaling constant, 77
tracking character coordinates, 182
scaling input values, 76
two equations with two unknowns, 176
SEROUT, 8, 317
two’s complement, 174, 196
servo port jumper, 150
two-axis bar graph, 291
signed numbers and PBASIC, 174
signed numbers in PBASIC, 80 -V-
division, 145 vertial bar graph, 281
SIN, 100 vibration, 65
sine, 99 -W-
software requirements, 321
Wainwright, Danny, 241
-T- worm, custom character for LCD, 264
temperature unit conversion, 59 WRITE, 213

También podría gustarte