Instituto Politécnico Nacional
Unidad Profesional Interdiciplinaria
en Ingenieria Alejo Peralta
Fundamentos de Programación
Ingenieria en Control y Automatización
Práctica 6: Comunicación serial con pyserial
Integrantes:
Boleta Nombre Apellido Paterno Apellido Materno
2025720149 Antonio Sánchez Cruz
2025720003 Héctor Quiroz Téllez
2025720081 Ángel Gael Vásquez Gómez
2 de Mayo de 2025
UPIIAP Unidad de Aprendizaje 2AM1
1. Introducción
En esta práctica se trabajó con la lectura de tres potenciómetros conectados a un Arduino, enviando
los datos a la computadora por el puerto serial. Utilizando Python y la librerı́a matplotlib, se graficaron
en tiempo real los valores de dos potenciómetros, mientras que el valor del segundo potenciómetro se
usó para cambiar dinámicamente el tı́tulo de las gráficas según el rango en el que se encontraba. Cada
gráfica mostró la evolución de los datos conforme pasaba el tiempo, y se configuraron lı́mites para que
las señales se vieran de forma clara. Además, se programó una condición para finalizar la ejecución
automáticamente cuando los tres potenciómetros cumplieran ciertos rangos de valores establecidos.
2. Pseudocódigo
Este programa se explica en el siguiente pseudocodigo.
article [utf8]inputenc [spanish]babel [linesnumbered,ruled,spanish]algorithm2e
Algoritmo 1: Contador de dı́as y comidas desde Arduino
Input: Puerto serial COM9, datos de dı́as y comidas
Output: Conteo de dı́as y comidas
1 Función main:
Data: Diccionario conteo dias, conteo comidas
Data: Puerto serial Arduino
2 for i ← 1 to 2000 do
3 texto ← [Link]();
4 if texto no es vacı́o then
5 foreach palabra en [Link]() do
6 if palabra en conteo dias then
7 conteo dias[palabra] ← conteo dias[palabra] + 1;
8 else if palabra en conteo comidas then
9 conteo comidas[palabra] ← conteo comidas[palabra] + 1;
10 return conteo dias, conteo comidas ;
1
UPIIAP Unidad de Aprendizaje 2AM1
Algoritmo 2: Lectura de potenciómetros y envı́o de datos
Input: Pines analógicos A0 y A1, valores de umbral
Output: Datos de dı́a y comida
1 Función loop:
Data: Valores de potValue y potValue2
Data: Cadenas de dı́as y comidas
2 potValue ← analogRead(A0);
3 potValue2 ← analogRead(A1);
4 if potValue ¡200 then
5 [Link]("Hoy es el dı́a Lunes");
6 else if potValue ¿200 and potValue ¡= 400 then
7 [Link]("Hoy es el dı́a Martes");
8 else if potValue ¿400 and potValue ¡= 600 then
9 [Link]("Hoy es el dı́a Miércoles");
10 else if potValue ¿600 and potValue ¡= 800 then
11 [Link]("Hoy es el dı́a Jueves");
12 else if potValue ¿800 and potValue ¡= 1000 then
13 [Link]("Hoy es el dı́a Viernes");
14 else if potValue ¿1000 and potValue ¡= 1023 then
15 [Link]("Hoy es el dı́a Vietsen");
16 if potValue2 ¡200 then
17 [Link]("de lasagna");
18 else if potValue2 ¿200 and potValue2 ¡= 400 then
19 [Link]("de pizza");
20 else if potValue2 ¿400 and potValue2 ¡= 600 then
21 [Link]("de sushi");
22 else if potValue2 ¿600 and potValue2 ¡= 800 then
23 [Link]("de Ramen");
24 else if potValue2 ¿800 and potValue2 ¡= 1000 then
25 [Link]("de Pozole");
26 else if potValue2 ¿1000 and potValue2 ¡= 1023 then
27 [Link]("de Tlayuda");
28 delay(80);
3. Código
Una vez teniendo el pseudocodigo y teniendo ideas claras lo que deseamos que se realizara con el
programa, procedemos a escribir nustro codigo final el cual, queda de la sieguiente manera:
2
UPIIAP Unidad de Aprendizaje 2AM1
1 import s e r i a l
2 d e f main ( ) :
3
4 Arduino = s e r i a l . S e r i a l ( p o r t = ’COM9} ’ , baudrate
=9600 , t i m e o u t =1)
5
6 # Contadores de d a s
7 conteo dias = {
8 ” Lunes ” : 0 ,
9 ” Martes ” : 0 ,
10 ” Mi rcoles ”: 0,
11 ” Jueves ” : 0 ,
12 ” Viernes ” : 0 ,
13 ” Vietsen ” : 0
14 }
15
16 # Contadores de comidas
17 conteo comidas = {
18 ” lasagna ” : 0 ,
19 ” pizza ” : 0 ,
20 ” sushi ” : 0 ,
21 ”Ramen ” : 0 ,
22 ” Pozole ” : 0 ,
23 ” Tlayuda ” : 0
24 }
25
26 for i n range ( 2 0 0 0 ) :
27
28 t e x t o = Arduino . r e a d l i n e ( ) . decode ( ’ u t f
−8 ’ ) . s t r i p ( )
29 i f not t e x t o :
30 continue
31 print ( texto )
32
33 palabras = texto . s p l i t ( )
34 f o r palabra i n palabras :
35 i f palabra i n conteo dias :
36 c o n t e o d i a s [ p a l a b r a ] += 1
37 e l i f p a l a b r a i n conteo comidas :
38 conteo comidas [ p a l a b r a ] += 1
39
40
41 # Mostrar resultados
42 p r i n t ( ” \ nDias contados : ” )
43 f o r dia , c a n t i d a d i n c o n t e o d i a s . i t e m s ( ) :
44 p r i n t ( f ”{ dia }: { cantidad } ” )
45
46 p r i n t ( ” \ nComidas contadas : ” )
47 f o r comida , c a n t i d a d i n conteo comidas . i t e m s ( )
:
48 p r i n t ( f ” { comida } : { c a n t i d a d } ” )
49
3
UPIIAP Unidad de Aprendizaje 2AM1
50 Arduino . c l o s e ( )
51
52
53 if name == ” m a i n ” :
54 main ( )
55
56 ARDUINO
57
58 c o n s t i n t p o t P i n = A0 ;
59 c o n s t i n t p o t P i n 2 = A1 ;
60
61 S t r i n g d1 = ” Lunes ” , d2 = ” Martes ” , d3 = ”
M i e r c o l e s ” , d4 = ” Jueves ” , d5 = ” V i e r n e s ” , d6
= ” Vietsen ” ;
62 S t r i n g a1 = ” lasagna ” , a2 = ” p i z z a ” , a3 = ” s u s h i ” ,
a4 = ”Ramen ” , a5 = ” Pozole ” , a6 = ” Tlayuda ” ;
63
64 v o i d setup ( ) {
65 S e r i a l . begin ( 9 6 0 0 ) ;
66 }
67
68 void loop ( ) {
69 i n t potValue = analogRead ( p o t P i n ) ;
70 i n t potValue2 = analogRead ( p o t P i n 2 ) ;
71
72 i f ( potValue <200) S e r i a l . p r i n t ( ” Hoy es e l d a
” + d1 ) ;
73 e l s e i f ( potValue > 200 && potValue <=400 )
S e r i a l . p r i n t ( ” Hoy es e l d a ” + d2 ) ;
74 e l s e i f ( potValue < 600 && potValue >400 )
S e r i a l . p r i n t ( ” Hoy es e l d a ” + d3 ) ;
75 e l s e i f ( potValue < 800 && potValue >=600)
S e r i a l . p r i n t ( ” Hoy es e l d a ” + d4 ) ;
76 e l s e i f ( potValue > 800 && potValue <=1000)
S e r i a l . p r i n t ( ” Hoy es e l d a ” + d5 ) ;
77 e l s e i f ( potValue > 1000 && potValue <=1023)
S e r i a l . p r i n t ( ” Hoy es e l d a ” + d6 ) ;
78
79 i f ( potValue2 <200) S e r i a l . p r i n t l n ( ” de ” + a1 ) ;
80 e l s e i f ( potValue2 > 200 && potValue2 <=400 )
S e r i a l . p r i n t l n ( ” de ” + a2 ) ;
81 e l s e i f ( potValue2 < 600 && potValue2 >400 )
S e r i a l . p r i n t l n ( ” de ” + a3 ) ;
82 e l s e i f ( potValue2 < 800 && potValue2 >=600)
S e r i a l . p r i n t l n ( ” de ” + a4 ) ;
83 e l s e i f ( potValue2 > 800 && potValue2 <=1000)
S e r i a l . p r i n t l n ( ” de ” + a5 ) ;
84 e l s e i f ( potValue2 > 1000 && potValue2 <=1023)
S e r i a l . p r i n t l n ( ” de ” + a6 ) ;
85
86 delay (80) ; }
4
UPIIAP Unidad de Aprendizaje 2AM1
4. Resultados
Figura 1: Resultado de acuerdo al rango del pot No.1
Figura 2: Resultado de acuerdo al rango del pot No.2)
5
UPIIAP Unidad de Aprendizaje 2AM1
Figura 3: Resultado de acuerdo al rango del pot No.3
5. Conclusiones
Quiroz Téllez Héctor: Durante esta práctica, aprendı́ a integrar Arduino con Python utilizando la
biblioteca PySerial. Esto me permitió establecer una comunicación efectiva entre ambos dispositivos, lo
que es fundamental para proyectos que requieren interacción entre hardware y software. La experiencia
me enseñó la importancia de la precisión en la programación y cómo pequeños errores pueden afectar el
funcionamiento del sistema.
Sánchez Cruz Antonio:sta práctica me permitió comprender cómo los sensores analógicos pueden
ser utilizados para recolectar datos en tiempo real. Al conectar los potenciómetros al Arduino y enviar
los datos a Python, pude visualizar la información de manera gráfica, lo que facilitó el análisis y la
interpretación de los resultados. Esta experiencia reforzó mis habilidades en el manejo de datos y en la
toma de decisiones basadas en información cuantitativa.
Vásquez Gómez Ángel Gael: A través de esta práctica, profundicé en el uso de estructuras de datos
como diccionarios en Python para almacenar y procesar información. Implementé un sistema de conteo
de dı́as y comidas, lo que me permitió automatizar el registro y análisis de eventos. Esta experiencia
destacó la importancia de la organización y la eficiencia en la programación, ası́ como la utilidad de
Python en la automatización de tareas.