scieee AI-readable full text Open interactive document viewer

Desarrollo de una librería en MicroPython para el manejo de una pantalla táctil

Martín Jiménez, Danny

Abstract

El proyecto sobre el que vamos a tratar consiste en la elaboración de una librería , un documento donde se reúnen diversas funciones con el fin de ayudar a futuros programadores para que no tengan que realizar de nuevo las fu nciones ya declaradas, en el entorno de programación MicroPython. Se verá además las ventajas e inconvenientes que nos presenta el lenguaje mencionado, además de la pantalla táctil empleada sobre la que se ha trabajado y elaborado la librería El objetivo de este documento es por un lado servir como complemento al código desarrollado, como por otro parte explicar y desarrollar los posibles usos al igual que los motivos por los que fueron elegidos el modelo de microcontrolador y pantalla en torno a los cuale s se ha elaborado el proyecto.

Full text

Equation Chapter 1 Section 1 Proyecto Fin de Grado Ingeniería Electrónica, Robótica y Mecatrónica Desarrollo de una Librería en MicroPython para el Manejo de una Pantalla Táctil Autor: Danny Martín Jiménez Tutor: Manuel Ángel Perales Esteve Dpto. Teoría de Ingienería Electrónica Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2019 Proyecto Fin de Grado iii Ingeniería de Electrónica, Robótica y Mecatrónica Desarrollo de una Librería en MicroPython para el Manejo de una Pantalla Táctil Autor: Danny Martín Jiménez Tutor: Manuel Ángel Perales Esteve Profesor Contratado Doctor Dpto. de Ingeniería Eléctrica Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2019 Proyecto Fin de Grado: Desarrollo de una Librería en MicroPython para el Manejo de una Pantalla Táctil v Autor: Danny Martín Jiménez Tutor: Manuel Ángel Perales Esteve El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros: Presidente: Vocales: Secretario: Acuerdan otorgarle la calificación de: El Secretario del Tribunal Fecha: A mi familia vii A mis maestros ix Agradecimientos ntes de iniciar el desarrollo del proyecto me gustaría dedicar unas palabras a mi familia, a mi padre, mi madre y mis dos hermanos, por todo el apoyo que me han dado durante los años de carrera, al igual que el apoyo económico que han realizado. También me gustaría valorar a todos los compañeros que he tenido durante el grado, en especial a mis amigos, gracias a ellos he podido afrontar y superar cada obstáculo que se ha presentado en el largo camino hasta aquí. Finalmente deseo agradecer de corazón a todo el magnífico profesorado que he podido disfrutar, y que siempre han tenido tiempo para atender mis necesidades y dudas, y los que tantas cosas me han enseñado, no solo en el ámbito de la carrera sino también en personalidad, ayudándome así a ser mejor persona. Danny Martín Jiménez Sevilla, 2019 A 4.4 Pruebas realizadas 60 5 Conclusiones 61 6 Anexo 62 6.1 Librería completa 62 Referencias 80 Índice de Conceptos 83 Glosario 84 xvii ÍNDICE DE TABLAS Tabla 2-I: Presupuesto del proyecto [10] 31 Tabla 4-I: Operadores empleados 41 Tabla 4-II:Función de color 50 xix ÍNDICE DE FIGURAS Figura 1-1: Anuncio primer ordenador táctil [1] 23 Figura 1-2: PDA Newton [2] 24 Figura 1-3: IBM teléfono inteligente [3] 24 Figura 1-4: Nintendo DS [4] 24 Figura 1-5: Windows XP Tablet Edition [5] 24 Figura 1-6: Funcionamiento pantalla capacitiva [6] 26 Figura 2-1: ESP32 Adafruit [8] 29 Figura 2-2: Pantallas táctiles serie FT800 [9] 30 Figura 3-1: Logotipo de Python [11] 33 Figura 3-2:Página principal Python [12] 34 Figura 4-1: Placa ESP32 [13] 38 Figura 4-2: Visualización de las Teclas [14] 52 Figura 4-3:Scrollbar asociado al ejemplo [15] 56 xxi Notación < Menor o igual > Mayor o igual 1 INTRODUCCIÓN Hoy en día estamos muy acostumbrados a ver por todas partes pantallas táctiles, y cada vez lo analógico se va viendo superado por lo digital. Pero la mayoría de las personas desconocen cuándo y cómo surgió el uso de las pantallas de esta forma, y mucho menos a quién hemos de agradecer por tan útil invento. Necesitamos irnos hasta la época de los sesenta, más concretamente en torno a los años 1965 y 1967, para encontrarnos con lo que sería la primera piedra para la creación de las pantallas táctiles de hoy en día. En aquellos años un inventor británico, E.A. Johnson, comienza a escribir una serie de artículos en los que describía una pantalla táctil capacitiva. Originalmente su idea consistía en aplicar esta tecnología al control aéreo, pero no logró resultados y acabo abandonando su estudio. El siguiente paso no fue realizado hasta los setenta, cuando por fin se patenta el concepto de pantalla táctil a manos del doctor George Samuel Hurst al lograr crear la primera interfaz electrónica táctil en 1971, gracias al sensor “Touch” bajo el nombre de “Elograph” 1 . No fue hasta 1975 cuando Estados Unidos, su lugar de nacimiento, le concede la patente y empieza su desarrollo a mayor escala con la ayuda de Elographics, una empresa que el mismo había creado. A pesar de ello aún había un gran camino que recorrer pue la pantalla en aquel momento no era transparente, pero eso no la privo de ser mencionada como uno de los cien productos tecnológicos más importantes de la época en 1973. Demostrando que desde los inicios se vio el potencial que podría llegar a ser esta tecnología. Al contrario que E.A.Johnson, el doctor Samuel Hurst siempre había tenido la intención de convertir aquella tecnología en un método para leer la información de una forma más fácil, y eso es lo que le hace sacar al mercado la primera pantalla resistiva táctil por 1982, comenzando así la carrera en el mercado de que empresa daría con la tecla de incorporar a sus productos esta tecnología. Un año después, en 1983, sale al mercado el primer ordenador comercial con tecnología táctil en su pantalla de la mano de Hewlett-Packard bajo el nombre de HP-150, en la siguiente imagen podemos observar el anuncio que se realizó en aquel año para promocionarlo. Este ordenador contaba con un ingenioso sistema que detectaba los objetos no transparentes en la pantalla a través de un sistema de transmisores y receptores infrarrojos. Ese sistema no podría considerarse una tecnología táctil como tal sino más bien óptica pero aun así los historiadores le dan el honor de ser la primera vez que la tecnología táctil llegaba de forma comercial, y como es lógico al ser la primera aquella versión tenía muchos 1 Empresa actualmente conocida bajo el nombre de Elo Touch Solutions o ELO para abreviar. Figura 1-1: Anuncio primer ordenador táctil [1] Introducción 24 inconvenientes, como la necesidad de una limpieza minuciosa, y pronto se vio desplazada y mejorada. En los noventa, más concretamente en 1993, la empresa Apple lanzo al mercado la primera PDA táctil llamado Newton y pese a su poco éxito comercial fue la precursora de la incorporación de esta tecnología a dispositivos móviles y otros dispositivos de mano, surgiendo por ello los primeros smartphones. Además contaba con reconocimiento de escritura en la que además se incorporaba un lápiz táctil. En el mismo año IBM lanzó el primer teléfono inteligente, sin ningún botón y con más funciones que simplemente llamar, contaba con funciones de calendario, bloc de notas, beeper 2 , y hasta una PDA y máquina de fax, todo ello mostrado en su pantalla táctil. Tras salir al mercado bajo el nombre IBM Simon fue rápidamente quitado de la venta por varios meses por problemas de software, pero tras volver estuvo en circulación por dos años, cuando dejó de venderse por culpa de su elevado precio y su batería, la cual tenía una escasa duración y no permitía al dispositivo gozar de mucha autonomía. Tras el fracaso de su PDA Newton, Apple dejó el sector y apareció Palm, en 1996, con su serie Pilot, incorporando nuevas tecnologías táctiles que dejaban obsoletas las anteriores versiones que habían salido hasta la fecha, teniendo así un nuevo salto en esta tecnología y comenzando una carrera entre las empresas para dar al consumidor novedades que dejaran a la competencia como productos antiguos. 2 Más conocido como buscapersonas o mensáfono. Figura 1-5: Windows XP Tablet Edition [5] Figura 1-4: Nintendo DS [4] Figura 1-2: PDA Newton [2] Figura 1-3: IBM teléfono inteligente [3] Ya entrados en el siglo XXI la empresa Microsoft lanzo en 2002 Windows XP Tablet Edition, que sería el inicio de la gran influencia de las tecnologías táctiles en pequeños dispositivos electrónicos, hasta lo que tenemos hoy en día, donde ya el foco dejo de ser tanto la pantalla para centrarse en los procesadores y el tamaño de los componentes. Otro hecho notable que aumentó la popularidad de esta tecnología fue la salida al mercado, en 2004, por parte de la compañía de Nintendo de la Nintendo DS, a partir de la cual todas las consolas portátiles de esta compañía hasta la actualidad han presentado pantallas táctiles. Aunque el mayor boom sin duda alguna se produjo en 2007 gracias a Apple, que al contrario que la anterior vez tuvo éxito con la comercialización del primer IPhone que rompía con el canon de los móviles hasta el momento al consistir exclusivamente de la tecnología táctil y la pantalla, sin ningún botón. Hoy en día aún se puede apreciar lo importante que fue este acontecimiento pues todos los smartphones que se ven consisten en un modelo similar, incluso se nos hace raro ya encontrar algún dispositivo móvil con botones analógicos. 1.1 Técnologías de las pantallas táctiles En este apartado se desarrollaran los diferentes tipos de pantallas táctiles que existen en la actualidad, así como se explicaran las diferencias y los diferentes usos de cada una de ellas. 1.1.1 Resistivas Este tipo de tecnología táctil consiste en un diseño de varias capas, permitiendo que cuando el usuario toque una zona de la pantalla alguna capa se ponga en contacto con otra identificando así la pulsación correspondiente, gracias a que internamente se produce un cambio en la resistencia, y por tanto en la corriente eléctrica. El problema como se puede observar a simple vista es el tiempo de reacción, es decir, la respuesta es más lenta y además en un inicio incapaz de detectar múltiples pulsaciones al mismo tiempo o gestos. Este problema se ha ido solucionando poco a poco, siendo presentadas mejoras que permiten el multitouch, y en la sensibilidad del toque, normalmente todas ellas introducidas desde el mundo de la telefonía. Otro inconveniente llega desde el brillo, aunque no es tanto un problema sí que es necesario mencionar que pierde entorno a un 25% del brillo por la necesidad de pasar por las diferentes capas de presión. Pero no todo son desventajas, las pantallas de este tipo cuentan con una gran resistencia al polvo y al agua, además de un coste de producción muy pequeño, permitiendo así que gocen de una gran popularidad y que estén presentes en multitud de aparatos electrónicos. 1.1.2 Capacitivas Esta tecnología se basa en un campo electrostático que se ve distorsionado cuando un elemento conductor eléctrico, como el dedo de una persona, entra en contacto con la superficie de la pantalla, que es un cristal funcionando como una capa de aislamiento eléctrico recubierta a su vez por un conductor transparente. A primera vista podemos encontrar uno de las desventajas de este modelo, y es que no se detecta pulsación si la pantalla es tocada por un elemento no conductor como suelen ser la mayoría de lápices táctiles del mercado, pensando más en el tipo anteriormente mencionado. 3 SOFTWARE Además del hardware, es necesario especificar los programas que se han empleado para la realización de este proyecto, aunque al igual que ocurría con el apartado físico debemos recordar que se pueden usar muchos otros programas diferentes, al existir un amplio repertorio en internet. Los programas que se enumeraran y describirán a continuación han sido seleccionados en base a su comodidad, interfaz y su accesibilidad, además de que claramente cumplan el objetivo deseado. 3.1 Python Python es el lenguaje de programación que vamos a emplear por lo que es obligatorio la necesidad de instalarlo, siendo así uno de los pocos programas que no cuentan con otras posibilidades pero tiene la ventaja de que funciona en todos los sistemas operativos del mercado. Este lenguaje de programación es multiparadigma e interpretado, siendo su principal característica y diferencia con otros lenguajes conocidos, como puede ser el caso de C o Java, el ser dinámico, es decir, su compilación línea a línea del código en cuestión, además del uso de palabras antes que el uso de símbolos. Esto último es consecuencia de su pensamiento y animo de que los códigos sean legibles, fáciles de entender y para nada encriptados, como podría ocurrir en caso de usar símbolos que impedirían a los usuarios menos avanzados interpretar partes ya realizadas por otros usuarios. Como ejemplo de esa mentalidad también tenemos la ausencia de llaves, ya que podría acabar siendo un proceso realmente complicado discernir donde empiezan y acaban estas, para solucionarlo se emplea la tabulación como muestra de pertenencia a una condición anterior (como el caso de condicionales o bucles). Por último hemos de hacer mención a la gran importancia que tiene este lenguaje en el campo de la informática, ya que es el más usado últimamente para las aplicaciones de inteligencia artificial, en especial gracias a su comunidad, la facilidad de aprendizaje y lo potente que es, es decir, que permite realizar gran multitud de tareas complejas. 3.1.1 Instalación El proceso de instalación es muy sencillo y guiado, existiendo además numerosos tutoriales en Internet de ayuda Figura 3-1: Logotipo de Python [11] Software 34 en caso de existir alguna complicación. Basta con ir a la página oficial de Python 3 , y como se ve en la imagen desde ahí podremos descargarnos la versión más reciente sin problema alguno. 3.1.2 ESPTool Además, dentro del programa tendremos que instalar ESPTool, un archivo realizado en Python que viene integrado junto a otros muchos archivos en una carpeta interna del programa para permitir que el usuario instale los complementos que desee. Este programa interno será el encargado de incorporar el firmware de MicroPython al microcontrolador seleccionado, según un proceso que será explicado más adelante en el apartado de Montaje. Su proceso de instalación es bastante simple, solo necesitaremos entrar en la pantalla de comandos del ordenador e introducir la siguiente instrucción dentro del terminal de Python, o del centro de comandos en caso de haber establecido su interacción durante la descarga: pip install esptool En caso de que no viniera el archivo en Python se puede descargar desde la siguiente página: https://github.com/espressif/esptool 3.2 MicroPython Para ajustarse a las nuevas necesidades un físico australiano, Damien George, implemento el software de Python para hacer una versión optimizada que pudiera ser utilizada en dispositivos electrónicos de pequeño tamaño, como lo son los microcontroladores, manteniendo sus señas de identidad como lo son el código fácil de 3 https://www.python.org/ Figura 3-2:Página principal Python [12] 35 interpretar, su programación línea a línea… Su principal característica radica en su reducido tamaño 4 , siendo este la capacidad mínima del hardware que hemos de adquirir, al perder prestaciones con respecto a su versión para ordenadores, que en un microcontrolador no se emplearían de forma habitual. Por este motivo algunas funciones que venían definidas en librerías en Python cambiaran ligeramente o no estarán disponibles aquí, salvo que se incorporen nuevas librerías, en caso de que terminen siendo necesitadas por el usuario. 3.2.1 Instalación Al contrario que antes, no tendremos que realizar ninguna instalación en nuestro ordenador, pues solo necesitaremos descargar un paquete de instalación con el firmware para posteriormente poder instalarlo dentro del microcontrolador seleccionado. Para obtener el archivo necesario tendremos que irnos a la página oficial, y de ahí acceder a la pestaña de descargas. En la página principal veremos una función muy buena, como es la programación online para practicar y comprobar sin necesidad de meternos en la placa que el código es correcto. Aquí hemos de hacer un pequeño inciso para recalcar un aspecto importante, como podemos observar el firmware solo está disponible para ciertas placas, lo que nos reduce bastante la elección de un microcontrolador, aunque se espera que un futuro cada vez esté disponible para un mayor espectro. 3.3 uPyCraft Este programa será el encargado de establecer la comunicación con la placa, además del lugar donde iremos programando las funciones de la librería. Su elección radica en una interfaz simple y cómoda, también incorpora revisión de sintaxis para identificar posibles errores de ese tipo y poder solucionarlos sin necesidad de tener que buscar por todo el código elaborado. Otra ventaja respecto a otros programas que podemos encontrar por internet es que no es necesario instalación, lo que facilita su portabilidad al contrario de los que requieren instalación previa. 3.4 Drivers de Silabs La función de estos drivers es permitir que el ordenador pueda conectarse e identificar el puerto por el que se conecta la placa seleccionada, en este caso recordemos que es ESP32. Para poder obtenerlos hemos de ir a la página principal 5 y allí explorar dentro del menú de productos los drivers USB to UART 6 , donde deberemos descargar la versión que deseemos, teniendo cuidado con no elegir alguna versión en fase beta, ya que podría tener algunos problemas. 4 1108 KB 5 https://www.silabs.com 6 https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers Software 36 En nuestro caso hemos tomado en específico la versión 6.7.6 para Windows. 4 DESARROLLO En este apartado se procederá a desarrollar los pasos que se han ido siguiendo para la realización del trabajo, desde la instalación del firmware hasta las pruebas realizadas de funcionamiento de la librería programada, pasando por las conexiones y las funciones creadas. 4.1 Montaje Para saber cómo se han de conectar el microcontrolador a la pantalla táctil primero hemos de informarnos de ambos a través de sus respectivos datasheets. Este paso es muy importante ya que nos revelará información crucial para evitar quemar componentes internos de los dispositivos y con eso ayudar a que no terminen estropeados y que respondan de la manera esperada. En este caso, apreciamos que los voltajes de salida del microcontrolador llegan hasta una tensión máxima de 3V lo que nos facilita las cosas ya que la pantalla seleccionada trabaja hasta un rango máximo de 5V. Además contamos con la ayuda de que para facilitar el proceso, la pantalla táctil menciona físicamente los nombres de los diferentes puertos permitiendo que sean identificados más rápidamente y no se den confusiones con ellos. 4.1.1 Configuración de pines E/S 4.1.1.1 PD El pin PD hace referencia a “power down” y es empleado para determinar si la comunicación con la pantalla esta activada o no, es decir, es el encargado de despertar a la pantalla táctil para que reciba y actualice información de sus otros puertos. Este pin será configurado de solo salida, y no tendremos ninguna limitación de cuál seleccionar en el microcontrolador. Será decisión del usuario elegir un puerto para su comunicación, que posteriormente habrá que informar su número a la función que se encarga de establecerlos correctamente. 4.1.1.2 CS El pin CS hace referencia a “Chip Select” y es empleado de habilitar o no los buses hacia los que se envían los datos dependiendo si está a un valor alto o no. Cada vez que se quiera leer o mandar datos hacia la pantalla táctil habrá de dejarlo a nivel bajo, y al finalizar volver a bloquear los buses en cuestión por seguridad Al igual que el caso anterior, será configurado como un puerto de solo salida, sin ninguna limitación extra a la hora de seleccionar el pin, aunque por comodidad se recomienda que sea contiguo al anterior. 4.1.1.3 SCK El pin SCK hace referencia a “Soft Clock”, es el encargado de regular la velocidad con la que se transmite cada bit en ambos sentidos, siendo de vital importancia para el correcto funcionamiento, pues de estar mal configurado algunos paquetes de datos podrían perderse o identificarse erróneamente. El microcontrolador tiene un puerto específico para esta función de comunicación, por lo que el usuario no tiene opción como en los anteriores casos, aunque sí que tiene libertad para indicar la velocidad de comunicación Desarrollo 38 38 además de otros parámetros. 4.1.1.4 MOSI Es uno de los pines por los que se comparte información entre los dispositivos, en específico, este puerto transmite datos del microcontrolador a la pantalla táctil, como su propio nombre indica, “Master Output Slave Input”. Por tanto es un puerto de salida de nuestra placa, y como pasaba anteriormente con el SCK tiene un pin en específico destinado a tal tarea. 4.1.1.5 MISO Junto a MOSI son los únicos pines por los que circula información, y al contrario que el anterior este se encarga de llevar los datos de la pantalla táctil al microcontrolador, siendo por tanto el primer y único pin de entrada que vamos a tener configurado en nuestro dispositivo. Su nombre significa: “Master Input Slave Output”. Como pasaba con el MOSI, el MISO también dispone de un pin específico para la tarea, siendo imposible destinar otro, aunque eso no significa que no dábamos configurarlo como solo entrada por seguridad. 4.1.2 Conexionado Ya hemos mencionado anteriormente que tan solo 2 de todos los pines que hemos de conectar a la pantalla son elegibles por el usuario, el resto están completamente definidos y resulta imposible su conexión a otros puertos. Quedando por tanto una conexión similar a la que se muestra a continuación a modo de ejemplo: En este caso los pines PD y CS que pueden ser seleccionados han sido conectados a los puertos 12 y 14 respectivamente. El caso del pin INT que presenta la pantalla podemos omitirlo, puesto que su función no la Pantalla SCK MOSI MISO CS INT PD 3V 5V GND GND Figura 4-1: Placa ESP32 [13] 39 vamos a emplear en este proyecto y por tanto no tenemos obligación de conectarlo a ninguno de los pines del microcontrolador. 4.1.3 Instalación del firmware Antes de comenzar a programar hemos de proceder a introducir MicroPython en el microcontrolador seleccionado, para ello seguiremos los siguientes pasos, teniendo en cuenta que pueden verse afectados por posibles cambios de nombre en el archivo que contenga el firmware como por el puerto por el que ha sido conectado al ordenador. Primero abriremos una pantalla de comandos, la forma de abrirlo dependerá del sistema operativo con el que se esté trabajando. A continuación, si se han realizado correctamente la instalación de Python y ESPtool tan solo tendremos que introducir la siguiente línea de comandos, respetando la dirección del puerto a la que se ha introducido el microcontrolador. esptool.py –port /<insertar dirección del puerto> erase_flash Con esto eliminaremos toda la memoria flash que tuviera anteriormente, es recomendable hacerlo incluso cuando el dispositivo es nuevo para asegurarnos una posterior instalación sin problemas. Vamos a comentar brevemente el formato de dirección del puerto existente a los sistemas operativos más comunes, Windows y Linux. En el primero bastaría con mirar en la pestaña de dispositivos que puerto está ocupado e introducir /COMx siendo x el número del puerto en cuestión; el segundo corresponde a la estructura /dev/ttyUSBx, necesitando mirar previamente usando el cmd el número. Tras este paso, procedemos a escribir la memoria flash con el entorno de programación deseado, teniendo su respectivo archivo (ver sección de Software) descargado y guardado en una localización conocida. esptool.py –chip esp32 –port /<dir. puerto> write_flash –z 0x1000 <dir.archivo y nombre de este>.bin Tras esperar un determinado tiempo se habrá instalado el firmware en el dispositivo y ya podremos comenzar a trabajar con ello, aunque es recomendable realizar alguna prueba de que todo funciona correctamente, para ello abriremos uPyCraft y tras conectar con el dispositivo probaremos algunos comandos de Python que se encuentren disponibles en MicroPython. 4.2 Estructura Para conseguir tener una librería más ordenada y fácil de manejar se ha decidido diferenciar entre dos tipos de funciones, las funciones creadas con el fin de ser usadas por el usuario y aquellas que se han realizado para evitar repetir numerosas veces los mismo pasos y sirven al creador para reducir el código además de aportar enormemente en funciones de debugging. Además de lo mencionado previamente a las funciones se enlistarán una serie de constantes que tendrán valores Desarrollo 40 40 como las direcciones de registro de la pantalla, sacados de la guía de programador 7 , teniendo en cuenta las diferencias existentes entre las pantallas de 3.5 pulgadas y la de 5 pulgadas. En Python como no existen constantes a las que no se pueda modificar su valor hemos de advertir al usuario que no emplee nombres iguales, ya que sobrescribiría el valor y pondría en riesgo el sistema. 4.2.1 Tabla de operadores En todos los lenguajes de programación existen una serie de operadores destinados a agilizar las funciones más habituales que emplean los usuarios, Python aunque busque tener un código fácil de interpretar y nada enmascarado también los usa. Debido a esto, se enunciaran a continuación los operadores empleados en la elaboración de la librería así como su significado, desde los más comunes y obvios hasta los que puedan ser complicados de entender. Operador Ejemplo Función que realiza + X+Y Realiza la función aritmética de suma entre los términos X e Y - X-Y Realiza la función aritmética de resta entre los términos X e Y * X*Y Realiza la función de multiplicación entre los dos términos empleados / X/Y Realiza la función de división entre X e Y, dando como resultado el cociente de la operación. & X&Y Operación que realiza la función lógica AND, no tiene sentido en números en base decimal, solo en base binaria. | X|Y Operación que realiza la función lógica OR, no tiene sentido en números en base decimal, solo en base binaria. >> X>>Y Operación que realiza en X un desplazamiento de Y bits hacia la derecha. Solo tiene sentido en base binaria, los bits que salen del rango se pierden. << X<<Y Realiza la operación de desplazamiento en X de Y bits hacia la izquierda. Solo tiene sentido en base binaria, se incorporan tantos 0 7 https://www.ftdichip.com/Support/Documents/ProgramGuides/FT800%20Programmers%20Guide.pdf 41 como bits desplazados. < X<Y Operación lógica que devuelve TRUE en caso de que X sea menor que Y, y FALSE en caso contrario > X>Y Operación lógica que devuelve TRUE en caso de que X sea mayor que Y, y FALSE en caso contrario. == X==Y Operación lógica que compara el valor de X e Y, dando como resultado TRUE si tienen el mismo valor, y FALSE en caso contrario. != X!=Y Operación lógica que compara el valor de X e Y, dando como resultado TRUE si tienen valores distintos, mientras que da FALSE si tienen el mismo valor |= X|=Y Forma reducida de realizar la operación OR: X=X|Y Tabla 4-I: Operadores empleados 4.3 Códigos Como ya se ha mencionado anteriormente, la estructura del código se dividirá en dos grandes bloques, las internas serán funciones más destinadas a configurar variables internas de la pantalla y al envío y recepción de datos; mientras que las funciones externas se centraran usualmente en aquellas funciones de alto nivel que tengan consecuencias visuales en la pantalla táctil, de tal manera que si el usuario decide realizar algún cambio en estas no se encuentre con un lenguaje de bajo nivel que pueda darle problemas. 4.3.1 Declaración de constantes Previo al inicio de crear las funciones hemos de declarar todas las constantes que se vayan a necesitar, pudiendo identificar varios grupos de variables en esta sección. 4.3.1.1 Registros En este grupo se encuentran definidos la posición en memoria de la pantalla de los diferentes parámetros importantes que componen su memoria fija, y que durante el uso puedan ser modificados o sean necesarios en algún momento. 4.3.1.2 Comandos La pantalla táctil está programada para que al recibir ciertos valores realice determinadas acciones concretas, estas son llamadas los comandos que regulan las acciones que posteriormente se ejecutan. Su valor viene definido en la guía de programador que nos ofrece el fabricante para las pantallas de una misma serie. Desarrollo 48 48 scFTo.PadFIFO() 4.3.2.16 Leer pantalla táctil Lee_pantalla() Las pantallas táctiles permiten un flujo de datos bidireccional, es decir, no solo se encargan de recibir y pintar todo aquello que le hayamos programado, como cualquier pantalla, sino que además nos permite saber en que punto exacto se ha tocado, aplicación realmente útil para la creación de elementos como botones. scFTo.Lee_pantalla() 4.3.3 Funciones externas 4.3.3.1 Configuración de la pantalla conf_pant(var1) Esta función se encarga de configurar los registros internos de la pantalla que varían según el tamaño de la misma. Es importante que el usuario ejecute esta función antes que las demás pues podría causar grandes problemas pese a que esta configurado en la previa declaración que se empleen por defecto los valores de la pantalla de 3.5 pulgadas. Esta función se subdivide en dos secciones, la primera es una declaración para que las variables configuradas sean de carácter global para todo el código y otra en la que se les da el valor correspondiente según una condición establecida.  Var1: valor entero que será el que determine el tamaño de la pantalla, siendo 3 y 5 la pantalla de 3.5 y la 5 pulgadas respectivamente. En caso de recibir otro valor, al ser posible enviar cualquier valor que se desee, el programa no hará nada y devolverá un 0 indicando al usuario que ha salido algo mal. scFto.conf_pant(3) 4.3.3.2 Inicialización de los pines HAL_Init_SPI(pin1, pin2) 49 Esta función se encarga de configurar los pines, ya explicados anteriormente, pudiendo el usuario elegir los dos de libre configuración a través de las variables que recibe, siendo la primera de ellas la encargada del pin de chip select mientras la segunda será la que determine el puerto del power down. En esta función se emplean funciones de una librería que hay que incorporar al inicio de la nuestra, Pin y SPI de la librería machine, con esto el usuario no tendrá que incorporarlas manualmente él, reduciendo así la dificultad de ejecución de la nuestra.  Pin1: valor numérico del pin que se vaya a configurar como PD, es decir, como power down. A pesar de que la función pueda recibir cualquier valor, la función fallará si esta por encima de los pines del microcontrolador, o coincide el valor con un pin no configurable para esta determinada función.  Pin2: valor numérico del pin que se vaya a configurar como CS, es decir, como chip select. A pesar de que la función pueda recibir cualquier valor, la función fallará si esta por encima de los pines del microcontrolador, o coincide el valor con un pin no configurable para esta determinada función. scFTo.HAL_Init_SPI(14,12) 4.3.3.3 Escritura en RAM Comando( COMM) Básicamente esta función es EscribeRam32, solo que pensada para su aplicación para tanto el usuario como otras funciones de la librería ejecuten rápidamente diferentes comandos.  COMM: valor numérico en hexadecimal o decimal asociado a algún comando preestablecido por la pantalla. scFTo.Comando(0x0400000) 4.3.3.4 Color de la siguiente instrucción que se va a realizar ComColor( R, G, B) Esta función permite al usuario seleccionar el color con el que se representará la siguiente instrucción que realice, teniendo una amplia libertad de selección al disponer de más de 16 millones de posibles colores diferentes. Es la primera función que necesita la selección de pantalla previamente pues como ya se menciono, la posición de los colores difiere entre la pantalla de 3.5 pulgadas y la de 5 pulgadas.  R: valor numérico asociado a la tonalidad roja que se desea. Su rango va de 0 a 255, es decir, 1 byte.  G: valor numérico asociado a la tonalidad verde que se desea. Su rango va de 0 a 255, es decir, 1 byte.  B: valor numérico asociado a la tonalidad azul que se desea. Su rango va de 0 a 255, es decir, 1 byte. Desarrollo 50 50 Quedando el color final determinado por la combinación de los valores aportados por los tres argumentos. scFTo.ComColor(45,62,148) ComFgcolor( R, G, B) ComBgcolor( R, G, B) Los argumentos de estas dos funciones son iguales que los de la función anterior, por lo que se omitirá su explicación. scFTo.ComFgcolor(76,84,2) scFTo.ComBg(200,160,0) En ciertas aplicaciones no solo necesitaremos configurar el color, sino también el color de fondo (BG) o de primer plano (FG), para ello se pensó las dos funciones que se acaban de presentar. Para diferenciar cuando se emplea una y cuando otra podemos observar la siguiente tabla según la información que nos proporciona la guía de la pantalla. Instrucción ComFgcolor ComBgcolor ComColor ComTXT No afecta No afecta Sí Boton Sí No afecta Sí(rótulo) ComTeclas Sí No afecta Sí(texto) ComScrollbar Sí(barra interior) Sí(barra exterior) No afecta ComNum No afecta No afecta Sí Tabla 4-II:Función de color Hay más comandos a los que va a afectar estas funciones, pero al no haber sido incluidos se ha optado por dejarlos fuera de esta tabla, para ellos se recomienda acudir a la guía. Aparte de las mencionadas funciones, existe otra a la que debería de afectar estas instrucciones para alterar el color, pero esta programada para no hacerlo, al venir ya definido un color dentro de la misma. Esto esta realizado ya que no tiene gran importancia para el desarrollo del proceso, en especial ya que no es un elemento fijo, sino uno temporal. 51 4.3.3.5 Escritura en la pantalla ComTXT( x, y, fuente, ops, cadena) Esta función nos permite escribir el texto que deseemos, con una serie de propiedades definidas en los argumentos de la función.  X: Valor numérico de la coordenada en el eje X.  Y: valor numérico de la coordenada en el eje Y.  Fuente: valor numérico, en el rango de 0 a 31 que nos permite elegir el tamaño de la fuente de escritura.  Ops: valor numérico al que va asociado diferentes opciones a la hora de como tomar los valores que se mandan en el argumento, estas opciones van recogidas en las definiciones previas a las funciones en nuestra librería. De no darle ningún valor se tomara como defecto la opción 0, que se corresponde a considerar las coordenadas recibidas como el vértice superior izquierdo desde el que se comenzará la escritura.  Cadena: Conjunto de caracteres que se deseen representar en la pantalla en una posición dada. scFto.ComTxT(80,90,25,OPT_CENTERX,”hola”) ComNum( x, y, fuente, ops, Num) Al igual que lo podemos realizar con letras también disponemos la posibilidad de escribir números, contando con el mismo número de opciones, se pueden representar números por la anterior opción en caso de ser necesario, aunque gastaría un poco más de recursos que la función aquí presente.  X: Valor numérico de la coordenada en el eje X.  Y: valor numérico de la coordenada en el eje Y.  Fuente: valor numérico, en el rango de 0 a 31 que nos permite elegir el tamaño de la fuente de escritura.  Ops: valor numérico al que va asociado diferentes opciones a la hora de como tomar los valores que se mandan en el argumento, estas opciones van recogidas en las definiciones previas a las funciones en nuestra librería. De no darle ningún valor se tomara como defecto la opción 0, que se corresponde a considerar las coordenadas recibidas como el vértice superior izquierdo desde el que se comenzará la escritura. Resaltar que para números negativos será necesario emplear la opción “OPT_SIGNED”.  Num: Valor del número que se desea representar en la pantalla táctil Para el número 31: scFTo.ComNum(50,50,20,0,31) Para el número -31: scFTo.ComNum(50,50,20,OPT_SIGNED,31) Desarrollo 52 52 4.3.3.6 Teclas ComTeclas( x, y, w, h, fuente, ops, Keys) Figura 4-2: Visualización de las Teclas [14] Con esta función podemos crear teclas, que no botones, con el texto que deseemos dentro además de poder cambiar tanto su tamaño como lugar, teniendo incluso la posibilidad de dar otros efectos, como que se centren de otra manera o quitarles el efecto 3D, como el que tienen en la imagen.  X: Valor numérico de la coordenada en el eje X.  Y: valor numérico de la coordenada en el eje Y.  W: valor numérico correspondiente a la anchura de la tecla.  H: valor numérico correspondiente a la altura de la tecla.  Fuente: valor numérico, en el rango de 0 a 31 que nos permite elegir el tamaño de la fuente de escritura.  Ops: valor numérico al que va asociado diferentes opciones a la hora de como tomar los valores que se mandan en el argumento, estas opciones van recogidas en las definiciones previas a las funciones en nuestra librería. De no darle ningún valor se tomara como defecto la opción 0, que se corresponde al efecto 3D de las teclas, ver imagen asociada anteriormente, para eliminar este efecto usar el valor definido en la declaración OPT_FLAT.  Keys: Conjunto de caracteres que se deseen representar en la pantalla en una dentro de la tecla. scFTo.ComTeclas(50,60,20,20,15,0,”1”) 4.3.3.7 Representar en pantalla Dibuja() Una vez ejecutamos esta función, se representará en pantalla todas aquellas instrucciones que se le haya ido dando a la pantalla con las otras funciones. Hay que mencionar que solo se ejecutará durante un instante, por ello debe estar siempre dentro de un bucle eterno de tal manera que parezca que esta pintado de forma continuada. 53 scFto.Dibuja() 4.3.3.8 Iniciador de la pantalla táctil Inicia_pantalla() Esta función ha de ser empleada tras haber configurado el tipo de pantalla que se esta empleando y con los pines ya definidos, y antes de todo aquello que queramos realizar pues se encarga de varios apartados importantes. Por un lado inicializa la pantalla, despertándola inicialmente, y comprueba que no haya ningún problema en la comunicación a través de una comprobación de los valores de ciertos registros. Por otro lado se encarga de dar valor a diferentes registros internos de la pantalla y tras esto configura la pantalla para que este completamente lista para lo que se desee realizar con ella, pudiendo habilitar o no el amplificador de audio a través de las últimas escrituras, teniendo que introducir 0x81 para apagar el audio si no se quiere utilizar. Una posible mejora sería pasar por referencia un 0 o un 1 con el que poder determinar si se requiere el audio, pero al ser algo secundario y fácilmente cambiable, incluso pudiendo trabajar perfectamente con esta configuración cuando no se trabaja con el audio se ha dejado como esta, activado siempre. scFTo.Inicia_pantalla() 4.3.3.9 Color de fondo de la pantalla Nueva_pantalla( R, G, B) El color de fondo de la pantalla puede ser cambiado a través de esta función, a la que hay que pasarle por referencia los valores de las diferentes tonalidades que se quiera, en el formato conocido RGB. Como es conocido no se espera que el usuario tenga problemas usando esta función, pero existe el caso de que inserte un color fuera de rango lo que podría o bien desconfigurar el comando o bien modificar el color, según cual haya sido el color implicado que se haya excedido y la pantalla usada.  R: valor numérico asociado a la tonalidad roja que se desea. Su rango va de 0 a 255, es decir, 1 byte.  G: valor numérico asociado a la tonalidad verde que se desea. Su rango va de 0 a 255, es decir, 1 byte.  B: valor numérico asociado a la tonalidad azul que se desea. Su rango va de 0 a 255, es decir, 1 byte. Quedando el color final determinado por la combinación de los valores aportados por los tres argumentos. scFTo.Nueva_pantalla(40,180,60) Desarrollo 54 54 4.3.3.10 Debugging de los registros Las siguientes funciones están más pensadas en una aplicación de debbugging para usuarios que dominen el campo de la programación y estén realizando proyectos con esta pantalla en el entorno de MicroPython, que para usuarios promedios que solo busquen realizar cierta aplicación con los elementos que se le da en la librería. Esto se debe a que la utilidad de esta función es informar al usuario que valor hay en el registro que el quiera conocer, de esta forma realizar una comprobación manual de los puntos donde no se realice lo que el usuario busque. Lee_Reg(dir)  Dir: Dirección del registro del que se desea conocer su valor. Lectura=scFto.Lee_Reg(REG_SOUND) Mientras que la siguiente función es su contraparte, encargándose de la escritura en la dirección aportada por el usuario, siempre empleando valores de 32 bits. Esc_Reg( dir, valor)  Dir: Dirección del registro en el que se desea sobrescribir su valor.  Valor: valor numérico que se desea escribir en la dirección asociada. scFto.Esc_Reg(REG_VOL_SOUND, 24) 4.3.3.11 Espera Espera_pant() Esta función se encarga de bloquear la ejecución del código elaborado por el usuario hasta que se realice un toque en cualquier lugar de la pantalla táctil. Para ello se ejecuta un bucle while, en el que mientras el valor de POSY sea el de reset, significa que no se ha pulsado, se mantendrá leyendo la pantalla esperando que POSY varíe su valor. Una vez se pulse, se realiza otro bucle igual que el anterior, pero en esta ocasión con el fin de notificar que se ha dejado de pulsar, es decir, que la variable ha vuelto a su valor de reset, esto se realiza ya que consideramos un toque como pulsar y retirar no solo realizar una pulsación, además de que esto último podría provocar ligeros problemas en la aplicación, como sería que al pulsar se realizaran varias operaciones rápidamente sin que el usuario pudiera reaccionar. 55 scFTo.Espera_pant() 4.3.3.12 Líneas Para realizar un conjunto de líneas rectas debemos emplear los siguientes comandos, previa definición del color y del grosor de estas. El color ya se ha mencionado anteriormente como realizarlo, pero no el caso de la configuración del grosor, para poder determinarlo hemos de invocar la siguiente función que recibe como parámetro el grosor deseado ComLineWidth( width) ComLineas(xo,yo, xf, yf) Esta última función es la encargada de realizar una línea entre la posición inicial, dada por el primer grupo de parámetros, y la posición final, indicada en el segundo grupo. El usuario podría realizar a mano esta configuración, aunque se ha realizado esta función para simplificar en todo lo posible los comandos que debe aprenderse para poder manejar la pantalla en todo su apogeo.  Width: valor numérico del grosor de la línea deseado. Su rango va entre 16 y 4095, con una precisión 1/16 Píxeles.  Xo: valor numérico de la coordenada en el eje X del punto inicial de la recta.  Yo: valor numérico de la coordenada en el eje Y del punto inicial de la recta.  Xf: valor numérico de la coordenada en el eje X del punto final de la recta.  Yf: valor numérico de la coordenada en el eje Y del punto final de la recta. scFTo.ComLineWidth(40) scFTo.ComLineas(10,20,50,50) 4.3.3.13 Scrollbar ComScrollbar( x, y, w, h, ops, val, size, range): Se podrá realizar un scroll junto a su barra en cualquier lugar de la pantalla, tanto en vertical como en horizontal sin problema alguno, tan solo es necesario a lo sumo un poco de prueba y error para configurar correctamente todos los elementos necesarios, que se enumeran a continuación.  X: Valor numérico de la coordenada en el eje X.  Y: valor numérico de la coordenada en el eje Y.  W: valor numérico correspondiente a la anchura de la barra.  H: valor numérico correspondiente a la altura de la barra. Desarrollo 56 56  Ops: valor numérico al que va asociado diferentes opciones a la hora de como tomar los valores que se mandan en el argumento, estas opciones van recogidas en las definiciones previas a las funciones en nuestra librería. De no darle ningún valor se tomara como defecto la opción 0, que se corresponde al efecto 3D del scrollbar, para eliminar este efecto usar el valor 255.  val: valor numérico de la posición inicial del scroll dentro de la barra, con un rango determinado entre 0 y el valor de range que se pasara posteriormente.  Size: valor numérico del tamaño del scroll.  Range: máximo valor numérico que puede tomar el scroll al ser desplazado por la barra. Según los valores de w y h la barra se pintara en horizontal o vertical, siendo para el primer caso necesario que el valor de w sea superior al de h. En caso contrario estaremos en el segundo caso. scFto.Scrollbar(20,50,120,8,0,10,40,100) En el ejemplo se representara un scrollbar con el vértice superior izquierdo en la posición (20,50) de la pantalla, con una anchura de 120 y una altura de 8. Tendrá efecto 3D, su posición inicial estará en el valor 10 de un rango de medidas de 0 a 100, con una barra que mide 40. 4.3.3.14 Boton El usuario cuando quiera realizar un botón podrá elegir entre dos funciones, la primera de ellas se encargará de solo pintar el botón en el estado deseado y configurado por el usuario, mientras que la segunda función pintará el botón dependiendo si esta pulsado o no, devolviendo al usuario dicha información. ComButton( x, y, w, h, font, ops, cadena)  x: valor numérico de la coordenada X del vértice superior izquierdo del botón.  y: valor numérico de la coordenada Y del vértice superior izquierdo del botón.  W: valor numérico correspondiente a la anchura del botón.  H: valor numérico correspondiente a la altura del botón.  font: valor numérico de la fuente deseada para la cadena de caracteres que se escribirá dentro.  ops: Según su valor el botón será representado como pulsado o no pulsado, 1 será el valor en el primer caso, 0 para el restante. Figura 4-3:Scrollbar asociado al ejemplo [15] 57  cadena: conjunto de caracteres que se desea representar dentro del botón. Estado=scFTo.ComButton(80,40,30,30,10,1,”pulsa”) Boton(x, y, w, h, font, cadena)  x: valor numérico de la coordenada X del vértice superior izquierdo del botón.  y: valor numérico de la coordenada Y del vértice superior izquierdo del botón.  W: valor numérico correspondiente a la anchura del botón.  H: valor numérico correspondiente a la altura del botón.  font: valor numérico de la fuente deseada para la cadena de caracteres que se escribirá dentro.  cadena: conjunto de caracteres que se desea representar dentro del botón. scFTo.Boton(80,40,30,30,10,”pulsa”) En ambos ejemplos se pintara el mismo botón con la diferencia que en el segundo su estado podrá variar dependiendo si se pulsa dentro del botón la pantalla táctil, además la función nos proporcionara ese información para que podamos emplearla en el código de manera sencilla. 4.3.3.15 Puntos ComPointSize(size) Al igual que ocurría con las líneas, los puntos pueden configurar su tamaño a través de esta función, aunque no se encargará de ser pintados, esta pensada para aquellos que deseen emplear el comando manual para pintar los puntos que él desee.  Size: valor numérico del tamaño del punto deseado. scFTo.ComPointSize(16) Aunque lo normal será que se ejecute la siguiente función, que engloba tanto la configuración del tamaño como su posterior pintado, siendo como la mejora de la anterior. Com_Punto( x, y, R) Anexo 64 64 REG_INT_EN=1057948 REG_INT_FLAGS=1057944 REG_INT_MASK=1057952 REG_MACRO_0=1057992 REG_MACRO_1=1057996 REG_MARCH_ACC=1058144 REG_MARCH_DIR=1058136 REG_MARCH_OP=1058140 REG_MARCH_WIDTH=1058148 REG_OUTBITS=1057880 REG_PCLK=1057900 REG_PCLK_POL=1057896 REG_PLAY=1057928 REG_PLAYBACK_FORMAT=1057972 REG_PLAYBACK_FREQ=1057968 REG_PLAYBACK_LENGTH=1057960 REG_PLAYBACK_LOOP=1057976 REG_PLAYBACK_PLAY=1057980 REG_PLAYBACK_READPTR=1057964 REG_PLAYBACK_START=1057956 REG_PWM_DUTY=1057988 REG_PWM_HZ=1057984 REG_RENDERMODE=1057808 REG_ROMSUB_SEL=1058016 REG_ROTATE=1057876 REG_SNAPSHOT=1057816 REG_SNAPY=1057812 REG_SOUND=1057924 REG_SWIZZLE=1057888 REG_TAG=1057912 REG_TAG_X=1057904 REG_TAG_Y=1057908 REG_TAP_CRC=1057824 REG_TAP_MASK=1057828 REG_TOUCH_ADC_MODE=1058036 REG_TOUCH_CHARGE=1058040 REG_TOUCH_DIRECT_XY=1058164 REG_TOUCH_DIRECT_Z1Z2=1058168 REG_TOUCH_MODE=1058032 REG_TOUCH_OVERSAMPLE=1058048 REG_TOUCH_RAW_XY=1058056 REG_TOUCH_RZ=1058060 REG_TOUCH_RZTHRESH=1058052 REG_TOUCH_SCREEN_XY=1058064 REG_TOUCH_SETTLE=1058044 REG_TOUCH_TAG=1058072 REG_TOUCH_TAG_XY=1058068 REG_TOUCH_TRANSFORM_A=1058076 REG_TOUCH_TRANSFORM_B=1058080 REG_TOUCH_TRANSFORM_C=1058084 REG_TOUCH_TRANSFORM_D=1058088 REG_TOUCH_TRANSFORM_E=1058092 REG_TOUCH_TRANSFORM_F=1058096 REG_TRACKER=1085440 REG_TRIM=1058156 REG_VCYCLE=1057852 REG_VOFFSET=1057856 REG_VOL_PB=1057916 REG_VOL_SOUND=1057920 REG_VSIZE=1057860 REG_VSYNC0=1057864 REG_VSYNC1=1057868 GRIS_CLARO=0xE0E0E0 GRIS_OSCURO=0x606060 S_TRIANG=0x04 S_BEEP=0x05 S_ALARM=0x06 65 S_WARBLE=0x07 S_PIPS=0x10 S_XILO=0x41 S_PIANO=0x46 N_DO=60 N_REB=61 N_RE=62 N_MIB=63 N_MI=64 N_FA=65 N_SOLB=66 N_SOL=67 N_LAB=68 N_LA=69 N_SIB=70 N_SI=71 FT_GPU_INTERNAL_OSC=0x48 FT_GPU_EXTERNAL_OSC=0x44 FT_GPU_PLL_48M=0x62 FT_GPU_PLL_36M=0x61 FT_GPU_PLL_24M=0x64 FT_GPU_ACTIVE_M=0x00 FT_GPU_STANDBY_M=0x41 FT_GPU_SLEEP_M=0x42 FT_GPU_POWERDOWN_M=0x50 FT_GPU_CORE_RESET=0x68 RELOJ=3000 #revisar este valor #definiciones que van a variar su valor POSX=0 POSY=0 PANTALLA=3 HCYCLE=408 HOFFSET=70 HSYNC0=0 HSYNC1=10 VCYCLE=263 VOFFSET=13 VSYNC0=0 VSYNC1=2 PCLK_POL=0 HSIZE=320 VSIZE=240 PCLK=5 CS=1 PD=1 spi=1 CMD_Offset=0 #Funcion para determinar el tipo de pantalla que se tiene. Es necesario que se utilice antes que el resto de las demas funciones o daria problemas def conf_pant(var1): if (var1==3) or (var1==5): global PANTALLA global HCYCLE global HOFFSET global HSYNC0 global HSYNC1 global VOFFSET global VCYCLE global VSYNC0 global VSYNC1 global PCLK_POL global HSIZE global VSIZE global PCLK PANTALLA=var1 if (PANTALLA==3): #lista de defines que van con la pantalla ft800 de 3.5 pulgadas HCYCLE =408 Anexo 66 66 HOFFSET=70 HSYNC0=0 HSYNC1=10 VCYCLE=263 VOFFSET=13 VSYNC0=0 VSYNC1=2 PCLK_POL=0 HSIZE=320 VSIZE=240 PCLK=5 else: #lista de defines que van con la pantalla de ft800 de 5 pulgadas HCYCLE =548 HOFFSET=43 HSYNC0=0 HSYNC1=41 VCYCLE=292 VOFFSET=12 VSYNC0=0 VSYNC1=10 PCLK_POL=1 HSIZE=480 VSIZE=272 PCLK=5 return 1 else: return 0 def HAL_Init_SPI(pin1, pin2): global CS global PD global spi #CS=chip select #recomendamos pin14 CS=Pin(pin1,Pin.OUT) #PD=power down #recomendamos pin12 PD=Pin(pin2,Pin.OUT) spi=SPI(baudrate=600000,polarity=0,phase=0, bits=8, firstbit=SPI.MSB, sck=Pin(5), mosi=Pin(18), miso=Pin(19)) def HAL_SPI_ReadWrite(data): dat=bytearray(1) recibido=bytearray(1) dat[0]=data spi.write_readinto(dat,recibido) recibido=int.from_bytes(recibido,"big") #int return recibido def HAL_SPI_CSHigh(): CS.value(1) def HAL_SPI_CSLow(): CS.value(0) def HAL_SPI_PDhigh(): PD.value(1) def HAL_SPI_PDlow(): PD.value(0) 67 def DELAY (): from utime import sleep_ms sleep_ms(800) #mirar tiempo luego despues def SENDADDRESSWR( Memory_Address): # Write out the address. Only the lower 3 bytes are sent, with the most significant byte sent first # Mask off the first byte to send SPI_Writebyte = ((Memory_Address & 0x00FF0000) >> 16) # Since this is a write, the MSBs are forced to 10 SPI_Writebyte = (SPI_Writebyte & 0xBF | 0x80) # Call the low-level SPI routine for this MCU to send this byte HAL_SPI_ReadWrite(SPI_Writebyte) SPI_Writebyte = ((Memory_Address & 0x0000FF00) >> 8) HAL_SPI_ReadWrite(SPI_Writebyte) SPI_Writebyte = (Memory_Address & 0x000000FF) HAL_SPI_ReadWrite(SPI_Writebyte) def SENDADDRESSRD( Memory_Address): # Write out the address. Only the lower 3 bytes are sent, with the most significant byte sent first # Mask off the first byte to send SPI_Writebyte = ((Memory_Address & 0x00FF0000) >> 16) # Since this is a read, the upper two bits are forced to 00 SPI_Writebyte = (SPI_Writebyte & 0x3F) # Call the low-level SPI routine for this MCU to send this byte HAL_SPI_ReadWrite(SPI_Writebyte) SPI_Writebyte = ((Memory_Address & 0x0000FF00) >> 8) HAL_SPI_ReadWrite(SPI_Writebyte) SPI_Writebyte = (Memory_Address & 0x000000FF) HAL_SPI_ReadWrite(SPI_Writebyte) # Send dummy 00 as required in the FT800 datasheet when doing a read HAL_SPI_ReadWrite(0x00) def WRITE_32( SPIValue32): SPI_Writebyte = (SPIValue32 & 0x000000FF) # Write the first (least significant) byte HAL_SPI_ReadWrite(SPI_Writebyte) SPI_Writebyte = ((SPIValue32 & 0x0000FF00) >> 8) HAL_SPI_ReadWrite(SPI_Writebyte) SPI_Writebyte = ((SPIValue32 & 0x00FF0000)>> 16) HAL_SPI_ReadWrite(SPI_Writebyte) SPI_Writebyte = ((SPIValue32 & 0xFF000000) >> 24) # Write the last (most significant) byte HAL_SPI_ReadWrite(SPI_Writebyte) def WRITE_16( SPIValue16): SPI_Writebyte = (SPIValue16 & 0x00FF) # Write the first (least significant) byte HAL_SPI_ReadWrite(SPI_Writebyte) SPI_Writebyte = ((SPIValue16 & 0xFF00) >> 8) # Write the last (most significant) byte HAL_SPI_ReadWrite(SPI_Writebyte) def WRITE_8( SPIValue8): # Write the data byte HAL_SPI_ReadWrite(SPIValue8) def READ_32(): # Read the first data byte (this is the least significant byte of the register). SPI writes out dummy byte of 0x00 # Get the byte which was read by the low-level MCU routine SPI_DWordRead = HAL_SPI_ReadWrite(0x00) # Read the actual data byte. We pass a 0x00 into the SPI routine since it always writes when it reads # Get the byte which was read by the low-level MCU routine DWordTemp = HAL_SPI_ReadWrite(0x00) # Put the byte into a 32-bit variable (shifted 8 bits up) SPI_DWordRead |= (DWordTemp << 8) Anexo 68 68 # Read the actual data byte. We pass a 0x00 into the SPI routine since it always writes when it reads # Get the byte which was read by the low-level MCU routine DWordTemp = HAL_SPI_ReadWrite(0x00) # Put the byte into a 32-bit variable (shifted 16 bits up) SPI_DWordRead |= (DWordTemp << 16) # Read the actual data byte. We pass a 0x00 into the SPI routine since it always writes when it reads # Get the byte which was read by the low-level MCU routine DWordTemp = HAL_SPI_ReadWrite(0x00) # Put the byte into a 32-bit variable (shifted 24 bits up) SPI_DWordRead |= (DWordTemp << 24) # Return the byte which we read return(SPI_DWordRead) def READ_8(): # Read the data byte. We pass a 0x00 into the SPI routine since it always writes when it reads # SPI_Writebyte = 0x00; # Get the byte which was read by the low-level MCU routine SPI_Readbyte = HAL_SPI_ReadWrite(0x00) # Return the byte which we read return(SPI_Readbyte) def HostCommand( Host_Command): # Chip Select Low HAL_SPI_CSLow() # This is the command being sent SPI_Writebyte = (Host_Command & 0x3F | 0x40) HAL_SPI_ReadWrite(SPI_Writebyte) # Sending dummy byte # SPI_Writebyte = 0x00 HAL_SPI_ReadWrite(0x00) HAL_SPI_ReadWrite(0x00) # Chip Select High HAL_SPI_CSHigh() def DummyRead(): # byte PortRead = 0x00; # byte SPI_byte_Read = 0x00; # SPI_Writebyte = 0x00 # Chip Select Low HAL_SPI_CSLow() # Read/Write # Sending dummy 00 byte HAL_SPI_ReadWrite(0x00) # Sending dummy 00 byte HAL_SPI_ReadWrite(0x00) # Sending dummy 00 byte HAL_SPI_ReadWrite(0x00) # Chip Select High HAL_SPI_CSHigh() def FT800_IncCMDOffset(Current_Offset, Command_Size): New_Offset = Current_Offset + Command_Size if(New_Offset > 4095): New_Offset = (New_Offset - 4096) return New_Offset def ComEsperaFin(): global CMD_Offset cmdBufferWr=0 cmdBufferRd=1 while(cmdBufferWr != cmdBufferRd): HAL_SPI_CSLow() SENDADDRESSRD(REG_CMD_WRITE) # Read the value of the REG_CMD_WRITE register cmdBufferWr = READ_32() HAL_SPI_CSHigh() HAL_SPI_CSLow() SENDADDRESSRD(REG_CMD_READ) # Read the value of the REG_CMD_READ register 69 cmdBufferRd = READ_32() HAL_SPI_CSHigh() # Comparo buffer de escritura con lectura. Cuando sean iguales, habrá dejado la pantalla de pintar # Check the actual value of the current WRITE register (pointer) CMD_Offset = cmdBufferWr def EscribeRam32( dato): global CMD_Offset HAL_SPI_CSLow() # Writing to next available location in FIFO (FIFO base address + offset) SENDADDRESSWR(RAM_CMD + CMD_Offset) # Vertex 2F 01XXXXXX XXXXXXXX XYYYYYYY YYYYYYYY WRITE_32(dato) HAL_SPI_CSHigh() # Move the CMD Offset since we have just added 4 bytes to the FIFO CMD_Offset = FT800_IncCMDOffset(CMD_Offset, 4) def EscribeRam16( dato): global CMD_Offset HAL_SPI_CSLow() # Writing to next available location in FIFO (FIFO base address + offset) SENDADDRESSWR(RAM_CMD + CMD_Offset) # Vertex 2F 01XXXXXX XXXXXXXX XYYYYYYY YYYYYYYY WRITE_16(dato) HAL_SPI_CSHigh() # Move the CMD Offset since we have just added 4 bytes to the FIFO CMD_Offset = FT800_IncCMDOffset(CMD_Offset, 2) def EscribeRam8( dato): global CMD_Offset HAL_SPI_CSLow() # Writing to next available location in FIFO (FIFO base address + offset) SENDADDRESSWR(RAM_CMD + CMD_Offset) # Vertex 2F 01XXXXXX XXXXXXXX XYYYYYYY YYYYYYYY WRITE_8(dato) HAL_SPI_CSHigh() # Move the CMD Offset since we have just added 4 bytes to the FIFO CMD_Offset = FT800_IncCMDOffset(CMD_Offset, 1) def EscribeRamTxt(cadena): i=0 while(i<len(cadena)) : EscribeRam8(cadena[i]) i=i+1 EscribeRam8(0) def Comando( COMM): global CMD_Offset HAL_SPI_CSLow() # Writing to next available location in FIFO (FIFO base address + offset) SENDADDRESSWR(RAM_CMD + CMD_Offset) # Write the DL_START command WRITE_32(COMM) HAL_SPI_CSHigh() # Move the CMD Offset since we have just added 4 bytes to the FIFO CMD_Offset = FT800_IncCMDOffset(CMD_Offset, 4) def ComVertex2ff( x, y): """ Args: x(int): coordenada en x. y(int): coordenada en y. Returns: void """ global CMD_Offset coord=x coord=coord<<19 coord=coord+ (y<<4) HAL_SPI_CSLow() # Writing to next available location in FIFO (FIFO base address + offset) SENDADDRESSWR(RAM_CMD + CMD_Offset) # Vertex 2F 01XXXXXX XXXXXXXX XYYYYYYY YYYYYYYY WRITE_32(0x40000000+coord) HAL_SPI_CSHigh() # Move the CMD Offset since we have just added 4 bytes to the FIFO Anexo 70 70 CMD_Offset = FT800_IncCMDOffset(CMD_Offset, 4) def ComColor( R, G, B): """ Args: R(int): 0-255 de tonalidad roja. G(int): 0-255 de tonalidad verde. B(int): 0-255 de tonalidad azul. Returns: void """ if PANTALLA==3: color=(R<<8)+G color=(color<<8)+B else: color=(B<<8)+G color=(color<<8)+R # Color RGB 00000100 BBBBBBBB GGGGGGGG RRRRRRRR (B/G/R = Colour values) Comando(0x04000000+color) def ComTXT( x, y, fuente, ops, cadena): """ Args: x(int): coordenada en el eje X. y(int): coordenada en el eje Y. fuente(int): rango permitido de 0 a 31, nos permite elegir la fuente. ops(int): valor 0 indica que las coordenadas son del pixel superior izquierdo, tambi茅n puede tener el valor de: OPT_CENTERX, OPT_CENTERY. Cadena(char):texto a representar. Returns: void """ EscribeRam32(CMD_TEXT) EscribeRam16(x) EscribeRam16(y) EscribeRam16(fuente) EscribeRam16(ops) i=0 while(i<len(cadena)) : EscribeRam8(int.from_bytes(cadena[i].encode(),"big")) i=i+1 EscribeRam8(0) PadFIFO() def ComNum( x, y, fuente, ops, Num): """ Args: x(int): coordenada en el eje X. y(int): coordenada en el eje Y. fuente(int): rango permitido de 0 a 31, nos permite elegir la fuente. ops(int): valor 0 indica que las coordenadas son del pixel superior izquierdo, tambi茅n puede tener el valor de: OPT_CENTERX, OPT_CENTERY. Para n煤meros con signo usar OPT_SIGNED. Num(long): n煤mero a representar. Returns: void """ EscribeRam32(CMD_NUMBER) EscribeRam16(x) EscribeRam16(y) EscribeRam16(fuente) EscribeRam16(ops) EscribeRam32(Num) PadFIFO() def ComTeclas( x, y, w, h, fuente, ops, Keys): """ Args: x(int): posición X del v茅rtice superior izquierdo del Scrollbar. y(int): posición Y del v茅rtice superior izquierdo del Scrollbar. w(int): longitud en X del Scrollbar. h(int): longitud en Y del Scrollbar. fuente(int): rango permitido de 0 a 31, nos permite elegir la fuente ops(int): 0 si queremos 3D, OPT_FLAT para quitarlo Keys(char): texto que queremos que aparezca en la tecla a crear Returns: void 71 """ EscribeRam32(CMD_KEYS) EscribeRam16(x) EscribeRam16(y) EscribeRam16(w) EscribeRam16(h) EscribeRam16(fuente) EscribeRam16(ops) i=0 while(i<len(Keys)) : EscribeRam8(int.from_bytes(Keys[i].encode(),"big")) i=i+1 EscribeRam8(0) PadFIFO() def Ejecuta_Lista(): """ Args: void Returns:void """ HAL_SPI_CSLow() SENDADDRESSWR(REG_CMD_WRITE) WRITE_16(CMD_Offset) HAL_SPI_CSHigh() def PadFIFO(): """ Args: void Returns:void """ pad=CMD_Offset & 0x0003 if pad>0: i=0 while i<4-pad : EscribeRam8(0) i=i+1 def Dibuja(): """ Args: void Returns:void """ Comando(CMD_DISPLAY) Comando(CMD_SWAP) Ejecuta_Lista() def Inicia_pantalla(): # Put the Power Down. pin high to wake FT800 HAL_SPI_PDhigh() DELAY() # Read location 0 to wake up FT800 DummyRead() # Change the PLL to external clock - optional #HostCommand(FT_GPU_EXTERNAL_OSC) # Ensure configured to 48 MHz HostCommand(FT_GPU_PLL_48M) DELAY() # Reset the core HostCommand(FT_GPU_CORE_RESET) DELAY() # Read address 0 to ensure FT800 is active HostCommand(FT_GPU_ACTIVE_M) # Read the Chip ID to check comms with the FT800 - should be 0x7C chipid = 0x00 while(chipid != 0x7C): # CS low HAL_SPI_CSLow() # Send the address SENDADDRESSRD(REG_ID) Anexo 72 72 # Read the actual value chipid = READ_8() # Si el programa esta pillado aqui, es que no esta bien conectada la placa. CS high HAL_SPI_CSHigh() DELAY() # ============================================================= # Write the display registers on the FT800 for your particular display # ============================================================= HAL_SPI_CSLow() SENDADDRESSWR(REG_HCYCLE) WRITE_16(HCYCLE) HAL_SPI_CSHigh() HAL_SPI_CSLow() SENDADDRESSWR(REG_HOFFSET) WRITE_16(HOFFSET) HAL_SPI_CSHigh() HAL_SPI_CSLow() SENDADDRESSWR(REG_HSYNC0) WRITE_16(HSYNC0) HAL_SPI_CSHigh() HAL_SPI_CSLow() SENDADDRESSWR(REG_HSYNC1) WRITE_16(HSYNC1) HAL_SPI_CSHigh() HAL_SPI_CSLow() SENDADDRESSWR(REG_VCYCLE) WRITE_16(VCYCLE) HAL_SPI_CSHigh() HAL_SPI_CSLow() SENDADDRESSWR(REG_VOFFSET) WRITE_16(VOFFSET) HAL_SPI_CSHigh() HAL_SPI_CSLow() SENDADDRESSWR(REG_VSYNC0) WRITE_16(VSYNC0) HAL_SPI_CSHigh() HAL_SPI_CSLow() SENDADDRESSWR(REG_VSYNC1) WRITE_16(VSYNC1) HAL_SPI_CSHigh() HAL_SPI_CSLow() SENDADDRESSWR(REG_SWIZZLE) WRITE_16(2) HAL_SPI_CSHigh() HAL_SPI_CSLow() SENDADDRESSWR(REG_PCLK_POL) WRITE_16(PCLK_POL) HAL_SPI_CSHigh() HAL_SPI_CSLow() SENDADDRESSWR(REG_HSIZE) WRITE_16(HSIZE) HAL_SPI_CSHigh() HAL_SPI_CSLow() SENDADDRESSWR(REG_VSIZE) WRITE_16(VSIZE) HAL_SPI_CSHigh() HAL_SPI_CSLow() 73 SENDADDRESSWR(REG_PCLK) WRITE_16(PCLK) HAL_SPI_CSHigh() # ================================================================= # Configure the touch screen # ================================================================== HAL_SPI_CSLow() SENDADDRESSWR(REG_TOUCH_RZTHRESH) WRITE_16(1200) HAL_SPI_CSHigh() # ================================================================== # Send an initial display list which will clear the screen to a black colour # ================================================================== # Set the colour which is used when the colour buffer is cleared HAL_SPI_CSLow() SENDADDRESSWR(RAM_DL+0) WRITE_32(0x02000000) HAL_SPI_CSHigh() # Clear the Colour, Stencil and Tag buffers. This will set the screen to the 'clear' colour set above. HAL_SPI_CSLow() SENDADDRESSWR(RAM_DL+4) WRITE_32(0x26000007) HAL_SPI_CSHigh() # Display command ends the display list HAL_SPI_CSLow() SENDADDRESSWR(RAM_DL+8) WRITE_32(0x00000000) HAL_SPI_CSHigh() # Writing to the DL_SWAP register tells the Display Engine to render the new screen designed above. HAL_SPI_CSLow() SENDADDRESSWR(REG_DLSWAP) WRITE_32(0x00000002) HAL_SPI_CSHigh() # ================================================================== # Set the GPIO pins of the FT800 to enable the display now # ================================================================== # note: Refer to the GPIO section in the FT800 datasheet and also the connections to the GPIO # used on the particular development module being used # Bit 7 enables the LCD Display. It is set to output driving high # Bit 1 enables the Audio Amplifier. It is set to output driving low to shut down the amplifier since audio not used here # Bit 0 is unused but set to output driving high. HAL_SPI_CSLow() SENDADDRESSWR(REG_GPIO_DIR) WRITE_8(0x83) Referencias 80 80 REFERENCIAS [1] Inforoadictos(2013). La pantalla táctil: sus orígenes. Consultado en: https://inforadictos.com/la-pantalla-tctil-sus-orgenes/ [2] Wikipedia(2019). Apple Newton. Consultado en: https://es.wikipedia.org/wiki/Apple_Newton [3] Xataca(2014). Feliz veinte cumpleaños, IBM Simon Personal: la imagen de la semana. Consultado en: https://www.xataka.com/historia-tecnologica/feliz-veinte-cumpleanos-ibm-simon-personal-la-imagen-de-la- semana-1 [4]Circuitbank. Nintendo DS. Consultado en: https://circuitbank.com/products/nintendo-ds [5]Wikipedia(2019). Pilot 1000. Consultado en: https://es.wikipedia.org/wiki/Pilot_1000 [6]Wikipedia(2019). Pantalla táctil. Consultado en: https://es.wikipedia.org/wiki/Pantalla_t%C3%A1ctil#Tipos [7] Andrew Przybylski, «Las pantallas digitales son ahora una parte intrínseca de la infancia moderna, de la generación de los llamados nativos digitales» revista Psychological Science, Universidad de Oxford, 2017. [8] Adafruit(2019). Adafruit HUZZAH32-ESP32 Feather Board. Consultado en: https://www.adafruit.com/product/3619 [9] FTDChip(2019). VM800B-FT800. Consultado en: https://www.ftdichip.com/Products/Modules/VM800B.html [10] Información obtenida de las páginas Adafruit(2019) y BRTChip(2019). Consultado en: https://www.adafruit.com/product/3619 https://brtchip.com/product/vm800b35a-bk/ 81 [11] Python(2019).Welcome to Python. Consultado en: https://www.python.org/ [12] Python(2019). Download Python. Consultado en: https://www.python.org/ [13] FábricaDigital(2019). Adafruit Huzzah32- ESP32 Feather. Consultado en: https://fabricadigital.org/tutoriales/adafruit-huzzah32-esp32-feather/ [14] FTDiChip (2014). FT800 Series programmer guide (pág. 188). Consultado en: https://www.ftdichip.com/Support/Documents/ProgramGuides/FT800%20Programmers%20Guide.pdf [15] FTDiChip (2014). FT800 Series programmer guide (pág 195). Consultado en: https://www.ftdichip.com/Support/Documents/ProgramGuides/FT800%20Programmers%20Guide.pdf Bibliografía 82 82 Bibliografía Páginas consultadas a la hora de realizar el estudio sobre la historia de las pantallas táctiles, así como sus tipos y clasificaciones: https://inforadictos.com/la-pantalla-tctil-sus-orgenes/ https://www.xatakamovil.com/desarrollo/pantallas-tactiles-capacitivas-vs-resistivas https://www.lainformacion.com/salud/investigacion-medica/exposicion-pantallas-consecuencias-negativas- adolescentes_0_990802422.html https://www.tucanaldesalud.es/es/voz-especialista/efectos-uso-excesivo-pantallas-tactiles https://es.wikipedia.org/wiki/Pantalla_t%C3%A1ctil#Tipos Documentación empleada para conocer y asentar cierta base en el campo de la programación en MicroPython, además de su importancia respecto a otros lenguajes: https://teslabem.com/blog/que-es-micropython/ https://aprendiendoarduino.wordpress.com/tag/mosi/ http://ligdigonzalez.com/por-que-utilizar-python-para-machine-learning/ https://www.instructables.com/id/MicroPython-and-UPyCraft-on-ESP32/ https://brtchip.com/vm800b-ft800-development-platform/ Páginas empleadas como ayuda a la hora de programar la librería, ya sea por el uso de ciertas funciones externas como por conocer los requisitos de la pantalla usada: http://docs.micropython.org/en/v1.9.3/wipy/library/machine.Pin.html http://docs.micropython.org/en/v1.9.3/wipy/library/utime.html http://docs.micropython.org/en/v1.9.3/wipy/library/machine.html https://www.ftdichip.com/Support/Documents/ProgramGuides/FT800%20Programmers%20Guide.pdf https://docs.micropython.org/en/latest/library/uctypes.html https://www.ftdichip.com/Support/Documents/AppNotes/AN_275_FT800_Example_with_Arduino.pdf https://cdn-learn.adafruit.com/downloads/pdf/adafruit-huzzah32-esp32-feather.pdf https://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT800.pdf https://docs.micropython.org/en/latest/esp32/tutorial/intro.html 83 ÍNDICE DE CONCEPTOS No se encuentran entradas de índice. Glosario 84 84 GLOSARIO ISO: International Organization for Standardization 4 UNE: Una Norma Española 4