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 BoeBot, 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 Estándar Con Luz
Parte Parallax # 27976 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
•
13 es un retorno de carro; manda al cursor a la siguiente línea. 21 apaga la pantalla LCD. 22 enciende la pantalla LCD.
LCD de limpiarse. • •
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} ' {$PBASIC 2.5}
' Dispositivo Objeto ' Lenguaje
= BASIC Stamp 2 = PBASIC 2.5
Cap 1: La pantalla LCD Serial Parallax · Página 11
SEROUT 14, 84, [22, 12] PAUSE 5 SEROUT 14, 84, ["See this?", 13, "The LCD works!"] END
' Inicializa la LCD
' Mensaje de texto, retorno de carro ' mas texto en la linea 1. ' 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 PAUSE 600 SEROUT 14, 84, [22] PAUSE 400 SEROUT 14, 84, [21] LOOP
√
' ' ' ' ' '
Inicia el bloque DO...LOOP Retraso de 6/10 de segundo Enciende la pantalla Retraso de 4/10 de segundo Apaga la pantalla 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} ' {$PBASIC 2.5} counter
' Dispositivo Objeto ' Lenguaje VAR
Byte
= BASIC Stamp 2 = PBASIC 2.5
' Variable del ciclo FOR...NEXT
SEROUT 14, 84, [22, 12] PAUSE 5
' Inicializa la LCD ' 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 9 10 128 to 143 148 to 163
Cursor a la izquierda Cursor a la derecha Cursor abajo (la linea inferior ajustara en la linea superior) Posiciona el cursor en la linea 0, caracteres 0 al 15 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, 131, 134, 137, 140, 143,
"L", "I", "N", "E", "-", "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} ' {$PBASIC 2.5} index character offset
' Dispositivo Objeto ' Lenguaje VAR VAR VAR
SEROUT 14, 84, [22, 12] PAUSE 500
Nib Byte Byte
= BASIC Stamp 2 = PBASIC 2.5
' Variable del ciclo FOR...NEXT ' Guardado del caracter ' Valor de compensacion ' Inicializa la LCD ' 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 SEROUT 14, 84, 500, [21, 22] NEXT END
' Flashea 5 veces
' 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 SEROUT 14, 84, ["This is a", 13]
' Limpia la pantalla ' 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] PAUSE 5
' Enciende LCD y limpia ' Pausa 5 ms para limpiar
SEROUT 14, 84, ["Time Elapsed...", 13] SEROUT 14, 84, [" h m s"]
' Texto + retorno de carro ' 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} ' {$PBASIC 2.5} hours minutes seconds
' Directiva de Stamp ' Directiva de PBASIC VAR VAR VAR
Byte Byte Byte
' Guarda horas ' Guarda minutos ' Guarda segundos
SEROUT 14, 84, [22, 12] PAUSE 5
' Inicia LCD y limpia pantalla ' Pausa 5 ms para limpiar
SEROUT 14, 84, ["Time Elapsed...", 13] SEROUT 14, 84, [" h m s"]
' Texto + retorno de carro ' 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 seconds = seconds + 1 LOOP
' Pausa + consumo ~ 1 segundo ' Incrementa segundo contador ' 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 LcdCr LcdOff
CON CON CON
12 13 21
' Form feed -> clear screen ' Retorno de Carro ' Apaga la pantalla
Cap 1: La pantalla LCD Serial Parallax · Página 19
LcdOn Line0 Line1
CON CON CON
22 128 148
' Enciende la pantalla ' Linea 0, caracter 0 ' 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] PAUSE 5
' Inicializa la LCD ' 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, %01110, %00100, %01010, %10001, %11111]
Figura 1-15 Redefiniendo el caracter personalizado 0
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, %00000, %11111, %10001, %01010, %00100, %01110, %11111, %11111]
' ' ' ' ' ' ' ' '
Define Caracter Personalizado 7 * * * * * * * * * * * * * * * * * * *
* *
* *
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, SEROUT 14, 84, PAUSE 1250 SEROUT 14, 84, SEROUT 14, 84, PAUSE 1500
[133] [0]
' ' ' ' ' '
[8] [7]
Cursor -> Linea 0, char Muestra Caracter Personalizado 0 Retraso de 1.25 segundos Espacio atras Muestra Caracter Personalizado 7 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, %00000, %11111, %11111, %01110, %00100, %01010, %10001, %11111]
' ' ' ' ' ' ' ' '
Define Caracter Personalizado 0
SEROUT 14, 84, [255, %00000, %11111, %10001, %01010, %00100, %01110, %11111, %11111]
' ' ' ' ' ' ' ' '
Define Caracter Personalizado 7
* * * * * * * * * * * * * *
* * * * * * * * *
* * * * * * * * * * * * * * * * * * *
* *
* *
Página 24 · Sensores Inteligentes y sus Aplicaciones
SEROUT 14, 84, [22, 12] PAUSE 5
' Enciende pantalla y limpia ' 5 ms retraso para limpiar
' -----[ Main Rutina ]------------------------------------------------------DO SEROUT 14, 84, SEROUT 14, 84, PAUSE 1250 SEROUT 14, 84, SEROUT 14, 84, PAUSE 1500
[133] [0] [8] [7]
' ' ' ' ' '
Cursor -> Linea 0, char Muestra Caracter Pers. 0 Retraso de 1.25 seconds Espacio atras Muestra Caracter Pers. 7 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 Message2 Message3 Message4
DATA @ 2, "Message " DATA "again" DATA "Larger message, going faster" 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: windowLeft = 134: increment = 1 GOSUB Scroll_Message
messageEnd = message2 windowRight = 137
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: windowLeft = 150: increment = 2 GOSUB Scroll_Message
messageEnd = message4 windowRight = 161
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} ' {$PBASIC 2.5}
' Directiva BASIC Stamp ' 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 LcdCls LcdCr LcdOff LcdOn Line0 Line1
CON CON CON CON CON CON CON
84 12 13 21 22 128 148
' ' ' ' ' ' '
True, 8-bits, no parity, 9600 Form feed -> limpia pantalla Retorno de carro Apaga la pantalla Enciende la pantalla Linea 0, caracter 0 Linea 1, caracter 0
TimeOn TimeOff
CON CON
250 0
' Caracter de tiempo de encendido ' Caracter de tiempo de atenuac.
' -----[ Variables ]---------------------------------------------------------' Variables funcionales para la subrutina Scroll_Message. cursorStart head tail pointer character
VAR VAR VAR VAR VAR
Byte Byte Byte Byte Byte
' ' ' ' '
Posicion del primer caracter Inicio del texto desplegado Fin del texto desplegado apuntador de direccion EEPROM Guarda un caracter
Cap 1: La pantalla LCD Serial Parallax 路 P谩gina 29
' Variables de configuracion para la subrutina Scroll_Message. increment windowRight
VAR VAR
Nib Byte
windowLeft
VAR
Byte
messageStart messageEnd
VAR VAR
Byte Byte
' ' ' ' ' ' '
Caracteres por cambiar Direccion del caracter de extrema derecha Direccion del caracter de extrema izquierda Direccion EEPROM para inicio 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: windowLeft = 134: increment = 1 GOSUB Scroll_Message
messageEnd = message2 windowRight = 137
' Cambia los valores de varias variables de configuracion y demuestra el ' efecto en la pantalla con cada cambio. windowLeft = 131: GOSUB Scroll_Message
windowRight = 140
messageStart = Message1: GOSUB Scroll_Message
messageEnd
messageStart = Message3: windowLeft = 150: increment = 2 GOSUB Scroll_Message
messageEnd = message4 windowRight = 161
= message3
END ' -----[ Subrutina - Scroll_Message ]---------------------------------------Scroll_Message: cursorStart = windowRight - increment + 1 head = 0 tail = increment - 1 ' ciclo de avance
' Caracter ExtremaDer en ventan ' Inicializa head y tail ' del mensaje
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 SEROUT LcdPin, T9600, [" "] NEXT
' Limpia caracteres anteriores.
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. Q2. Q3. Q4.
Reloj de pulsera, calculadora, teléfono (las respuestas pueden variar). Dos líneas de texto, cada una con 16 caracteres de ancho. El comando SEROUT. 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 interconstruido 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] ' 1234567890123456 SEROUT 14, 84, [" Hello ", CR]
' Enciende y limpia pantalla ' 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] ' 1234567890123456 SEROUT 14, 84, [" Hello ", CR]
' Enciende y limpia pantalla ' Centra texto en linea sup.
DO SEROUT 14, 84, [21] PAUSE 500 SEROUT 14, 84, [22] PAUSE 500 LOOP
' Apaga pantalla ' Enciende pantalla
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 SEROUT SEROUT SEROUT
14, 14, 14, 14,
84, 84, 84, 84,
[22, 12] ["Inicio"] [158] ["Final"]
' ' ' '
Enciende y Escribe en Linea2, 6o Escribe en
limpia pantalla Linea 0 caracter de der. a izq. 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] SEROUT 14, 32, ["Using 19200 bps"]
' Enciende y limpia pantalla ' 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] SEROUT 14, 396, ["Using 2400 bps"]
' Enciende y limpia pantalla ' 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 T9600
PIN CON
14 84
PAUSE 250 SEROUT 14, 84, [22, 12] PAUSE 5 SEROUT LcdPin, SEROUT LcdPin, PAUSE 1500 SEROUT LcdPin, SEROUT LcdPin, PAUSE 1500 SEROUT LcdPin, SEROUT LcdPin,
' Enciende y limpia pantalla ' 5 ms retraso para limpiar
T9600, ["Nunca deje que T9600, ["mi escuela
"] "]
T9600, ["obstruyera T9600, ["mi educacion.
"] "]
T9600, [" T9600, ["
-Mark Twain"] 1835-1910 "]
END
P2. ¡Las 3 copias cambiarán al nuevo caracter definido! continuación, un programa muestra. ' ' ' '
Es como magia. A
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 Line1 copies
CON CON VAR
128 148 Nib
PAUSE 250 SEROUT 14, 84, [22, 12] PAUSE 5
' Enciende y limpia pantalla ' 5 ms retraso para limpiar
SEROUT 14, 84, [248, %00110, %00101, %00100, %11111, %00100, %01110, %10101, %00100]
' Define Caracter Pers. 0 ' * * ' * * ' * ' * * * * * ' * ' * * * ' * * * ' *
P谩gina 40 路 Sensores Inteligentes y sus Aplicaciones
FOR copies = 1 TO 3 SEROUT 14, 84, [0] NEXT
' Despliega Caracter Pers. 0
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, %00100, %10011, %01001, %00101, %00001, %00010, %00100, %11000] END
' Re-define Caracter Pers. 0 ' * ' * * * ' * * ' * * ' * ' * ' * ' * *
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 Sobject =
S Cair t = 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 Sobjectcm 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 tPULSINBS2)/10,000. Sobject-cm =
100 Cair t 2
Sobject-cm =
100 Cair tPULSIN-BS2 2 × 2 1,000,000
Sobject-cm =
Cair tPULSIN-BS2 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. Sobject-cm =
344.8 tPULSIN-BS2 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 time
VAR VAR
Word 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 inDistance time
VAR VAR VAR
Word Word 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 time
VAR VAR
Word 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
% error =
real - predicha ×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. % error =
346.5 - 344.8 ×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. E2. E3. E4.
El objeto esta a 2.59 m de distancia. 100 °F = 37.7 °C 30.48 cm = 1.0 ft. % 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 LCD Ping
PIN PIN PIN
13 14 15
' LED rojo activo en alto ' LCD Serial Parallax ' sensor Ping))) Parallax
CmConstant InConstant MaxDistance cmDistance time
CON CON CON VAR VAR
2260 890 361 Word Word
' Calc tiempo de sonido viaje redondo
PAUSE 200 SEROUT LCD, 84, [22, 12] PAUSE 5
' Maximo posible para medir (empirico) ' Distancia en centimetros ' Tiempo de eco en viaje redondo ' Inicializa LCD
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 PAUSE 50 FREQOUT Speaker, 450, 2200 RETURN Calc_Distance: inDistance = inConstant ** tiempo RETURN
' Bing ' Bong
' Estas son todas las mediciones
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 y
VAR VAR
Word 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 35.
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 y
VAR VAR
Word 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 Decimal sin signo 1 32767 32768 65535
con Complemento a dos Binario de 16-Bit !Bit 15 Bit 0"
0000000000000001 0111111111111111 1000000000000000 1111111111111111
Decimal con signed 1 32767 -32768 -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
√ √ √
Valor
Constante de escalamiento **
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 =
Valor Calculado
Resultado entero BASIC Stamp
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
d. x = 0 100
y = 0 100
y = −100 100
b. x = 0 100
y = 10 0 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
y tan θ = x
Figura 3-16 Tangente y Arcotangente
⎛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:
y = h sin θ
Figura 3-19 Tangente y Arcotangente
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° y = 127 sin 45° = 89.9 ≈ 90 x = 127 cos 45° = 89.9 ≈ 90
√ √ √ √ √
For h = 100 and θ = 315° y = 100 sin 315° = − 71 x = 100 cos 315° = 71
For h = 127 and θ = 180° y = 127 sin 180° =0 x = 127 cos 180° = − 127
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 x y
VAR VAR VAR
Word Word Word
DO DEBUG "Enter DEBUGIN SDEC DEBUG "Enter DEBUGIN SDEC
y: " y x: " 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 brads
VAR VAR
DEBUG CLS, "brads
Word Word */ 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
θ = tan
−1
⎛ AY ⎜ ⎜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 3 2
⎞ ⎟ ⎟ = 30° ⎟ ⎟ ⎠
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
⎛ ⎜ tan −1 ⎜ ⎜ ⎜ ⎝
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 θ tan θ =
AY 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 x y
VAR VAR VAR
Word Word 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, %01000, %10100, %01000, %00000, %00000, %00000, %00000, %00000]
' Define caracter personalizado 7 ' * ' * * ' * ' ' ' ' '
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
⎛ − AY tan −1 ⎜⎜ ⎝ AX
⎛ 1 ⎞ ⎟ ⎜ ⎞ ⎟ ⎜ 2 − 1 ⎟ = tan ⎟ ⎜ 3 ⎟ = 330 ° ⎠ ⎟⎟ ⎜⎜ ⎝ 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 h x cos θ = h
sin θ =
Figura 3-27 Seno y Coseno
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.
sin θ =
y h
θ = sin −1
y h
cos θ =
x h
θ = cos −1
x h
Figura 3-30 Seno, Arcoseno, Cosenoy Arcocoseno
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} ' {$PBASIC 2.5}
' Directiva BASIC Stamp ' Directiva PBASIC
P谩gina 104 路 Sensores Inteligentes y sus Aplicaciones
' -----[ Constantes ]--------------------------------------------------------Negative Positive
CON CON
1 0
' Signo - .bit15 de variables de palabra
' -----[ Variables ]---------------------------------------------------------sine side angle sign
VAR VAR VAR VAR
Word Word Word Bit
' ' ' '
seno en circulo r = 127 variable de subrutina resultado angle - degrees bit de Signo
' -----[ Inicializacion ]----------------------------------------------------DEBUG CLS sine = -128
' Limpia la Terminal de Depuracion ' Inicia y en -128
' -----[ Rutina principal ]--------------------------------------------------DO UNTIL sine = 127 sine = sine + 1 side = sine DEBUG "sine = ", SDEC sine, " GOSUB Arcsine DEBUG SDEC ? angle LOOP END
"
' ' ' ' ' ' '
Barre desde y = -127 a y = 127 Incremento en 1 Coloca side en y Muestra el valor de seno Calcula arcoseno Muestra el resultado angle Repite DO...LOOP
' 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: GOSUB Arccosine angle = 90 - angle RETURN
' Subrutina Inverso seno ' Obtiene inverso coseno ' seno(angle) = cos(90 - angle)
' -----[ 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: sign = side.BIT15 side = ABS(side) angle = 63 - (side / 2) DO
' ' ' ' '
Subrutina Inverso coseno Guarda el signo de side Evalua side positivo aproximacion inicial al angulo Ciclo de approximation sucesiva
Capítulo 3: Inclinación con el Acelerómetro Memsic · Page 105
IF (COS angle <= side) THEN EXIT ' angle = angle + 1 ' LOOP angle = angle */ 361 ' IF sign = Negative THEN angle = 180 - angle' RETURN
Hecho cuando COS angle <= side Incrementa el angulo Convierte brads a grados Ajusta si el signo es negativo.
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 sin θ =
AX 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} ' {$PBASIC 2.5}
' Directiva BASIC Stamp ' Directiva PBASIC
' -----[ Constantes ]--------------------------------------------------------Negative Positive
CON CON
1 0
' Signo - .bit15 de variables de una palabra
' -----[ Variables ]---------------------------------------------------------x y
VAR VAR
Word Word
' Medicion del eje x mems ' Medicion del eje y mems
side angle sign
VAR VAR VAR
Word Word Bit
' dispara variable de subrutina ' resultado angulo - grados ' 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 PULSIN 7, 1, y
' medicion del eje x ' 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 LOOP
' Pausa 1/10 segundo ' 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: GOSUB Arccosine angle = 90 - angle RETURN
' Subrutina seno inverso ' Obtiene coseno inverse ' seno(angle) = cos(90 - angle)
' -----[ 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: ' sign = side.BIT15 ' side = ABS(side) ' angle = 63 - (side / 2) ' DO ' IF (COS angle <= side) THEN EXIT ' angle = angle + 1 ' ciclo angle = angle */ 361 ' IF sign = Negative THEN angle = 180 - angle' RETURN
Subrutina coseno inverso Salva el signo de side Evalua side positivo Aproximacion inicial de angulo Ciclo de aproximacion sucesiva Hecho cuando COS angle <= side Incrementa angulo Convierte brads a grados Ajusta si el signo es negativo.
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, %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, "
√
' Define caracter personalizado 7 ' * ' * * ' * ' ' ' ' '
", 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. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
¿Cuáles son las 7 cantidades que puede medir con un acelerómetro? ¿Qué significan las siglas MEMS? ¿Qué es lo que se mueve dentro del MX2125 cuando lo inclina? ¿Puede la gravedad ser considerada una forma de aceleración? ¿Que tiene que hacer a un programa que muestra mediciones en la Terminal de Depuración para que las muestre en una LCD serial? ¿Cómo puede restringir a una variable a un rango de valores? ¿Cómo puede orientar su tarjeta para aplicar 1 g al eje x del acelerómetro? ¿Cómo puede orientar su tarjeta para aplicar 0 g a ambos ejes? ¿Cual es la diferencia entre un radian binario y un grado? ¿Qué rango de valores aceptan los operadores SIN y COS? ¿Qué representan estos valores? ¿Cómo puede convertir de brads a grados? ¿Qué rango of valores acepta el operador ATN? ¿Qué represent esos valores? ¿Porqué puede usar ATN para calcular el ángulo de rotación de su tarjeta? ¿Qué rango de valores está la subrutina Arccosine diseñada para aceptar? ¿Qué representan esos valores? ¿Qué rango de valores está la subrutina Arcsine diseñada para aceptar? ¿Qué representan esos valores? ¿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 electromechanical 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.
E3. E4.
y VAR Word PULSIN 10, 1, y x VAR Word PULSIN 9, 1, x x = x * 2 x = x * 2 / 1000
E5.
x = x /500 value = (value MIN 0 MAX 100) ** 8519 + 20
E2.
-O-
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 angleOld x y turnCount
VAR VAR VAR VAR VAR
Word Word Word Word Word
PAUSE 250 SEROUT 14, 84, [22, 12] PAUSE 5
' Inicializa LCD
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 PULSIN 7, 1, y
' medicion del eje x ' 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 LOOP
' Pause 1/10 second ' 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
tan θ =
−N sin θ − y = 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 Clk En
PIN PIN PIN
2 0 1
' P2 transmite-recibe a/de Din/Dout ' P0 manda pulsos al reloj de HM55B ' P2 controla pin EN(ABLE) de HM55B
' -----[ Constantes ]--------------------------------------------------------Reset Measure Report Ready NegMask
CON CON CON CON CON
%0000 ' comando Reset de HM55B %1000 ' comando de inicio de medicion %1100 ' comando para recibir status/valores de ejes %1100 ' 11 -> Hecho, 00 -> no errores %1111100000000000 ' Para negativos 11-bit a 16-bits
' -----[ Variables ]---------------------------------------------------------x y status angle
VAR VAR VAR VAR
Word Word Nib Word
' ' ' '
datos del eje x datos del eje y banderas de Status Guarda medicion de angulo
' -----[ Rutina Principal]---------------------------------------------------DO
' Ciclo principal GOSUB Compass_Get_Axes
' Obtiene valores de x y y
angle = x ATN -y angle = angle */ 361
' Convierte x y y a brads ' Convierte brads a grados
DEBUG HOME, "x-axis N(-S) = ",SDEC x, CLREOL, CR, "y-axis W(-E) = ", SDEC y, CLREOL, CR, CR, "angle = ", DEC angle, " degrees", CLREOL
' Muestra ejes y grados
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 SHIFTOUT DinDout,clk,MSBFIRST,[Reset\4]
' Manda comando reset a HM55B
HIGH En: LOW En ' HM55B comando inicio medicion SHIFTOUT DinDout,clk,MSBFIRST,[Measure\4] status = 0 ' Borra status anterior de banderas DO HIGH En: LOW En
' Ciclo de chequeo de Status de banderas ' 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 HIGH En
DinDout,clk,MSBPOST,[x\11,y\11]
' Obtiene valores de ejes x & y ' 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. x axis units =
total magnetic field intensity 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) CompassLowVal DATA (1) CompassCal DATA (16)
' Guardan compensaciones de ejes x y y ' Guarda indice del mas bajo angulo ' 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 Previous
CON CON
0 1
' Indice para arreglo tabular ' 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 fraction brads table temp axisOffset
VAR VAR VAR VAR VAR VAR
Word Nib Byte Byte(2) Word(2) Word
' Valores enteros para pantalla ' Valores fraccionales para pantalla ' Mediciones de radianes binarios ' Guarda valores en tabla ' Guarda mediciones de ejes ' 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", CR, "continue" DEBUGIN character DEBUG CR, CR
LOOP
' espera por el usuario
' Repite ciclo principal
' -----[ Subrutina - Compass_Calibrate ]------------------------------------Compass_Calibrate: GOSUB GOSUB GOSUB DEBUG
Get_And_Store_Axis_Offsets Get_And_Store_Interpolation Get_And_Store_Low_Value_Address 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 ' en la EEPROM. SELECT counter CASE 0 temp(0) = x CASE 1 temp(1) = y CASE 2 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 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
max y min de cada eje y guarda
' Norte ' Este ' Sur
' Oeste
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 CR, "Ideal Actual CR, "-----------
Degree Angle", Ideal Actual", -----------", 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: HIGH En: LOW En SHIFTOUT DinDout,clk,MSBFIRST,[Reset\4]
' subrutina módulo de brújula ' Comando envia reset al HM55B
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 HIGH En
DinDout,clk,MSBPOST,[x\11,y\11]
IF (y.BIT10 = 1) THEN y = y | NegMask IF (x.BIT10 = 1) THEN x = x | NegMask
' Obten valores de ejess x & y ' Deshabilita modulo ' Guarda 11-bits,palabra con signo ' 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 x = x - axisOffset READ CompassOffsets + 2, Word axisOffset y = y - axisOffset
' ' ' '
Obtiene corrige Obtiene corrige
compensacion eje x eje x compensacion eje y 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) CompassLowVal DATA (1) CompassCal DATA (16)
' Guarda compensaciones de ejes x y y ' Guarda indice del angulo mas bajo ' 16 angulos de referencia para brújula
' -----[ Definiciones de Pines ]---------------------------------------------DinDout Clk En
PIN PIN PIN
2 0 1
' P6 transmite-recibe de/a Din/Dout ' P5 envia pulsos al reloj de HM55B ' P4 controla EN(ABLE) de HM55B
' -----[ Constantes ]--------------------------------------------------------Reset Measure Report Ready NegMask current previous
CON CON CON CON CON CON CON
%0000 ' Comando Reset para el HM55B %1000 ' Comando de inicio de medicion %1100 ' Comando obtener status/valores de eje %1100 ' 11 -> Hecho, 00 -> no errores %1111100000000000 ' De negativo 11-bit a 16-bits 0 ' Indice para arreglo tabular 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 table span angleOffset
VAR VAR VAR VAR
Status Byte(2) x y
' ' ' '
Indice EEPROM Guarda tabla de valores EEPROM Span entre entradas de tabla 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 GOSUB angle DEBUG
GOSUB DEBUG angle DEBUG PAUSE
Compass_Get_Axes Compass_Correct_Offsets = x ATN -y HOME, "x-axis N(-S) = ",SDEC x, CLREOL, CR, "y-axis W(-E) = ", SDEC y, CLREOL Compass_Interpolate CR, CR, "angle = ", DEC angle, " brads", CLREOL = angle */ 361 CR,"angle = ", DEC angle, " degrees", CLREOL 150
LOOP
' ' ' '
Obtiene valores x y y corrige compensacs de ejes Convierte x y y a brads Despliega ejes corregidos
' Interpolacion Lineal ' Muestra angulo interpolado ' ... en brads ' Convierte brads a grados ' Muestra angulo interpolado ' ... en grados ' Retraso de Debug para alentar PCs ' 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 SHIFTOUT DinDout,clk,MSBFIRST,[Reset\4]
' Envía comando reset a HM55B
HIGH En: LOW En SHIFTOUT DinDout,clk,MSBFIRST,[Measure\4] status = 0
' Comando inicia medición HM55B ' 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 HIGH En
DinDout,clk,MSBPOST,[x\11,y\11]
IF (y.BIT10 = 1) THEN y = y | NegMask IF (x.BIT10 = 1) THEN x = x | NegMask
' Obtiene valores de ejes x & y ' Deshabilita modulo ' Guarda 11-bits,palabra con signo ' 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 x = x - axisOffset READ CompassOffsets + 2, Word axisOffset y = y - axisOffset
' ' ' '
Obtiene corrige Obtiene corrige
compensacion eje x eje x compensacion eje y 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 Positive
CON CON
1 0
' Word.bit15 = 1 -> negative ' Word.bit15 = 0 -> positive
Luego, agregue 4 variables a la sección de Variables de los programas. mCount xSum ySum sign
VAR VAR VAR VAR
Nib Word Word Bit
' ' ' '
Medición count eje x medición accumulator eje y medición accumulator 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 ySum = 0
' Acumuladores en cero
FOR mCount = 1 TO 10
' Toma 10 mediciones
' *** El codigo Original de la subrutina Compass_Get_Axes va aquí *** xSum = xSum + x ySum = ySum + y NEXT
' Mantiene suma en ejecucion de x ' Mantiene suma en ejecucion de y
Chapter 4: El módulo de brújula Hitachi HM55B · Page 145
' Divide xSum sign = xSum.BIT15 xSum = ABS(xSum) x = xSum / 10 IF xSum // 10 >=5 THEN x = x + 1 IF sign = Negative THEN x = - x
' ' ' ' '
Guarda el signo de xSum Toma el valor absoluto x = la medicion promedidada fraccion > .5? Redondea Si xSum es negativo, niega x
sign = ySum.BIT15 ySum = ABS(ySum) y = ySum / 10 IF ySum // 10 >=5 THEN y = y + 1 IF sign = Negative THEN y = - y
' ' ' ' '
Guarda el signo de ySum Toma el valor absoluto y = la medicion promedidada fraccion > .5? Redondea 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 Clk En
PIN PIN PIN
2 0 1
' P2 transmite-recibe a/de Din/Dout ' P0 manda pulsos al reloj de HM55B ' P2 controla pin EN(ABLE) de HM55B
' -----[ Constantes ]--------------------------------------------------------Reset Measure Report Ready NegMask
CON CON CON CON CON
%0000 ' comando Reset de HM55B %1000 ' comando de inicio de medicion %1100 ' comando para recibir status/valores de ejes %1100 ' 11 -> Hecho, 00 -> no errores %1111100000000000 ' Para negativos 11-bit a 16-bits
Negative Positive
CON CON
1 0
' Word.bit15 = 1 -> negativo ' Word.bit15 = 0 -> positivo
' -----[ Variables ]---------------------------------------------------------x y status angle
VAR VAR VAR VAR
Word Word Nib Word
' ' ' '
datos del eje x datos del eje y banderas de Status Guarda medicion de angulo
mCount xSum ySum sign
VAR VAR VAR VAR
Nib Word Word Bit
' ' ' '
cuenta de medicion acumulador de medicion de eje x acumulador de medicion de eje y 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 angle = angle */ 361
' Convierte x y y a brads ' Convierte brads a grados
DEBUG HOME, "x-axis N(-S) = ",SDEC x, CLREOL, CR, "y-axis W(-E) = ", SDEC y, CLREOL, CR, CR, "angle = ", DEC angle, " degrees", CLREOL
' Muestra ejes y grados
PAUSE 150
' Retraso Debug para alentar PC
LOOP
' Repite ciclo principal
' -----[ Subrutina - Compass_Get_Axes ]-------------------------------------Compass_Get_Axes:
' subrutina modulo de brujula
xSum = 0 ySum = 0
' Acumuladores a cero
FOR mCount = 1 TO 10
' Toma 10 mediciones
HIGH En: LOW En SHIFTOUT DinDout,clk,MSBFIRST,[Reset\4]
' Manda comando reset a HM55B
HIGH En: LOW En ' HM55B comando inicio medicion SHIFTOUT DinDout,clk,MSBFIRST,[Measure\4] status = 0 ' Borra status anterior de banderas DO
' Ciclo de HIGH En: LOW En ' SHIFTOUT DinDout,clk,MSBFIRST,[Report\4] SHIFTIN DinDout,clk,MSBPOST,[Status\4] ' ciclo UNTIL status = Ready ' Deja listo SHIFTIN HIGH En
DinDout,clk,MSBPOST,[x\11,y\11]
chequeo de Status de banderas comando de status medicion Obtiene Status ciclo cuando status esta
' Obtiene valores de ejes x & y ' 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 ySum = ySum + y NEXT
' Mantiene una suma en ejecucion de x ' Mantiene una suma en ejecucion de y
Página 148 · Sensores Inteligentes y sus Aplicaciones
sign = xSum.BIT15 xSum = ABS(xSum) x = xSum / 10 IF xSum // 10 >=5 THEN x = x + 1 IF sign = Negative THEN x = - x
' ' ' ' '
Guarda signo de xSum Toma valor absoluto x = la medicion promediada fraccion >.5? Redondea arriba Si xSum negativo, niega x
sign = ySum.BIT15 ySum = ABS(ySum) y = ySum / 10 IF ySum // 10 >=5 THEN y = y + 1 IF sign = Negative THEN y = - y
' ' ' ' '
Guarda signo de ySum Toma valor absoluto y = la medicion promediada fraccion >.5? Redondea arriba 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 SEROUT 14, 84, [22, 12] PAUSE 5
' Estabiliza la fuente de energia ' Enciende y limpia la LCD ' retraso de 5 ms para limpiar
SEROUT 14, 84, [255, %01000, %10100, %01000, %00000, %00000, %00000, %00000, %00000]
' Define caracter personalizado 7 ' * ' * * ' * ' ' ' ' '
SEROUT 14, 84, [129, "Heading...", 149, "x=", 158, "y="]
' Caracteres Estáticos
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 Clk En
PIN PIN PIN
2 0 1
' P2 transmite-recibe a/de Din/Dout ' P0 manda pulsos al reloj de HM55B ' P2 controla pin EN(ABLE) de HM55B
' -----[ Constantes ]--------------------------------------------------------Reset Measure Report Ready NegMask
CON CON CON CON CON
%0000 ' comando Reset de HM55B %1000 ' comando de inicio de medicion %1100 ' comando para recibir status/valores de ejes %1100 ' 11 -> Hecho, 00 -> no errores %1111100000000000 ' Para negativos 11-bit a 16-bits
' -----[ Variables ]---------------------------------------------------------x y status angle
VAR VAR VAR VAR
Word Word Nib Word
' ' ' '
datos del eje x datos del eje y banderas de Status Guarda medicion de angulo
' -----[ Inicializacion ]----------------------------------------------------' Inicializacion de la LCD PAUSE 200 SEROUT 14, 84, [22, 12] PAUSE 5
' Estabiliza la fuente de energia ' Enciende y limpia la LCD ' retraso de 5 ms para limpiar
SEROUT 14, 84, [255, %01000, %10100, %01000, %00000, %00000, %00000, %00000, %00000]
' Define caracter personalizado 7 ' * ' * * ' * ' ' ' ' '
Chapter 4: El m贸dulo de br煤jula Hitachi HM55B 路 Page 157
SEROUT 14, 84, [129, "Heading...", 149, "x=", 158, "y="]
' Caracteres Est谩ticos
' -----[ Rutina Principal ]--------------------------------------------------DO
' Ciclo principal GOSUB Compass_Get_Axes
' Obtiene valores de x y y
angle = x ATN -y angle = angle */ 361
' Convierte x y y a brads ' 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: HIGH En: LOW En SHIFTOUT DinDout,clk,MSBFIRST,[Reset\4]
' subrutina modulo de brujula ' Manda comando reset a HM55B
HIGH En: LOW En ' HM55B comando inicio medicion SHIFTOUT DinDout,clk,MSBFIRST,[Measure\4] status = 0 ' Borra status anterior de banderas DO
' Ciclo de HIGH En: LOW En ' SHIFTOUT DinDout,clk,MSBFIRST,[Report\4] SHIFTIN DinDout,clk,MSBPOST,[Status\4] ' ciclo UNTIL status = Ready ' Deja listo SHIFTIN HIGH En
DinDout,clk,MSBPOST,[x\11,y\11]
chequeo de Status de banderas comando de status medicion Obtiene Status ciclo cuando status esta
' Obtiene valores de ejes x & y ' 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. E2. E3. E4.
θ = 0° grados a partir del Norte, o debido al Norte. θ = 297.3° a partir del Norte. 1.6 microtesla = 1.6 x 10-6 T = 1600 x 10-9 T = 1600 nanotesla 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 difference alarmArm
VAR VAR VAR
Word Word Bit
Modifique el ultimo comando SEROUT en la routine de inicialización: SEROUT 14, 84, [128, "Alarm Angle Set ", 148, "OFF "]
' Caracteres estaticos
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 angle = angle */ 361
' Convierte x y y a brads ' 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 LOOP
' Retraso de Debug para alentar PCs ' 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} ' {$PBASIC 2.5}
' Directiva BASIC Stamp ' Directiva PBASIC
' -----[ Constantes ]--------------------------------------------------------Negative Positive
CON CON
1 0
' Signo - .bit15 de variables de una palabra
' -----[ I/O Definitions ]---------------------------------------------------DinDout Clk En
PIN PIN PIN
2 0 1
' P2 transmite-recibe a/de Din/Dout ' P0 manda pulsos al reloj de HM55B ' P2 controla pin EN(ABLE) de HM55B
Reset Measure Report Ready NegMask
CON CON CON CON CON
%0000 ' comando Reset de HM55B %1000 ' comando de inicio de medicion %1100 ' comando para recibir status/valores de ejes %1100 ' 11 -> Hecho, 00 -> no errores %1111100000000000 ' Para negativos 11-bit a 16-bits
' -----[ Variables ]---------------------------------------------------------xTilt yTilt
VAR VAR
Word Word
' Medicion del eje x mems ' Medicion del eje y mems
side angleTilt sign
VAR VAR VAR
Word Word Bit
' dispara variable de subrutina ' resultado angulo - grados ' bit de Signo
xCompass yCompass status angleCompass
VAR VAR VAR VAR
Word Word Nib Word
' ' ' '
datos del eje x datos del eje y banderas de Status 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 PULSIN 7, 1, yTilt
' medicion del eje x ' 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 angleCompass = angleCompass */ 361
' Convierte x y y a brads ' Convierte brads a grados
DEBUG CR, "Compass angle = ", DEC angleCompass, " degrees", CLREOL PAUSE 150 LOOP
' Retraso de Debug para alentar PCs ' 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: GOSUB Arccosine angleTilt = 90 - angleTilt RETURN
' Subrutina seno inverso ' Obtiene coseno inverse ' sin(angle) = cos(90 - angle)
' -----[ 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: sign = side.BIT15 side = ABS(side) angleTilt = 63 - (side / 2) DO
' ' ' ' '
Subrutina coseno inverso Salva el signo de side Evalua side positivo Aproximacion inicial de angulo Ciclo de aproximacion sucesiva
Chapter 4: El módulo de brújula Hitachi HM55B · Page 165
IF (COS angleTilt <= side) THEN EXIT angleTilt = angleTilt + 1 ciclo angleTilt = angleTilt */ 361 IF sign = Negative THEN angleTilt = 180 - angleTilt ENDIF RETURN
' Hecho cuando COS angle <= side ' Incrementa angulo ' Convierte brads a grados ' Ajusta si el signo es negativo.
' -----[ Subroutine - Compass_Get_Axes ]-----------------------------------Compass_Get_Axes: HIGH En: LOW En SHIFTOUT DinDout,clk,MSBFIRST,[Reset\4]
' Subrutina módulo de brújula ' Manda comando reset a HM55B
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 52), 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 y temp
VAR VAR VAR
Word Word Byte
Página 170 · Sensores Inteligentes y sus Aplicaciones
DEBUG CLS, "0123456789X", "1 ", "2 ", "3 ", "4 ", "5 ", "Y ",
CR, CR, CR, CR, CR, CR, 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 X = x MIN 1 DEBUG CRSRXY, x, y, "*"
' <--- Add ' <--- Add
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 y temp
VAR VAR VAR
Word Word Byte
Capítulo 5: Fundamentos de juegos con el Acelerómetro· Page 173
DEBUG CLS, " 3| ", " 2| ", " 1| ", "------+------", "-3-2-1| 1 2 3", " -2| ", " -3| ",
CR, CR, CR, CR, CR, CR, 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, "*" ' ' <--- hasta aquí
ENDIF 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
(3, 1)
3
(-2, -2)
-2
Después
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 5 K =2
K=
(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
(3, 1)
1
(-2, -2)
-2
Después
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 redibujado. 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, " 3| ", " 2| ", " 1| ", "------+------", "-3-2-1| 1 2 3", " -2| ", " -3| ",
CR, CR, CR, CR, CR, CR, CR, CR
' ' ' ' ' ' ' '
0 14 28 42 56 70 84 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} '{$PBASIC 2.5} index character
' directivas
VAR VAR
DATA CLS, " 3| ", " 2| ", " 1| ", "------+------", "-3-2-1| 1 2 3", " -2| ", " -3| ",
CR, CR, CR, CR, CR, CR, CR, CR
Byte Byte
Stamp & PBASIC
' Variables
' ' ' ' ' ' ' '
0 14 28 42 56 70 84 98 + 1 = 99
FOR index = 0 TO 99 READ index, character DEBUG character NEXT
' Guarda fondo en EEPROM
' Recupera y despliega fondo
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 y
VAR VAR
Word Word
xOld yOld
VAR VAR
Nib Nib
temp
VAR
Byte
' <--- Agregue ' <--- Agregue
(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 yOld = y
' <--- Agregue ' <--- 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, "Current entry: (", DEC x, ",", DEC y, ")" DEBUG CRSRXY, 0, 11, "Previous entry: (", DEC xOld, ",", DEC yOld, ")" DEBUG CRSRXY, 0, 12, "Press any Key..."
' <--- Agregue ' <--- Agregue ' <--- 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 index = (14 * yOld) + xOld + 1 READ index, character DEBUG CRSRXY, xOld, yOld, character ENDIF
' ' ' '
Ve si el asterisco se movio Direccion de caracter de fondo Obtiene caracter de fondo Muestra caracter de fondo
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} '{$PBASIC 2.5}
' directivas
Stamp/PBASIC
' -----[ Variables ]------------------------------------------------------x y
VAR VAR
Word Word
' Guarda posicion presente
xOld yOld
VAR VAR
Nib Nib
' Guarda posicion previa
P谩gina 186 路 Sensores Inteligentes y sus Aplicaciones
temp
VAR
Byte
' Variable tonta para DEBUGIN
index character
VAR VAR
Byte Byte
' READ index/caracter storage
' -----[ Datos de EEPROM]----------------------------------------------------DATA CLS, " 3| ", " 2| ", " 1| ", "------+------", "-3-2-1| 1 2 3", " -2| ", " -3| ",
' Datos de fondo CR, CR, CR, CR, CR, CR, CR, CR
' ' ' ' ' ' '
14 28 42 56 70 84 98 + 1 = 99
' -----[ Inicializacion ]-------------------------------------------------FOR index = 0 TO 99 READ index, character DEBUG character NEXT
' Despliega fondo
' -----[ Rutina Principal ]--------------------------------------------------DO xOld = x yOld = y
' Guarda coordenadas previas
DEBUG "Type X coordinate: " DEBUGIN SDEC1 x DEBUG CR, "Type Y coordinate: " DEBUGIN SDEC1 y
' Obtiene nuevas coordenadas
x = (x * 2) + 6 y = 3 - y
' valores Cartesianos a DEBUG
DEBUG CRSRXY, x, y, "*"
' Despliega asterisco
IF (x <> xold) y (y <> yold) THEN index = (14 * yOld) + xOld + 1 READ index, character DEBUG CRSRXY, xOld, yOld, character ENDIF DEBUG CRSRXY, 0, 10, "Press any Key..." DEBUGIN temp DEBUG CRSRXY, 0, 8, CLRDN LOOP
' ' ' '
Checa si el asterisco se movio Direccion de caracter de fondo Obtiene caracter de fondo Muestra caracter de fondo
' Espera al usuario ' Limpia informacion vieja
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 READ index, character DEBUG CRSRXY, x, y, character
' Re-despliega fondo
DEBUG CRSRXY, 0, 8, "Type X coordinate: " DEBUGIN SDEC1 x DEBUG CR, "Type Y coordinate: " DEBUGIN SDEC1 y
' Obtiene nuevas coordenadas
x = (x * 2) + 6 y = 3 - y
' Valores de cartesiano a DEBUG
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 Right
(-3, 0)
Tilt Left
(3, 0)
Tilt Down
(0, -3)
Tilt Up
(0, 3)
Figura 5-12: Inclinación del Acelerómetro y Posición del Cursor
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} '{$PBASIC 2.5}
' Stamp/PBASIC directives
' -----[ Datos EEPROM]-------------------------------------------------------' Guarda fondo en EEPROM DATA CLS, " 5^Y ", " 4| ", " 3| ", " 2| ", " 1| X", "----------+--------->", "-5-4-3-2-1| 1 2 3 4 5", " -2| ", " -3| ", " -4| ", " -5| ",
' Direccion del ultimo caracter en el renglon
CR, CR, CR, CR, CR, CR, CR, CR, CR, CR, CR
' ' ' ' ' ' ' ' ' ' ' '
0 22 44 66 88 110 132 154 176 198 220 242
Página 192 · Sensores Inteligentes y sus Aplicaciones
' -----[ Variables ]---------------------------------------------------------x y
VAR VAR
index char
VAR VAR
Word Word Word Byte
' Guarda posición presente
' READ index/caracter storage
' -----[ Inicializacion ]----------------------------------------------------FOR index = 0 TO 242 READ index, char DEBUG char NEXT
' Lee y despliega fondo
' -----[ 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 PULSIN 7, 1, y
' Obtiene Ax y Ay
' x y y
' Calcula posicion x ' Calcula posicion y
Calcula posicion del cursor. = (x MIN 1875 MAX 3125) - 1875 ** 1101 = (y MIN 1875 MAX 3125) - 1875 ** 576 = 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 PULSIN 7, 1, y
' Obtiene Ax y Ay
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: ' x y y
Calcula posicion del cursor. = (x MIN 1875 MAX 3125) - 1875 ** 1101 = (y MIN 1875 MAX 3125) - 1875 ** 576 = 10 - y
' Calcula posicion x ' Calcula posicion 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 DEBUG CRSRXY, x, CRSRXY, x MAX 19 + 1, CRSRXY, x, CRSRXY, x MIN 1 - 1, CRSRXY, x, PAUSE 50
√
nueva posicion del cursor (modificado). y, "*", y, "*", y MAX 9 + 1, "*", y, "*", y MIN 1 - 1, "*"
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} '{$PBASIC 2.5}
' directivas
Stamp/PBASIC
' -----[ Datos EEPROM ]------------------------------------------------------' Guarda fondo en EEPROM ' 3 fondos usados en el juego Maze DATA @0, HOME, "#####################", "###### $ ########", "## ### ###", "# ########### ###", "#$ # ####", "##### # $ #####WIN", "# ## ## $ #", "# $ ########### # #", "# ##$## # #", "# ######## #", "#####################",
CR, CR, CR, CR, CR, CR, CR, CR, CR, CR, CR
' Fondo de laberinto
YouLose DATA @243, HOME, "#####################", "#####################", "### ####### ####", "### ####### ####", "#####################",
CR, CR, CR, CR, CR,
' Fondo YouLose
Cap铆tulo 5: Fundamentos de juegos con el Aceler贸metro路 Page 199
"########## ##########", "#####################", "### ####", "### YOU LOSE ####", "### ####", "#####################",
CR, CR, CR, CR, CR, CR
YouWin DATA @486, HOME, " ########### ", " ################# ", "##### ##### #####", "#### ### ####", "# ### ##### ### #", "# ############### #", "## ########### ##", "## ##", " #### YOU WIN #### ", " #### #### ", " ######### ",
CR, CR, CR, CR, CR, CR, CR, CR, CR, CR, CR
' Fondo YouWin
' -----[ Variables ]---------------------------------------------------------x VAR Word ' coordenadas de grafica e inclinacs. x & y y VAR Word index char
VAR VAR
Word Byte
' Direccion EEPROM y caracter
symbol points
VAR VAR
Word Byte
' Direccion simbolo para EEPROM DATA ' 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 READ index + symbol, char DEBUG char NEXT
' Despliega laberinto
' -----[ 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 y = (y MIN 1875 MAX 3125) - 1875 ** 576 y = 10 - y
' Calcula posicion x ' Calcula posicion 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, "Score: ", DEC3 points
' Despliega puntaje
' ¿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, "#####################", "###### $ ########", · · · YouLose DATA @243, HOME, "#####################", "#####################", · · · YouWin DATA @486, HOME, " ########### ", " ################# ", · ·
CR, CR,
CR, CR,
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 points
VAR VAR
Word 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, "Score: ", DEC3 points
' Despliega puntaje
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 READ index + symbol, char IF(char = "%") THEN char = "$" WRITE index + symbol, char ENDIF DEBUG char NEXT
√
' Despliega laberinto ' ' ' '
<--<--<--<---
Agregue Agregue Agregue Agregue
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 y
VAR VAR
Word Word
xOld yOld
VAR VAR
Word Word
' <--- Agregue ' <--- Agregue
Agregue líneas de inicialización para xOld y yOld. x xOld y yOld
√
' coordenadas de grafica e inclinacs. x & y
= = = =
10 10 5 5
' Inicia caracter de juego en medio ' <--- Agregue ' <--- 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 IF (x < xOld) THEN x = xOld MIN 1 - 1
' <--- Agregue ' <--- Agregue
IF (y > yOld) THEN y = yOld MAX 9 + 1 IF (y < yOld) THEN y = yOld MIN 1 - 1
' <--- Agregue ' <--- Agregue
' Display asterisco at new posición. DEBUG CRSRXY, x, y, "*" PAUSE 50
' Despliega asterisco ' Pausa nuevamente por parpadeo
xOld = x yOld = y
' <--- Agregue ' <--- 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. Q2. Q3. Q4.
Dispositivo de interface humana (en inglés Human interface device). CLRDN. DEBUGIN DEC1 x.
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| ", " 1| ", "----+----", "-2-1| 1 2", " -2| ",
CR, CR, CR, CR, 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 y
VAR VAR
Byte 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. tan θ =
opposite 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 RecordsEnd
DATA DATA
(10)
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 Contents
00
00
00
00
00
00
00
00
00
00
00
00
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
Receive Windowpane
√ √ √
Figura 6-2 Introduciendo valores para EepromDataStorage. bs2
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 RecordsEnd
DATA DATA
(10)
' -----[ Variables ]---------------------------------------------------------char eeIndex value
VAR VAR VAR
Byte Word 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 Records RecordsEnd
DATA DATA DATA
0 (10)
' -----[ Variables ]---------------------------------------------------------char eeIndex value
VAR VAR VAR
Byte Word 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 Records RecordsEnd
DATA DATA DATA
0 (1000)
' -----[ Variables ]---------------------------------------------------------char eeIndex value x y
VAR VAR VAR VAR VAR
Byte Word Word value 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 CR, "----CR
√
angle ", ------",
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 Backward
Decelerate RC Car Forw ard and Backw ard 30 20
gravity/100
10 0 0
50
100
150
200
250
-10 -20 -30
Stop
300
Figura 6-5 Mediciones del eje y del Acelerómetro en el Carro RC
-40 seconds/30
Accelerate Forward
Decelerate
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 Circles
Straighten Out RC Car Left then Right
60 40
Figura 6-8 Mediciones del Acelerómetro en el Carro RC mientras se maneja en círculos
gravity/100
20 0 0
100
200
300
400
500
600
-20 -40 -60 -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
f
3 2.5
gravity (g)
2 1.5 1 0.5 0 170 -0.5
190
210
230
250
270
Figura 6-15 Aceleración durante un Ollie
-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 3
f
2.5
gravity, (g)
2 1.5 1 0.5 0 775 -0.5
795
815
835
855
875
Figura 6-16 Gráfica de un Ollie ligeramente mejor
-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 Records RecordsEnd
DATA DATA DATA
0 (1000)
' -----[ Variables ]---------------------------------------------------------char eeIndex value x y
VAR VAR VAR VAR VAR
Byte Word Word value 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 CR, "----CR
x-axis ------
y-axis", ------",
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 618. 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 y counter
VAR VAR VAR
DEBUG CLS DO DO UNTIL y > 2650
Word Word Word
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 2 1.5
gravity, g
1 0.5 0 -0.5
0
100
200
300
400
500
600
700
800
900
1000
-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 Records RecordsEnd
DATA DATA DATA
0 (1000)
' -----[ Variables ]---------------------------------------------------------char eeIndex value x y
VAR VAR VAR VAR VAR
Byte Word Word value 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 SEROUT 14, 84, [22, 12] PAUSE 5
' Estabiliza la fuente de energia ' Inicia LCD & limpia la pantalla ' 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
Char9
DATA
. . . %11111, %00011, %11011, %11011, %11111, %11111, %11111, %11111 . . . %11111, %11111, %11111, %11111, %11011, %11011, %11000, %11111 . . .
' ' ' ' ' ' ' '
* 0 * * * * * *
* 0 * * * * * *
* 0 0 0 * * * *
* * * * * * * *
* * * * * * * *
' ' ' ' ' ' ' '
* * * * * * * *
* * * * * * * *
* * * * 0 0 0 *
* * * * * * 0 *
* * * * * * 0 *
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} ' {$PBASIC 2.5}
' Dispositivo Objeto ' Lenguaje
= BASIC Stamp 2 = PBASIC 2.5
' -----[ Datos EEPROM]-------------------------------------------------------Char0
DATA
%11111, %01111, %11111, %11111, %11111, %11111, %11111,
' ' ' ' ' ' '
* 0 * * * * *
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *
Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 265
%11111
' * * * * *
Char1
DATA
%11111, %00111, %11111, %11111, %11111, %11111, %11111, %11111
' ' ' ' ' ' ' '
* 0 * * * * * *
* 0 * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * * *
Char2
DATA
%11111, %00011, %11111, %11111, %11111, %11111, %11111, %11111
' ' ' ' ' ' ' '
* 0 * * * * * *
* 0 * * * * * *
* 0 * * * * * *
* * * * * * * *
* * * * * * * *
Char3
DATA
%11111, %00011, %11011, %11111, %11111, %11111, %11111, %11111
' ' ' ' ' ' ' '
* 0 * * * * * *
* 0 * * * * * *
* 0 0 * * * * *
* * * * * * * *
* * * * * * * *
Char4
DATA
%11111, %00011, %11011, %11011, %11111, %11111, %11111, %11111
' ' ' ' ' ' ' '
* 0 * * * * * *
* 0 * * * * * *
* 0 0 0 * * * *
* * * * * * * *
* * * * * * * *
Char5
DATA
%11111, %10011, %11011, %11011, %11011, %11111, %11111, %11111
' ' ' ' ' ' ' '
* * * * * * * *
* 0 * * * * * *
* 0 0 0 0 * * *
* * * * * * * *
* * * * * * * *
Char6
DATA
%11111, %11011, %11011, %11011,
' ' ' '
* * * *
* * * *
* 0 0 0
* * * *
* * * *
P谩gina 266 路 Sensores Inteligentes y sus Aplicaciones
%11011, %11011, %11111, %11111
' ' ' '
* * * *
* * * *
0 0 * *
* * * *
* * * *
Char7
DATA
%11111, %11111, %11011, %11011, %11011, %11011, %11011, %11111
' ' ' ' ' ' ' '
* * * * * * * *
* * * * * * * *
* * 0 0 0 0 0 *
* * * * * * * *
* * * * * * * *
Char8
DATA
%11111, %11111, %11111, %11011, %11011, %11011, %11001, %11111
' ' ' ' ' ' ' '
* * * * * * * *
* * * * * * * *
* * * 0 0 0 0 *
* * * * * * 0 *
* * * * * * * *
Char9
DATA
%11111, %11111, %11111, %11111, %11011, %11011, %11000, %11111
' ' ' ' ' ' ' '
* * * * * * * *
* * * * * * * *
* * * * 0 0 0 *
* * * * * * 0 *
* * * * * * 0 *
Char10
DATA
%11111, %11111, %11111, %11111, %11111, %11011, %11000, %11111
' ' ' ' ' ' ' '
* * * * * * * *
* * * * * * * *
* * * * * 0 0 *
* * * * * * 0 *
* * * * * * 0 *
Char11
DATA
%11111, %11111, %11111, %11111, %11111, %11111, %11000, %11111
' ' ' ' ' ' ' '
* * * * * * * *
* * * * * * * *
* * * * * * 0 *
* * * * * * 0 *
* * * * * * 0 *
Char12
DATA
%11111,
' * * * * *
Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 267
%11111, %11111, %11111, %11111, %11111, %11100, %11111
' ' ' ' ' ' '
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * 0 *
* * * * * 0 *
Char13
DATA
%11111, %11111, %11111, %11111, %11111, %11111, %11110, %11111
' ' ' ' ' ' ' '
* * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * 0 *
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 LcdCls LcdCr LcdOff LcdOn Line0 Line1 Define
CON CON CON CON CON CON CON CON
84
' True, 8-bits, no parity, 9600 12 13 21 22 128 148 248
' ' ' ' ' ' '
Form feed -> limpia pantalla Retorno de carro Apaga la pantalla Enciende la pantalla Linea 0, caracter 0 Linea 1, caracter 0 direccion define caract pers 0
' -----[ Variables ]---------------------------------------------------------custChar index charBase dotLine cursor counter line
VAR VAR VAR VAR VAR VAR VAR
Nib Nib Byte Byte Nib Nib Byte
' selector de carcter personalizado ' variable indice Eeprom ' Caracter base para READ ' linea punteada de 5-pixel ' Colocacion de Cursor ' variable de conteo ciclo ppal. ' Linea0 o Linea1
P谩gina 268 路 Sensores Inteligentes y sus Aplicaciones
' -----[ Inicializaci贸n ]----------------------------------------------------PAUSE 100 SEROUT LcdPin, T9600, [LcdOn, LcdCls] PAUSE 5 custChar = 2 line = Line0
' Estabiliza fuente de poder ' Inicializa LCD ' 5 ms retraso para limpiar pantalla ' Selecc caracter personalizado 2 ' BarGraph en Linea 0.
' -----[ Rutina Principal ]--------------------------------------------------DO
' Ciclo Principal FOR charBase = Char0 TO Char14 STEP 8 GOSUB Def_Cust_Char cursor = 7 GOSUB Disp_Cust_Char PAUSE 200 '- charBase NEXT
' ' ' ' ' '
PAUSE 1000
' Pausa 1 segundo
LOOP
Va los 10 caracteres personal. Define el caracter Coloca the cursor Imprime el caracter charbase mayor - pausa menor Repite FOR charbase...
' 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 + custChar] FOR index = 0 TO 7 READ charBase + index, dotLine SEROUT LcdPin, T9600, [dotLine] NEXT
' Define caracter personalizado ' 7 bytes, define 7 lineas punteadas ' Obtiene byte para linea punteada ' Lo manda a la LCD
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} ' {$PBASIC 2.5}
' Dispositivo Objeto ' Lenguaje
= BASIC Stamp 2 = 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 LcdCls LcdCr LcdOff LcdOn Line0 Line1 Define
CON CON CON CON CON CON CON CON
84
' True, 8-bits, no parity, 9600 12 13 21 22 128 148 248
' ' ' ' ' ' '
Form feed -> limpia pantalla Retorno de carro Apaga la pantalla Enciende la pantalla Linea 0, caracter 0 Linea 1, caracter 0 direccion define caract pers 0
' -----[ Variables ]---------------------------------------------------------custChar index dotLine cursor value charCnt line
VAR VAR VAR VAR VAR VAR VAR
Nib Nib Byte Nib Byte Byte Byte
' selector de carcter personalizado ' variable indice Eeprom ' linea punteada de 5-pixel ' Colocacion de Cursor ' Valor a ser graficado ' variable para conteo Caracter ' Linea0 o Linea1
' -----[ inicializaci贸n ]----------------------------------------------------PAUSE 100 SEROUT LcdPin, T9600, [LcdOn, LcdCls] PAUSE 5 custChar = 3 dotLine = %11111 GOSUB Def_Horiz_Bar_Char line = Line0
' Estabiliza fuente de poder ' Initializa LCD ' 5 ms retraso para limpiar pantalla
' Selecciona caracter personalizado 3 ' Oscurece todos los pixeles en cada linea ' Subrutina define Caracter ' BarGraph en Linea 0.
DEBUG "Enter valores (0 to 80)", CR ' -----[ Main Rutina ]------------------------------------------------------DO
' Ciclo Principal DEBUG ">" DEBUGIN DEC value GOSUB Bar_Graph
LOOP
' Valor en ventana de Transmision ' Despliega como grafica de barra ' 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 charCnt = value / 5 custChar = 3 IF charCnt > 0 THEN FOR cursor = 0 TO charCnt - 1 GOSUB Disp_Cust_Char NEXT ENDIF
' valor Limite - 0 a 80 ' número de barras negras ' Escoge caracter pers. negro ' Si escribe barras negras… ' Escribe charCnt - 1 barras negras ' Escribe la barra negra
' 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 + custChar] FOR index = 0 TO 7 SEROUT LcdPin, T9600, [dotLine] NEXT RETURN
' Define caracter personalizado ' 7 bytes, define 7 lineas punteadas ' Manda a la LCD
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, [line + cursor, custChar] RETURN
' Escribe caracter personalizado
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 dotLine = %11111 GOSUB Def_Horiz_Bar_Char
' Selecciona caracter personalizado 3 ' Oscurece todos los pixeles en cada linea ' 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 GOSUB Bar_Graph
LOOP
' Valor en ventana de Transmision ' Despliega como grafica de barra ' 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 charCnt = value / 5 custChar = 3
' valor Limite - 0 to 80 ' número de barras negras ' Escoge caracter pers. negro
IF charCnt > 0 THEN FOR cursor = 0 TO charCnt - 1 GOSUB Disp_Cust_Char NEXT ENDIF
' Si escribe barras negras… ' Escribe charCnt - 1 barras negras ' Escribe la barra negra
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 custChar = value // 5 ' Escoge patron de bits para la LOOKUP custChar, [%00000, %10000, %11000, dotLine custChar = 2 ' GOSUB Def_Horiz_Bar_Char GOSUB Disp_Cust_Char
' Coloca cursor ' ¿Cuantos quintos de barra? definicion de caracter personalizado %11100, %11110], Establece caracter personalizado en 2 ' Define el caracter personalizado ' 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} ' {$PBASIC 2.5}
' Dispositivo Objeto ' Lenguaje
= BASIC Stamp 2 = 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 LcdOn Line0 Line1 Define
CON CON CON CON CON
12 22 128 148 248
' ' ' ' '
Form feed -> limpia pantalla Enciende la pantalla Linea 0, caracter 0 Linea 1, caracter 0 direccion define caract pers 0
' -----[ Variables ]---------------------------------------------------------custChar index rowMap cursor value line
VAR VAR VAR VAR VAR VAR
Byte Nib Byte Byte Byte Byte
' selector de carcter personalizado ' variable indice Eeprom ' linea punteada de 5-pixel ' Colocacion de Cursor ' Valor a ser graficado ' 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] PAUSE 5
' Inicializa LCD ' 5 ms retraso para limpiar pantalla
' subrutina valores Caracter personalizado. custChar = 3 line = Line0 cursor = 7
' Use caracter personalizado 3 ' Cursor a Linea0 ' Cursor a 8avo caracter
' -----[ Rutina Principal ]--------------------------------------------------DO
' Ciclo Principal FOR value = 0 TO 16 DEBUG ? value GOSUB Def_Vert_Bar_Char GOSUB Disp_Cust_Char PAUSE 50 NEXT DEBUG CR, CR PAUSE 500
LOOP
' value cuenta de 0 a 16 ' Muestra value en Terminal de Depuraci贸n ' Define caracter de grafica de barra ' Muestra caracter en la LCD ' Hace lento al ciclo
' espacios antes sig. secuencia ' Retraso antes sig. secuencia ' 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, [line + cursor, custChar] RETURN
' Escribe caracter personalizado
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} ' {$PBASIC 2.5}
' Dispositivo Objeto ' Lenguaje
= BASIC Stamp 2 = PBASIC 2.5
' -----[ Pins E/S]----------------------------------------------------------LcdPin
PIN
14
' pin E/S conectado a RX de la LCD
' -----[ Constants ]---------------------------------------------------------T9600 LcdCls LcdCr LcdOff LcdOn Line0 Line1 Define
CON CON CON CON CON CON CON CON
84
' True, 8-bits, no parity, 9600 12 13 21 22 128 148 248
' ' ' ' ' ' '
Form feed -> limpia pantalla Retorno de carro Apaga la pantalla Enciende la pantalla Linea 0, caracter 0 Linea 1, caracter 0 direccion define caract pers 0
Capítulo 7: Gráficos de Barra en LCD para Distancias e inclinaciones · Page 289
' -----[ Variables ]---------------------------------------------------------custChar index rowMap cursor value line
VAR VAR VAR VAR VAR VAR
Byte Nib Byte Byte Byte Byte
' selector de carcter personalizado ' variable indice Eeprom ' linea punteada de 5-pixel ' Colocacion de Cursor ' Valor a ser graficado ' Linea0 or Linea1
' -----[ Inicialización ]----------------------------------------------------PAUSE 100 SEROUT LcdPin, T9600, [LcdOn, LcdCls] PAUSE 5
' Estabiliza fuente de poder ' Inicializa LCD ' 5 ms retraso para limpiar pantalla
' -----[ Rutina Principal ]--------------------------------------------------DO
' Ciclo Principal DEBUG "Enter horizontal", CR, "value (0 TO 16)" DEBUGIN DEC cursor DEBUG "Enter vertical", CR, "value (1 TO 31)" DEBUGIN DEC value GOSUB Bar_Graph_H_V
LOOP
' Pide posicion de caracter ' Obtiene posicion de caracter ' Pide al usuario valor ' Obtiene valor ' Llama a Bar_Graph_H_V ' 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] PAUSE 5
' Limpia trazado previo ' 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 GOSUB Horizontal_Placement
' Define caracter personalizado
IF value = 16 THEN
' Caso especial: value = 16
value = 1 custChar = 2
' Linea 0 display
Página 290 · Sensores Inteligentes y sus Aplicaciones
GOSUB Def_Vert_Bar_Char line = Line0 GOSUB Horizontal_Placement value = 15 custChar = 3 GOSUB Def_Vert_Bar_Char line = Line1 GOSUB Horizontal_Placement
' Linea 1 Display
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 CASE 0 TO 7 GOSUB Disp_Cust_Char CASE 8 cursor = 7 GOSUB Disp_Cust_Char cursor = 8 GOSUB Disp_Cust_Char CASE 9 TO 16 cursor = cursor - 1 GOSUB Disp_Cust_Char cursor = cursor + 1 ENDSELECT
' Cursor 0 a 7, sin cambios
' Cursor 8, despliega en 7 & 8
' Cursor 9 a 16, despliega 1 izq
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, [line + cursor, custChar] RETURN
' Escribe caracter personalizado
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 y
√
VAR VAR
Word Word
' eje x del Acelerómetro ' 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
LOOP
√
' Llama a Bar_Graph_H_V ' 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 personalizado con ciertas columnas negras? 5. ¿Qué es lo que hace la instrucción IF rowMap.LOWBIT(index) = en TestVerticalBars.bs2? 6. ¿Porqué puede usar solo un byte en vez de 8 para definir personalizado con ciertas columnas negras? 7. ¿Qué es lo que hace la instrucción IF rowMap.LOWBIT(index) = en el programa TestVerticalBars.bs2?
un caracter 1 THEN... do
un caracter 1 THEN... do
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, " cm"]
' Despliega medición 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} ' {$PBASIC 2.5}
' Dispositivo Objeto ' Lenguaje
= BASIC Stamp 2 = PBASIC 2.5
' -----[ Pines E/S]----------------------------------------------------------LcdPin
PIN
14
' pin E/S conectado a RX de la LCD
' -----[ Constants ]---------------------------------------------------------T9600 LcdCls LcdCr LcdOff LcdOn Line0 Line1 Define Negative Positive
CON CON CON CON CON CON CON CON CON CON
84
' True, 8-bits, no parity, 9600 12 13 21 22 128 148 248 1 0
' ' ' ' ' ' '
Form feed -> limpia pantalla Retorno de carro Apaga la pantalla Enciende la pantalla Linea 0, caracter 0 Linea 1, caracter 0 direccion define caract pers 0 ' Signo - .bit15 de variables de palabra
' -----[ Variables ]---------------------------------------------------------custChar index rowMap cursor value line x y sine side angle sign
VAR VAR VAR VAR VAR VAR VAR VAR VAR VAR VAR VAR
Byte Nib Byte Byte Byte Byte Word Word Word Word Word Bit
' selector de carcter personalizado ' variable indice Eeprom ' linea punteada de 5-pixel ' Colocacion de Cursor ' Valor a ser graficado ' Linea0 or Linea1
' ' ' '
seno en circulo r = 127 variable para disparo de subrutinas resultado angulo - grados 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 LOOP
' Llama Bar_Graph_H_V ' 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] PAUSE 5
' Limpia trazado previo ' 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 GOSUB Horizontal_Placement
' Define caracter personalizado
IF value = 16 THEN
' Caso especial: value = 16
Página 300 · Sensores Inteligentes y sus Aplicaciones
value = 1 custChar = 2 GOSUB Def_Vert_Bar_Char line = Line0 GOSUB Horizontal_Placement
' Despiega Linea 0
value = 15 custChar = 3 GOSUB Def_Vert_Bar_Char line = Line1 GOSUB Horizontal_Placement
' Despiega Linea 1
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 CASE 0 TO 7 GOSUB Disp_Cust_Char CASE 8 cursor = 7 GOSUB Disp_Cust_Char cursor = 8 GOSUB Disp_Cust_Char CASE 9 TO 16 cursor = cursor - 1 GOSUB Disp_Cust_Char cursor = cursor + 1 ENDSELECT
' Cursor 0 a 7, sin cambios
' Cursor 8, despliega en 7 & 8
' Cursor 9 a 16, despliega 1 izq
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, [line + cursor, custChar] RETURN
' Escribe caracter personalizado
' -----[ 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: GOSUB Arccosine angle = 90 - angle RETURN
' Subrutina Seno Inverso ' Obtiene coseno inverso ' sin(angle) = cos(90 - angle)
' -----[ 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: sign = side.BIT15
' Subrutina Inverso coseno ' Guarda el signo de side
P谩gina 302 路 Sensores Inteligentes y sus Aplicaciones
side = ABS(side) ' angle = 63 - (side / 2) ' DO ' IF (COS angle <= side) THEN EXIT ' angle = angle + 1 ' LOOP angle = angle */ 361 ' IF sign = Negative THEN angle = 180 - angle' RETURN
Evalua side positivo aproximacion inicial al angulo Ciclo de approximation sucesiva Hecho cuando COS angle <= side Mantiene incrementando angulo Convierte brads a grados Ajusta si el signo es negativo.
Apéndice A: Tabla de caracteres ASCII· Page 303
Apéndice A: Tabla de caracteres ASCII Tabla ASCII (primeros 128 caracteres) Dec 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
Hex 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
Char NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
Nombre / Función Null Start Of Heading Start Of Text End Of Text End Of Transmit Enquiry Acknowledge Bell Backspace Horizontal Tab Line Feed Vertical Tab Form Feed Carriage Return Shift Out Shift In Data Line Escape Device Control 1 Device Control 2 Device Control 3 Device Control 4 Non Acknowledge Synchronous Idle End Transmit Block Cancel End Of Medium Substitute Escape File Separator Group Separator Record Separator Unit Separator
Dec 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
Hex 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
Char space ! " # $ % & ' ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
Dec 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
Hex 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
Char @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _
Dec 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
Hex 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
Char ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ 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 Rocklin, California 95765, USA Office: (916) 624-8333 Fax: (916) 624-8003
General: info@parallax.com Técnico: support@parallax.com Web Site: www.parallax.com 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 Todos los modelos, luz de fondo apagada Luz de fondo encendida 27977 / 27979
Voltaje 5 VDC 5 VDC
Corriente 20 mA 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 Tipo de pantalla LCD Dirección de observación Luz de fondo Temperatura de Operación Temperatura de almacenaje Tolerancia dimensional
Descripción STN, YG, positive, transflective 6H YG LED -4°F~158°F (-20°C~70°C) -22°F~176°F (-30°C~80°C) ±.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 Test 2,400 9,600 19.200
SW1 OFF ON OFF ON
SW2 OFF OFF 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 Baud19200
CON CON
0 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 Baud19200
CON CON
0 32
HIGH TxPin PAUSE 100
' Establece pin en alto para ser un puerto serial ' Pausa para que LCD Serial inicialize
SEROUT TxPin, Baud19200, [250] SEROUT SEROUT SEROUT SEROUT SEROUT SEROUT SEROUT SEROUT SEROUT
TxPin, TxPin, TxPin, TxPin, TxPin, TxPin, TxPin, TxPin, TxPin,
Baud19200, Baud19200, Baud19200, Baud19200, Baud19200, Baud19200, Baud19200, Baud19200, Baud19200,
[0] [4] [14] [31] [14] [4] [0] [0] [2]
' ' ' ' ' ' ' ' ' '
Define caracter personalizado 2 Ahora envia los 8 bytes de datos 0 = %00000 4 = %00100 * 14 = %01110 * * * 31 = %11111 * * * * * 14 = %01110 * * * 4 = %00100 * 0 = %00000 0 = %00000 ' 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
8
08
9
09
10
0A
11
0B
12
0C
13
0D
Despliega el caracter personalizado 7 Backspace / Left - El cursor es movido una posición a la izquierda. El comando no borra el caracter. Right - El cursor es movido una posición a la derecha. El comando no borra el caracter. Line Feed - El cursor es movido hacia abajo una línea. Para los modelos LCD de 2 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. N/A Form Feed - El cursor es movido a la posición 0 en la línea 0 y toda la pantalla es 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 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. N/A
14 - 16
0E - 10
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 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
Hex 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4
Action Mueve el cursor a la línea 0, posición 7 Mueve el cursor a la línea 0, posición 8 Mueve el cursor a la línea 0, posición 9 Mueve el cursor a la línea 0, posición 10 Mueve el cursor a la línea 0, posición 11 Mueve el cursor a la línea 0, posición 12 Mueve el cursor a la línea 0, posición 13 Mueve el cursor a la línea 0, posición 14 Mueve el cursor a la línea 0, posición 15 Mueve el cursor a la línea 0, posición 16 (solo el modelo 27979) Mueve el cursor a la línea 0, posición 17 (solo el modelo 27979) Mueve el cursor a la línea 0, posición 18 (solo el modelo 27979) Mueve el cursor a la línea 0, posición 19 (solo el modelo 27979) Mueve el cursor a la línea 1, posición 0 Mueve el cursor a la línea 1, posición 1 Mueve el cursor a la línea 1, posición 2 Mueve el cursor a la línea 1, posición 3 Mueve el cursor a la línea 1, posición 4 Mueve el cursor a la línea 1, posición 5 Mueve el cursor a la línea 1, posición 6 Mueve el cursor a la línea 1, posición 7 Mueve el cursor a la línea 1, posición 8 Mueve el cursor a la línea 1, posición 9 Mueve el cursor a la línea 1, posición 10 Mueve el cursor a la línea 1, posición 11 Mueve el cursor a la línea 1, posición 12 Mueve el cursor a la línea 1, posición 13 Mueve el cursor a la línea 1, posición 14 Mueve el cursor a la línea 1, posición 15 Mueve el cursor a la línea 1, posición 16 (solo el modelo 27979) Mueve el cursor a la línea 1, posición 17 (solo el modelo 27979) Mueve el cursor a la línea 1, posición 18 (solo el modelo 27979) Mueve el cursor a la línea 1, posición 19 (solo el modelo 27979) Mueve el cursor a la línea 2, posición 0 (solo el modelo 27979) Mueve el cursor a la línea 2, posición 1 (solo el modelo 27979) Mueve el cursor a la línea 2, posición 2 (solo el modelo 27979) Mueve el cursor a la línea 2, posición 3 (solo el modelo 27979) Mueve el cursor a la línea 2, posición 4 (solo el modelo 27979) Mueve el cursor a la línea 2, posición 5 (solo el modelo 27979) Mueve el cursor a la línea 2, posición 6 (solo el modelo 27979) Mueve el cursor a la línea 2, posición 7 (solo el modelo 27979) Mueve el cursor a la línea 2, posición 8 (solo el modelo 27979) Mueve el cursor a la línea 2, posición 9 (solo el modelo 27979) Mueve el cursor a la línea 2, posición 10 (solo el modelo 27979) Mueve el cursor a la línea 2, posición 11 (solo el modelo 27979) 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 10 Base 16 Base 2
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
00 00
00 01
00 10
00 11
01 00
01 01
01 10
01 11
10 00
10 01
10 10
10 11
11 00
11 01
11 10
11 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 Binario
8 1000
F 1111
E 6 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 Hexadecimal
1100 C
0110 6
0000 1001 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 SEROUT 14, 84, [22, 12] PAUSE 5
' Estabiliza la fuente de energia ' Enciende y limpia la pantalla ' 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 negativa (-). El voltaje en la terminal (+) del capacitor debe ser siempre mayor 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 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.
Símbolo del Capacitor
10 µF
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-
acceleration, 65 on a circular path, 233 RC car study, 230 skateboard trick study, 240
accelerometer and LCD tilt bubble graph, 188 measuring height, 211 MX2125 design (picture), 67 schematic and wiring diagram, 68 three-axis, 66
animation
bicycle distance measurement, 247 binary radians (brads), 101 converting to degrees, 87
-C-
capacitor safety, 322 Cartesian coordinates, 174 Celsius to Fahrenheit conversion, 59 clamping input range, 78 CLREOL, 96 collision, 65 compass (drawing), 129 compass module, Hitachi HM55B, 119 calibration, 128 interpreting measurements, 119
flashing text, 11
magnet cautions, 125
pixel worm custom characters, 264
schematic and wiring diagram, 121
arccosine, 99 arcsine, 99 arctangent, 92 ATN, 85, 127 -B-
bar graph horizontal, 271 two-axis, 291 vertical, 281
bar magnet, 125 baud rate, 7 baud rate switches for LCD, 6
sensing axes, 120 testing, 121
computer system requirements, 321 contrast adjustment for LCD, 7 conversion binary radians to degrees, 87 Fahrenheit to Celsius temperature, 59
coordinate systems, 174 COS, 100 counting wheel revolutions, 248 CR, 10 CRSRXY, 8, 168 custom characters
Page 324 路 Smart Sensors y Applications
-L-
hourglass animation, 24 pixel worm animation, 264
LCD
predefined in Parallax Serial LCD, 19
and accelerometer tilt bubble graph, 188
swapping, 261
baud rate switches, 6
-D-
DATA, 180, 213, 223 deadband, 249 declination, 124 degree symbol in ASCII, 143 display coordinates, 174 -E-
EEPROM, 262 -F-
Fahrenheit to Celsius conversion, 59 -G-
Gelfand, Alan (Ollie), 241 graphic character display, 168 gravity, 65 -H-
hardware requirements, 321 hexadecimal, 22, 317 hexadecimal to binary conversion, 319 HIDs (Human Interface Devices), 167 horizontal bar graph, 271 household items required, 321 hysteresis, 248 -I-
inclination, 124 incline, 65 input range clamping, 78
cautions for older models, 4 contrast adjustment, 7 control codes, 9 creating custom characters, 264 defining custom characters, 20 horizontal bar graph, 271 mounting brackets, 153 Parallax Serial LCD Documentation, 305 predefined custom characters, 19 scrolling text, 25 scrolling text in window, 30 two-axis bar graph, 291 vertical bar graph, 281
-M-
MIN, 196 -N-
negative numbers and PBASIC, 174 negative numbers in PBASIC division, 145
-O-
ollie, 241 oscillations, 242 -P-
Parts Kit component listing, 322
Índice · Page 325
percent error measurements, 59 Ping))) sensor, 41
LcdTimer.bs2, 17 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 Programs BikeWheelAcceleration.bs2, 251 BradsToDegrees.bs2, 90 BubbleGraph.bs2, 191 CalibrateCompass.bs2, 132 ConvertBinaryToHexadecimal.bs2, 318 CrsrxyPlot.bs2, 169 CursorPositions.bs2, 15 DatalogAcceleration.bs2, 226 DatalogYaxisUnscaled.bs2, 244 EepromBackgroundDisplay.bs2, 181 EepromBackgroundRefresh.bs2, 185 EepromDataStorage.bs2, 216 EepromDataStorageWithReset.bs2, 221 EepromPixelWorm.bs2, 264 HorizBarGraph.bs2, 273 HorizontalTilt.bs2, 108 Hourglass.bs2, 23 LcdTestCompass.bs2, 155 LcdTestMessage.bs2, 10 LcdTestNumbers.bs2, 12
SignedNumbers.bs2, 81 SimpleTilt.bs2, 70 SimpleTiltLcd.bs2, 74 SineCosine.bs2, 101 TestArcsine.bs2, 103 TestAtn.bs2, 89 TestCalibratedCompass.bs2, 139 TestCompass.bs2, 122 TestCompassAveraged.bs2, 146 TestScaleOffset.bs2, 78 TestScrollingSubroutine.bs2, 28 TestVerticalBars.bs2, 283 TestWheelCounter.bs2, 249 TiltObstacleGame.bs2, 198 TwoAxisBarDisplay.bs2, 287 VertWheelRotation.bs2, 95
PULSIN, 69 -R-
RC car acceleration, 230 READ, 213 Reset button as program switch, 219 rotation, 65, 85, 229
Page 326 · Smart Sensors y Applications
-S-
scaling constant, 77 scaling input values, 76 SEROUT, 8, 317 servo port jumper, 150 signed numbers and PBASIC, 174 signed numbers in PBASIC, 80 division, 145
SIN, 100 sine, 99 software requirements, 321 -T-
temperature unit conversion, 59
tesla (T), 124 tilt game controller, 196 tracking character coordinates, 182 two equations with two unknowns, 176 two’s complement, 174, 196 two-axis bar graph, 291 -V-
vertial bar graph, 281 vibration, 65 -W-
Wainwright, Danny, 241 worm, custom character for LCD, 264 WRITE, 213