100% encontró este documento útil (1 voto)
189 vistas

Programación Con Python 03

Cargado por

Jorge Cribb
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF o lee en línea desde Scribd
100% encontró este documento útil (1 voto)
189 vistas

Programación Con Python 03

Cargado por

Jorge Cribb
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF o lee en línea desde Scribd
Está en la página 1/ 92
USERS Bi |! Programaci6n en ython ©.© PROYECTOS PRACTICOS - RASPBERRY PI MICROPYTHON Programacion en ython PROYECTOS PRACTICOS - RASPBERRY PI MICROPYTHON Gaara Titulo: Programaci6n en Python - Vol. IIT / Autor: Edgardo Stasi Coordinador editorial: Miguel Lederkremer / Edici6n: Claudio Penta Disefio y Maquetado: Marina Mozzetti / Coleccién: USERS ebooks - LPCU298 Copyright © MMXX. Es una publicacién de Six Ediciones. Hecho el depésito que marca la ley 11723. Todos los derechos reservados. Esta pubiicacién no puede ser reproducida ni en todo ni en parte, por ningdn medio actual o futuro, sin al permiso previo y por escrito de Six Ediciones. Su infraccién est penada por las leyes 11723 y 25446. La editorial no asume responsabiidad alguna por cualquier consecuencia derivade de la fabricacién, funcionamiento y/o utlizecién de los servicios y productos que se describen y/o analzan. Todas las marcas mencionadas en este libro son propiedad exclusiva de sus respectivos duefios. Libro de edicién argentina, PREMIUM.REDUSERS.COM Stasi, Edgardo Programacién en Python 3 : proyectos pricticos - Raspberry Pi - Micropython Edgardo Stasi, - 1a ed . - Ciudad Auténoma de Buenos Aires : Six Ediciones, 2020 Libro digital, PDF - (Programacion en Python ; 3) Archivo Digital: online ISBN 978-987-4958-26-6 1. Lenguajes de Programacién. I. Titulo. CDD 005.4 Proyectos con Descubriendo JavaScript Arduino, PONGAEN PRACTICA EL LENGUAJE DEL MOMENT Nuestros expertos comparten su saber y experiencia Calidad y cantidad por una minima cuota mensual Cientos de publicaciones con los temas que mas interesan Siempre, donde vayas. On Line — Off Line. En cualquier dispositivo Al menos 1 novedad semanal. Lee todo lo que desees sin limites cei) Peres ALi to) SUSCRIBETE 921» mw Pete ois eekly PROLOGO Python es un lenguaje de programacién que supo ganarse el cariito de la comuni- dad de programadores tanto por su simplicidad en la escritura como en su poten- cialidad a la hora de crear un proyecto. No es extrafto, entonces, encontrarnos que cada vez mds sistemas sean imple- mentados bajo este lenguaje y que su extensa comunidad aporte continuamente librerias simples pero eficientes. En este e-book, veremos distintas maneras que existen para llevar todo su poten- cial a proyectos practicos, simples pero ilustrativos que, extrapolados, nos pueden dar una idea de cémo encarar proyectar mas grande. Para ello, veremos cémo ponerlos en prictica y obtener resultados en el mundo {fisico utilizando placas de usos miiltiples, como Raspberry pi o pyboard. También conoceremos MicroPython, una versién acotada del lenguaje, aunque no menos potente, creada exclusivamente para funcionar en componentes donde los recursos son limitados por tratarse de placas de un tamario reducido, ideales para la implementacién de sistemas dentro del mundo del lol. Acerca del autor Edgardo Stasi es un Ingeniero en informatica argentino, recibido en el afio 2004. Ha desarrollado distintos sistemas de gestion empresarial adquiriendo experiencia con los lenguajes VB6, Progress 4GL, VB.Net. En los Ultimos afios comenzé a desarrollar aplicaciones para entorno web, lo que lo llevé a capacitarse en HTML, CSS, PHP y JS. Sus primeros encuentros con Python fueron en el laboratorio de programacién de la facuitad, donde pudo visualizar su potencial y su simplicidad de Codificacin. Actualmente, es su lenguaje preferido como hobby, con el que desarrolla e implementa proyectos de domotica y robotica de manera aficionada. ython es un lenguaje de programacién multiplataforma, consistente y maduro, utilizado por numerosas empresas internacionales. Se utiliza en miltiples campos tales como aplicaciones web, juegos y multimedia, interfaces grificas, networking, aplicaciones cientificas, inteligencia artificial y muchos otros. En esta serie de ebooks sobre programacion en Python el lector encontrara todo lo necesario para iniciarse 0 profundizar sus conocimientos en este lenguaje de programacién. El curso se compone de tres volimenes, orientados tanto a quien recién se inicia en este lenguaje como a quien ya esta involucrado y quiere profundizar sus conocimientos de Python. Volumen | Se realiza una revisién de las caracteristicas de este lenguaje, también se entregan las indicaciones para instalar el entorno de desarrollo y se analizan los elementos basicos de la sintaxis y el uso de las estructuras de control, con una serie de cédigos de ejemplo explicados en detalle Volumen II Se presenta el paradigma de programacién orientada a objetos con todas sus implicancias: clases, herencia y todo el campo de posibilidades que nos abre comenzar a utilizar este paradigma en Python. Volumen III Orientado a la aplicacién de Python en proyectos, veremos ejemplos de aplicacion en Raspberry Pi y Micropython entre otros. iExitos en este nuevo desafio! 4 PRENIUM.REDUSERS.CON. 01 - QUE ES RASPBERRY PI /6 EL SOFTWARE / 6 EL HARDWARE [ 7 PREPARAMOS PYTHON / 10 ACCESO A RASPBERRY PI POR SHH /11 QUE ES SHH? 02 - GPIO / 14 DISENO DEL CIRCUITO /15 CONEXIONES PROTOBOARD PLACA / CONEXIONES DE ELEMENTOS ALTERNATIVAS SI NO TENEMOS LA PLACA / 16 NUESTRO CODIGO / 18 LIBERIA TIME / LIBRERIA GPIO / CONTINUEMOS CON EL C60'60 03 - HACKEO A MINECRAFT PI / 22 INSTALACION DE MINECRAFT / 22 PRIMEROS PASOS / 23 HOLA MINECRAFT / 25 CONECTARNOS CON MINECRAFT / 25 COMANDOS PYTHON PARA MINECRAFT PI / ARMEMOS NUESTRA CASA OTROS COMANDOS INTERESANTES / 38 MINECRAFT.PLAYER / MINECRAFT.CAMERA APLICACIONES / 39 04 - MICROPYTHON / 40 VENTAJAS / 40 DESVENTAJAS / 40 PREMIUM.REDUSERS.COM PLACAS COMPATIBLES CON MYCROPYTHON / 41 PYBOARD / WIPY / ESP8 266 / BBC.MICRO.BIT PLACAS PYBOARD / 44 PRIMEROS PASOS / MODULO PYB / CLASES / MODULO MACHINE / SIMULADPOR ON LINE DE PYBQARD ENCENDAMOS EL LED / 54 05 - PROYECTOS EN MYCROPYTHON / 56 HOLA MUNDO | 56 LA CLASE l2C / LA CLASE FRAMEBUF HAGAMOS NUESTRA APLICACION / 60 CONTROL DE SERVO / 63 PYTHON Y 10T / 69 Apéndice - DJANGO: PYTHON EN LA WEB / 70 QUE ES DJANGO / 70 ‘SUS ORIGENES INSTALACION EN WINDOWS O LINUX /71 EN LINUX / EN WINDOWS: ENTORNOS VIRTUALES / 72 USOS DE ENTORNOS VIRTUALES CREAR UN PROYECTO / 74 ESTRUCTURA AGREGAR UNA APLICACION A UN PROYECTO /78 LOGICA DEL FUNCIONAMIENTO / ARMADO DE UN TEMPLATE / HOLA MUNDO. RESUMEN / 87 Qué es Raspberry pi La tecnologia avanza en una direccién indiscutible apuntando a la hiperconectividad, y en este proceso el LoTT (internet de las cosas) toma relevancia y comienza a vivir Su auge. Para acompaiiar este movimiento, surgen placas que simplifican el diseflo y la implementacion de proyectos que permiten conectar distintos dispositivos para obtener, procesar y transmitir informacion en tiempo real Raspberry pi da un salto a esto e integra en una placa de un tamafto poco mayor que una tarjeta de crédito una computadora funcional con todos sus componentes. Solo basta conectarle una memoria con una imagen del sistema operativo, un teclado, un mouse, un monitor y parlantes, para poder disfrutar de sus capacidades. EL SOFTWARE Si bien podemos instalar distintas versiones de sistemas operativos, al menos, para seguir este curso, recomendamos instalar Raspbian, una distribuci6n GNU/Linux basado en Debian y optimizada para el hardware disponible. Una vez que tenemos este sistema operativo funcionando, vamos a verificar que, dentro de los programas preinstalados, se encuentra Python, por lo que solo nos resta comenzar a escribir chdigo para generar nuestros programas, procesos 0 automatizaciones. Ra Ss p b I a n Raspbian: distribucién Debian para Raspberry pi. 6 PRENIUM.REDUSERS.CON. EL HARDWARE Como ya hemos visto, la placa Raspberry pi es una computadora integrada, a la que solo le faltan los periféricos. Segiin la version que tengamos, sera el hardware disponible, sin embargo, para los alcances de este e-book, es indistinto con cual estemos trabajando. Placa Raspberry pi 2015. Si observamos detalladamente la imagen anterior, nos vamos a encontrar con una serie de pines generales de entrada/salida, conocidos como GPIO (General Purpose Input/Output), estos nos van a permitir interactuar con el mundo exterior mas alla de los periféricos estandares PREMIUM.REDUSERS.COM 1. Qué es Raspberry pi Desde Python, veremos como conectarnos y obtener o transmitir datos a través de ellos. Por tal raz6n, es importante que sepamos cmo identificarlos y cual es su funcion individualmente. KEE les ae bg Uilele 9 CVT ee} Lele 2 Alimenta isle Ieee ele Baecets) En las Ultimas versiones de Raspbian OS, podemos ejecutar pinout por consola para obtener la configuracién de pines sobre la placa que estamos Alimentacién 84 1 sbaiando Alimentacion 5v Masa BCM 14 (1x0) BCM 15 (Axo) BCM 18 (pwn) Masa BCM 23 BCM 24 Masa BCM 25 BCM 8 (ceo) BCM 7 (ce1) BCM 1 (1osc) Masa BCM 12 (pwno) Masa BCM 16 BCM 20 (mos), BCM 21(sciK) Resultado de pinout. PRENIUM.RED| con Peer Perera ea Suna eed Camera ports (CSI) [See va eos 8) rr EE] ted te! GPIoa (7 ones othe) CaCed Cary Cota ote tre) EYemal ote) Coeet) Cao ty) CoCr ated GPIO7 GPT00 orn at) Corr ted Cored ator) coer Cr ats) Cetra PREMIUM.REDUSERS.COM python Vol.3, Para trabajar desde Python, bastard con asignar a una variable un pin determinado. A partir de ese momento, podremos leer o escribir el estado de dicha variable, que va a otorgarnos el estado electrénico del pin en cuestion. En Raspberry pi podremos hacerlo de dos formas distintas * mediante el ntimero fisico en la placa, 0 * mediante el nimero de canal asignado en el procesador (BCM). clea en cuenta Los pines GPIO Peer Le Rd Pu acy Dae esto para evitar sobrecargarlo y CTE ac} placa Raspberry pi. 1. Qué es Raspberry pi eS PREPARAMOS PYTHON Para comenzar a programar con Python, debemos contar con la libreria GPO. Si nuestra placa tiene instalado Raspian OS, ya viene correctamente instalada. Sin embargo, si por algin motivo no se encuentra, 0 estamos utilizando alguna otra distribucién como sistema operativo, deberemos ejecutar desde consola los siguientes comandos: Con el primero, instalamos Python, si no esta. Mientras que, con el segundo, instalamos la libreria GPIO. Cuando, por algin inconveniente, el paso anterior no funciona, podemos instalar la Libreria en forma manual. Lo primero que haremos es descargar el paquete desde: https://pypi.org/project/RPi.GPIO/. Luego, lo descomprimimos (en caso de cambiar el nombre del archivo, colocamos el correcto): Entramos al directorio que acabamos de crear en la descarga: Instalamos la libreria con: Con todo esto, ya estamos en condiciones de comenzar a programar. Dicha programacién podemos hacerla de dos maneras distintas. * Desde la misma placa, instaldndole los periféticos adecuados para poder manipular y visualizar como si de una computadora se tratase. * De manera remota, accediendo mediante SSH (Secure Shell). 10 PRENIUM.REDUSERS.COM eee python Vol.3 ACCESO REMOTO A RASPBERRY PI POR SSH Si no contamos con los periféricos adecuados o preferimos acceder a nuestra placa de manera remota, podemos utilizar este protocolo y trabajar desde una PC como si estuvigramos haciéndolo desde la misma Rasberry pi. éQué es SSH? Es un protocolo de acceso remoto seguro, que utiliza la arquitectura cliente/servidor. A diferencia de otros protocolos, SSH encripta la informacion . iia Swatch lly Raspberry Pi i Esquema basico de SSH. Para poder acceder, es condicién que estemos conectados en la misma red y que conozcamos la ip @ Prearammng ® office @ treme Bb Games de la Raspberry pi —_— Lo primero que haremos es habilitar desde la ® tap > 2 Raspberry el SSH. Para ello, deberemos conectarle By 4 Remove sotare un monitor y un teclado, Dir We, Aopearance Settings y acceder a la parte de GBI Audio Device Settings configuraciones. BB srurcown FA vain ers ester [BB Mouse and Keyboard Settings Acceso a configuracién por SSH. PREMIUM.REDUSERS.COM "1 1. Qué es Raspberry pi eS Activacién SSH - Modo grafico Luego, en la ventana que se nos abre, presionamos en la solapa de interfaces, buscamos la opcién SSH y la tildamos en enable. 120: Enabled © Disabled Sonat: ® Enabled Disabled 1-Wire Enabled © Disabled Remote GPIO: Enabled © Disabled Hecho esto, podremos acceder desde la maquina cliente. Para eso aceedemos a la consola de comandos y escribimos ssh seguida del nimero ip y el nombre del usuario -Lusr-name (por defecto pi). Al presionar ENTER, nos pediré una contrasefia, que por defecto es raspberry. Una vez cumplidos estos pasos, ya estamos dentro de nuestra placa y podremos enviar los comandos como si estuviéramos de manera local. En el caso de que tengamos instalada una versién de Raspbian Lite, que no incluye la interfaz grafica y solo tenemos acceso por consola de comandos, deberemos escribir sudo raspi-config y asi se nos abrir un ment. Ment acceso a configuracién por comandos. 12 PRENIUM.REDUSERS.CON. Ss python Vol.3 Una vez en este ment, accedemos a Interfacing Options y seleccionaremos, en la nueva pantalla, la opcién SSH para habilitarla. Activacién SSH - Modo comandos Ahora si. Ya tenemos todo en condiciones para poder comenzar a programar nuestro proyecto. PREMIUM.REDUSERS.COM 13 GPIO En este capitulo nos introduciremos en el uso de la libretia GPIO. Como vimos en el capitulo anterior, podremos transmitir o recibir sefiales de cada uno de los pines de la placa Para poner esto en practica, diseftaremos un circuito con el cual sera posible encender 0 apagar un led mediante un pulsador, Disefio eléctrico de nuestro proyecto 14 PRENIUM.REDUSERS.CON. Los materiales que utilizaremos son: © Una placa Raspberry pi 3 * Un diodo led * Una resistencia de 1000. * Un pulsador. * Una protoboard * Tres cables macho-hembra * Dos cables macho-macho. Para escribir nuestro cédigo, crearemos una carpeta llamada proyectos y, dentro de esta, un archivo con el nombre proyecto py en donde escribiremos nuestro eédigo Python. DISENO DEL CIRCUITO Para asegurarnos un correcto funcionamiento, conectaremos siguiendo el siguiente detalle CONEXIONES PROTOBOARD-PLACA * Tomaremos un cable macho-hembra y conectaremos la columna 2 de la zona de alimentacién de nuestra protoboard al pin 6 (GND). * Desde el pin 3 (BCM 2), conectaremos la linea 3 * Luego, desde el pin 11, conectaremos la linea 13 * Conectaremos la fila I y 8 con la columna 2 de la zona de alimentacién, que ya habiamos conectado GND de la placa PREMIUM.RED com 2. GPIO CONEXIONES DE ELEMENTOS * El pulsador lo colocaremos puenteando la fila 1 y 3 de la protoboard. * El LED, lo conectaremos: positivo en fila 9 y negativo en fila 8 * Colocaremos la resistencia de manera que haga un puente entre la fila 13 y la fila 9 para alimentar el led de manera segura. ALTERNATIVAS SI NO TENEMOS LA PLACA Ya contamos con nuestro circuito armado y con el archivo creado listo para recibir el codigo que ejecutaremos en nuestra Raspberry pi. Solo nos resta comenzar a codificar. Pero si no tenemos una placa, podemos simular de manera online nuestro proyecto Para esto, accederemos a un simulador online gratuito alojado en https://create.withcode.uk/, donde podremos codificar y observar los resultados sin necesidad de tener una placa Calculos de Resistencia Sabemos que nuestro led funciona con un voltaje de 2,1V, con una ee CER Cea Kersh SEES Cte ues One eu ee eS eR CCR CR CUCU eee ics 3,3V-2,1=1,2V Secrecy necesitaremos una resistencia para obtener una caida de tensi6n de al menos 1,2V. OMe ee oy Wnty d ea Lee) toe Ue Ce AOR yale rau ice 16 PRENIUN.RED con Casas python Vol.3 ee create.withcode.uk mycode.py HH name = input("What is your name?") print("Hello " + name) Dt Simulador online de Python. Su uso es simple intuitivo, ya que va cargando componentes a medida que importamos bibliotecas en nuestro codigo En el caso de importar GPIO, nos mostrara la siguiente pantalla . create.withcode.uk mcode.py HH import RPi.GPIO as io mycode.py x Médulo de GPIO cargado. En este médulo, visualizaremos una luz, que indica el estado de un pin, y podremos tildar para indicar que esta recibiendo una sefial y simular asi el comportamiento de nuestro proyecto. PREMIUM.REDUSERS.COM W7 2.GPIO ea NUESTRO CODIGO Lo primero que haremos es importar la libreria que nos permitira codificar y manipular cada uno de los pines GPIO. Es importante colocarle un alias (en este caso io), para simplificar el llamado posterior a la libreria.Luego, para tener un mejor manejo del tiempo y las esperas, importamos la libreria time: Antes de avanzar, detengémonos a analizar estas librerias para conocer brevemente de qué se tratan. LIBRERIA TIME Esta biblioteca incluye un conjunto de funciones que nos permiten trabajar con fecha y hora. Entre las mas importantes, podriamos mencionar: * time(): nos devuelve la cantidad de segundos que transcurrieron desde las 0 h del 1 de enero de 1970 © ctime(): esta funcién convierte una expresidn devuelta por time() en una cadena del tipo semana mes dia hora:minutos:segundos aio. Por ejemplo sat noy 1 20:30:01 2019. * gmtime( ): obtencidn del tiempo UTC (tiempo universal coordinado) a partir de los segundos. Esta funcién nos devuelve un objeto que posee los siguientes atributos: + tm_year: afio + tm_mon: mes + tm_mday: dia del mes + tm_hour: hora «tm_min: minutos + tm_sec: segundos + tm_wday: dia de la semana [0, 6] + tm_yday: dia del afio [1, 366] + sleep(n): funcion que pone en suspensién n segundos la ejecucién del programa. 18 PRENIUM.REDUSERS.COM SS python Vol.3 LIBRERIA GPIO Como ya se ha dicho, esta libreria es la compuerta entre los pines de entrada/salida de la placa y Python. Por tal raz6n resulta mds que interesante el hecho de conocer cuales son las funciones mas importantes que contiene. * setmode(modo): indica en qué modo vamos a referenciamos a los pines. Podemos darle dos valores: de GPIO.BCM o por la placa (GPIO. BOARD). © setup(pin, modo): configura para qué vamos a utilizar el pin. Podemos darle dos valores: a modo GPIO. OUT (salida) 0 GPIO. IN (entrada). * output (pin, valor): indicamos el valor que sacaremos por el pin sefalado. Puede tomar dos valores: GPIO.HIGH (emitimos sefal, 3.3V) 0 GPIO. LOW (no emitimos, 0). * input (pin): lee el valor del pin indicado. El resultado puede estar entre dos GPIO.HIGH (se reciben 3.3V) 0 GPIO. LOW (no se recibe nada, OV). * PWM(pin, frecuencia): modulacién por ancho de pulso. Es un modo en el que se modula la sefial para simular una transferencia analdgica al pin indicado controlando la cantidad de energia que se entrega 0 se recibe. * cleanup(): limpia el estado de todos los puertos empleados, devolviéndoles su estado original. CONTINUEMOS CON EL CODIGO Ya importamos las librerias que vamos a utilizar en nuestro proyecto, ahora nos toca comenzar a configurar de qué modo utilizaremos estos pines En este caso, lo referenciaremos segin el canal empleado por el procesador, por tal motivo configuraremos el modo en BCM. Si miramos nuestro esquema, veremos que el pulsador lo conectaremos al pin 3 (BCM2), y el led, en el pin 11 (BCM17). Para ello, configuraremos el BCM2 como entrada y el BCM17 como salida. PREMIUM.REDUSERS.COM 19 2.GPIO Pero para no tener que estar continuamente pensando qué numero representa cada elemento, vamos a definir una variable para el pulsador y una para el LED. Y referenciaremos el pin en el setup con estas variables. pulsador = 2 led = 17 GPIO.setup(pulsador, GPIO.IN) GPIO.setup(led, GPIO.OUT) Lo que haremos ahora es generar un ciclo de 100 vueltas, con un retardo de medio segundo, que leera continuamente el estado del pulsador, y en caso de obtener un valor, encendera el led poniendo el estado del pin en alto. En caso contrario, lo pondré en bajo. Una vez finalizado el ciclo, limpiamos el estado de todos los pines utilizados. for i in range(100): inputValue = GPIO.input(pulsador) if (inputValue == True): GPIO.output(led, GPIO.HIGH) else: GPIO.output(led, GPIO.LOW) time.sleep(@.5) GPIO. cleanup() 20 PRENIUM.REDUSERS.CON. Casas python Vol.3 create.withcode.uk rmycode-py #84 import RPi.GPIO as GPIO import time GPIO. setmode (GPIO..BCM) pulsador = 2 led = 17 GPIO. setup(pulsador, GPIO.IN) GPIO.setup(led, GPI0.OUT) for i in range(10@) inputValue = GPIO. input (pulsador) if (inputValue ue): GPIO.output(1ed, GPIO. HIGH) else: GPIO.output(led, GPIO. LOW) tne. ste09(0.5) >Be GPIO.cleanup() mycode py * Simulador en ejecucién y cédigo completo PREMIUM.REDUSERS.COM 21 Hackeo a Minecraft Pi Minecratt Pi es una version libre de este popular juego reescrito exclusivamente para las placas Raspberry pi. Esta pensado como una herramienta educativa para programadores y se puede descargar gratuitamente bajo licencia GNU desde https://www.minecraft.net/en-us/edition/pi/. Esta version del juego viene preinstalada en el sistema operativo Raspbian, por eso es recomendable iniciar esta placa con este sistema operativo para simplificar areas y evitar problemas de compatibilidades INSTALACION DE MINECRAFT PI Si por algiin motivo nos vemos en la necesidad de instalar Minecraft Pi, deberemos seguir estos pasos © Descargarlo desde la pagina indicada antes. * Abrir una consola de comandos. * Con el comando ed navegar hasta la carpeta donde hemos descargado el juego, por lo general. en a carpeta Download ler © Descomprimir el archivo descargado: tar- ee eae zxvf [email protected]. * Acceder a la carpeta de instalacién: cd mepi. Minecraft Pi - © Ejecutar Minecraft Pi: ./minecraft-pi. Version del juego para Raspberry También podemos descargar el juego directamente desde la consola de COIS OUT Pu Ren On et ST nur u ied weet https://s3.amazonaws.com/assets.minecraft.net/pi/minecraft-pi-0.1.1.tar.gz. 22 PRENIUM.REDUSERS.CON. PRIMEROS PASOS Para programar Ordenes en el juego desde Python, lo primero que haremos es iniciarlo. Esto podemos hacerlo desde la consola de comandbs, accediendo a la ruta donde se halla guardado el juego, o desde el ment Game de nuestra placa Raspberti, seleccionando Minecraft Pi Derr eas) Tae PIVEOITION Beery tie iyi STI =s Pantalla inicial del juego Una vez iniciado el juego, comenzamos una nueva partida presionando Start Game y, en la pantalla que se nos abre a continuacién, hacemos clic en Create new. PREMIUM.REDUSERS.COM 23 3. Hackeo a Minecraft Pi SS ee aaa) Creacién de una nueva partida. Una vez hecho esto, ya tenemos el juego listo para utilizar. Lo siguiente es abrir el IDLE de Python para poder programar. Para esto, nuevamente desde el ment principal de programas, seleccionamos. Programing->Python 3(IDLE) Es importante que tengamos en todo momento el juego abierto para que el cédigo que ejecutemos desde el IDLE se vea reflejado A partir de ahora, tenemos dos opciones: crear un archivo donde pondremos las rutinas para luego ejecutarlas, o ir escribiendo cédigo a medida que jugamos para obtener los resultados Ejecucion del IDLE de Python. a 3 Pat & e tl & & a 24 PRENIUM.REDUSERS.CON. | python Vol.3 HOLA MINECRAFT Vamos a programar nuestro primer script. En este caso, lo vamos a hacer directamente desde el IDLE sin necesidad de crear un archivo aparte. Para lograrlo, es importante que tengamos abierto tanto el juego como Python. CONECTARNOS CON MINECRAFT Para conectarnos con el juego desde Python, debemos importar la libreria Minecraft perteneciente al paquete mepi. Como ya sabemos, lo realizaremos con el comando import. Luego, deberemos crear un objeto con la funcién create(), que nos servira de rnexo entre el lenguaje y el juego Esta funcién puede ser Hamada con o sin parémetros. Si la llamamos sin parimetros, nos referenciaré a una instancia del juego que est en ejecucién en el mismo dispositive que Python y en el mismo instante. Sin embargo, podemos llamarla pasdndole dos parimetros: direccién y puerto Este cédigo crea una instancia para enlazarse a un mundo en el dispositivo cuya ip es 192.168.1.33, y la comunicaci6n se establecerd mediante el puerto 4711 A partir de ahora, ya podremos manipular el mundo de Minecraft. Para ello, solo debemos referenciar algtin método del objeto me. Para poder escribir nuestro mensaje en el chat, lo que debemos hacer es llamar al método postToChat (texto). Este método escribe directamente en el chat del juego el texto que le estemos pasando como parametro, por eso lo utilizaremos con el texto Hola Minecraft. PREMIUM.REDUSERS.COM 25 3. Hackeo a Minecraft Pi Hola Minecraft Resultado de nuestro primer script. Veremos cémo, con estas tres lineas, pudimos manipular nuestro juego de manera externa. A continuacién, disefiaremos un pequefio refugio simple, pero antes de meternos en el cédigo vamos a ver algunos de los comandos que tenemos disponibles en la libreria y que nos permitiran automatizar distintas tareas en el juego. COMANDOS PYTHON PARA MINECRAFT PI Existen distintos comandos con los que podremos hacer una variedad de acciones instanténeas en el juego solo con escribirlas en Python. De hecho, podremos crearnos una interfaz con botones para ejecutar tareas rutinarias y ponerlas en funciones al hacerle clic Muchos de los comandos que se ejecutan hacen referencia a una posicién espacial del mundo de Minecraft, por eso es importante que entendamos de qué se trata dicha posicién espacial POSICION ESPACIAL Si nos remontamos a nuestras clases de matematica, recordaremos que, en el mo- mento de querer dibujar en dos dimensiones, nos bastaba con un simple eje de dos coordenadas (x e y). 26 PRENIUM.REDUSERS.CON. eee python Vol.3 Ejes de coordenadas en 2 dimensiones Pero si quisiéramos representar algo en tres dimensiones (supongamos un punto), vamos a necesitar un eje més, por lo que obtendriamos un sistema de coordenadas de tres ejes (x, y yz), donde x representa el ancho, y la altura y z la profundidad. Ejes de coordenadas en 3 dimensiones. PREMIUM.REDUSERS.COM 27 3. Hackeo a Minecraft Pi Como el mundo en Minecraft esta en tres dimensiones, es l6gico pensar que necesitamos un eje de tres coordenadas para representar cada elemento. Y para simplificar las cosas, la unidad tomada es un bloque. Es decir que cada uno posee una unidad de ancho, por una de profundidad, por una de alto. De esta forma, si nos movemos cuatro posiciones hacia la derecha, lo que estamos haciendo es movernos cuatro bloques a la derecha En un principio, el mundo esta lleno de bloques vacios, que se van llenando con bloques de distintos materiales (piedra, césped, aire, etcétera) AIR STONE GRASS ORT COBBLESTONE WOOD_PLANKS SAPLING BEDROCK WATER_FLOWING WATER WATER_STATIONARY LAVA_FLOWING Lava LAVA_STATIONARY ‘SAND GRAVEL GOLD_ORE TRON_ORE COAL_ORE wood Leaves GLass LAPTS_LAZULT_ORE LAPTS_LAZULI_BLOCK Ceavaneunre 10 BU) 11 12 13 14 1s 16 17 18 20 21 22 ‘SANDSTONE BED |COBWEB GRASS_TALL WOOL FLOWER_YELLOW FLOWER_CYAN /MUSHROOM_BROWN MUSHROOM_RED |GOLD_BLock TRON_BLOCK STONE_SLAB_DOUBLE STONE_SLAB BRICK_BLOCK TT BOOKSHELF MOSS_STONE JopsIDIAN TORCH FIRE STATRS_woOD CHEST DIAMOND_ORE DIAMOND_BLOCK Codigo de id de los bloques en Minecraft Pi. 28 24 26 38 31 35. 7 38 39 40 41 42 a3 44 45 46 a7 48 4g 58 51 53 54 56 37 CRAFTING TABLE 58 FARMLAND 60 FURNACE_INACTIVE 61 FURNACE_ACTIVE 62 ]DOOR_WOOD 64 LADDER 65 STAIRS COBBLESTONE 67 DOOR_IRON 71 REDSTONE_ORE B SNOW 78 Tce 79 |SNOW_BLOCK 80 cactus 81 clay 82 |SUGAR_CANE 83 FENCE 85 J]GLOWSTONE_BLOCK 89 BEDROCK_INVISIBLE 95 |STONE_BRICK 98 GLASS_PANE 102 MELON 103 FENCE_GATE 107 |GLOWING_OBSIDIAN 246 NETHER_REACTOR_CORE 247 PRENIUM.REDUSERS.CON. Ss python Vol.3 Cada bloque, cada objeto dentro de nuestro mundo, se encuentra en una coordenada determinada por los valores asignados a x, y y z. Sabiendo esto, podemos aprovechar Python para agregar, quitar o modificar un bloque. También es posible posicionar nuestro personaje en distintos puntos del espacio cambiandole al menos una de estas coordenadas. Para comenzar a interactuar, es importante que sepamos cual es nuestra posicién actual, de esa manera podremos alterar el mundo en torno al personaje. Para obtener la posicién, deberemos escribir: La funcion getPos() nos va a devolver un objeto con tres valores, cada uno representa a una de las coordenadas espaciales. Entonces, resulta eficaz crear tres variables donde almacenamos cada una de estas coordenadas Otra forma de hacer lo mismo es utilizar una técnica de Python, que consiste en asignar las variables en una sola linea como sigue: Como se observa, reducimos tres lineas el cddigo de nuestro script. Si consideramos que tenemos muy limitada la cantidad de memoria disponible, comprenderemos répidamente la importancia de optimizar lo mas que podemos el cédigo. Si queremos trasladar a nuestro personaje como si lo estuviéramos teletransportando, deberemos utilizar la funci6n setPos(x,y,z). Como imaginamos, asignaremos una nueva posicién al personaje estableciéndole las tres coordenadas espaciales como pardmetro. Entonces, si quisiéramos crear un script para teletransportarnos diez bloques mas adelante, bastaria con escribir el siguiente cédigo: PREMIUM.REDUSERS.COM 29 3. Hackeo a Minecraft Pi from mcpi.minecraft import Minecraft mc = Minecraft.create() xX, y, Z = mc.player.getPos() mc.player.setPos(x+10,y,z) Ahora que sabemos la posicion de nuestro personaje y como movernos, vamos a agregar un bloque frente a nosotros. Para ello utilizaremos la funcion setBlock() Esta funcion recibe los siguientes parametros: * x: coordenada en x; * y: coordenada en y; * z: coordenada en z; * Ad: id de bloque a ingresar; * data: este parimetro es opcional y se utiliza solo en algunos bloques. Su funcién es asignarle alguna propiedad especial. Por ejemplo, si insertamos un bloque del tipo lana (id = 35), podemos variar este parametro para indicar si es blanco (data = @), naranja(data = 1), magenta (data = 2), celeste(data = 3) oamarillo (data = 4) Insertemos entonces un bloque de piedra frente al personaje. Lo que haremos es: * Definir una variable piedra a la que le asignaremos el valor correspondiente al id del bloque de piedra. * Obtener la posicién actual * Insertar el blogue en la misma posicién que el personaje, pero aumentando en uno x 0 z (si cambiamos y, situariamos el bloque por encima del personaje) from mcpi.minecraft import Minecraft piedra = 1 mc = Minecraft.create() x, y, Z = mc.player.getPos() mc.setBlock(x+1, y, z,piedra) 30 PRENIUM.REDUSERS.CON. S python Vol.3 Insertamos un bloque tipo piedra frente al personaje. AVANCEMOS UN POCO MAS EN NUESTRO CODIGO Lo que vamos a hacer ahora es que florezca todo a nuestro paso, en otras palabras, insertaremos un bloque tipo flor a medida que vamos caminando. Para ello deberemos realizar un script que no finalice nunca, y que cada corto tiempo obtenga la posicién de nuestro personaje e intercambie el bloque existente debajo por un bloque del tipo flor (id = 38) Para pausar el cédigo, utilizaremos la funcién sleep(), de la libreria time, por lo que debemos importarla a nuestro script. from mcpi.minecraft import Minecraft from time import sleep flor = 38 me = Minecraft.create() while True: x, y, Z = me.player.getPos() mc. setBlock(x,y-1,z, flor) sleep(@.1) PREMIUM.RED com 31 3. Hackeo a Minecraft Pi Pero si queremos ser realistas, deberiamos poner una validacién mas, porque nuestro cédigo nos inserta una flor debajo de nosotros sin importar el tipo de bloque en el que estemos parados, y podremos poner una en el agua, en la arena, en el aire 0 en el césped. Pero lo coherente seria que solo floreciera cuando caminamos por el césped, por este motivo antes de poner una flor, chequearemos si el bloque debajo de nosotros tiene un id = 2 (Grass). from mcpi.minecraft import Minecraft from time import sleep flor = 38 cesped = 2 mc = Minecraft.create() while True: x, y, Z = mc.player.getPos() mipiso = mc.getBlock(x,y-1,2) if mipiso == cesped: mc. setBlock(x, y-1,z, flor) sleep(@.1) Veremos cémo ahora, a medida que caminamos, solo pondremos una flor si lo que estamos pisando es un bloque del tipo césped. Si caminamos sobre cualquier otra cosa, no pasa absolutamente nada Como nuestro cédigo es infinito, si queremos frenarlo, deberemos presionar la combinacién de teclas Ctrl + C en la ventana de Python ARMAR UN CUBO SOLIDO DE BLOQUES Si quisiéramos crear un cubo de 5 x 5x 5 bloques, la primera solucién que encontrariamos seria la de anidar tres for de la siguiente manera: piedra = 1 x, y, Z = mc.player.getPos() for iz in range(1,6): for iy in range(1,6): for ix in range(1,6): mc.setBlock(x + ix,y + iy,z + iz,piedra) 32 PRENIUM.REDUSERS.CON. Ss python Vol.3 Pero como la premisa que debemos considerar siempre, atendiendo la memoria limitada que podamos llegar a tener en nuestra placa, es la de reducir el cddigo lo mas posible, podemos utilizar la funcién setBlocks(), que hard el mismo trabajo, pero en una sola linea. Esta funci6n, recibe dos coordenadas, el tipo de bloque y opcionalmente alguna caracteristica del bloque por insertar. Para entender el desarrollo de esta funcion, deberemos visualizar un cubo en un eje de coordenadas tridimensional, y centrarnos en dos vertices opuestos. La idea es reconocer las coordenadas de estos vértices, y Python Ilenara el cubo automaticamente con el bloque indicado. Coordenadas de vértices de un cubo. Con esta funcién, el codigo anterior quedaria de la siguiente manera: Observemos que, tanto en el primer cédigo como en el segundo, el cubo de bloques comienza a crearse a partir de la posicién del personaje mas 1, esto es para asegurarnos que no lo aplastaremos al crear nuestra estructura. PREMIUM.REDUSERS.COM 33 3. Hackeo a Minecraft Pi ARMEMOS NUESTRA CASA Ahora armarnos una casa de manera automitica. Siguiendo con el concepto minimalista, trataremos de hacerlo con la menor cantidad de cédigo posible para evitar sobrecargar la memoria de nuestra Raspberry pi Una forma sencilla de levarlo a cabo es crear un cubo sélido de madera, y en su interior crear un cubo de aire. Luego, nos deberiamos encargar de agregar una ventana y una puerta en una de sus paredes Pasemos al codigo. Como siempre, lo primero que haremos es importar las librerias que vamos a emplear: frommcpi.minecraftimportMinecraft Luego crearemos una variable que nos permita almacenar el id del bloque que utilizaremos como estructura. Como vamos a utilizar el bloque de madera trabajaremos con id = estructura = 5 Como este tipo de bloque acepta distintos tipos, crearemos otra variable a la cual le asignaremos el niimero que representa al deseado: tipo = 3 Lo que estamos haciendo al crear estas dos variables es parametrizar el bloque que utilizaremos. De manera que, si deseamos realizar la casa con otro material, no tengamos que cambiar todo el cédigo, solo bastard con cambiarle el valor a estas variables, JUNGLE WOOD PLANK Minecraft Id: 5:3 Caracteristicas del bloque a emplear. 34 PRENIUM.REDUSERS.CON. | python Vol.3 Nos conectamos con el juego, creando su instancia y asignandola a una variable. Luego obtenemos la posicién del personaje: Para dejar listas las variables de posicién, vamos a aumentar el valor de z en 15. De esta manera, no tenemos que preocuparnos si la casa puede llegar a caernos encima: Al aumentar z en 15 unidades, estamos definiendo que la casa se va a construir 15 bloques frente a nosotros. Una vez que tengamos las coordenadas listas, pasamos a crear el primer bloque macizo, el cual lo haremos de 10 x 10 x 4. El parametro y lo iniciamos desde la posicién -1. Lo hacemos asi para que el piso de nuestra casa se encuentre a la altura del suelo que estamos pisando y no sobre un escalén de un bloque. Hasta el momento, construimos un bloque sélido con el material elegido, lo que vamos a hacer ahora es ahuecarlo, Para ello crearemos un cubo de 9 x 9x 3 desde la posicion x + 1. yyz + 1hastalaposicién x + 10,y + 3yz + 10 En este caso, el tipo de bloque va a ser aire, por lo que emplearemos el id = @. Con esto ya tenemos un cubo hueco realizado con el material escogido, solo nos faltan la puerta y la ventana. Para la puerta, dejaremos una abertura de 2 x 3. Es decir, id = ®. Pero para parametrizar el valor, crearemos una variable puerta con el fin de que en el futuro podamos cambiar el material. Para la ventana, emplearemos ocho boques tipo vidrio (id = 26), por lo que insertaremos cuatro bloques con y = 1en la mitad de la pared donde coloquemos la puerta, y otros cuatro cony = 2. Entonces, sabiendo que en las coordenadas (x; y3 z) de nuestro mundo comienza una pared, y finaliza en (x + 10; y + 4; 2), podemos insertar la puerta y la ventana de la siguiente manera: PREMIUM.REDUSERS.COM 35 3. Hackeo a Minecraft Pi PUERTA * Bloquel: * Bloque2: * Bloque3: * Bloque4: * Bloques: * Bloque6: VENTANA * Bloquel: * Bloque2: * Bloque3: * Bloque4: * Bloques: * Bloque6: * Bloque7: * Bloque’: Sabiendo esto, luego de ahuecar nuestro cubo, insertaremos el siguiente cédigo: Hemos puesto una condici6n antes de insertar la ventana, porque la queremos coordenadas (x + 13 y3 z) coordenadas (x coordenadas (x coordenadas (x coordenadas (x coordenadas (x + + + + + en coordenadas (x en coordenadas (x en coordenadas (x en coordenadas (x en coordenadas (x en coordenadas (x en coordenadas (x en coordenadas (x despegada del suelo. Podemos, al principio, crear dos variables con las que parametrizaremos la puerta y la ventana. Entonces: 23 ys 2) 13; y + 13 z) 23 y + 13 z) 13 y + 23 z) 23 y + 23 z) +45 y+ 5 +55 y+ 15 +63; y+ 15 +73 y+ 15 + 45 y + 25 +53 y + 25 + 63 y + 23 +73 y + 23 y la insertamos de la siguiente manera: z) z) z) z) z) z) z) z) PRENIUM.REDUSERS.COM eee python Vol.3 for iy in range(@,3): for ip in range(1,3): #bloque para puerta mc.setBlock(x + ip, y + iy, z,puerta) if iy> @: for iv in range(4,8): #bloque para ventana mc.setBlock(x + iv, y + iy,z,ventana) Con esto, ya hemos terminado de armar toda la estructura de nuestra casa, que quedara como sigue: Disefio final de la casa armada. Lo ultimo que le haremos al c6digo es teletransportar a nuestro personaje dentro de la casa y para ello insertaremos lo siguiente mc.player.setPos(x + 5,y,z + 5) CODIGO COMPLETO Luego de haber escrito todos los pasos, nuestro cédigo final es el siguiente from mcpi.minecraft import Minecraft estructura = 5 tipo = 3 PREMIUM.REDUSERS.COM 37 3. Hackeo a Minecraft Pi puerta = @ ventana = 20 mc = Minecraft.create() Xx, y, Z = mc.player.getPos() z=z+i15 mc.setBlocks(x, y - 1, z,x +11, y+4, z+ 11,estructura, tipo) mc.setBlocks(x + 1, y, z + 1,x + 10, y + 3, z + 10,0) for iy in range(0,3): for ip in range(1,3): #bloque para puerta mc.setBlock(x + ip, y + iy, z,puerta) if iy> @: for iv in range(4,8): #bloque para ventana mc.setBlock(x + iv, y + iy,z,ventana) me.player.setPos(x + 5,y,z + 5) Mientras estemos jugando, bastard con ejecutar nuestro cédigo para que, en forma automética, aparezca una casa lista para ser habitada con nuestro personaje dentro de ella OTROS COMANDOS INTERESANTES Existen muchos comandos dentro de la libreria de Minecraft: a continuacién, pasaremos a conocer los mas destacados: © getBlock(x,y,z): en muchas situaciones, nos vemos en la necesidad de saber de qué esta hecho un determinado bloque. Esta funcién nos devuelve el id del bloque posicionado en las coordenadas pasadas como parametros * saveCheckpoint(): con esta funcién, grabamos la partida para ser recuperada en cualquier momento, sin temor a que se pierdan los cambios 0 avances realizados hasta el momento. * restoreCheckpoint( ): esta funcién nos permite recuperar una partida previamente almacenada con saveCheckpoint () 38 PRENIUM.REDUSERS.CON. eee python Vol.3 MINECRAFT.PLAYER El objeto player de Minecraft nos entrega una serie de funciones con las cuales podremos interactuar con el personaje principal Entre las funciones més importantes podemos nombrar: * getPos() y setPos(): obtenemos o seteamos la posicién actual del personaje. * getRotation( ): nos devuelve en qué direccién esta mirando el personaje. El resultado es un valor que va de @ a 369, representando los grados del angulo de rotacion. MINECRAFT.CAMERA Este objeto nos permite manipular la vista del juego. Entre los comandos mas destacados podemos nombrar: * setNormal (entityid): carga la camara normal para un determinado jugador que pasamos como parametro. * setFollow(entityid): con esta funcién, la cémara entra en modo para seguir a la entidad especificada APLICACIONES En este capitulo vimos algunos de los comandos que la libreria minecraft para Python nos ofrece. También conocimos algunos métodos para modificar el mundo que rodea a nuestro personaje. Pero las posibilidades son infinitas, y los limites de qué cosas podemos hacer queda en cada uno de nosotros hasta donde nos Ileve nuestra inventiva. Siguiendo con el ejemplo de la casa, podriamos Hamar una subrutina para amueblarla. © hacer que aparezcan y desaparezcan elementos en funcién del tiempo con las funciones setBlock() en posiciones aleatorias, con lo que nos entretendriamos como si de un minijuego se tratase, en el que el objetivo seria obtener la mayor cantidad de determinados elementos. Si bien vimos herramientas suficientes para interactuar con el mundo, podemos acceder a una guia completa del API desde https://www.stuffaboutcode.com/p/minecraft-api-reference.html.. PREMIUM.REDUSERS.COM 39 MicroPython Seginn el sitio oficial, MicroPython es un pequefio pero eficiente interprete del lenguaje de programacién Python 3 optimizado para que pueda ser ejecutado en microcontroladores y ambientes restringidos. A pasos lentos pero seguros, este lenguaje supo hacerse camino en el [oT, por un lado, por la sencillez en su uso, por la prolijidad de su cédigo; y por el otro, porque al ser de cédigo abierto cuenta con un sinfin de librerias para poder implementar cualquier tipo de proyecto, comandando una importante cantidad de placas VENTAJAS © Incluye un RELP (Read-Eval-Print-Loop 0 consola de lenguaje) que lee las instrucciones, las evalta y procesa los resultados sin necesidad de compilar 0 cargar los programas en la memoria del dispositive. Muchas librerias para la ejecucién de tareas y el simplificado de codificaci6n Con estas librerias, podemos conectarnos mediante un socket, leer un JSON (sigia en inglés de notacién de objetos de JavaScript) desde un sitio web, entre otras posibilidades, con las cuales simplificamos la programacin y reducimos el eédigo por cargar. * Extensible: podemos extender Python con lenguajes de programacién de mas bajo nivel con los cuales personalizaremos mejor los procesos y resultados. DESVENTAJAS * MicroPython esta elaborado con las funciones mas relevantes de Python 3 y sus librerias. Si bien est basado en su eficiencia, podemos encontrarnos muchas veces con que no contamos con algo que solemos utilizar en su version completa. * Como no es un lenguaje de bajo nivel, su ejecucién suele ser mas lenta que en homélogos realizados en C 0 C++. 40 PRENIUM.REDUSERS.CON. PLACAS COMPATIBLES CON MICROPYTHON Existen muchas placas compatibles con MicroPython. Si bien cada una tiene sus particularidades, todas se caracterizan por la simplicidad en el uso y la programacién de la mano de este potente lenguaje. Algunas de las mas empleadas son: PYBOARD Esta placa es un disefio compacto pero poderoso que se puede conectar a una PC mediante un cable micro USB, como el de los celulares. Fue disefiada exclusivamente para ser programada con Python, por lo que posee una integracién perfecta con este lenguaje Pena tet B PREMIUM.REDUSERS.COM a 4. MicroPython Posee una memoria RAM de 256KB, cuenta con conectividad WiFi y Bluetooth. Si bien no esté preparada para que se le instale un sistema operativo como si sucede con la Raspberry, ofrece una gran versatilidad al permitir ejecutar codigos de manera remota desde un dispositivo anfitrién, o almacenando el cddigo por ejecutar en la memoria interna de la placa para luego hacerla funcionar de manera auténoma desconectada de la PC WIPY Esta placa representa un novedoso desarrollo para IoT, centrado en la conectividad y la ejecucion de codigos Python. Esté equipada con un procesador de doble chipset Espressif ESP32 y una placa WiFi capaz de conectar | km Resulta ideal para proyectos que requieran la conexién remota de un dispositivo con todo el potencial que Python puede ofrecer, aT Lae 42 PRENIUN.RED con python Vol.3 ESP8266 Esta es una placa versatil y poderosa, pensada para ser programada tanto desde el IDE de Arduino como desde Python Su grandeza radica en que es posible ejecutar codigos enviados desde un shell a través de internet. Cuenta con el procesador ESP8266 de 80Mhz, placa WiFi y una memoria Flash de 4MB para almacenar programas. Oe NSS LE BBC MICRO:BIT BBC micro:bit es un microcomputador programable, atil para distintos proyectos que pueden ir desde un instrumento musical hasta un robot Su punto fuerte es la simplicidad para programar soportando la programacién en bloques. Fue disefiada para ser utilizada en ambitos escolares, y ha obtenido una gran aceptacién entre docentes y alumnos. a an LG Trike eT Neel a) fad or micro:bit Placa BBC micro:bit. PREMIUM.RED com 43 4. MicroPython PLACAS PYBOARD pin cru fame fame available timers peripherals aii cé rer} {3} Bo B12 ~~ B13 ——_ B14 B15 B6 87 C4. 5 inner row B3 (USR) C13 (amA)) Micro Python pyboard @PYBV1.0 == 44 PRENIUM.REDUSERS.CON. available timers CPU, Pn peripherals name hame VIN: 3.6v - 10v power input (supplied by USB when USB connected) 3V3: regulated 3.3v output only, max 300mA IVBAT: battery backup input |A3V3, analog reference connected to 3V3 via inductor X17 is pulled to GND via 4.7k resistor when USR pressed }P2-P5 are connected to the 4 LEDs ISD = AB is used for SD card switch IMMA INT = B2 is used for accelerometer interrupts connect BOOTO to 3V3 and press RST to enter DFU mode micropython.org PREMIUM.REDUSERS.COM python Vol.3 Como ya hemos visto, esta placa es disefiada exclusivamente para ejecutar cédigos Python. Si bien esto parece una limitacion, no resulta tal debido a que posee un gran potencial en el hardware En combinacion con un lenguaje simple pero potente, es posible emprender proyectos de gran tamafio gracias a su variedad de pines disponibles con una gran versatilidad de uso y configuraciones. PRIMEROS PASOS Cuando conectamos la placa pyboard a nuestra PC, como ya hemos anticipado, tenemos dos maneras de enviarle e6digo: escribiendo en la memoria flash 0 enviandole c6digo mediante un intérprete de comandos conectado por el puerto serie. ESCRITURA DIRECTA EN LA MEMORIA FLASH (MSC) Cuando conectamos la placa a nuestra computadora sin instalar ningun tipo de driver, es reconocida como si se tratase de un pendrive. Si accedemos a la unidad que se crea, nos vamos a encontrar con los siguientes archivos: 4. MicroPython * boot. py: archivo de configuracin de la placa * main. py: script que va a ejecutar la placa al ser encendida, sin importar si esta © no conectada a otro dispositivo © pybcdc. inf: driver necesario para que podamos acceder mediante un puerto serie. * README. txt: archivo de interés. Para poder introducirle un cédigo a nuestra placa, bastard con abrir y reescribir el archivo main. py Supongamos que queremos que parpadee el led | para indicar que la placa esta encendida y funcionando, deberiamos escribir en dicho archivo lo siguiente: import pyb led = pyb.LED(1) while True: led. toggle() pyb. delay(1000) Una vez que hemos actualizado el archivo main. py, debemos reiniciar la placa, para ello presionamos el botén de reset CODIFICACION DIRECTA DESDE UNA CONSOLA SHELL En este método, podemos ejecutar cédigo directamente desde nuestra computadora, y la placa vaa responder sin necesidad de actualizar ningiin tipo de archivo ni reiniciarla. Es un buen método para cuando estamos generando un programa y necesitamos chequear el funcionamiento. Para poder utilizar este método, deberemos instalar en nuestro equipo: * toggle: cambia de estado el led, si esta encendido lo apaga y si esta apagado lo enciende. OP ae CME ie Rumer 46 PRENIUM.REDUSERS.CON. eee python Vol.3 © El driver, que es el archivo pybcde.inf que encontramos en la unidad creada automéaticamente al conectar la placa a la PC. Si bien el manual recomienda utilizar solo el archivo incluido en la placa, en Windows 10 la instalacion automatica suele funcionar correctamente. * Un Shell de acceso remoto, podriamos utilizar PuTTY por ser de uso gratuito y liviano. Lo primero que haremos es ir al administrador de dispositivos y chequear en qué puerto serie se nos ha instalado la placa. Archivo Accién Ver Ayuda ¢o9\mni\bm|2 Bf Dispositivos de software a [LJ Dispositivos de tecnologia de memoria > Ka Dispositivos del sistema BF Dispositivos portatiles i Entradas y salidas de audio » GB Equipo BG Firmware i Modems » Gl Monitores >» Mousey otros dispositivos sefialadores [Otros dispositivos CO Procesadores Y §@ Puertos (COM y LPT) {Bi Dispositivo serie USB (COM15) Serie estandar sobre ellaanculo Bluetooth (COMS) i Teclados Y me Unidades de disco = ST500LTO12-1DG142 “m= _uPy microSD Flash USB Device v Reconociendo placa Pyboard desde administrador de dispositivos. PREMIUM.REDUSERS.COM 47 4. MicroPython A continuacién, abrimos PuTTY y configuramos para una conexi6n serial, determinando donde dice Serial line el numero de puerto que vimos en el administrador de dispositivos. §R PUTTY Configuration ? x Category Session Basic options for your PUTTY session : wig Specify the destination you want to connect to in Tea Serial ine Speed el com1s 9600 ——— Features Comnection type Window Raw OTehet © Riogin OSSH @ Sena Sec Load. save or delete a stored session Behaviour ‘erahiton Saved Sessions Selection in Defaut Settings Load Configuracién serial con Public TTY (PuTTY). Luego, haciendo clic en Open se nos abrir una consola de comando donde se estard ejecutando MicroPython. En esta consola, podremos ingresar el cédigo directamente y veremos el resultado en Ia placa de manera inmediata sin necesidad de resetearla. Cabe aclarar qué, utilizando este método, no se almacena nada en el firmware, por lo que todo lo que escribamos se va a perder al cerrar la consola cOMi5- PuTTY Consola MicroPython con PuTTY. 48 PRENIUM.REDUSERS.CON. eee python Vol.3 MODULO PYB Este médulo posee funciones especificas de la placa pyboard. Entre las funciones que mas se destacan podemos enumerar las siguientes: * pyb.delay(ms): crea una interrupeién de ms milisegundos * pyb.udelay(us) : crea una interrupcidn de us microsegundos. © pyb.millis(): devuelve la cantidad de milisegundos desde que la placa ha sido reiniciada. © pyb..wfi( ): entra en un estado de bajo consumo esperando una interrupcién interna o externa. * pyb.stop(): pone a la placa en un estado de suspension, y se mantiene hasta que una interrupci6n externa o una orden interna lo reactive. * pyb.have_cdc(): chequea si el usb esté conectado, devuelve True si esta, 0 False en caso contrario CLASES También, podemos encontrarnos con una serie de clases, que nos facilitan el manejo de distintos componentes internos como externos. De esta manera, ya no necesitarfamos programar ni instalar nada adicional, sino que bastard con invocar a la adecuada. Entre las clases mas relevantes podemos mencionar: * LED(): nos devuelve un objeto que representa uno de los led incluidos en la placa. Se debe pasar como pardmetro el niimero de led (1: rojo, 2: verde, 3:amarillo, 4: azul) y luego darle las opciones on(),of F() 0 toggle() import pyb led1 = pyb.LED(1) #declaramos la variable led1 #con la que manejaremos led #rojo led1.on() #1la encendemos led1.off() #la apagamos led1.toggle() #cambiamos es estado, si #esta encendida, la apagamos #o encendemos si est4 apagada led1.intensity(valor) #indicamos con que intensidad #queremos que brille. Toma un #valor entre @ y 255 PREMIUM.REDUSERS.COM 43 4. MicroPython *Accel(): la placa pyboard incluye un chip acelerémetro, con el cual podemos determinar cualquier movimiento que sufta. Para controlar tales movimientos utilizamos esta clase, que, entre sus métodos mas importantes, incluye x(), y() y 2() quienes nos devuelven tales coordenadas. import pyb pos = pyb.Accel() print (pos.x()) #Imprime coordenada x print (pos.y()) #Imprime coordenada y print (pos.z()) #Imprime coordenada z * Servo(): nos devuelve un objeto con el cual podremos manipular uno de los tres servos posibles. Una vez declarado el objeto, podremos setear el angulo de giro y la velocidad, entre otras funciones. Dentro de la placa, cada servo es conectado mediante los pines: GND, VIN y X1 (servo 1), X2 (servo 2) 0 X3 (servo 3). import pyb servo = pyb.Servo(1)#Conectamos al servo 1 servo.angle(90, 5@0)#Giramos 982 en 5 segundos * ADC(): clase para realizar conversién de andlogo a digital en cada pin #DAC(): clase para realizar conversién de digital a andlogo en cada pin * Switch: nos devuelve un objeto que nos permitira leer el estado del switch de la placa sw = pyb.Switch() # Crea el objeto sw. value() # Obtiene el valor sw.callback(f) # registra una funcién para # llamar cada vez que se # presiona En el sitio oficial de MicroPython (www.micropython.org), es posible encontrar documentacién completa sobre el uso de este médulo 50 PRENIUM.REDUSERS.CON. eee python Vol.3 Este médulo tiene asociado declaraciones y funciones relacionadas con cada placa en particular. Cada fabricante crea este médulo respetando la interfaz, de manera que sea posible intercambiar de placa sin variaciones en el codigo. ALGUNAS DE LAS FUNCIONES MAS EMPLEADAS * reset (): resetea el dispositive como si hubiéramos presionado el botén de reinicio * sleep(): pone la placa en estado de suspension, desactivando la CPU y los periféricos, salvo la placa WLAN. Para reactivar la placa, es necesario programar previamente cual es la interrupcién que lo hard. * deepsleep(): similar a sleep(), salvo que pone en estado de suspension total, y para reactivarlo se tiene que presionar el bot6n de reset () 0 programar previamente el pin que lo reactivara. CLASES IMPLEMENTADAS Al igual que pyb, machine implementa una serie de clases con las que automatizamos tareas, y atomizamos el acceso y el funcionamiento de distintos pines y componentes agregados a la placa # Pin(): devuelve un objeto que nos permitiré interactuar con un pin determinado para leer o setear su valor * WDT(): controlamos el watchdog de la placa. Con esta clase, podemos evitar un bloqueo y reiniciarla en caso de una falla En el sitio oficial de MicroPython (www.micropython.org) es posible encontrar documentacién completa sobre el uso de este médulo SIMULADOR ONLINE DE PYBOARD Si entramos en el sitio oficial de MicroPython, www.micropython.org, podemos acceder a un simulador de la placa pyboard, con el cual interactuaremos con distintas librerias sin necesidad de contar con una placa fisica Cabe mencionar que no esta completamente implementado MicroPyton y todas sus librerias, pero podemos hacer una simulacién bastante aproximada para darnos una idea general del funcionamiento de la placa PREMIUM.REDUSERS.COM 51 4. MicroPython ii ceed MicroPython Macey et ot et pn ‘cobyhon aso capt wth mal Pion as posse to Sitio oficial de MicroPython. Para acceder al simulador, deberemos hacer clic sobre el botén que dice USE MICROPYTHON ONLINE, esto nos Ilevard a un simulador online sin necesidad de instalar nada. Simulador online. 52 PRENIUM.REDUSERS.CON. SS python Vol.3 Para otorgar mayor realismo y mas versatilidad, este simulador posee cuatro sectores con los que podemos interactuar. ESPACIO DE CONSOLA Este espacio representa una consola de comando donde podremos escribir cédigo como si estuviéramos ejecutando el modo serial. De esta manera, cada sentencia que escribamos la veremos reflejada de manera inmediata. Por otro lado, si en el cédigo por ejecutar utilizamos la sentencia print(), veremos impreso en este sector el resultado, esto nos servira para hacer un seguimiento de la ejecucion del programa. ESPACIO PARA CODIGO Si escribimos el cédigo en un editor externo 0 queremos simular que estamos creando un archivo para luego actualizar el archivo main.py de la placa, debemos escribir el cédigo en este sector. Para entrar en modo de ejecucién, deberemos presionar sobre el botén que esté abajo y que dice RUN SCRIPT. A la par de este botén, veremos otro con el cual podremos cargar algiin cédigo de ejemplo de entre los que nos propone el simulador. SELECTOR DE COMPONENTES En este espacio, tenemos la opcién de conectar a la placa 4 componentes distintos © Un led: este se conecta al pin Y12. Como la clase Pin del médulo pyb no esta implementada, utilizaremos machine para encenderlo y apagarlo. * Un servo que se conecta con los pines GND, VIN y X1. © Un potencidmetro con el que podremos trabajar con el convertidor de sefiales andlogo y digital (ADC). © Una pantalla LCD. Podemos seleccionar uno o varios de estos elementos. Cada vez que tildamos uno, lo vemos reflejado en el simulador de la placa (4). PREMIUM.REDUSERS.COM 53 4. MicroPython Por arriba de los componentes, tenemos una serie de opciones para configurar el hardware de nuestra placa Ilevando la ejecucién lo mis realista posible a distintas situaciones. Para que estas configuraciones surtan efecto, cada vez que hagamos una modificacién en los parametros, deberemos presionar el bot6n que dice reset. SIMULADOR DE PLACA Este espacio es mis que un simple dibujo. En él se ve reflejado cada elemento que seleccionemos del panel 3. También podemos interactuar como si de una placa real se tratase o ver el estado de los led de placa ‘A medida que avanza la ejecucion, podremos ver como cambian los estados de cada componente en este sector. También es posible presionar sobre el boton de reset, en el caso de que necesitemos reiniciar la placa, o si un error de cédigo nos ha llevado a una mala ejecuci6n o ciclo infinito También podemos presionar sobre el botén de usuario o switch ENCENDAMOS EL LED A modo de prueba, vamos a realizar un pequefio seript que nos permitiré encender las cuatro led de la placa de nuestro simulador, En primer lugar, importamos las librerias que vamos a utilizar, en este caso emplearemos time y pyb import time import pyb El paso siguiente es realizar un ciclo de 1000 vueltas que ira cambiando el estado de cada luz en forma alternada definiendo a 4 como iterador. Para realizar una division cuyo resultado queremos que sea lo mas preciso posible, utilizamos el operador /. Por el contrario, sila idea es CU Cm CMU ec OMe eae ETE a1) Ey es 54 PRENIUM.REDUSERS.CON. Ss python Vol.3 Sabiendo que tenemos cuatro luces, vamos a dividir nuestro iterador en cuatro con el operador %, lo que nos ira arrojando un valor entero que va a estar entre @ y 3. Con este resultado, invocaremos a la funcion toggle de la clase LED(), con lo que iremos encendiendo y apagando alternadamente cada una de las lamparas de la placa. Para dar un tiempo de espera entre cada suceso, emplearemos la funcién sleep_ ms de la clase time. PREMIUM.REDUSERS.COM 55 Proyectos en MicroPython En este capitulo, crearemos una serie de proyectos simples escritos en MicroPython. Para ponerlos en practica sin necesidad de adquirir la placa pyboard, emplearemos el simulador descripto en el capitulo anterior. Para ello, accederemos a http://www.micropython.org/unicorn/, donde nos abrir el simulador de Python y la placa pyboard. HOLA MUNDO En este primer proyecto, emplearemos una pantalla LCD, donde imprimiremos el tradicional Hola Mundo. Para llevar a cabo nuestro proyecto, deberemos conectar una pantalla monocromatica en los pines x9 y x10. Si miramos la referencia de pines de la placa pyboard, veremos que x9 corresponde a SCL y x10 corresponde a SDA. Pero {qué significan estas siglas? Muchos sensores y periféricos, como la pantalla que queremos conectar, requieren de dos pines en serie para poder funcionar, uno correspondiente a datos (serial data), conocido como SDA, y otro correspondiente al clock interno (serial clock), conocido como SCL. MicroPython implementa una clase para poder controlar estos pines, conocida como 12C. Es importante mencionar que este bus permite la conexién de mas de un dispositivo, para ello a cada uno que se conecta se le asigna un identificador tinico con el cual podra intercambiar datos. Como esta conexién es serial, la transmisi6n y recepcién de datos queda definida por palabras de 8 bits. 56 PRENIUM.REDUSERS.CON. PREMIUM.REDUSERS.COM Pines SDAy SCL 5. Proyectos en MicroPython eS LA CLASE |2C Esta clase es implementada tanto por pyb como por machine. Si bien el funcionamiento es homélogo en ambos médulos, existen diferencias sutiles en sus implementaciones. Como el simulador con el cual trabajamos solo implementa el médulo de machine, explicaremos algunos de los métodos implementados por esta clase. DECLARACION El constructor requiere cuatro parametros, de los cuales solo dos son requeridos: i2c = machine. 12C1(id,scl,sda,frq). Donde: * id: es la identificacién Gnica del dispositivo conectado, por defecto es -1 * scl: (requerido) corresponde al pin del clock. * sda: (requerido) corresponde al pin de datos. * frq: con este parimetro configuramos la frecuencia minima del clock. Dicha frecuencia debe ser compatible con el dispositive que conectamos INIT(SCL,SDA, FREQ) Este método inicializa el bus con los parametros especificados. Es importante que respetemos los pines scl y sda de la placa en el momento de llamar a este método, en caso contrario nos arrojara un error. DEINITO Finaliza el bus 12C. METODOS PRIMITIVOS Estos métodos forman parte del disefio primitivo de la clase y permiten implementar la lecturalescritura de un dispositivo * start(): inicializa una transaccién, pone el pin de datos en bajo, y el del clock, en alto. * stop(): finaliza una transacci6n, pone el pin de datos en alto mientras el de clock lo sostiene en alto. *readinto(buffer, nack=True): lee un paquete de bytes del dispositivo y los almacena en la variable buffer. Si nack es true, se indica que ya no 58 PRENIUM.REDUSERS.CON. eee python Vol.3 se volver a leer, por lo que vacia el buffer de lectura. En caso contrario, queda esperando a una siguiente lectura. * write (buffer): escribe en el dispositivo los byte enviados por buffer. OPERACIONES ESTANDARES. Con estos métodos, se pueden llevar a cabo operaciones de lectura y escritura de un dispositivo determinado. * readfrom(addr, nbyte,stop): lee n bytes del dispositivo cuya id es addr y los devuelve para asignarlos a una variable. Si stop es verdadero, se genera la condicion de parada al final de la transferencia. * readfrom_into(addr, buffer, stop): lee todo el contenido del dispositivo cuya id es addr y lo devuelve dentro de la variable buffer. Si stop es verdadero, se genera la condicion de parada al final de la transferencia *writeto(addr, buffer ,stop): escribe los bytes del buffer pasado como pardmetro. *writetovto(addr, vector, stop): escribe los bytes contenidos en el vector que es pasado como pardmetro al dispositivo conectado cuyo id es addr. LA CLASE FRAMEBUF En nuestro proyecto, también utilizaremos este médulo para crear un buffer donde cargaremos una imagen o un texto y lo pasaremos a nuestra pantalla. Esta clase nos permite trabajar a nivel pixeles una imagen, generar una linea, un rectngulo o un texto y traducirlo a un buffer de byte CONSTRUCTOR El constructor requiere cinco parametros: * buffer: un espacio de memoria donde almacenaremos todos los bytes. width: el ancho expresado en pixeles. * height: el alto expresado en pixeles. * format: corresponde al tipo de los pixeles que se van a almacenar. (MONO_ HLSB: monocromatico; RGB565: color RGB de 16 bits; GS2_HMSB: escala de grises de 2 bits; GS4_HMSB: escala de grises de 4 bits; GS4_HMSB: escala de grises de 8 bits). © stride: representa la cantidad de pixeles entre dos lineas horizontales. PREMIUM.REDUSERS.COM 59 ty 5. Proyectos en MicroPython oa METODOS *fill(c): pinta todo el buffer del color pasado como parametro. * pixel(x,y,c): si el color no es pasado, devuelve el color de un determinado pixel. Por el contrario, si se pasa como parametro el color, se setea dicho color en el pixel determinado por las coordenadas x e y. *hline(x,y,w,c);vline(x,y,h,c); line(x1,y1,x2,y2,c): con estas funciones podemos dibujar una linea; la primera la hacemos horizontal; la segunda, vertical; y la tercera, entre dos puntos pasados por las coordenadas. *rect(x,y,w,h,c); fill_rect(x,y,w,h,c): con estas funciones podemos dibujar un rectangulo con inicio x, y, de ancho wy alto h. La diferencia entre una y otra es que la primera solamente dibuja el contorno (un solo pixel como borde) mientras que la segunda realiza un recuadro leno. * text(s,x,y,¢). escribe un texto (s) en las coordenadas indicadas (x € y), del color ¢. Hasta el momento, el texto se realiza en un tamafio de 8 x 8 sin posibilidad de hacer un cambio en la fuente. HAGAMOS NUESTRA APLICACION Para comenzar a llevar a cabo nuestra aplicacién, lo primero que haremos es importar las librerias que utilizaremos, estas son: machine, 12C, y framebuf. Como la declaracién del objeto 12¢ requiere los pines de dato y clock, utilizaremos Pin de machine para referenciarlos. Como vimos, la placa pyboard reserva al pin X9 como SCL y al pin X10 como SDA EI paso siguiente es crear nuestro buffer, para ello lo primero que tenemos que ver es el tamaiio del display y el tipo de pantalla. En nuestro caso, que estamos 60 PRENIUM.REDUSERS.COM Ss python Vol.3 utilizando el emulador, tenemos una pantalla monocromatica cuya dimension es de 64 columnas por 32 filas fbuf = framebuf.FrameBuffer(bytearray(64 * 32 // 8), 64, 32, framebuf .MONO_HLSB) Para saber cual es el tamafio de nuestro buffer, creamos un array de byte de 64 columnas y 32 filas, dividido en grupos de ocho que conforman nuestra palabra, como mencionamos al principio Ya tenemos todo definido, solo nos queda empezar a dibujar. El primer paso es pintar todo de negro. De esta forma nos aseguramos que el buffer no incluya basura en su contenido. fbuf.fil1(0) Lucgo, agregamos el texto Hola en la columna 15, fila 8 Como sabemos que cl alto es de 8 pixeles, escribiremos Mundo cn la columna 15 fila 18 fbuf.text(‘Hola’, 15, 8) fbuf.text( ‘Mundo’, 15, 18) Por tiltimo, enviaremos la informacién a nuestro display. i2c.writeto(8, fouf) Resultado de nuestro cédigo. PREMIUM.REDUSERS.COM 61 5. Proyectos en MicroPython Pero para darle un toque mas artistico a nuestro proyecto, vamos a agregarle como detalles un punto en cada extremo del display y le insertaremos un recuadro ala frase Hola Mundo. Para insertar un punto, pintaremos un pixel en la posicién que deseemos. En este caso, pondremos uno en las coordenadas correspondientes al extremo izquierdo superior y otro en el derecho inferior. Esto es: fbuf.pixel(@,2,1) fbuf.pixel(63,31,1) y para el recuadro, utilizaremos la funcién rect. fbuf.rect(14,7,45,20,1) De esta forma, nuestro c6digo finalmente nos queda de la siguiente manera: import machine import framebuf from machine import 12C scl = machine. Pin( ‘x9? ) sda = machine.Pin(‘x1@’) i2c = 12C(scl=scl, sda=sda) fbuf = framebuf.FrameBuffer(bytearray(64 * 32 // 8), 64, 32, framebuf.MONO_HLSB) buf. fill(@) fbuf.pixel(@,8,1) fbuf. pixel(63, 31,1) fbuf.rect(14,7,45,20,1) fbuf.text(‘Hola’, 15, 8) fbuf.text(‘Mundo’, 15, 18) i2c.writeto(8, fbuf) 62 PRENIUM.REDUSERS.CON. eee python Vol.3 Estado final de nuestra aplicacion. CONTROL DE SERVO En este proyecto, armaremos un sistema en donde podremos mover un potenciémetro para cambiar la posicién de un servo mecanico. Para saber cual es la inclinacién que ha adquirido el servo, mostraremos en un display el Angulo de giro Estado inicial del sistema. Si llevamos a la practica este proyecto con componentes reales, deberemos instalar dichos componentes de la siguiente manera: * Potenciémetro: en el pin Y4 * Display: SCL en el pin X9 y SDA en X10 * Servo: en los pines X1, GND y VIN, tomando la precaucién de que estos dos Ultimos pertenezcan a la fila de X1 PREMIUM.REDUSERS.COM 63 5. Proyectos en MicroPython ea LAS LIBRERIAS POR IMPORTAR SON LAS SIGUIENTES. * machine: para obtener los pines correspondientes al potenciémetro y al display. * 12C: para trabajar con el display. * pyb: para interactuar con el servo y llevar a cabo la conversién de seftal andloga a digital del potenciémetro, y poder interactuar con las led de estados. © time: para realizar una espera antes de volver a chequear el estado del potencidmetro. * framebuf: para cargar la informacion por mostrar en el display. Una vez que esta todo preparado, definimos las variables con las cuales interactuaremos con el servo, con el potenciémetro y con el display. SERVO Como conectamos el servo en la linea correspondiente al pin X1, nuestra variable la definiremos de la siguiente manera: Si la conexién fuese en la linea del pin X2, usariamos Servo(2), y si fuera en la linea del pin X3, Servo(3). POTENCIOMETRO Nuestro potenciémetro est en el pin Y4, por tal raz6n, crearemos primero la variable que represente a dicho pin, y luego la variable que nos permitira interactuar con el potenciémetro propiamente dicho. DISPLAY Nuestro display esta conectado en los pines X9 y X10, por lo que crearemos las variables para representar ambos pines y la variable correspondiente al display. g PRENIUM.REDUSERS.COM

También podría gustarte