Está en la página 1de 125

Programación de

Computadoras
PROGRAMACIÓN DE COMPUTADORAS 2

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 3

Índice
Presentación 5
Red de contenidos 7

Unidad de Aprendizaje 1
ESTRUCTURA DE PROGRAMACIÓN 9
1.1 Tema 1 : Estructura de programación 11
1.1.1 : Introducción a la programación 11
1.1.2 : Estructura de control secuencial 20
1.1.3 : Estructura de control secuencial 21
1.1.4 : Estructura de control repetitivas 24

1.2 Tema 2 : Comandos en Python 27


1.2.1 : Aplicaciones de estructuras de control, manejo de entrada y 27
salida de datos en Python
1.2.2 : Comparación entre Python y C++ en las estructuras de control y 28
manejo de datos.

Unidad de Aprendizaje 2
ARREGLOS 41
2.1 Tema 3 : Arreglos 43
2.1.1 : Arreglos unidimensionales o vectores 43
2.1.2 : Arreglos bidimensionales o matrices 43

2.2 Tema 4 : Aplicaciones de arreglos 48


2.2.1 : Aplicaciones de arreglos unidimensional y bidimensional en 48
Python.

Unidad de Aprendizaje 3
ALGORITMOS DE CONTROL 81
3.1 Tema 5 : Desarrollo de algoritmos de control 72
3.1.1 : Introducción a los Subalgoritmos 73
3.1.2 : Funciones 73
3.1.3 : Procedimientos

3.2 Tema 6 : Desarrollo de aplicaciones 81


3.2.1 : Aplicación en Python de subalgoritmos 81

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 4

Unidad de Aprendizaje 4
MANEJO DE PUERTOS
4.1 Tema 7 : Manejo de puertos 89
4.1.1 : Comunicación a tráves de puertos. 89
4.1.2 : Diseño del software en computadora para captura de datos a 82
través del puerto serial (RS232 y USB).
4.1.3 : Diseño del software en computadora para envío de datos a 95
través del puerto serial (RS232 y USB).
4.1.4 : Diseño del software para microcontroladores. 95
4.1.5 : Diseño del hardware; circuito de comunicación y potencia.

Unidad de Aprendizaje 5
ADQUISICION DE DATOS Y APLICACIONES
5.1 Tema 8 : Interfaz gráfico con Python 97
5.1.1 : Creación de ventanas 97
5.1.2 : Manejo de eventos 98
5.1.3 : Manejo de archivos 98
5.1.4 : Introducción a los Sockets TCP/IP 99
5.1.5 : Uso de sockets para comunicación TCP/IP, cliente/servidor 103
5.1.6 : Aplicación de un sistema de adquisición de datos usando 107
interfaz gráfica, sensores, comunicación TCP/IP,
microcontrolador (Arduino) y circuitos de potencia

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 5

Presentación
La tecnología actual involucra el uso de software, desde la aplicación en el control de
electrodomésticos, juguetes electrónicos, videojuegos, comunicaciones y aplicaciones
enproyectos de ingeniería, estudio e investigación de diversos temas de la ciencia.
Bajo este campo de aplicación, se hace prescindible conocer la programación a nivel
técnico y de ingeniería.

Es necesario conocer los algoritmos y los lenguajes de programación que puedan ser
de utilidad y nos permita aplicarlos según el área de estudio de interes.

El presente manual desarrolla básicamente el lenguaje de Python y software de


interfaz gráfica para Python, de tal manera que, sea orientado para el manejo de
periféricos a través del puerto de comunicaciones de la computadora.

El curso es netamente práctico. Lastres primerasunidades de estudio comprenden


ódesarrolla la estructura de programación, comandos básicos, manejo de arreglos y de
algoritmos de control. Eso permitirá la comprensión del manejo del software y pueda
comprobarse el fácil manejo de la programación en Python.

La cuarta unidad esta orientada al manejo del puerto de comunicaciones (serie y


USB). En esta unidadsedesarrollanlosprogramas básicos del manejo del puerto y se
utiliza las interfaces de hardware necesarios para el control de cargas externas a la
computadora.

La quinta unidad; desarrolla la aplicación del software para realizar la adqisicion de


datos para el monitoreo y/o control de cargas manejadas a través del puerto de
comunicaciones de la computadora.

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 6

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 7

Red de contenidos

Programación II

Unidad 1 Unidad 2 Unidad 3 Unidad 4 Unidad 5

Estructura de Arreglos Algoritmo de Manejo de Adquisición


programación control puertos de datos y
aplicaciones

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 8

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 9

UNIDAD

1
ESTRUCTURA DE
PROGRAMACIÓN
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el estudiante implementa programas utilizando las
diferentes estructuras de control y maneja las entradas y salidas de datos en
Python.

TEMARIO
1.1 Tema 1 : Estructuras de programación
1.1.1 : Introducción a la programación
1.1.2 : Estructura de control secuencial
1.1.3 : Estructura de control selectivas
1.1.4 : Estructura de control repetitivas

1.2 Tema 2 : Comandos en Python


1.2.1 : Manejo de entrada y salida de datos en Python. Aplicaciones de
estructuras de control.
1.2.2 : Comparación entre Python y C++ en las estructuras de control y
manejo de datos.

ACTIVIDADES PROPUESTAS

 Los alumnos identifican la forma de declarar variables y manejan las


entradas y salidas de datos en Python.
 Los alumnos realizan ejemplos con estructuras de control secuencial,
selectivas y repetitivas en Python.
 Los alumnos diferencian la programación en C++ y Python.

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 10

1.1. ESTRUCTURAS DE PROGRAMACION

1.1.1. Introducción a la programación

Un programa básicamente es un conjunto instrucciones desarrolado en un lenguaje


para realizar un proceso y obtener un resultado final. Un algortimo es un conjunto
finitos de operaciones, no utiliza un lenguaje, ordenados de una manera lógica para
poder modelar la solución a un problema planteado.

Python es un lenguaje de programación interpretado y no necesita compilarse, se tipea


y luego se ejecuta directamente el programa.Python es fácil de aprender y potente
lenguaje de programación, tiene estructuras de datos de alto nivel eficientes, que le
permiten escribir operaciones complejas. La programación orientada a objetos es
mucho más fácil que en lenguajes como Java.

Figura 1: Logo de Python


Fuente.- Tomado de blog.informaticalab.com/wp-content/uploads/2012/10/python-logo.png

Python ha convertido en uno de los lenguajes de programación más populares entre


los desarrolladores y programadores. Es valorado por su sintaxis y código limpio
legibile. Python es un lenguaje de programación de alto nivel de propósito general.
Python es a la vez orientado a objetos e imperativa y se puede utilizar incluso en un
estilo funcional.

Los programas de Python son portátiles, es decir, pueden ser portados a otros
sistemas operativos como Windows, Linux, Unix y Mac OS X, y se pueden ejecutar en
Java y .NET (máquinas virtuales).

Figura 2: Logo de Python


Fuente.- Tomado de https://devcodela.s3.amazonaws.com/imagenesck/2014/05/30/multiplatform.png

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 11

Para invocar o iniciar Python, solo enrutar como muestra el siguiente diagrama:

Figura 3: Iniciando Python en IDLE (integrated development environment)


Fuente.- Elaboración propia

Al abrir el editor de Python observaremos lo siguiente:

Figura 4: Ventana de Python


Fuente.- Elaboración propia

Se trabajar con la versión Python 2.7.9 de 32 bits, compattible con Windows 7 y 8 de


64 bits.
Esta ventana es el modo interactivo. Al aparecer el promt (>>>) se puede ingresar los
comandos y al presionar “enter” es ejecutado automáticamente (programación
interpretado).
El programa realizado puede guardarse colocando el nombre y la extensión “py”,
ejemplo: nombre.py

Tipos de datos
Python tiene cinco tipos de datos
 Numbers (números)
 String (cadena de caracteres)
 List (lista)
 Tuple (tupla)
 Dictionary (Diccionario)

Las variables se adaptan automaticamente a los valores asignados, es decir que no es


necesario declarar el tipo de variable, siendo esta una de característica de Python que
es de tipado dinámico.Para asignar los valores solo basta colocar el signo de igualdad
(=).

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 12

Figura 5: Datos numéricos enteros y de punto flotante


Fuente.- Elaboración propia

La figura 5 muestra ejemplos de tipo de datos numéricos, entre ellos, numero entero,
numero de punto flotante y numero entero largo.
A todo comentario de una sola línea se antepone el símbolo de # y cuando es
multilinea se empieza y termina el comentario con tres veces el siguiente símbolo “.
La función “type” muestra el tipo de dato declarado.

Figura 6: Datos numéricos en base 8 y 16


Fuente.- Elaboración propia

Se puede definir variables en base ocho y hexadecimal como muestra la figura 6. Al


invocar la variable definida se mostrará el valor convertido a base 10.

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 13

Figura 7: Datos numéricos complejos y booleanos


Fuente.- Elaboración propia

Python reconoce las variables de tipo complejos y utiliza el imaginario “j”. Puede
solicitarse la parte real, imaginaria y el módulo de un número complejo.

Figura 8: Datosde tipo String o cadena de caracteres


Fuente.- Elaboración propia

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 14

Una cadena de caracteres es del tipo “String” yla figura 8 muestra el ejemplo
respectivo.
La función “len” indica el número de caracteres correspondiente a la cadena.
Los caracteres ocupan la posicion desde cero y en forma creciente de izquierda a
derecha.
Puede también tomarse la posición de derecha a izquierda, en este caso, varia desde
el valor de -1 y en forma decreciente.

Figura 9: Ejemplo de lista (List)


Fuente.- Elaboración propia

Una lista (list) básicamente es un array, cuyos componentes están separados por
comas y están encerrados por corchetes. Los componentes pueden cambiarse o
modificarse.

Figura 10: Ejemplo de tupla (tuple)


Fuente.- Elaboración propia

Una tupla (tuple) tambien es un array, cuyos componentes están separados por comas
y están encerrados por parentesis. Los componentes no pueden cambiarse o
modificarse. El ejemplo de la figura muestra el ejemplo respectivo y se aprecia el
mensaje de error al intentar modificarse un componente de la tupla.

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 15

Figura 11: Ejemplo de diccionario (dictionary)


Fuente.- Elaboración propia

Un diccionario (dictionary)es un conjunto no ordenado de pares clave:valor, con


claves únicas (en el diccionario en particular). Un par de llaves crean un diccionario
vacío.
Las operaciones principales sobre un diccionario son guardar un valor con una clave y
extraer ese valor dada la clave.

Operadores Matemáticos

 Suma (+)
 Resta (-)
 Negación
 Multiplicación (*)
 Exponente (**)
 División (/)
 División entera (//)
 Módulo (%)

Figura 12: Operaciones matemáticas básicas


Fuente.- Elaboración propia

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 16

Operadores de Comparación

 Compara si es igual a (==)


 Compara si es diferente (!=)
 Compara si es diferente (<>)
 Compara si es mayor (>)
 Compara si es menor (<)
 Compara si es mayor igual (>=)
 Compara si es menor igual (<=)

Figura 13: Ejemplo de operadores de comparación


Fuente.- Elaboración propia

Operadores de asignación

 Asigna valor igual a (=)


 Suma el valor de la izquierda con el valor de la derecha (+=)
 Resta el valor de la izquierda menos el valor de la derecha (- =)
 Multiplica el valor de la izquierda con el valor de la derecha ( * =)
 Division natural del valor de la izquierda entre el valor de la derecha ( / =)
 Módulo entre el valor de la izquierda entre el valor de la derecha ( % = )
 Eleva el valor de la izquierda a la potencia del valor de la derecha ( ** = )
 Division redondeada del valor de la izquierda entre el valor de la derecha (// =)

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 17

Figura 14: Ejemplo de operadores de asignación


Fuente.- Elaboración propia

Operadores lógicos

 Es verdadero si ambos son verdaderos (and).


 Es falso solamente si ambos son falsos (or)
 Niega el operador (not)

.
Figura 15: Ejemplo de operadores lógicos
Fuente.- Elaboración propia

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 18

Operadores a nivel de bit

 Operación and bit a bit (&).


 Operación or bit a bit (|).
 Operación xor bit a bit (^)
 Operación not bit a bit (~).
 Desplazamiento a la izquierda.
 Desplazamiento a la derecha.

Figura 16: Operaciones bit a bit


Fuente.- Elaboración propia

Operadores especiales

 Es verdadero si los valores son iguales (is).


 Es verdadero si los valores no son iguales (is not).
 Es verdadero si los valores se encuentran en el array (in).
 Es verdadero si los valores no se encuentran en el array (in not).

Figura 17: Ejemplo de operadores especiales


Fuente.- Elaboración propia

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 19

1.1.2. Estructura de control secuencial

La estructura de control secuencial básicamente es el conjunto de acciones,


instrucciones que se realiza de forma ordenada y sistemática, de tal manera que,
conlleve a una solución a un problema propuesto.

INICIO

ACCION 1

ACCION 2

ACCION N

FIN

Figura 18: Estructura secuencial


Fuente.- Elaboración propia

La estructura de control secuencial puede contener las siguientes instrucciones:

- Declaración de variables
- Asignación de variables
- Captura de ingreso de datos
- Procesamiento
- Resultados

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 20

1.1.3. Estructura de control selectivas

Se usan para tomar decisiones lógicas, la condición es evaluada y de acuerdo al


resultado se realiza un conjunto de instrucciones. Puede clasificarse en estructura de
control selectia simple, dobles y múltiples.

Estructura de control selectiva simple:

Se caracteriza porque tienen solo una condición. La estructura si-entonces evalúa la


condición y en tal caso:
Si la condición es verdadera, entonces ejecuta la acción “Si”o conjunto de acciones, en
caso contrario, si la condición es falsa no realiza alguna acción.

El pseudocódigo es:

Si<condición> Entonces
<Acción >
Fin_si

Si

Condición F

Acción

Figura 19: Estructura selectiva simple


Fuente.- Elaboración propia

Figura 20: Estructura selectiva simple en Python ( if )


Fuente.- Elaboración propia

Estructura de control selectiva doble:

Son estructuras lógicas que permiten controlar la ejecución de varias acciones y se


utilizan cuando se tienen dos opciones de acción, se debe ejecutar solo una de ellas,
pero no ambas a la vez.

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 21

Su sintaxis es la siguiente en pseudocódigo:

Si <condición> entonces
<Acción1>
Sino
<Acción 2>
Fin_Si

Si

Condición
V F

Acción 1 Acción 2

Figura 21: Estructura selectiva doble


Fuente.- Elaboración propia

Figura 22: Estructura selectiva doble en Python ( if - else )


Fuente.- Elaboración propia

Estructura de control selectiva múltiple:

La estructura de control selectiva múltiple evalúa una expresión que podrá tomar n
valores distintos, y según el valor se ejecuta solo una acción respectiva.En el diagrama
de flujo del algoritmo; seguirá solo un determinado camino entre las n posibilidades.
Esta estructura se representa por un selector el cual si toma el valor 1 ejecutará la
acción 1, si toma el valor 2 ejecutara la acción 2, si toma el valor n realizara la acción
n.

Su sintaxis es la siguiente:

En caso (variable) hacer


Caso 1: Acción 1
Caso2: Acción 2
Caso N: Acción N
En caso contrario:Acción
Fin_caso

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 22

Condición

Valor 1 Valor 2 Valor n

Acción 1 Acción 2 .……Acción n

Figura 23: Estructura selectiva multiple


Fuente.- Elaboración propia

Figura 24: Estructura selectiva simple en Python ( if – elif - else )


Fuente.- Elaboración propia

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 23

1.1.4. Estructura de control repetitivas

La estructura de control repetitivas hace que se ralizen un numero de acciones y se


repiten mientras sea verdadera la condición evaluada, generándose asi blucles o
lazos. En Python solo existen el While y el For.

Estructura repetitiva While

Se ejecuta la misma acción o conjunto de acciones mientras se cumpla la condición.

Mientras No
Condición

Si

Acciones

Figura 25: Estructura repetitiva while


Fuente.- Elaboración propia

Figura 26: Estructura repetitiva while en Python


Fuente.- Elaboración propia

Estructura repetitiva For

Se ejecuta un grupo de acciones cada vez que el valor de la variable es iterado dentro
de un rango, cabe resaltar que este rango es pecificado, desde la variable de inicio,
final y ocasionalmente el incremento o decremento. No necesariamente la variable
empieza encero. En Python se puede iterar en progresiones aritméticas, en elementos
de una secuencia, una lista o cadena, en el orden en que estos aparecen en la misma.

No
Esta dentro
deun rango
VlCondición
Si

Acciones
Incremento

Figura 27: Estructura repetitiva for


Fuente.- Elaboración propia

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 24

Figura 28: Estructura repetitiva for en Python


Fuente.- Elaboración propia

La función range:

Figura 29: Funcion range en Python


Fuente.- Elaboración propia

Sentencia Break

La sentencia break en Python termina el bucle actual y reanuda la ejecución en la


siguiente sentencia, al igual que la ruptura tradicional que se encuentra en C.

El uso más común de ruptura es cuando alguna condición externa se activa requiere
una salida precipitada de una condicional o un bucle.

Sentencia Continue

La Sentencia continue en Python devuelve el control al comienzo del bucle while. La


declaración continuar rechaza todos los estados restantes en la iteración actual del
bucle y se mueve el control de nuevo a la parte superior del bucle.

Sentencia pass

La sentencia pass de Python se utiliza cuando se requiere una declaración


sintácticamente pero no desea que cualquier comando o código a ejecutar. La
sentencia pass es una operación nula; no pasa nada cuando se ejecuta.

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 25

Resumen
1. Python es un lenguaje de programación interpretado y no necesita compilarse.

2. Python es multiplataforma.

3. El tipo de variabes son detectadas automáticamente y no necesariamente se


declaran.

4. La identacion es similar a la sangría en textos. Una identación de cuatro espacios


en blanco indicara que las instrucciones están dentro de una estructura de control,
siendo obligatoria el uso de la identación.

5. La estructura de control existente en Python es: IF, WHILE y FOR.

Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:

o https://www.youtube.com/watch?v=fYW2U-rEoZ4
o https://www.youtube.com/watch?v=fPFsMntZgTs
o https://www.youtube.com/watch?v=kpbUtBAu7O0
o https://www.youtube.com/watch?v=MC-NUAO1dQM
o https://www.youtube.com/watch?v=TSW5bHV_K1U

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 26

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 27

1.2. COMANDOS EN PYTHON

1.2.1. Manejo de entrada y salida de datos en Python.Aplicaciones de


estructuras de control

Función print()

En la ventana de comandos, es decir, la pantalla IDLE, basta en colocar el nombre de


las variables previamente declarada y enter para poder apreciar sus valores
correspondientes.

Figura 30: impresión directa en pantalla IDLE


Fuente.- Elaboración propia

La función print imprime en pantalla una cadena de caracteres de tipo string (str) y/o
numéricos. Las cadenas de caracteres estarán encerradas por un apostrofe (‘) o
comillas (“).

Figura 31: Impresión con la función print en pantalla IDLE


Fuente.- Elaboración propia

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 28

Carácter Significado

d, i Entero en decimal
0 Entero en octal
x, X Entero en hexadecimal
e, E Numero en coma flotante con exponente
f, F Numero en coma flotante sin exponente
Numero en coma flotante con o sin exponente,
g, G
según la precisión y la talla del exponente
s Transforma el objeto en cadena usando str.
Figura 32: Caracteres de formato para el operador % de cadenas
Fuente.- Elaboración propia

Algunas especificaciones de formato se escriben: %cd, %c.pf, %cs, %c.pg


Donde:
- c: número de columnas.
- p: numero de decimales.
- d, f, s, g: entero, real, string respectivamente

Figura 33: Ejemplos con caracteres de formato para el operador %


Fuente.- Elaboración propia

Secuencia Significado

No se incluye en la cadena (sirve para


\newline escribirliterales de cadena que ocupen más de una
línea)
\\ Barra invertida (backslash).
\’ Comilla simple
\” Comillas dobles
\a Campanilla (bell)
\b Retroceso (backspace).
\f Nueva página
\n Nueva línea
\r Retorno de carro
\t Tabulador horizontal
\v Tabulador vertical
\000 Carácter ASCII con código octal
\xhh Carácter ASCII con código hexadecimal hh.
Figura 34: Secuencia de escape en las cadenas
Fuente.- Elaboración propia

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 29

El primer programa guardado con extensión “py” es mostrado en el siguiente gráfico, y


al lado el programa ejecutado (Run).

Figura 35: Primer programa Hola Mundo


Fuente.- Elaboración propia

Cabe resaltar que se debe colocar obligatoriamente en la parte superior del programa
un código para que pueda reconocer todo tipo de caracteres como la tilde, letra “ñ”, “¡”,
etc. El código recomendado es # -*- coding: cp1252 -*-..

Figura 36: Programa con código en el encabezado


Fuente.- Elaboración propia

Figura 37: Ejemplo de programa que genera 5 numeros enteros aleatorioa y analiza si es par o impar
Fuente.- Elaboración propia

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 30

Función raw_input () e input

La función raw_input; clásicamente captura un carácter alfanúmerico ingresado, y la


función input por lo generalsolo cadena de caracteres de tipo stirng.

El siguiente ejemplo se aprecia que la función input captura variables numéricas y no


captura variables del tipo string.

Figura 38: Ejemplo de programa con la función input


Fuente.- Elaboración propia

El siguiente ejemplo se aprecia que la función raw_input puede capturar variables del
tipo string, es decir, números, letras, etc.

Figura 39: Ejemplo de programa con la función raw_input


Fuente.- Elaboración propia

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 31

Para que la función input pueda trabajar correctamente en este ejemplo, se debe
colocar la clave encerrada con comilla simple, es decir, enfatizando que es del tipo
string.

Figura 40: Ejemplo de programa trabajando adecuadamente con la función input


Fuente.- Elaboración propia

El siguiente programa muestra a solicitud del usuario el calendario según el año y el


mes ingresado. Se considera que el el año ingresadosea mayor q cero y el mes este
dentro del intervalo cerrado de del 1 al 12.

Figura 41: Ejemplo de programa “Calendario”


Fuente.- Elaboración propia

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 32

Figura 42: Programa”Calendario” ejecutado


Fuente.- Elaboración propia

1.2.2. Comparación entre Python y C++ en las estructuras de control y


manejo de datos

EJEMPLO 1

Programa que calcule la suma de dos números.


En C++

Figura 43: Programa suma de números en C++


Fuente.- Elaboración propia

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 33

En Python

Figura 44: Programa suma de números en Python


Fuente.- Elaboración propia

EJEMPLO 2

Programa que calcule el área de un circulo.


En C++

Figura 45: Programa que calcula el área de un circulo en C++


Fuente.- Elaboración propia

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 34

En Python

Figura 46: Programa calcula el área de un circulo en Python


Fuente.- Elaboración propia

EJEMPLO 3

Programa que encuentra las raíces de una ecuación cuadrática.


En Python

Continúa en la siguiente página:

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 35

Figura 46: Programa calcula las raíces de una ecuación de segundo grado
Fuente.- Elaboración propia

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 36

Resumen
1. La función de impresión en pantalla es print, pudiendo tener los tres formatos
print’cadena de caracteres’
print “cadena de caracteres” o
print (“cadena de caracteres”).

2. Las funciones de captura de caracteres por teclado es raw_input e input en la


versión 2.7 de Python. La función raw_input captura cadena de caracteres e input
números por lo general.

3. Las funciones de captura de datos también imprimen en pantalla el mensaje a


visualizar para solicitar el carácter a ingresar.

4. Un programa realizado en Python es mas corto que realizado en lenguaje c++.

Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:

o https://www.youtube.com/watch?v=5Gqn2lPPKxQ
o http://www.mclibre.org/consultar/python/lecciones/python_while.html
o http://www.cyberciti.biz/faq/python-raw_input-examples/

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 37

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 38

UNIDAD

2
ARREGLOS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el estudiante implementa programas en donde se
puede apreciar el uso de arreglos unidimensionales y bidimensionales para la
solución de problemas aplicativos a las áreas industrial y/o de electrónica.

TEMARIO
2.1 Tema 3 : Arreglos
2.1.1 : Arreglos unidimensionales o vectores
2.1.2 : Arreglos bidimensionales o matrices

2.2 Tema 4 : Aplicaciones de arreglos


2.2.1 : Aplicacion de arreglos unidimensional y bidimensional en Python.

ACTIVIDADES PROPUESTAS

 Los alumnos utilizan los arreglos unidimensionales y bidimensionales


para solución de problemas con programación.

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 39

2.1. ARREGLOS
2.1.1. Arreglos unidimensionales o vectores

Una lista en Python es sólo una colección ordenada de elementos que pueden ser de
cualquier tipo. En comparación una matriz es una colección ordenada de artículos de
un solo tipo, por lo que, en principio, una lista es más flexible que un array, pero es
esta flexibilidad que hace un poco más difícil las cosas cuando se quiere trabajar con
una estructura regular. Una lista es también un tipo mutable dinámico y esto significa
que puede añadir y eliminar elementos de la lista en cualquier momento.
Para definir una lista, se escribe una lista separada por comas de elementos entre
corchetes:

Figura 47: Manejo de listas en Python


Fuente.- Elaboración propia

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 40

2.1.2. Arreglos bidimensionales o matrices

Numpy es el módulo Numerico de Python, capaz de realizar cálculos similares a


MATLAB. Numpy añade toda la capacidad matemática y vectorial a Python haciendo
posible operar con cualquier dato numérico o array. Incorpora operaciones básicas
aritméticas entre otros. Para cargar el módulo en Python y poder llamarlo de formar
más cómoda es de uso extendido la utilización del alias np.
Un array, vector o matriz sirve para almacenamiento en memoria. Los arrays contienen
una serie de elementos dispuestos en filas y/o columnas dependiendo de la
dimensión.
En el caso de ndarray los principales atributos son los siguientes:

 ndarray.ndim : Proporciona el número de dimensiones de nuestro array. El


array identidad es un array cuadrado con una diagonal principal unitaria.
 ndarray.shape : Devuelve la dimensión del array, es decir, una tupla de
enteros indicando el tamaño del array en cada dimensión. Para una matriz de n
filas y m columnas obtendremos (n,m).
 ndarray.size : Es el número total de elementos del array.
 ndarray.dtype : Es un objeto que describe el tipo de elementos del array.
 ndarray.itemsize : devuelve el tamaño del array en bytes.
 ndarray.data : El buffer contiene los elementos actuales del array.

Figura 48: Manejo de arreglos en Python


Fuente.- Elaboración propia

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 41

Comandos de array en Python:


 identity(n,dtype). Devuelve la matriz identidad, es decir, uma matriz cuadrada
nula excepto en su diagonal principal que es unitaria. n es el número de filas (y
columnas) que tendrá la matriz y dtype es el tipo de dato. Este argumento es
opcional. Si no se establece, se toma por defecto como flotante.
 ones(shape,dtype). Crea un array de unos compuesto de shape elementos.
 zeros(shape, dtype). Crea un array de ceros compuesto de “shape”
elementos”.
 empty(shape, dtype). Crea un array de ceros compuesto de “shape”
elementos” sin entradas.
 eye(N, M, k, dtype). Crea un array bidimensional con unos en la diagonal k y
ceros en el resto. Es similar a identity. Todos los argumentos son opcionales. N
es el número de filas, M el de columnas y k es el índice de la diagonal. Cuando
k=0 nos referimos a la diagonal principal y por tanto eye es similar a identity.
 arange([start,]stop[,step,],dtype=None). Crea un array con valores
distanciados step entre el valor inicial star y el valor final stop. Si no se
establece step python establecerá uno por defecto.
 linspace(start,stop,num,endpoint=True,retstep=False). Crea un array con
valor inicial start, valor final stop y num elementos.
 meshgrid(x,y). Genera una matriz de coordenadas a partir de dos los arrays x,
y.

Figura 49: Ejemplo de comandos de array en Python


Fuente.- Elaboración propia

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 42

Un subtipo especial de array bidimensional de NumPy es la matriz. Una matriz es


como una array, excepto que la multiplicación de matrices (y exponenciación)
reemplaza la multiplicación elemento a elemento. Las matrices se crean mediante la
función matrix.

Figura 50: Ejemplo de matrices en Python


Fuente.- Elaboración propia

Para hallar la determinante se puede utilizar: linalg.det(a )


Para solucionar una ecuación lineal se puede utilizar: linalg.solve(a,b)

Figura 51: Aplicación de matrices en Python


Fuente.- Elaboración propia

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 43

Resumen
1. Gracias a la librería Numpy para Python podemos utilizar comando para el fácil
manejo de array.

2. Adicionalmente la librería Scipy que trabaja con Numpy y Python contribuye para el
cálculo de determinantes y soluciones de sistema de ecuaciones lineales.
Aplicando matrices y utlizando el comando linalg.solve(a,b) se puede encontrar el
resultado.

3. Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:

o https://www.youtube.com/watch?v=nQQcdFJ7Gqg
o https://www.youtube.com/watch?v=zCliTI7gsnc
o https://www.youtube.com/watch?v=XKDSwibZfYA
o http://progra.usm.cl/apunte/materia/sistemas-ecuaciones.html

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 44

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 45

2.2. APLICACIONES DE ARREGLOS


2.2.1. Aplicación de arreglos unidimensional y bidimensional en Python

Ejemplo 1: Desarrolle un programa que calcule las corrientes en el siguiente circuito:

Figura 51: Circuito 1


Fuente.- Elaboración propia

Solución: Circuito simulado

Figura 51: Circuito 1 simulado


Fuente.- Elaboración propia

Ecuaciones del sistema de ecuaciones:


6 = 12 x I1 + 10 x I2
25 = 10 x I1 + 14 x I2

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 46

Programa:

Figura 52: Programa


Fuente.- Elaboración propia

Resultado:

Figura 53: Resultado del programa


Fuente.- Elaboración propia

Ejemplo 2: Desarrolle un programa que calcule las corrientes en el siguiente circuito:

Figura 54: Cricuitto 2


Fuente.- Elaboración propia

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 47

Solución: Circuito simulado:

Figura 55: Circuito 2 simulado


Fuente.- Elaboración propia

Programa:

Figura 56: Programa


Fuente.- Elaboración propia

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 48

Resultado:

Figura 57: Resultado


Fuente.- Elaboración propia

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 49

Resumen
1. Las librerías Numpy y Scipy para Python ofrecer muchas ventajas para el manejo
de matrices, gracias a ellas podemos aplicarlalas para la solución de circuitos
eléctricos.

2. Para instalar las librerías de Numpy y Scipy se puede descargar directamene de


internet gratuitamente digitando “c:\Python27\pip install numpy” y “c:\Python27\pip
install scipy”.

3. Se puede revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:

o https://www.youtube.com/watch?v=nQQcdFJ7Gqg
o https://www.youtube.com/watch?v=zCliTI7gsnc
o https://www.youtube.com/watch?v=XKDSwibZfYA
o http://progra.usm.cl/apunte/materia/sistemas-ecuaciones.html

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 50

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 51

UNIDAD

3
ALGORITMOS DE CONTROL
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el estudiante implementa subalgoritmos que permiten la
simplificación de tareas repetitivas dentro de un programa.

TEMARIO

3.1 Tema 5 : Desarrollo de algoritmos de control


3.1.1 : Introduccion a los subalgoritmos
3.1.2 : Funciones
3.1.3 : Procedimientos

3.2 Tema 6 : Desarrollo de aplicaciones


3.2.1 : Aplicación en Python de subalgoritmos.

ACTIVIDADES PROPUESTAS

 Los alumnos realizan programas con funciones matemáticas. Definen


claramente las funciones para aplicarlos en programas específicos.

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 52

3.1 DESARROLLO DE ALGORITMOS DE CONTROL

3.1.1. Introducción a Los subalgoritmos

Una subrutina o subprograma (también llamada procedimiento o función), codifica un


subalgoritmo que permite resolver una tarea específica. Esto permite modularizar el
código, haciéndolo más fácil de entender. Además, se usan subrutinas previamente
desarrolladas por otros programadores, que están bien diseñadas y probadas. Pueden
devolver o no un valor de retorno

3.1.2. Funciones

Caberesaltar que existen funciones ya definidas como son las funciones matemáticas.

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 53

3.1.3. Procedimientos

Las funciones pueden crearse en cualquier punto de un programa, escribiendo su


definición.
La primera línea de la definición de una función contiene:
- La palabra reservada def
- Para el nombre de la función es recomendable escribir todos los caracteres en
minúsculas separando las palabras por guiones bajos.
- Los paréntesis pueden incluir los argumentos de la función.
Las instrucciones que forman la función se escriben con sangría con respecto a la
primera línea.
Puede indicarse al final de la función con la palabra reservada return, pero, no es
obligatorio.
Antes de llamar o invocarse a la función, debe definirse, normalmente las definiciones
de las funciones se escriben al principio de los programas.

Figura 58: Función 1


Fuente.- Elaboración propia

Figura 59: Función 2


Fuente.- Elaboración propia

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 54

Figura 60: Función 3


Fuente.- Elaboración propia

Un parámetro es un valor que la función espera recibir cuando sea llamada (invocada),
a fin de ejecutar acciones en base al mismo. Una función puede esperar uno o más
parámetros (que irán separados por una coma) o ninguno.

def mi_funcion(nombre, apellido):


# función a realizar

Los parámetros, se indican entre los paréntesis, a modo de variables, a fin de poder
utilizarlos como tales, dentro de la misma función.

Los parámetros que una función espera, serán utilizados por ésta, dentro de su
algoritmo, a modo de variables de ámbito local. Es decir, que los parámetros serán
variables locales, a las cuáles solo la función podrá acceder:

def mi_funcion(nombre, apellido):


nombre_completo = nombre, apellido
print nombre_completo

Si quisiéramos acceder a esas variables locales, fuera de la función, obtendríamos un


error:

def mi_funcion(nombre, apellido):


nombre_completo = nombre, apellido
print nombre_completo
# Retornará el error: NameError: name 'nombre' is not defined
print nombre

Al llamar a una función, siempre se le deben pasar sus argumentos en el mismo


orden en el que los espera.

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 55

Se puede asignar valores por defecto a los parámetros de las funciones. Esto significa,
que la función podrá ser llamada con menos argumentos de los que espera:

def saluda(nombre, mensaje='Hello'):


print mensaje, nombre

saluda('Jose Eduardo') # Imprime: Hello Jose Eduardo

Es posible llamar a una función, pasándole los argumentos esperados, como pares
de claves=valor:

def saluda(nombre, mensaje='Hello'):


print mensaje, nombre

saluda(mensaje="Good morning", nombre="Cecilia")

Puede ser que una función, espere recibir un número arbitrario desconocido de
argumentos. Estos argumentos, llegarán a la función en forma de tupla.

Para definir argumentos arbitrarios en una función, se antecede al parámetro un


asterisco (*):

def recorrer_parametros_arbitrarios(parametro_fijo, *arbitrarios):


print parametro_fijo

# Los parámetros arbitrarios se corren como tuplas


for argumento in arbitrarios:
print argumento

Es posible llamar a una función dentro de otra, de forma fija y de la misma manera que
se la llamaría, desde fuera de dicha función:

def funcion():
return "Hello World"

def saludar(nombre, mensaje='Hello'):


print mensaje, nombre
print mi_funcion()

Sin embargo, es posible que se desee realizar dicha llamada, de manera dinámica,
es decir, desconociendo el nombre de la función a la que se deseará llamar. A este
tipo de acciones, se las denomina llamadas de retorno.

Para conseguir llamar a una función de manera dinámica, Python dispone de dos
funciones nativas:locals() y globals().

Ambas funciones, retornan un diccionario. En el caso de locals(), éste diccionario se


compone -justamente- de todos los elementos de ámbito local, mientras que el
de globals(), retorna lo propio pero a nivel global.

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 56

def funcion():
return "Hello World"

def llamada_de_retorno(func=""):
"""Llamada de retorno a nivel global"""
return globals()[func]()

print llamada_de_retorno("funcion")

# Llamada de retorno a nivel local


nombre_de_la_funcion = "funcion"
print locals()[nombre_de_la_funcion]()

Si se tienen que pasar argumentos en una llamada retorno, se lo puede hacer


normalmente:

def funcion(nombre):
return "Hello " + nombre

def llamada_de_retorno(func=""):
"""Llamada de retorno a nivel global"""
return globals()[func]("Pedro")

print llamada_de_retorno("funcion")

# Llamada de retorno a nivel local


nombre_de_la_funcion = "funcion"
print locals()[nombre_de_la_funcion]("Fiorella")

Durante una llamada de retorno, el nombre de la función, puede no ser el indicado.


Entonces, siempre que se deba realizar una llamada de retorno, es necesario
comprobar que ésta exista y pueda ser llamada.

if nombre_de_la_funcion in locals():
if callable(locals()[nombre_de_la_funcion]):
print locals()[nombre_de_la_funcion]("Clarisa")

El operador in, nos permitirá conocer si un elemento se encuentra dentro de una


colección, mientras que la función callable() nos dejará saber si esa función puede ser
llamada.

def funcion(nombre):
return "Hello " + nombre

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 57

def llamada_de_retorno(func=""):
if func in globals():
if callable(globals()[func]):
return globals()[func]("Lois")
else:
return "Función no encontrada"

print llamada_de_retorno("funcion")

nombre_de_la_funcion = "funcion"

if nombre_de_la_funcion in locals():
if callable(locals()[nombre_de_la_funcion]):
print locals()[nombre_de_la_funcion]("Fiorella")
else:
print "Función no encontrada"

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 58

Resumen
1. La librería de funciones matemáticas contribuyen a agilizar la programación.

2. Una función permite reutilizar parte de la programación tantas veces como sea
necesaria.

3. Una función también permite evaluar un algoritmo según las variables locales
definidas.

4. Se puede revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
o http://librosweb.es/libro/python/capitulo_4/definiendo_funciones.html
o https://www.youtube.com/watch?v=_C7Uj7O5o_Q
o https://www.youtube.com/watch?v=_fiY9P-lPEc

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 59

DESARROLLO DE APLICACIONES

3.2.1. Aplicación en Python de subalgoritmos

Algunos ejemplos utilizando las funciones matemáticas:

Figura 61: Ejemplos de uso la librería matemática


Fuente.- Elaboración propia

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 60

Ejemplo sencillo de aplicación de la función en Python.

Figura 62: Ejemplo aplicativo de la función en Python


Fuente.- Elaboración propia

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 61

Ejercicios de la siguiente fuente:

https://bioinf.comav.upv.es/courses/linux/python/funciones.html

Ejercicios

1. Corrige el siguiente programa para calcular el área de un triángulo.

from math import sqrt


def calcular_area_triangulo(lado1, lado2, lado3):
semiperimetro = (lado1 + lado2 + lado3) / 2.0
area2 = semiperimetro * (semiperimetro - lado1) * (semiperimetro -
lado2) * (semiperimetro - lado3)
area = sqrt(area2)

print(calcular_area_triangulo(4, 5, 3))
calcular_area_triangulo(1, 2, 3)

2. Escribe un programa que calcule el área de un triángulo utilizando la fórmula:


base * altura / 2.
3. Corrige el siguiente programa para calcular el factorial.

def factorial(numero):
acumulado = 1
for indice in range(1, numero + 1):
acumulado = indice
return acumulado

print(factorial(10))

4. Escribe un programa que sume los números de una lista.


5. Corrige el siguiente programa que busca palabras comunes entre dos frases.

def palabras_comuns(frase1, frase2):


set1 = set(frase1.strip().split())
set2 = set(frase2.strip())
comunes = set1.union(set2)

print(palabras_comunes('Hola caracola', 'La caracola enterrada'))

6. Escribe una función que cuente las palabras dada una lista de frases.

7. Como solución al problema de comparación de dos listas de proteínas


planteado en la sección de estructuras de datos creamos un programa que
repetía el bloque en el que se leían los ficheros con las listas de proteínas.
Reescribir el programa utilizando funciones.

albumina
inmunoglobulina
antitripsina
lipoproteina
transferrina
inmunoglobulina
antitripsina
protombina

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 62

Generar, a partir de esta información, las listas de proteinas exclusivas de la


muestra 1 y 2 así como las proteínas que aparecen en ambos experimentos.

8. Crear un programa que contenga una función a la que podamos darle el


nombre de un fichero, una lista de palabras y que imprima las líneas que
contengan una de esas palabras.
9. Reescribir el programa que calcula la media entre triplicados de un
experimento de microarrays utilizando funciones.

nombre_gen muestra_1_1 muestra_1_2 muestra_1_3 muestra_2_1 muestra_2_2


muestra_2_3
gen1 1.2 1.3 1.4 7.6 6.5 8.7
gen2 4.5 3.4 3.9 2.5 3.2 3.3
gen3 9.6 8.7 8.3 5.5 5.4 4.5
gen4 2.3 3.2 2.1 3.1 2.9 3.2

10. Dado el siguiente fichero de genotipado masivo:

marcador padre madre f1 hib1 hib2 hib3


snp1 GG CC GC GG GC CC
snp2 AA TT AT AT TT
snp3 AA CC AC CC AC AC

Esbribir un fichero en el que el genotipo del padre sea A, la madre B y los


híbridos sean H (heterocigoto), A, B o X (desconocido):

marcador hib1 hib2 hib3


snp1 A H B
snp2 X H B
snp3 B H H

La estructura del programa debe ser parecida a:

def transformar_formato(genotipo):
return formato arreglado

def cambiar_formato_genotipo(fichero):
for linea in fichero:
Si primera linea:
imprimir
else:
marcador, genotipo = linea.split
genotipo = transformar_formato(genotipo)
imprimir marcador y genotipo

cambiar_formato_genotipo(fichero)

Soluciones
1. Corrige el siguiente programa para calcular el área de un triángulo.

from math import sqrt


def calcular_area_triangulo(lado1, lado2, lado3):
semiperimetro = (lado1 + lado2 + lado3) / 2.0

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 63

area2 = semiperimetro * (semiperimetro - lado1) * (semiperimetro -


lado2) * (semiperimetro - lado3)
area = sqrt(area2)
return area

print(calcular_area_triangulo(4, 5, 3))
print(calcular_area_triangulo(1, 2, 3))

2. Escribe un programa que calcule el área de un triángulo utilizando la fórmula:


base * altura / 2.

::
def calcular_area_triangulo(base, altura):
area = base * altura / 2.0 return area

print(calcular_area_triangulo(3, 5)) print(calcular_area_triangulo(7, 3))

3. Corrige el siguiente programa para calcular el factorial.

def factorial(numero):
acumulado = 1
for indice in range(1, numero + 1):
acumulado *= indice
return acumulado

print(factorial(10))

4. Escribe un programa que sume los números de una lista.

def suma_lista(lista):
acumulado = 0
for numero in lista:
acumulado += numero
return acumulado

print(suma_lista([1, 2, 3, 4]))

5. Corrige el siguiente programa que busca palabras comunes entre dos frases.

def palabras_comunes(frase1, frase2):


set1 = set(frase1.strip().split())
set2 = set(frase2.strip().split())
comunes = set1.intersection(set2)
return comunes

print(palabras_comunes('Hola caracola', 'La caracola enterrada'))

6. Escribe una función que cuente las palabras dada una lista de frases.

def contar_palabras(lista_frases):
contador = {}
for frase in lista_frases:
palabras = frase.strip().split()
for palabra in palabras:
if palabra not in contador:
contador[palabra] = 0
contador[palabra] += 1

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 64

return contador

print(contar_palabras(['Hola caracola', 'La caracola enterrada']))

7. Como solución al problema de comparación de dos listas de proteínas


planteado en la sección de estructuras de datos creamos un programa que
repetía el bloque en el que se leían los ficheros con las listas de proteínas.
Reescribir el programa utilizando funciones.

albumina
inmunoglobulina
antitripsina
lipoproteina
transferrina
inmunoglobulina
antitripsina
protombina

Generar, a partir de esta información, las listas de proteinas exclusivas de la


muestra 1 y 2 así como las proteínas que aparecen en ambos experimentos.

def leer_proteinas(nombre_fichero):
'Leer las palabras de un fichero y las devuelve en un set'

proteinas = set()
for linea in open(nombre_fichero'):
proteina = linea.strip()
proteinas.add(proteina)
return proteinas

def comparar_proteinas(fichero1, fichero2):


'Compara las proteinas presentes en dos ficheros'

#leemos la primera lista de proteinas y


#la guardamos en un set
proteinas1 = leer_proteinas(fichero1)
proteinas2 = leer_proteinas(fichero2)

#Ahora podemos hacer las comparaciones entre los


#conjuntos de proteinas
print 'Proteinas comunes'
print proteinas1.intersection(proteinas2)

print 'Proteinas exclusivas de la lista 1'


print proteinas1.difference(proteinas2)

print 'Proteinas exclusivas de la lista 2'


print proteinas2.difference(proteinas1)

if __name__ == '__main__':
comparar_proteinas('proteinas1.txt', 'proteinas2.txt')

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 65

8. Crear un programa que contenga una función a la que podamos darle el


nombre de un fichero, una lista de palabras y que imprima las líneas que
contengan una de esas palabras.

#!/usr/bin/env python
# Dado un fichero de texto como entrada busca una lista de
# patrones de texto e imprime las lineas coincidentes

def imprimir_lineas_coincidentes(nombre_fichero, patrones):


'''Dado un fichero y unos patrones imprime las lineas coincidentes
Para cada linea del fichero se evaluara si incluye uno de los
patrones
o no. Si uno de los patrones esta presente la linea se imprimira.

Los patrones deben ser una lista de cadenas de texto.


'''

#este bucle se ejecutara una vez por cada linea


for linea in open('nombre_fichero'):

#hemos de comprobar si algun patron esta en la lista


#hacemos un bucle que recorra todos los patrones
algun_patron_en_linea = False #por defecto asumimos que
#ningun patron se encuentra
#en la linea
for patron in patrones:
if patron in linea:
algun_patron_en_linena = True
#como hemos encontrado al menos un patron
#no es necesario continuar con el bucle
break

#una vez sabemos si para la presente linea hay algun


#patron coincidente o no podemos imprimirla
if algun_patron_en_linea:
print linea

if __name__ == '__main__':

nombre_fichero = 'prueba.txt'
patrones = ['texto1', 'texto2']
imprimir_lineas_coincidentes(nombre_fichero, patrones)

9. Reescribir el programa que calcula la media entre triplicados de un


experimento de microarrays utilizando funciones.

nombre_gen muestra_1_1 muestra_1_2 muestra_1_3 muestra_2_1 muestra_2_2


muestra_2_3
gen1 1.2 1.3 1.4 7.6 6.5 8.7
gen2 4.5 3.4 3.9 2.5 3.2 3.3
gen3 9.6 8.7 8.3 5.5 5.4 4.5
gen4 2.3 3.2 2.1 3.1 2.9 3.2
#!/usr/bin/env python
#Dado un fichero de texto con el formato:
# nombre_gen muestra_1_1 muestra_1_2 muestra_1_3 muestra_2_1
muestra_2_2 muestra_2_3
# gen1 1.2 1.3 1.4 7.6 6.5 8.7
# gen2 4.5 3.4 3.9 2.5 3.2 3.3
# gen3 9.6 8.7 8.3 5.5 5.4 4.5

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 66

#Calcula la media entre de los tres primeros valores y los tres


segundos.

def calcular_media(valores):
'''Dada una lista de valores devuelve la media.

Los valores pueden ser cadenas de texto, int o float.


'''
#pasamos todos los valores a float
valores = map(float, valores)

media = sum(valores) / len(valores)


return media

def calcular_medias(fichero):
'Calcula las medias para los triplicados de un microarray'

for linea in open(fichero):


linea = linea.strip() #eliminamos el retorno de carro

#La primera linea solo hay que imprimirla


if 'nombre_gen' in linea:
print linea
#para esta linea no hay que ejecutar nada
#mas en el bucle for
continue

items = linea.split()
nombre_gen = items[0]
valores1 = items[1:4]
valores2 = items[4:7]
print valores1
print valores2

media1 = calcular_media(valores1)
media2 = calcular_media(valores2)

print nombre_gen, media1, media2

if __name__ == '__main__':

calcular_medias('microarray.txt')

10. Dado el siguiente fichero de genotipado masivo:

marcador padre madre f1 hib1 hib2 hib3


snp1 GG CC GC GG GC CC
snp2 AA TT AT AT TT
snp3 AA CC AC CC AC AC

Esbribir un fichero en el que el genotipo del padre sea A, la madre B y los


híbridos sean H (heterocigoto), A, B o X (desconocido):

marcador hib1 hib2 hib3


snp1 A H B
snp2 X H B
snp3 B H H

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 67

La estructura del programa debe ser parecida a:

def transformar_formato(genotipo):
return formato arreglado

def cambiar_formato_genotipo(fichero):
for linea in fichero:
Si primera linea:
imprimir
else:
marcador, genotipo = linea.split
genotipo = transformar_formato(genotipo)
imprimir marcador y genotipo

cambiar_formato_genotipo(fichero)
def transformar_genotipo(linea_genotipo):
'''Transforma una linea de genotipo

desde:
snp1 GG CC GC GG GC CC
a:
snp1 A H B
'''

#no podemos hacer:


#items = linea_genotipo.split()
#
#porque los datos faltantes estan codificados
#por espacios

marcador, genotipos = linea_genotipo.split(' ', 1)

#dividimos el resto de genotipos


#los genotipos ahora son -> GG CC GC GG GC CC
genotipos_separados = []
for posicion in range(0, len(genotipos), 3):
genotipo = genotipos[posicion: posicion + 2]
genotipos_separados.append(genotipo)
#los genotipos ahora son una lista:
# ['GG ', 'CC ', 'GC ', 'GG ', 'GC ', 'CC ']

genotipo_padre = genotipos_separados.pop(0)
# ['CC ', 'GC ', 'GG ', 'GC ', 'CC ']
genotipo_madre = genotipos_separados.pop(0)
# ['GC ', 'GG ', 'GC ', 'CC ']
genotipo_hib = genotipos_separados.pop(0)
# ['GG ', 'GC ', 'CC ']

#ahora debemos transformar cada uno de los genotipos


#de los hibridos
genotipos_transformados = []
for genotipo in genotipos_separados:
if genotipo == ' ':
genotipo = 'X'
elif genotipo == genotipo_padre:
genotipo = 'A'
elif genotipo == genotipo_madre:
genotipo = 'B'
elif genotipo == genotipo_hib:

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 68

genotipo = 'H'
else:
print 'Ha habido un fallo, genotipo desconocido', genotipo
genotipos_transformados.append(genotipo)

#los items de la linea transformada


items = [marcador] + genotipos_transformados
#la linea tiene los items separados por comas
linea = ' '.join(items)

return linea

def cambiar_formato_genotipos(fichero):
'''Transforma un fichero de genotipado a otro formato.

El formato de entrada debe ser:

marcador padre madre f1 hib1 hib2 hib3


snp1 GG CC GC GG GC CC
snp2 AA TT AT AT TT
snp3 AA CC AC CC AC AC

Y el de salida:

marcador hib1 hib2 hib3


snp1 A H B
snp2 X H B
snp3 B H H

A -> Homocigoto como el padre


H -> heterocigoto
B -> Homocigoto como la madre
X -> Dato faltante
'''

for linea in open('genotipos.txt'):


linea = linea.strip()
if 'padre' in linea: #es la primera linea
items = linea.split()
print items[0], ' '.join(items[4:])
#items[0] sera marcador
#items[4:] imprime el nombre
#de los hibridos
continue #En esta iteracion abandonamos el bucle aqui

#esto se ejecutara para cada linea excepto


#la de la cabecera
print transformar_genotipo(linea)

if __name__ == '__main__':
cambiar_formato_genotipos('genotipos.txt')

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 69

Resumen
1. Las funciones presentan una facilidad para realizar diversos tipos de aplicaciones
en Python, dependerá del programador aprovecharlo y enfocarlo a la necesidad
del programa aplicativo.

2. Se puede revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:

o http://librosweb.es/libro/python/capitulo_4/definiendo_funciones.html
o https://www.youtube.com/watch?v=_C7Uj7O5o_Q
o https://www.youtube.com/watch?v=_fiY9P-lPEc

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 70

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 71

UNIDAD

4
MANEJO DE PUERTOS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el estudiante conocerá la configuración del puerto de
comunicaciones y los comandos para el envio y recepción a través del puerto de
transmisión serial de datos. Programa la interfaz de comunicación
microcontroladores (Arduino). Selecciona adecuadamente la interfaz de potencia a
utilizar.

TEMARIO

4.1 Tema 7 : Manejo de puertos


4.1.1 : Comunicación a través de puertos
4.1.2 : Diseño del software en computadora para captura de datos a
través del puerto serial (RS232 Y USB).
4.1.3 : Diseño del software en computadora para envío de datos a través
del puerto serial (RS232 y USB).
4.1.4 : Diseño del software para microcontroladores.
4.1.5 : Diseño del hardware; circuito de comunicación y potencia.

ACTIVIDADES PROPUESTAS

 Los alumnos implementan la interfaz de potencia según la carga a


conectar. Realizan la programación aplicando al manejo de entrada y
salida de datos por el puerto USB, desarrollando la interfaz de software y
hardware.

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 72

3.1 MANEJO DE PUERTOS

4.1.1. Comunicación a tráves de puertos

Sobre la comunicación serial, tenemos las siguientes definiciones, según la fuente:


http://digital.ni.com/public.nsf/allkb/039001258CEF8FB686256E0F005888D1

1. ¿Qué es la comunicación serial?

La comunicación serial es un protocolo muy común (no hay que confundirlo con
el Bus Serial de Comunicación, o USB) para comunicación entre dispositivos
que se incluye de manera estándar en prácticamente cualquier computadora.
La mayoría de las computadoras incluyen dos puertos seriales RS-232. La
comunicación serial es también un protocolo común utilizado por varios
dispositivos para instrumentación; existen varios dispositivos compatibles con
GPIB que incluyen un puerto RS-232. Además, la comunicación serial puede
ser utilizada para adquisición de datos si se usa en conjunto con un dispositivo
remoto de muestreo.

El concepto de comunicación serial es sencillo. El puerto serial envía y recibe


bytes de información un bit a la vez. Aun y cuando esto es más lento que la
comunicación en paralelo, que permite la transmisión de un byte completo por
vez, este método de comunicación es más sencillo y puede alcanzar mayores
distancias. Por ejemplo, la especificación IEEE 488 para la comunicación en
paralelo determina que el largo del cable para el equipo no puede ser mayor a
20 metros, con no más de 2 metros entre cualesquier dos dispositivos; por el
otro lado, utilizando comunicación serial el largo del cable puede llegar a los
1200 metros.

Típicamente, la comunicación serial se utiliza para transmitir datos en formato


ASCII. Para realizar la comunicación se utilizan 3 líneas de transmisión: (1)
Tierra (o referencia), (2) Transmitir, (3) Recibir. Debido a que la transmisión es
asincrónica, es posible enviar datos por una línea mientras se reciben datos
por otra. Existen otras líneas disponibles para realizarhandshaking, o
intercambio de pulsos de sincronización, pero no son requeridas. Las
características más importantes de la comunicación serial son la velocidad de
transmisión, los bits de datos, los bits de parada, y la paridad. Para que dos
puertos se puedan comunicar, es necesario que las características sean
iguales.

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 73

a. Velocidad de transmisión (baud rate): Indica el número de bits


por segundo que se transfieren, y se mide en baudios (bauds). Por
ejemplo, 300 baudio representa 300 bits por segundo. Cuando se hace
referencia a los ciclos de reloj se está hablando de la velocidad de
transmisión. Por ejemplo, si el protocolo hace una llamada a 4800 ciclos
de reloj, entonces el reloj está corriendo a 4800 Hz, lo que significa que
el puerto serial está muestreando las líneas de transmisión a 4800 Hz.
Las velocidades de transmisión más comunes para las lineas
telefónicas son de 14400, 28800, y 33600. Es posible tener velocidades
más altas, pero se reduciría la distancia máxima posible entre los
dispositivos. Las altas velocidades se utilizan cuando los dispositivos se
encuentran uno junto al otro, como es el caso de dispositivos GPIB.

b. Bits de datos: Se refiere a la cantidad de bits en la transmisión.


Cuando la computadora envía un paquete de información, el tamaño de
ese paquete no necesariamente será de 8 bits. Las cantidades más
comunes de bits por paquete son 5, 7 y 8 bits. El número de bits que se
envía depende en el tipo de información que se transfiere. Por ejemplo,
el ASCII estándar tiene un rango de 0 a 127, es decir, utiliza 7 bits; para
ASCII extendido es de 0 a 255, lo que utiliza 8 bits. Si el tipo de datos
que se está transfiriendo es texto simple (ASCII estándar), entonces es
suficiente con utilizar 7 bits por paquete para la comunicación. Un
paquete se refiere a una transferencia de byte, incluyendo los bits de
inicio/parada, bits de datos, y paridad. Debido a que el número actual
de bits depende en el protocolo que se seleccione, el término paquete
se usar para referirse a todos los casos.

c. Bits de parada: Usado para indicar el fin de la comunicación de


un solo paquete. Los valores típicos son 1, 1.5 o 2 bits. Debido a la
manera como se transfiere la información a través de las líneas de
comunicación y que cada dispositivo tiene su propio reloj, es posible
que los dos dispositivos no estén sincronizados. Por lo tanto, los bits de
parada no sólo indican el fin de la transmisión sino además dan un
margen de tolerancia para esa diferencia de los relojes. Mientras más
bits de parada se usen, mayor será la tolerancia a la sincronía de los
relojes, sin embargo, la transmisión será más lenta.

d. Paridad: Es una forma sencilla de verificar si hay errores en la


transmisión serial. Existen cuatro tipos de paridad: par, impar, marcada
y espaciada. La opción de no usar paridad alguna también está
disponible. Para paridad par e impar, el puerto serial fijará el bit de
paridad (el último bit después de los bits de datos) a un valor para
asegurarse que la transmisión tenga un número par o impar de bits en
estado alto lógico. Por ejemplo, si la información a transmitir es 011 y la
paridad es par, el bit de paridad sería 0 para mantener el número de
bits en estado alto lógico como par. Si la paridad seleccionada fuera
impar, entonces el bit de paridad sería 1, para tener 3 bits en estado
alto lógico. La paridad marcada y espaciada en realidad no verifican el
estado de los bits de datos; simplemente fija el bit de paridad en estado
lógico alto para la marcada, y en estado lógico bajo para la espaciada.
Esto permite al dispositivo receptor conocer de antemano el estado de
un bit, lo que serviría para determinar si hay ruido que esté afectando

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 74

de manera negativa la transmisión de los datos, o si los relojes de los


dispositivos no están sincronizados.

2. ¿Qué es RS-232?

RS-232 (Estándar ANSI/EIA-232) es el conector serial hallado en las PCs IBM


y compatibles. Es utilizado para una gran variedad de propósitos, como
conectar un ratón, impresora o modem, así como instrumentación industrial.
Gracias a las mejoras que se han ido desarrollando en las líneas de
transmisión y en los cables, existen aplicaciones en las que se aumenta el
desempeño de RS-232 en lo que respecta a la distancia y velocidad del
estándar. RS-232 está limitado a comunicaciones de punto a punto entre los
dispositivos y el puerto serial de la computadora. El hardware de RS-232 se
puede utilizar para comunicaciones seriales en distancias de hasta 50 pies.

Pines del conector DB-9

--------------
\12345/
\6789/
---------

Conector externo de la computadora y expuesto del cable.

Funciones de los pines en RS-232:

Datos: TXD (pin 3), RXD (pin 2)

Handshake: RTS (pin 7), CTS (pin 8), DSR (pin 6), DCD (pin 1), DTR (pin 4)

Tierra: GND (pin 5)

Otros: RI (pin 9)

3. ¿Qué es RS-422?

RS-422 (Estándar EIA RS-422-A) es el conector serial utilizado en las


computadoras Apple de Macintosh. RS-422 usa señales eléctricas
diferenciales, en comparación con señales referenciadas a tierra como en RS-
232. La transmisión diferencial, que utiliza dos líneas para transmitir y recibir,
tiene la ventaja que es más inmune al ruido y puede lograr mayores distancias
que RS-232. La inmunidad al ruido y la distancia son dos puntos clave para
ambientes y aplicaciones industriales.

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 75

4. ¿Qué es RS-485?

RS-485 (Estándar EIA-485) es una mejora sobre RS-422 ya que incrementa el


número de dispositivos que se pueden conectar (de 10 a 32) y define las
características necesarias para asegurar los valores adecuados de voltaje
cuando se tiene la carga máxima. Gracias a esta capacidad, es posible crear
redes de dispositivos conectados a un solo puerto RS-485. Esta capacidad, y la
gran inmunidad al ruido, hacen que este tipo de transmisión serial sea la
elección de muchas aplicaciones industriales que necesitan dispositivos
distribuidos en red conectados a una PC u otro controlador para la colección de
datos, HMI, u otras operaciones. RS-485 es un conjunto que cubre RS-422, por
lo que todos los dispositivos que se comunican usando RS-422 pueden ser
controlados por RS-485. El hardware de RS-485 se puede utilizar en
comunicaciones seriales de distancias de hasta 4000 pies de cable.

Pines del conector DB-9

-------------
\12345/
\6789/
---------

Conector externo de la computadora y expuesto del cable.

Funciones de los pines en RS-485 y RS-422:

Datos: TXD+ (pin 8), TXD- (pin 9), RXD+ (pin 4), RXD- (pin 5)

Handshake: RTS+ (pin 3), RTS- (pin 7), CTS+ (pin 2), CTS- (pin 6)

Tierra: GND (pin 1)

5. ¿Qué es handshaking (o intercambio de pulsos de sincronización)?

El método de comunicación usado por RS-232 requiere de una conexión muy


simple, utilizando sólo tres líneas: Tx, Rx, y GND. Sin embargo, para que los
datos puedan ser transmitidos correctamente ambos extremos deben estar
sincronizados a la misma velocidad. Aun y cuando este método es más que
suficiente para la mayoría de las aplicaciones, es limitado en su respuesta a
posibles problemas que puedan surgir durante la comunicación; por ejemplo, si
el receptor se comienza a sobrecargar de información. Es en estos casos
cuando el intercambio de pulsos de sincronización, o handshaking, es útil. En
esta sección se describirán brevemente las tres formas más populares
de handshaking con RS-232: handshaking for software, handshaking por
hardware, y XModem.

a. Handshaking por software: Ésta será la primera forma


de handshaking que discutiremos. Esta forma de sincronización utiliza
bytes de datos como caracteres de control, de manera similar a como
GPIB utiliza las cadenas de caracteres como comandos. Las líneas
necesarias para la comunicación siguen siendo Tx, Rx, y GND, ya que
los caracteres de control se envían a través de las líneas de transmisión

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 76

como si fueran datos. La función SetXMode permite al usuario habilitar


o deshabilitar el uso de dos caracteres de control: XON y XOFF. Estos
caracteres son enviados por el receptor para pausar al transmisor
durante la comunicación.

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 77

b. A manera de ejemplo, asúmase que el transmisor comienza a enviar


datos a alta velocidad. Durante la transmisión, el receptor se da cuenta
que el búfer de entrada se está llenando debido a que el CPU está
ocupado con otras tareas. Para pausar temporalmente la transmisión, el
receptor envía XOFF (cuyo valor es típicamente 19 decimal, o 13
hexadecimal) hasta que el búfer se vacíe. Una vez que el receptor está
preparado para recibir más datos envía XON (cuyo valor es típicamente
17 decimal, u 11 hexadecimal) para continuar la comunicación.
LabWindows enviará un XOFF cuando el búfer de entrada se encuentre
a la mitad de su capacidad. Además, en caso que la transmisión inicial
de XOFF haya fallado, LabWindows enviará de nuevo un XOFF cuando
el búfer alcance un 75% y 90% de su capacidad. Para que funcione
correctamente, es necesario que el transmisor esté utilizando el mismo
protocolo.

La mayor desventaja de este método es además lo más importante a


considerar: los números decimales 17 y 19 son ahora los límites para la
transmisión. Cuando se transmite en ASCII, esto no importa mucho ya
que estos valores no representan caracter alguno. Sin embargo, si la
transmisión de datos es en binario, lo más probable es que estos
valores sean transmitidos como datos regulares y falle la comunicación.

c. Handshaking por hardware: El segundo método


de handshaking utiliza líneas de hardware. De manera similar a las
líneas Tx y Rx, las líneas RTS/CTS y DTR/DSR trabajan de manera
conjunta siendo un par la entrada y el otro par la salida. El primer par de
líneas es RTS (por sus siglas en inglés, Request to Send) y CTS (Clear
to Send). Cuando el receptor está listo para recibir datos, cambia la
línea RTS a estado alto; este valor será leído por el transmisor en la
línea CTS, indicando que está libre para enviar datos. El siguiente par
de líneas es DTR (por sus siglas en inglés, Data Terminal Ready) y
DSR (Data Set Ready). Estas líneas se utilizan principalmente para
comunicación por modem, permiten al puerto serial y modem indicarse
mutuamente su estado. Por ejemplo, cuando el modem se encuentra
preparado para que la PC envíe datos, cambia la línea DTR a estado
alto indicando que se ha realizado una conexión por la línea de
teléfono. Este valor se lee a través de la línea DSR y la PC comienza a
enviar datos. Como regla general, las líneas DTR/DSR se utilizan para
indicar que el sistema está listo para la comunicación, mientras que las
líneas RTS/CTS se utilizan para paquetes individuales de datos.

En LabWindows, la función SetCTSMode habilita o deshabilita el uso


de handshakingpor hardware. Si el modo CTS está habilitado,
LabWindows aplica las siguientes reglas:

Cuando la PC envía datos:

La librería de RS-232 debe de detectar que la línea CTS se encuentra


en estado alto antes de enviar datos.

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 78

Cuando la PC recibe datos:

Si el puerto está abierto y el búfer de entrada puede contener más


datos, la líbrería envía a RTS y DTR a estado alto.

Si el búfer de entrada está al 90% de su capacidad, la librería manda a


estado bajo RTS pero mantiene DTR en alto.

Si el búfer de entrada está casi vacío, la librería manda a estado alto


RTS y mantiene DTR en alto.

Si el puerto se cierra, la librería manda a estado bajo a RTS y DTR.

d. Handshaking por XModem: El último modo


de handshaking presentado es el protocolo de transmisión de archivos
XModem. Este protocolo es muy común en comunicación por modem.
Aun y cuando es más utilizado para comunicación por modem, el
protocolo XModem puede ser utilizado directamente entre otros
dispositivos. En LabWindows, la implementación de XModem se
mantiene oculta para el usuario. Mientras la PC se conecte a otro
dispositivo que utilice el protocolo XModem, se pueden utilizan las
funciones de LabWindows para transferir datos de un lado a otro. Estas
funciones son XModemConfig, XModemSend, y XModemReceive.

XModem utiliza un protocolo basado en los siguientes parámetros:


start_of_data, end_of_trans, neg_ack, ack, wait_delay, start_delay,
max_tries, packet_size. Estos parámetros deben de ser comunes en
ambos lados de la comunicación, y el estándar XModem contiene la
definición estándar de éstos; sin embargo, se pueden modificar
utilizando la función XModemConfig de LabWindows para cumplir
cualquier otro requerimiento. Los parámetros en XModem funcionan de
la siguiente manera: el receptor envía el caracter "neg_ack". Esto indica
al transmisor que ya está listo para recibir datos. El receptor continuará
enviado el caracter "neg_ack" en intervalos de tiempo de duración de
"start_delay" hasta que iguale la cuenta de "max_tries" o reciba
"start_of_data" del transmisor. Si el receptor intenta comunicarse con el
transmisor la misma cantidad de veces que "max_tries", informará al
usuario que no fue posible comunicarse con el transmisor. Si el receptor
sí recibe el "start_of_data" del transmisor, leerá el paquete de
información que sigue. Este paquete contiene el número de paquete, el
complemento del número de paquete para fines de verificación de
errores, el paquete actual de datos con una cantidad de bytes igual a
"packet_size", y un checksum para más verificación de errores.
Después de recibir el paquete, el receptor mandará llamar el
"wait_delay", y luego enviará el "ack" al transmisor. Si el transmisor no
recibe el "ack", intentará de reenviar el paquete de datos una cantidad
de veces igual a "max_tries" o hasta que reciba el "ack". Si nunca recibe
el "ack", informará al usuario que hubo un fallo al momento de querer
transferir el archivo.

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 79

Los datos deben de ser enviados en paquetes con una cantidad de


bytes igual a "packet_size". Debido a esto, cuando se está enviando el
último paquete y no se tiene la cantidad suficiente de información válida
para llenarlo, el protocolo llenará el paquete con el caracter ASCII nulo
(0). Esto puede causar que el archivo recibido sea más grande que el
original. Es importante recordar que no hay que usar XON/XOFF con el
protocolo XModem, ya que el número de paquete durante la
transferencia por XModem se incrementará conforme se envían los
caracteres XON/XOFF, lo que puede causar una falla en la
comunicación.

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 80

4.1.2. Diseño del software en computadora para captura de datos a través


del puerto serial (RS232 Y USB).

Programa básico para capturar datos por el puerto USB en Python

Figura 63: Programa de captura de datos por USB en Python


Fuente.- Elaboración propia

4.1.3. Diseño del software en computadora para envío de datos a través


del puerto serial (RS232 Y USB).

Un programa

Figura 64: Programa de envío de datos por USB en Python


Fuente.- Elaboración propia

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 81

4.1.4. Diseño del software para microcontroladores


En Arduino:

Figura 65: Programa de recepción de datos por USB en Python


Fuente.- Elaboración propia

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 82

Figura 66: Programa de envío de datos por USB en Python


Fuente.- Elaboración propia

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 83

4.1.5. Diseño del hardware; circuito de comunicación y potencia.


Circutio interfaz de comunicación con el puerto serial

Circutio interfaz de comunicación con el puerto USB

Figura 67: Interfaz con PIC


Fuente.- http://sebalabs.blogspot.pe/2015/10/lenguaje-arduino-08-parte-3-los-objetos.html

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 84

Placas de Arduino, los culaes disponen de un puerto de comunicaciones USB, listos


para interconectarse con la computadora.

Figura 68: Nanoarduino


Fuente.- http://articulo.mercadolibre.com.ve/MLV-461924978-arduino-nano-v30-atmega328-5v-16mhz-circuitos-micro-
pcb-_JM

Figura 69: Arduino MEGA


Fuente.- http://sebalabs.blogspot.pe/2015/10/lenguaje-arduino-08-parte-3-los-objetos.html

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 85

El modelo de Arduino comúnmente usado es el Arduino Uno, a continuación, se tiene


indicado sus partes.

Figura 70: Arduino uno


Fuente.- http://comohacer.eu/analisis-comparativo-placas-arduino-oficiales-compatibles/

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 86

Circuito de potencia con Triac:


(Para cargas de 220 VAC)

Figura 71: Circuito con Triac


Fuente.- Elaboración propia/

Circuito de potencia con transistor y Relay:


(Para cargas de VAC y VDC)

Figura 72: Circuito con transistor y relay


Fuente.- Elaboración propia

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 87

Circuito de potencia para controlar el cambio de giro de un motor DC:


(Puente H con transistores)

(Puente H con circuito integrado)

Figura 73: Circutos Puentes H


Fuente.- Elaboración propia

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 88

Circuito de potencia para motor paso a paso (PAP) unipolar y bipolar:

Figura 74: Circutos Puentes H


Fuente.- http://txapuzas.blogspot.pe/2009/12/paperstepperl298n-driver-de-potencia.html

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 89

Resumen
1. Con la librería Pyserial en Python, el manejo de entrada y salida de datos por el
puerto USB se realiza de manera sencilla, trabajando con la placa de Arduino.

2. Se tiene una gran variedad de interfaz de potencia para el manejo de motores


y/o cargas de voltaje AC y DC que se púede utilizar a elección.

3. Arduino, Python y Pyserial son las tres herramientas en software a utilizar para
el manejo del puerto USB, cabe resaltar, que los tres son desacargados
libremente sin costo alguno.

4. Se puede revisar los siguientes enlaces para ampliar los conceptos vistos en
esta unidad:

o https://misterelectronico.wordpress.com/2015/05/02/programacion-del-
puerto-serie-con-python/
o http://panamahitek.com/python-arduino-comunicacion-serial/
o http://polaridad.es/configuracion-comunicaciones-serie-python-arduino/
o http://robologs.net/2014/07/27/tutorial-de-arduino-y-python/
o https://www.youtube.com/watch?v=IS1ovQOS1Ao

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 90

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 91

UNIDAD

5
ADQUISICION DE DATOS Y
APLICACIONES
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el estudiante adquiere los conocimientos para el manejo de
Interfaz gráfico de Python, maneja diversos tipos de archivos (texto, imagen).
Diseña interfaz gráfica para el manejo de datos por el puerto USB. Realiza
comunicación TCP/IP, cliente/servidor e implementa un sistema de adqusición de
datos.

TEMARIO

5.1. Tema 8 : Interfaz grafico con Python


5.1.1. : Creacion de ventanas.
5.1.2. : Manejo de eventos
5.1.3. : Manejo de archivos
5.1.4. : Introducción a los Sockets TCP / IP
5.1.5. : Uso de sockets para comunicación TCP / IP, cliente – servidor
5.1.6. : Aplicación de un sistema de adquisición de datos usando
interfaz gráfica, microcontrolador (Arduino) y circuitos de
potencia.
ACTIVIDADES PROPUESTAS

 Los alumnos aplicaran la programación para el control y supervisión de


un sistema industrial básico, realizando la maqueta respectiva y
desarrollando la interfaz gráfica y hardware.

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 92

5.1. INTERFAZ GRAFICO CON PYTHON


Según la fuente:
http://www.python.org.ar/wiki/InterfacesGraficas

Existen varias librerias que implementan interfaces gráficas de usuario (GUI) en


python, las principales son:

 Tkinter: Basada en las librerías gráficas TCL/TK, interface "de-facto"


preinstalada con python, es la generalmente recomendada para proyectos
triviales y/o de aprendizaje.

 WxPython: Basada en WxWidgets (una libreria multiplataforma C/C++),


"bendecida" como la "más pitónica" por GvR (creador de Python), y sería la
interface por defecto si no hubiese existido TK en primer lugar.

 PyQT: basado en la libreria C++ QT (KDE)


 PyGTK: basado en la libreria C GTK (GNOME)

Características comunes

 Tamaño aprox. (instalador windows desarrollo): 15MB (excepto tkinter


que viene preinstalado)

 Huella en memoria (footprint) de hello-word en windows:


aproximadamente 20MB, excepto tkinter que es la mitad

Ventajas y Desventajas

Tkinter

 Ventajas:

o Preinstalado con python en casi todas las plataformas


o Relativamente simple y fácil de aprender (recomendado para
"aprendices")
o Documentación completa

 Desventajas:

o Pocos elementos gráficos (sin listados, arboles, etc.)


o Limitado control del comportamiento de la interface
(recomendado para proyectos "triviales")
o Lento (dibuja cada botón, etiqueta, menú, etc.) **
o Apariencia "extraña" (no se parece a las aplicaciones nativas) **

Nota **: cabe aclarar que las ultimas versiones de TCL/TK mejoran varios de estos
puntos, dibujando con las funciones nativas de la plataforma, lo que acelera y mejora
la apariencia.

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 93

WxPython

 Ventajas:

o Completo conjunto de elementos gráficos (listados, arboles,


grillas, etc.)
o Flexible control del comportamiento de la interface
o Rápido y de Apariencia nativa (diseñado para utilizar funciones
nativas de cada plataforma)
o "Baterias Incluidas": más de 12 librerias y utilitarios
complementarios (ver comparación)
o Independencia: no esta orientado a ningún entorno, ni QT ni GTK,
hay una capa mas que agrega un grado de libertad adicional
o No se cierra en el mínimo denominador común; soporta las
características comunes de Windows, y las emula en Linux/Mac OS
cuando no se pueden hacer nativamente (y viceversa).
o Es mas "pitónico", por ej. espacio de nombres mas claro, sin
referencias a C/C++, etc.
o Permite separar completamente el diseño de la interface en XML
del código python (XRC)
o Es fácil armar componentes personalizados, tanto que incorpora
widgets que no están en wxWidgets mismo, ya que están escritos en
Python (AGW).
o Documentación completa y ejemplos extensivos.
o Su lista oficial de usuarios (wxpython-users) es muy activa y
amigable, donde participan los desarrolladores principales del proyecto.

 Desventajas:

o No viene preinstalado con python, se debe instalar un paquete


(wxPython en Windows y Mac OS, wxWidgets+wxPython en Linux,
aunque en este último caso está generalmente está fácilmente
disponible en los repositorios).
o Relativamente mas complejo de aprender
o Al tener un desarrollo bastante rápido y sostenido, se liberan
versiones frecuentemente, lo que en la práctica le confiere cierto nivel
de "volatilidad" y problemas de compatibilidad si se deben mantener
varias versiones de wx para el mismo código.
o Es una capa más sobre el toolkit gráfico que se usa debajo (ej:
GTK).
o Las características emuladas de otras plataformas no siempre se
ven bien.
o Hacer interfaces multiplataformas que se vean bien requiere
conocimiento del toolkit subyacente (win32, gtk).
o En proyectos medianos/grandes, puede ser inestable y dificil de
debuggear: en windows es muy facil segfaultear si se pasan parámetros
incorrectos.

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 94

PyQt

 Ventajas:

o Completo conjunto de elementos gráficos (listados, arboles,


grillas, etc.)
o Flexible y potente control del comportamiento de la interface.
Posee un mecanismo de conexión de señales y eventos simple. Se
puede definir los eventos más sencillos en diseñaodr de GUI's (ej: al
pulsar este botón, borrar este campo de texto) y en el código python,
definir las acciones más avanzadas.
o Rápido y de Apariencia nativa (las últimas versiones utilizan
funciones nativas en windows)
o Se puede separar el diseño de la interface, pero usa un
"compilador" pyuic para crear las clases python.
o Arquitectura opcional para Modelo/Vista para las tablas, listas y
árboles.

 Desventajas:

o No viene preinstalado con python, se debe instalar por separado


o Relativamente mas complejo de aprender
o No del todo "pitónico". En ocasiones emerge la implentación en
C++ subyacente, teniendo que hacer casts entre tipos de datos, etc. El
prefijo Qt/Q (QtGUI, QWidget, QAplicattion) hace el código menos
"pitónico"
o No hay mucha documentación específica a python, ya que es
lenguaje en si no es demasiado considerado

PyGTK

 Ventajas:
o Completo conjunto de elementos gráficos (listados, arboles,
grillas, etc.)
o Flexible y potente control del comportamiento de la interface
o Enlace con PyOrbit para programar aplicaciones en GNOME
o Es estable, y los mensajes de error son correctos.
o
 Desventajas:
o No viene preinstalado con python, se debe instalar por separado
o Relativamente mas complejo de aprender
o Relativamente lento en Windows (dibuja cada botón, etiqueta,
menú, etc.) lo que le da una Apariecia "extraña" (aunque es parecido a
windows)
o En windows, es la librería que tiene mas dependencias y se
instalan por separado.
o Aparentemente tiene la documentación mas precaria de todos

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 95

5.1.1. Creación de ventanas

Según la fuente:
http://progra.usm.cl/apunte/materia/interfaces-graficas.html

Tenemos:

Todo programa necesita contar con algún mecanismo para recibir la entrada y
entregar la salida. Ya hemos visto dos maneras de hacer entrada:

 entrada por teclado (raw_input), y


 entrada por archivo (for linea in archivo: ...);

y dos maneras de hacer salida:

 salida por consola (print), y


 salida por archivo (archivo.write(...)).

La mayoría de los programas que ocupamos a diario no funcionan así, sino que tienen
una interfaz gráfica, compuesta por ventanas, menúes, botones y otros elementos, a
través de los cuales podemos interactuar con el programa.

Los programas con interfaces gráficas son fundamentalmente diferentes a los


programas con interfaces de texto. Los programas que hemos escrito hasta ahora se
ejecutan completamente de principio a fin, deteniéndose sólo cuando debemos
ingresar datos.

Los programas gráficos, por otra parte, realizan acciones sólo cuando ocurren ciertos
eventos provocados por el usuario (como hacer clic en un botón, o escribir algo en una
casilla de texto), y el resto del tiempo se quedan esperando que algo ocurra, sin hacer
nada. El programa no tiene control sobre cuándo debe hacer algo. Esto requiere que
los programas sean estructurados de una manera especial, que iremos aprendiendo
de a poco.

Python incluye un módulo llamado Tkinter que provee todas las funciones necesarias,
que deben ser importadas al principio del programa:

from Tkinter import *

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 96

Creación de la ventana

El siguiente programa es la interfaz gráfica más simple que se puede crear:

from Tkinter import *


w = Tk()
w.mainloop()

Haga la prueba: copie este programa en el editor de texto, guárdelo y ejecútelo.


Debería aparecer una ventana vacía:

La sentencia w = Tk() crea la ventana principal del programa, y la asigna a la


variable w. Toda interfaz gráfica debe tener una ventana principal en la que se irán
agregando cosas. Esta línea va al principio del programa.

La sentencia w.mainloop() indica a la interfaz que debe quedarse esperando a que el


usuario haga algo. Esta línea siempre debe ir al final del programa.

Al ejecutarlo, puede darse cuenta que el programa no termina. Esto ocurre porque la
llamada al método mainloop() se «queda pegada» esperando que algo ocurra. Esto se
llama un ciclo de eventos, y es simplemente un ciclo infinito que está continuamente
esperando que algo ocurra.

Todos los programas con interfaz gráfica deben seguir esta estructura: la creación de
la ventana al principio del programa y la llamada al ciclo de eventos al final del
programa.

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 97

Creación de widgets

Un widget es cualquier cosa que uno puede poner en una ventana. Por ahora,
veremos tres tipos de widgets sencillos, que son suficientes para crear una interfaz
gráfica funcional:

 las etiquetas (Label) sirven para mostrar datos,


 los botones (Button) sirven para hacer que algo ocurra en el programa, y
 los campos de entrada (Entry) sirven para ingresar datos al programa.

En un programa en ejecución, estos widgets se ven así:

El Entry es análogo al raw_input de los programas de consola: sirve para que el


programa reciba la entrada. El Label es análogo al print: sirve para que el programa
entregue la salida.

Un botón puede ser visto como un «llamador de funciones»: cada vez que un botón es
presionado, se hace una llamada a la función asociada a ese botón. Los botones no
tienen un análogo, pues los programas de consola se ejecutan de principio a fin
inmediatamente, y por esto no necesitan que las llamadas a las funciones sean
gatilladas por el usuario.

Para agregar un widget a un programa, hay que ocupar las funciones con los nombres
de los widgets (Label, Button y Entry). Estas funciones reciben como primer parámetro
obligatorio la ventana que contendrá el widget. Además, tienen parámetros opcionales
que deben ser pasados usando la sintaxis de asignación de parámetros por nombre.
Por ejemplo, el parámetro text sirve para indicar cuál es el texto que aparecerá en un
botón o en una etiqueta.

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 98

Por ejemplo, la siguiente sentencia crea un botón con el texto Saludar, contenido en la
ventana w:

b = Button(w, text='Saludar')

Si bien esto crea el botón y lo asigna a la variable b, el botón no es agregado a la


ventana winmediatamente: lo que hicimos fue simplemente decirle al botón cuál es su
contenedor, para que lo tenga en cuenta al momento de ser agregado. Para que esto
ocurra, debemos llamar al método pack, que es una manera de decirle al widget
«empaquétate dentro de tu contenedor»:

b.pack()

Como referencia, el programa que crea la ventana de la imagen es el siguiente


(¡pruébelo!):

from Tkinter import *

w = Tk()

l = Label(w, text='Etiqueta')
l.pack()

b = Button(w, text='Boton')
b.pack()

e = Entry(w)
e.pack()

w.mainloop()

Los widgets van siendo apilados verticalmente, desde arriba hacia abajo, en el mismo
orden en que van siendo apilados. Ya veremos cómo empaquetarlos en otras
direcciones.

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 99

5.1.2. Manejo de eventos

Controladores

Al crear un botón de la siguiente manera:

b = Button(w, text='Saludar')

no hay ninguna acción asociada a él. Al hacer clic en el botón, nada ocurrirá.

Para que ocurra algo al hacer clic en el botón, hay que asociarle una acción.
Un controlador es una función que será ejecutada al hacer clic en un botón.

Los controladores deben ser funciones que no reciben ningún parámetro.

Por ejemplo, supongamos que queremos que el programa imprima el mensaje Hola en
la consola cada vez que se haga clic en el botón que dice «Saludar». Primero, hay que
crear el controlador:

def saludar():
print 'Hola'

Para asociar el controlador al botón, hay que pasarlo a través del


parámetro command (en inglés: «orden») al momento de crear el botón:

b = Button(w, text='Saludar', command=saludar)

Esta línea significa: crear el botón b, contenido en la ventana w, que tenga el


texto 'Saludar' y que al hacer clic en él se ejecute la función saludar.

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 100

El siguiente ejemplo es un programa completo que tiene dos botones: uno para
saludar y otro para salir del programa. El controlador del segundo botón es la
función exit, que ya viene con Python:

from Tkinter import *

def saludar():
print 'Hola'

w = Tk()

l = Label(w, text='Hola progra')


l.pack()

b1 = Button(w, text='Saludar', command=saludar)


b1.pack()

b2 = Button(w, text='Salir', command=exit)


b2.pack()

w.mainloop()

El programa se ve así:

Ejecute el programa, y pruebe lo que ocurre al hacer clic en ambos botones.

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 101

Modelos

Mediante el uso de controladores, ya podemos hacer interfaces que hagan algo, pero
que siguen teniendo una limitación: las interfaces sólo reaccionan a eventos que
ocurren, pero no tienen memoria para recordar información.

Un modelo es un dato almacenado que está asociado a la interfaz. Usando modelos,


se puede lograr que la interfaz vaya cambiando su estado interno a medida que
ocurren eventos.

En general, a la hora de crear un programa con interfaz gráfica, debemos crear un


modelo para cada dato que deba ser recordado durante el programa.

Tkinter rovee varios tipos de modelos, pero para simplificar podemos limitarnos a usar
sólo modelos de tipo string. Un modelo puede ser creado de la siguiente manera:

m = StringVar()

Aquí, el modelo m es capaz de recordar un string

Para modificar el valor del modelo m, se debe usar el método set, que recibe el valor
como único parámetro:

m.set('hola')

Para obtener el valor del modelo m, se debe usar el método get, que no recibe ningún
parámetro:

s = m.get()

En este ejemplo, la variable s toma el valor 'hola'.

Como los modelos creados por StringVar almacenan datos de tipo string, hay que
tener cuidado de hacer las conversiones apropiadas si se desea usar datos numéricos:

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 102

a = StringVar()
b = StringVar()
a.set(5) # es convertido a string
b.set(8) # es convertido a string
print a.get() + b.get() # imprime 58
print int(a.get()) + int(b.get()) # imprime 13

Usted podría preguntarse cuál es la razón para usar modelos en vez de usar las
variables propias de Python, —es decir, las que son creadas mediante asignaciones—
para almacenar los datos. Los modelos tienen la ventaja que es posible asociarlos a
elementos de la interfaz que responden automáticamente cuando el valor del modelo
cambia.

Por ejemplo, podemos asociar una etiqueta a un modelo. La etiqueta siempre mostrará
en la interfaz el valor que tiene el modelo, incluso cuando éste cambie.

Para asociar un modelo a una etiqueta, hay que usar el parámetro textvariable:

x = StringVar()
l = Label(w, textvariable=x)
l.pack()

Cada vez que cambie el valor del modelo x, el texto de la etiqueta será actualizado
inmediatamente.

También podemos asociar un campo de entrada a un modelo. El valor asociado al


modelo siempre será el texto que está ingresado en el campo.

Para asociar un modelo a un campo de texto, también se usa el


parámetro textvariable:

x = StringVar()
e = Entry(w, textvariable=x)
e.pack()

Cuando se obtenga el valor del modelo mediante la llamada x.get(), el valor retornado
será lo que el usuario haya ingresado en el campo hasta ese momento.

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 103

5.1.3. Manejo de archivos

Según la fuente:
http://www.manejandodatos.es/2014/10/formularios-modales-en-tkinter-con-python/

Formularios modales

Si necesito un formulario modal, es porque requiero de unos datos que deben


devolverse a la ventana que lo invoca. y esto es lo que vamos a hacer. Crear un
formulario con un botón y una etiqueta, de forma que cuando llame al botón, me
solicite un nuevo valor, y dicho valor será el que se mostrará en la etiqueta.

Lo primero, vamos a crear el formulario base, con una clase main, donde creamos lo
previsto. Al pulsar el botón, se lanza un evento que llama al formulario modal, que
hemos construido con otra clase. Al inicializarlo, le transferimos el valor que queremos
modificar. Al ser una variable StringVar, puedes comprobar que mientras escribes,
cambia el valor. Si quieres controlar mejor los valores, la solución es “desvincular” el
valor a la hora de crear el Entry, y hacer la verificación de valor en la función ok.
Aquí tienes el código completo:

1 from Tkinter import *


2
3 class main(Frame):
4 def __init__(self, master):
Frame.__init__(self, master=None)
5 self.master.title("Probando Dialogos - Manejando datos")
6 self.master.geometry("300x50")
7 Button(root, text="cambiar valor", command=self.dialogo).pack()
8 self.valor = StringVar()
9 self.valor.set("Hola Manejando datos")
10 Label(self.master, textvariable=self.valor).pack()
11
12 def dialogo(self):
13 d = MyDialog(root, self.valor, "Probando Dialogo", "Dame valor")
root.wait_window(d.top)
14
#self.valor.set(d.ejemplo)
15
16 class MyDialog:
17 def __init__(self, parent, valor, title, labeltext = '' ):
18 self.valor = valor
19
20 self.top = Toplevel(parent)
21 self.top.transient(parent)
22 self.top.grab_set()
23 if len(title) > 0: self.top.title(title)
24 if len(labeltext) == 0: labeltext = 'Valor'
Label(self.top, text=labeltext).pack()
25 self.top.bind("<Return>", self.ok)
26 self.e = Entry(self.top, text=valor.get())
27 self.e.bind("<Return>", self.ok)
28 self.e.bind("<Escape>", self.cancel)
29 self.e.pack(padx=15)

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 104

30 self.e.focus_set()
31 b = Button(self.top, text="OK", command=self.ok)
32 b.pack(pady=5)
33
def ok(self, event=None):
34
print "Has escrito ...", self.e.get()
35 self.valor.set(self.e.get())
36 self.top.destroy()
37
38 def cancel(self, event=None):
39 self.top.destroy()
40
41 root = Tk()
42 a = main(root)
43 root.mainloop()
44
45
46
47

Los métodos a tener en cuenta son:


 wait_window es el método que lanza un nuevo formulario
 grab_set es lo que hace al nuevo formulario como modal, de forma que hasta que no
se destruye, no vuelve al formulario que lo creó

Tkinter Formularios modales

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 105

5.1.4. Introduccióna los Sockets TCP / IP

Python proporciona dos niveles de acceso a los servicios de red. En un nivel bajo,
puede acceder a la ayuda básica de socket en el sistema operativo subyacente, lo que
le permite implementar clientes y servidores para ambos protocolos de conexión y
orientados a conexión.

Python también tiene bibliotecas que proporcionan mayor nivel de acceso a los
protocolos de red de nivel de aplicación específicos, tales como FTP, HTTP, y así
sucesivamente.

¿Cuál es Sockets?
Los Sockets son los extremos de un canal de comunicación bidireccional. Los Sockets
pueden comunicarse dentro de un proceso, entre los procesos en la misma máquina, o
entre procesos en diferentes continentes.

Los Sockets pueden ser implementados en un número de diferentes tipos de canales:


sockets de dominio Unix, TCP, UDP, y así sucesivamente. La biblioteca socket
proporciona clases específicas para el manejo de los medios de transporte comunes,
así como una interfaz genérica para manejar el resto.

Los Sockets tienen su propio vocabulario:

Termino Descripción

domain La familia de protocolos que se utiliza como mecanismo de


transporte. Estos valores son constantes tales como AF_INET,
PF_INET, AF_UNIX, PF_X25, y así sucesivamente.

type El tipo de comunicaciones entre los dos puntos finales,


normalmente SOCK_STREAM para protocolos orientados a la
conexión y SOCK_DGRAM para protocolos sin conexión.

protocol Típicamente cero, esto puede ser utilizado para identificar una
variante de un protocolo dentro de un dominio y el tipo.

hostname El identificador de una interfaz de red:

• Una cadena, que puede ser un nombre de host, una dirección


decimal con puntos, o una dirección IPv6 en dos puntos (y
posiblemente de puntos) notación

• Una cadena "<'broadcast", que especifica una dirección


INADDR_BROADCAST.

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 106

• Una cadena de longitud cero, que especifica INADDR_ANY, o

• un número entero, interpretado como una dirección binaria con


el fin de bytes de ordenador.

port Cada servidor escucha a los clientes que llaman en uno o más
puertos. Un puerto puede ser un número Fixnum puerto, una
cadena que contiene un número de puerto, o el nombre de un
servicio

El módulo Socket

Para crear un socket, debe usarse la función socket.socket() disponible en el módulo


insocket, el cuál tiene la siguiente sintaxis:

s = socket.socket (socket_family, socket_type, protocol=0)

Aquí la descripción de los parámetros:

 socket_family: Esto es AF_UNIX or AF_INET, explicado anteriormente.

 socket_type: Estos son SOCK_STREAM or SOCK_DGRAM.

 protocol: Por defecto 0.

Una vez que tenga objeto socket, a continuación, puede utilizar las funciones
necesarias para crear su programa de cliente o servidor.

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 107

A continuación, se presenta la lista de las funciones requeridas.

Socket Methods
Metodo Descripción

s.bind() Es dirección de método de enlace (nombre de host, el par número de


puerto), al socket.

s.listen() Este método establece y se inicia escucha TCP.

s.accept() Esta acepta pasivamente conexión de cliente TCP, esperando a que


llegue la conexión (bloqueo).

Client Socket Methods


Método Descripción

s.connect() Este método inicia de forma activa la conexión del servidor TCP.
(Bloqueo).

General Socket Methods


Método Descripción

s.recv() Este método recive mensajes TCP

s.send() Este método envia mensajes TCP

s.recvfrom() Este método recive mensajes UDP

s.sendto() Este método envia mensajes UDP

s.close() Este método cierra el socket

socket.gethostname() Retorna el hostname.

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 108

5.1.5. Uso de sockets para comunicación TCP/IP, cliente - servidor.

Un Servidor simple:

Para escribir los servidores de Internet, utilizamos la función de socket disponibles en


el módulo de tubo para crear un objeto socket. Un objeto socket se utiliza para llamar a
otras funciones para configurar un servidor de socket.

Ahora llamar a la función bind (nombre de host, puerto) para especificar un puerto para
su servicio en el equipo dado.

A continuación, llamar al método accept del objeto devuelto. Este método espera hasta
que un cliente se conecta al puerto que ha especificado, y luego devuelve un objeto
conexión que representa la conexión a ese cliente.

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 109

Un Cliente simple:

Escribimos un programa cliente muy simple que se abre una conexión a un puerto
determinado 12345 y equipo dado. Esto es muy simple para crear un cliente de un
conector usando la función módulo de toma de Python.

El Socket.connect (hosname, puerto) abre una conexión TCP con hostname en el


puerto. Una vez que tenga una toma abierta, se puede leer de él como cualquier otro
objeto IO. Cuando haya terminado, no olvide cerrarlo, como era de cerrar un archivo.

El código siguiente es un cliente muy simple que se conecta a un host y el puerto


dado, lee todos los datos disponibles de la toma, y después sale.

Ahora ejecutar este server.py y luego correr el client.py para ver el resultado.

Produce el siguiente resultado:

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 110

Módulos de Python Internet


Una lista de algunos modulos importantes de red y programación de internet en
Python:

Protocolo Función común Numero Módulo Python


del
Puerto

HTTP Web pages 80 httplib, urllib, xmlrpclib

NNTP Usenet news 119 nntplib

FTP File transfers 20 ftplib, urllib

SMTP Sending email 25 smtplib

POP3 Fetching email 110 poplib

IMAP4 Fetching email 143 imaplib

Telnet Command lines 23 telnetlib

Gopher Document transfers 70 gopherlib, urllib

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 111

5.1.6. Aplicación de un sistema de adquisición de datos usando interfaz


grafica, sensores, comunicación TCP/IP, microcontrolador
(Arduino) y circuitos de potencia.

Ejemplo 1:

La siguiente información se pone como ejemplo de la fuente:


http://www.blendedtechnologies.com/realtime-plot-of-arduino-serial-data-using-python

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 112

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 113

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 114

Ejemplo 2:

La siguiente información se pone como ejemplo de la fuente:

http://robologs.net/2015/06/20/construir-un-robot-bluetooth-con-arduino-y-python/

Construir un robot bluetooth con Arduino y Python

Figura 75: Proyecto “Robot Bluetooth”


Fuente: http://robologs.net/2015/06/20/construir-un-robot-bluetooth-con-arduino-y-python/

Se programará el robot para recibir órdenes por Bluetooth (adelante, atrás, gira…) y
después escribiremos un programa en Python para mover al robot con las flechas del
teclado.

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 115

¿Qué necesito?
En el ordenador hay que tener instalado el programa Blueman, y las librerías de
python pyserial y pygame.
Como microcontrolador usaremos Arduino.
También es necesario un chasis con motores para el robot. Puede ser prefabricado o
construido a piezas, no importa. Hay muchos tipos de chasis y controladores de
motores, así que no voy a hablar del montaje ni de cómo controlar los motores. Sólo
será necesaria una función para cambiar la velocidad, algo de este estilo:

motores(int m1, int m2);


Dónde m1 y m2 es la velocidad de los motores. Os dejo para vosotros escribirla.
Y, por último, un poco de música.

Conexiones de la antena
Primero hay que conectar la antena Bluetooth a Arduino. Las conexiones serán estas:

 VCC -> Arduino 3.3v

 GND -> Arduino GND

 RXD -> Arduino TX

 TXD -> Arduino RX

Código de Arduino
Para cargarlo hay que desconectar la antena de los pines TX y RX.
int val;
1
2
void setup()
3 {
4 Serial.begin(9600);
5 delay(7000);
6
7 }
8
9 void loop()
10 {
11 if(Serial.available() >= 1)
12 {
val = Serial.read();
13
14
if(val == 'a')
15
{
16 motores(250,250);
17 }

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 116

18 else if(val == 'i')


19 {
20 motores(-250, 250);
}
21
else if(val == 's')
22 {
23 motores(0,0);
24 }
25 else if(val == 'r')
26 {
27 motores(-250,-250);
28 }
29 else if(val == 'd')
{
30 motores(250,-250);
31 }
32 }
33 }
34
35
36
37

¿Qué hace este programa?


Lee carácteres por Serial (la antena está conectada a los pines de comunicación
Serial) y según lo que vaya recibiendo cambia la dirección de los motores. O los
detiene.

Explicación:
La función void setup() inicia la comunicación Serial a 9600 baud y espera 7 segundos.
Así hay tiempo a conectar la antena.
1 void setup()
2 {
3 Serial.begin(9600);
4 delay(7000);
5
6 }

En el bucle principal se lee el Serial y si se está recibiendo algo útil (Serial.available()


>= 1), se guarda dentro de la variable val. Después se compara val con diversos
carácteres para ver en qué dirección tiene que ir el robot (‘a’->adelante, ‘i’->izquierda,
‘d’->derecha, ‘r’->retroceder y ‘s’->stop).

1 void loop()
2 {
if(Serial.available() >= 1)
3
{
4 val = Serial.read();
5
6 if(val == 'a')
7 {
8 motores(250,250);
9 }

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 117

10 else if(val == 'i')


11 {
12 motores(-250, 250);
}
13
else if(val == 's')
14 {
15 motores(0,0);
16 }
17 else if(val == 'r')
18 {
19 motores(-250,-250);
20 }
21 else if(val == 'd')
{
22 motores(250,-250);
23 }
24 }
25 }
26
27
28

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 118

Emparejar Arduino y el Ordenador

Para que el robot y el ordenador se comuniquen, primero deben emparejarse. Si no,


no aceptarán datos el uno del otro. Estos pasos están en el tutorial de antes, pero he
querido recordarlos.
Abrimos Blueman, el gestor de Bluetooth. Primero hay que buscar los dispositivos con
Bluetooth próximos. Le damos a “Search”:

Aparecerá una lista. Hay que darle con el botón derecho al nombre de la antena y
seleccionar “Pair”.

Pedirá introducir el Pin de la antena antes de conectarse. Una vez emparejado, hay
que pusar otra vez y seleccionar la opción “Dev B”. Esto permite comunicarse con la
antena a través de Serial.

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 119

Arriba a la derecha de la pantalla aparecerá un mensaje con la dirección del


dispositivo. La mía es /dev/rfcomm0.

Programa con Python


Con la librería pygame el programa leerá el teclado. Si se pulsa una flecha, el
programa enviará un carácter por serial al robot a la dirección /dev/rfcomm0. Si se deja
de presionar una tecla, se enviará el comando de parada. Con la tecla ‘escape’ se sale
del programa.
Tenéis que cambiar ‘/dev/rfcomm0’ de la línea 4 por la dirección de vuestra antena. Se
sale del programa con ESCAPE.
1 import serial
2 import pygame
3
4 ser = serial.Serial('/dev/rfcomm0', 9600)
5
6 pygame.init()
screen = pygame.display.set_mode((640, 480))
7
pygame.display.set_caption('Robot!')
8 pygame.mouse.set_visible(1)
9
10 val = '-'
11
12 while val != 'stop':
13 events = pygame.event.get()
14 for event in events:
15 if event.type == pygame.KEYDOWN:
16 if event.key == pygame.K_UP:
17 ser.write('a')
elif event.key == pygame.K_LEFT:
18
ser.write('i')
19 elif event.key == pygame.K_RIGHT:
20 ser.write('d')
21 elif event.key == pygame.K_DOWN:
22 ser.write('r')
23 elif event.key == pygame.K_ESCAPE:
24 val = 'stop'

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 120

25 if event.type == pygame.KEYUP:
26 ser.write('s')
27
28

Las dos primeras líneas sirven para llamar a las librerías:


1 import pygame
2
3 import pyserial
Ahora hay que iniciar el Serial:
1 ser = serial.Serial('/dev/rfcomm0', 9600)
Iniciamos pygame con algunos parámetros estándar para dibujar una ventana y
mostrar el ratón.
1 pygame.init()
2 screen = pygame.display.set_mode((640, 480))
3 pygame.display.set_caption('Robot!')
4 pygame.mouse.set_visible(1)

Ahora el programa mira si ha pasado algun evento (se ha desplazado el mouse, se ha


cambiado el estado de una tecla…). Si se ha pulsado una tecla (pygame.KEYDOWN),
mira que tecla es y si es una flecha envía la dirección por serial. Si es la tecla ESCAPE
cierra.
Si se ha dejado de pulsar una tecla (pygame.KEYUP), envia la instrucción de parada
por Serial.
1
2 while val != 'stop':
events = pygame.event.get()
3
for event in events:
4 if event.type == pygame.KEYDOWN:
5 if event.key == pygame.K_UP:
6 ser.write('a')
7 elif event.key == pygame.K_LEFT:
8 ser.write('i')
9 elif event.key == pygame.K_RIGHT:
10 ser.write('d')
11 elif event.key == pygame.K_DOWN:
ser.write('r')
12
elif event.key == pygame.K_ESCAPE:
13 val = 'stop'
14 if event.type == pygame.KEYUP:
15 ser.write('s')
16

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 121

Ejemplo3 ;

La siguiente información se pone como ejemplo de la fuente:

https://geekytheory.com/arduino-python-smtp-gmail/

EXPOSICIÓN DEL PROYECTO


Desde mi computadora, y mediante un código en Python, leeremos líneas de
información enviados desde un Arduino R3. Si por ejemplo la línea leída es igual a ‘H’
podrá envíar un correo electrónico.

¿ Qué es SMTP ?
El SMTP es un Protocolo para la transferencia simple de correo electrónico. En este
caso usaremos el SMTP server de Google.
Pueden consultar la librería de smtp de Python en el siguiente enlace
http://docs.python.org/2/library/smtplib.html

REALIZACIÓN DEL PROYECTO


Este tutorial se va a dividir en dos partes distintas:
Parte 1: Arduino (código y montaje)
Parte 2: Python (código y ejecución)

– PARTE 1: ARDUINO
El código de Arduino es realmente sencillo y, el montaje más aún, pues es colocar el
Sensor de Ultrasonido(HC-SR04). Además les invito a revisar el artículo
siguienteSensor de Ultrasonidos HC-SR04 para que tenga una idea más completa del
uso de este sensor, y si ya lo han leído espero que sea para refrescar la memoria.

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 122

Si ya haz usado Arduino antes, entenderás este código a la primera. Si,


por lo contrario, es tu primera vez, no se preocupe, es muy intuitivo y
está explicado por cada línea.

PARTE 2:

Python
Vamos, ahora, con la parte del código en Python. Esta parte consiste en la
programación del código que nos permitirá leer los datos envíados desde el
Arduino. Llamaremos a este código arduino_smtp.py o como ustedes prefieran
llamarle.
Antes de escribir el código, tendremos que instalar la librería ‘python-serial’ para que
no nos de error en la ejecución:

Si estamos en Windows sería de esta forma, primero localizamos la carpeta en


dónde hemos descargado la librería usando el CMD y por último
debemos de escribir lo siguiente:

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 123

Con esto ya instalamos la librería en Windows.


¡Y ahora vamos a la primera parte del código!
No os olvidéis de importar las librerías serial, time y smtplib:

Como pueden apreciar, tenemos que definir variables para usar el SMTP de
Google y estas son:

 Enprimer lugar, definir USUARIO_GMAIL con nuestro correo gmail y


CONTRASENA_GMAIL con su respectiva contraseña.

 En segundo lugar, definir el cuerpo del correo electrónico: definimos al


DESTINATARIO y un REMITENTE. El destinatario es la persona que recibe el
correo electrónico y el remitente la persona que lo envía.

 En tercer lugar, definir el ASUNTO del correo electrónico y su


respectivoMENSAJE.

 Y por último, definir el objeto arduino con los siguientes parametros:


puerto_com, baudios y tiempo de espera respectivamente.

A continuación la segunda parte del código!

Creamos un método con el nombre ‘enviar_correo_electronico‘ o el que ustedes


prefieran ponerle. Dentro de este método debe de estar todo el proceso del envío
de un correo electrónico usando el SMTP server de Google. Sin más preambulos
este es el código.

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL


PROGRAMACIÓN DE COMPUTADORAS 124

Ahora la parte final del código:

Para el funcionamiento de este método tendremos que hacer un while que tenga una
condición verdadera. En cristiano sería decir: mientras sea verdadero debe de hacer
tal cosa.

El código es el siguiente:

Para ejecutar este código, simplemente tendremos que introducir lo siguiente en


la consola que están usando de su Sistema Operativo de preferencia:

Como resultado deberían llegar a algo como esto

CARRERA DE MECATRÓNICA INDUSTRIAL IEST PRIVADO CIBERTEC


PROGRAMACIÓN DE COMPUTADORAS 125

Resumen
Para diseñar un programa que tiene una interfaz gráfica, hay tres elementos
importantes que hay que tener en consideración.

1. Los elementos que componen la interfaz. A esto se le suele denominar


la vista del programa.
2. Los modelos que mantienen el estado de la interfaz en todo momento.
3. Los controladores que reaccionan a eventos del usuario.

Se puede revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:

o http://progra.usm.cl/apunte/materia/interfaces-graficas.html
o http://pharalax.com/blog/python-desarrollo-de-interfaces-graficas-con-
tkinter-labelsbuttonsentrys/
o http://gmendezm.blogspot.pe/2012/12/tutorial-tkinter-python-gui.html
o http://www.pythondiario.com/2014/11/aplicaciones-graficas-con-tkinter-
en.html
o http://www.toptechboy.com/tutorial/python-with-arduino-lesson-16-simple-
client-server-configuration-over-ethernet/
o https://geekytheory.com/arduino-python-smtp-gmail/

IEST PRIVADO CIBERTEC CARRERA DE MECATRÓNICA INDUSTRIAL

También podría gustarte