Vous êtes sur la page 1sur 15

Guía de laboratorio

Programa IE

UNIVERSIDAD CESMAG
FACULTAD DE INGENIERIA
INGENIERIA ELECTRONICA

Asignatura Semestre Corte Docente


Electiva 6° Semestre – 6 1 Jorge Andrés Chamorro Enríquez
Automatización con servicios
telemáticos
No. Lab Nombre laboratorio Lugar Fecha Duración
5 Introducción a Linux Aula 6 3 horas

Tema Configuración de un servidor web Sub tema Manejo de puerto GPIO

Objetivo general Competencias esperadas


Introducir al educando en el Dominar la configuración básica de plataformas Windows
1
manejo y configuración de redes y Linux
de computadores entre Crear redes de datos entre plataformas Windows y Linux,
2
plataformas de software libre y compartiendo servicios telemáticos
propietario incluyendo Instalar y configurar servicios telemáticos como DHCP,
dispositivos tales como 3
WEB, FTP, MAIL entre otros
computadores, Smart phones y
Realizar aplicaciones simples orientadas al internet de las
micro computadores como 4
cosas (IOT) con microcomputadores Raspberry.
raspberry.

Teoría
¿Qué es Python?
Lenguaje de programación de propósito general, orientado a objetos, que también puede
utilizarse para el desarrollo web.

Queremos presentar un lenguaje de programación de propósito general, cuya expansión y


popularidad es relativamente reciente. Se trata de Python, una apuesta por la simplicidad, versatilidad
y rapidez de desarrollo. A continuación veremos unas notas imprescindibles del lenguaje, extractadas
básicamente de la página de inicio del lenguaje que se puede ver en www.python.org

Python es un lenguaje de scripting independiente de plataforma y orientado a objetos, preparado


para realizar cualquier tipo de programa, desde aplicaciones Windows a servidores de red o incluso,
páginas web. Es un lenguaje interpretado, lo que significa que no se necesita compilar el código
fuente para poder ejecutarlo, lo que ofrece ventajas como la rapidez de desarrollo e inconvenientes
como una menor velocidad.

En los últimos años el lenguaje se ha hecho muy popular, gracias a varias razones como:

1
Guía de laboratorio
Programa IE

 La cantidad de librerías que contiene, tipos de datos y funciones incorporadas en el propio


lenguaje, que ayudan a realizar muchas tareas habituales sin necesidad de tener que
programarlas desde cero.

 La sencillez y velocidad con la que se crean los programas. Un programa en Python puede tener
de 3 a 5 líneas de código menos que su equivalente en Java o C.
 La cantidad de plataformas en las que podemos desarrollar, como Unix, Windows, OS/2, Mac,
Amiga y otros.
 Además, Python es gratuito, incluso para propósitos empresariales.

De dónde viene Python

El creador del lenguaje es un europeo llamado Guido Van Rossum. Hace ya más de una década que
diseño Python, ayudado y motivado por su experiencia en la creación de otro lenguaje llamado ABC.
El objetivo de Guido era cubrir la necesidad de un lenguaje orientado a objetos de sencillo uso que
sirviese para tratar diversas tareas dentro de la programación que habitualmente se hacía en Unix
usando C.

El desarrollo de Python duró varios años, durante los que trabajó en diversas compañías de Estados
Unidos. En el 2000 ya disponía de un producto bastante completo y un equipo de desarrollo con el
que se había asociado incluso en proyectos empresariales. Actualmente trabaja en Zope, una
plataforma de gestión de contenidos y servidor de aplicaciones para el web, por supuesto,
programada por completo en Python.

Características del lenguaje

Propósito general: Se pueden crear todo tipo de programas. No es un lenguaje creado


específicamente para la web, aunque entre sus posibilidades sí se encuentra el desarrollo de
páginas.

Multiplataforma: Hay versiones disponibles de Python en muchos sistemas informáticos distintos.


Originalmente se desarrolló para Unix, aunque cualquier sistema es compatible con el lenguaje
siempre y cuando exista un intérprete programado para él.

Interpretado: Quiere decir que no se debe compilar el código antes de su ejecución. En realidad, sí
que se realiza una compilación, pero esta se realiza de manera transparente para el programador.
En ciertos casos, cuando se ejecuta por primera vez un código, se producen unos bytecodes que se
guardan en el sistema y que sirven para acelerar la compilación implícita que realiza el intérprete
cada vez que se ejecuta el mismo código.

Interactivo: Python dispone de un intérprete por línea de comandos en el que se pueden introducir
sentencias. Cada sentencia se ejecuta y produce un resultado visible, que puede ayudarnos a
entender mejor el lenguaje y probar los resultados de la ejecución de porciones de código
rápidamente.

Orientado a Objetos: La programación orientada a objetos está soportada en Python y ofrece en

2
Guía de laboratorio
Programa IE
muchos casos una manera sencilla de crear programas con componentes reutilizables.1

Funciones y librerías: Dispone de muchas funciones incorporadas en el propio lenguaje, para el


tratamiento de strings, números, archivos, etc. Además, existen muchas librerías que podemos
importar en los programas para tratar temas específicos como la programación de ventanas o
sistemas en red o cosas tan interesantes como crear archivos comprimidos en .zip.

Sintaxis clara: Por último, destacar que Python tiene una sintaxis muy visual, gracias a una notación
identada (con márgenes) de obligado cumplimiento. En muchos lenguajes, para separar porciones
de código, se utilizan elementos como las llaves o las palabras clave begin y end. Para separar las
porciones de código en Python se debe tabular hacia dentro, colocando un margen al código que iría
dentro de una función o un bucle. Esto ayuda a que todos los programadores adopten unas mismas
notaciones y que los programas de cualquier persona tengan un aspecto muy similar.

Conexión GPIO de Raspberry Pi 3

Este verano me compré una Raspberry Pi. ¿Es extraño que alguien que escribe un blog de
electrónica no tenga una Raspberry? Tal vez. El caso es que quería contaros mis primeras pruebas
centradas en la experimentación con la conexión GPIO.

Si habéis leído otros artículos de este blog dedicados a microcontroladores sabréis que suelo usar
PIC. El objetivo de este artículo es reproducir algunas funciones para las usábamos PIC pero usando
un dispositivo infinitamente más potente.

Comenzaremos con un repaso básico a lo que es la Raspberry Pi y sus accesorios a modo de


introducción. Seguiremos con el manejo básico de los pines I/O usando la shell. Después pasaremos
al PWM mediante la utilidad gpio de WiringPi y controlaremos un servo como ejemplo. Finalmente,
para probar el I2C manejaremos un ADC tipo PCF8591 por medio de los drivers internos.

Figura 1. Puertos GPIO Raspberry pi 3

1 https://desarrolloweb.com/articulos/1325.php
3
Guía de laboratorio
Programa IE

La placa base

Estos dispositivos se llaman Low Cost Single Board Computers, que quiere decir que es un
ordenador completo, de bajo consumo, con características modestas que está contenido en una
placa un poco mayor que una tarjeta de crédito. Hay de varias marcas, distintos precios y diseños.
El más común es de marca Raspberry. Fue también el primero en tener una acogida masiva. Hay
otras marcas como ODroid o Banana Pi, cada uno con sus características y sus precios.

Figura 2. Ordenamiento GPIO Raspberry pi 3

La versión 3, que es la que voy a usar, salió en febrero de 2016 y cuenta con WiFi incorporada,
Ethernet, varios puertos USB, HDMI y conectores para cámara, display, etc. Está basada en el
BCM2837, evolución del BCM2835, un SoC (System on Chip) de Broadcom bien conocido. Un
System on Chip no es más que un procesador, GPU y demás funciones integradas en un sólo
componente. Se parece mucho a la electrónica de un smartphone. Este modelo es un ARM de 64bits
a 1.2GHz, quad core y con 1Gb de RAM.

De la arquitectura no puedo contar mucho, ya que Raspberry no es Open Hardware. Hay disponibles
versiones reducidas del esquema eléctrico, pero por hasta la fecha no hay intención de liberar el
esquema completo. Por tanto muchos de los resultados se basan en la experimentación.

El chip que controla los puertos USB y la conexión Ethernet es el mismo, un LAN9514 de Microchip,
produciendo un cuello de botella. Tened esto en cuenta si planeáis usarlo como NAS. Dado el precio
del integrado y el uso general al que se destina el producto me parece una decisión de diseño más
que razonable.

4
Guía de laboratorio
Programa IE

Lo importante es que todas las versiones cuentan con una conexión GPIO (General Purpose Input
Output) triestado. Es decir salida nivel alto, bajo y alta impedancia -input-, como las de un
microcontrolador. Al fin y al cabo son los mismos pines del BCM expuestos para nosotros. Eso sí,
importante, funcionan a 3.3v y no a 5v y carecen de cualquier tipo de protección. No suele haber
problema en conectarlas a 5v con una resistencia, pero es algo que el datasheet prohíbe
expresamente, así que allá vosotros.

Accesorios

Lo primero que compraría sería una caja apropiada para el uso que estéis pensando. La que yo veo
más práctica para experimentar es la Pibow Coupé. Las cajas con este formato permiten acceder
fácilmente a todos los conectores con un detalle muy útil: tiene serigrafiada la numeración de los
pines. Lo único que no me gusta es que los pines GPIO sobresalen ligeramente de la caja y podrían
engancharse con algo.

Figura 3. Caja de acrílico tipo Pibow Coupe, color "flotilla".


El adaptador, para un uso ocasional sirve perfectamente con un cargador de móvil de 5v. Eso sí, en
cuanto queráis conectar un disco duro externo, por ejemplo, se os va a venir abajo. Recomiendan un
cargador de 3 amperios, que también os puede servir para cargar un móvil que soporte carga rápida.

¿Disipador? No es malo pero tampoco lo necesita. Si queréis ponerlo tened en cuenta que las cajas
como la de arriba sólo están preparadas para poner disipador en el chip principal.

El sistema operativo va en una tarjeta Micro SD, el tamaño no importa siempre que quepa el sistema
operativo y el software que queráis instalar, el mínimo sin entorno gráfico diría que una de 2Gb.

Otros accesorios que considero muy útiles son un latiguillo de cable de red Ethernet para conectarla
al router o al PC y un conector USB-Serie sobre todo para los que uséis portátil. Veremos por qué
más adelante.

Primeros pasos

5
Guía de laboratorio
Programa IE

El único SO que he probado es Raspbian, por lo que no puedo recomendaros otro para pruebas.
Hay versión con entorno gráfico y versión sin él. Como sólo me conecto por ssh puedo instalar la
versión ligera.

Para instalar el sistema operativo basta descomprimirlo y copiar la imagen en una SD. Viene
preconfigurada con un cliente dhcp y el demonio Avahi habilitado con el nombre raspberrypi.local. Lo
cual, si usáis linux, os va permitir acceder a ella con ese nombre por ssh en cuanto la conectéis a la
red cableada. ¿Y si uso Windows? Bueno pues Windows no soporta de manera nativa el protocolo
mDNS (DNS por multicast) así que no reconocerá el nombre. Podéis mirar en el router para saber
qué IP le ha asignado en la red.

Si el SSH no funciona o se estropea por lo que sea, o si no tenemos cable de red y sólo podemos
conectarla por wifi nos quedan aún dos opciones para comunicarnos con la Raspberry. Una obvia es
conectar un teclado por USB y un monitor HDMI.

La otra, si sólo tenemos portátil y no disponemos de teclado o de monitor HDMI. En ese caso sólo
nos queda una opción: la consola serie. La versión de raspbian que he probado tiene habilitada la
consola serie por defecto. Para eso os recomendaba antes contar con un conector usb-serie. La
configuración serie es 115200-8N1.

Pinout GPIO

El chip BCM2835 tiene una serie de registros que son los que controlan las entradas y salidas de
propósito general (gpio). Por hardware, esos registros se mapean en un rango de memoria accesible
por el sistema operativo. De esta forma podemos interactuar con ellos desde nuestro programa.

Habitualmente el acceso a memoria sólo se podría hacer como root, sin embargo, hay un driver
llamado gpiomem, que se encarga de mapear ese rango concreto de forma que sea accesible por el
usuario.

La conexión gpio de este modelo tiene 40pin, con un conector igual al que usaban los discos duros
IDE hace tiempo. Venden cables para conectarlos con una protoboard, pero no os lo recomiendo a
menos que sólo vayáis a usar la Raspberry para experimentar porque estas clavijas una vez
encajadas cuesta mucho quitarlas y se rompen con facilidad. En su lugar es preferible que compréis
cables con conectores Dupont hembra-hembra y también macho-hembra.

6
Guía de laboratorio
Programa IE

Figura 4. Disposición de los terminales GPIO

Entre los 40 terminales contamos con:

 24 terminales de entrada / salida de propósito general, con pull up y pull down independientes
programables por software.
 Un módulo UART, entrada y salida.
 Dos canales PWM con DC independiente y dos modos de operación.
 Un bus I2C.
 Dos buses SPI.

Lógicamente todas estas funciones se pueden emular también por software en caso necesario, por
supuesto con menor rendimiento que con el hardware nativo. Muchas librerías para Raspberry lo
incluyen.

Por contra hemos de decir que no tenemos otros extras que incorporan algunos microcontroladores
tales como entradas analógicas o comparadores accesibles desde el software.

Entrando un poco en detalles tenemos:

Terminales de +5V. Van conectados a la alimentación, detrás del fusible térmico de protección. Hay
una cosa curiosa y es que, pasado el fusible, las pistas de 5V de alimentación y de USB van unidas,
por lo que técnicamente podríais alimentar la Raspberry desde el USB o desde GPIO. No se
recomienda ya que habréis anulado el fusible de protección y cualquier corto que ocasionéis podría
tener graves consecuencias. El fusible es de 2.5A en los modelos modernos (de tipo MF-MSMF250),
por lo que restando el consumo de la Raspberry que son unos 600mA, podemos consumir más de
1A de estos pines. Siempre y cuando el adaptador de red lo dé, claro está.

Terminales de +3.3V. En las versiones anteriores a la 3 esta tensión la proporcionaba el propio chip
por lo que no podía suministrar más de 50mA y eso es lo que leeréis en multitud de foros. Sin
embargo, en las más modernas se utiliza un conversor conmutado PAM2306, el cual según su
7
Guía de laboratorio
Programa IE
datasheet podría proporcionar hasta 1A. Es el mismo conversor al que va conectado el chip así que
tened cuidado y no abuséis de él.

Terminales de GPIO. Es la conexión para periféricos del BCM.

Figura 5. Equivalente electrónico de un terminal GPIO

En general cada pin se puede configurar individualmente para funcionar como una salida o entrada
de alta impedancia, con posibilidad de tener pull-up y pull-down ambas de 50kohm.

La tensión aplicada a una entrada no debería nunca ser superior ni inferior a la tensión de
alimentación del integrado. Es decir, debe estar entre 0 y 3.3V. Los diodos que veis apenas llevan
corriente y no serán capaces de mitigar una sobretensión en las entradas.

En caso de usar la patilla como salida, tendrá un nivel de entre 0 y 3.3V. Las especificaciones dicen
que no debemos exceder los 50mA de consumo entre todas las salidas. Se refiere a cuando
consumamos corriente de una salida que esté a nivel 1, por ejemplo alimentando un LED con el otro
terminal a masa. La restricción no aplica cuando hablamos de nivel 0 y lo que hacemos
es drenar corriente hacia masa, por ejemplo si el LED estuviera conectado entre el positivo y una
salida GPIO. Esto es porque la pista interna del procesador que lleva la tensión positiva de 3.3V es
mucho más débil que los mosfets que drenan la corriente hacia masa. La realidad es que estos chips
suelen ser bastante resistentes, pero no olvidéis que carecen de protección.

Cada patilla, además de I/O puede tener funciones alternativas tal como I2C, UART o PWM.

El primer punto problemático es la numeración. Básicamente hay 3 sistemas:

 El etiquetado que sigue el BCM2837. Es decir los nombres GPIO4, GPIO7, etc. Es el que se
indica en la caja Pibow.
 El número de terminal físico del conector de 40 pin.
 La numeración de wiringPi, que usa numeración propia pero a diferencia de las anteriores no
varía entre versiones de Raspberry Pi.

8
Guía de laboratorio
Programa IE

Figura 6. Tabla de equivalencia numeración. WiringPi.

Así pues, tenemos el GPIO7, que en numeración de BCM es el 4, corresponde al pin 7 del conector
y lleva la numeración WiringPi 7.

O también tenemos el terminal número 3 del conector, cuyo nombre es SDA. En la revisión 1 de
Raspberry fue GPIO0 y en la siguiente versión fue el 2. Mientras que en WiringPi se numera como
8.

Sí, es un jaleo sobre todo en nuestros primeros proyectos. Cuando utilicéis código de ejemplo de
alguna página debéis estar atentos a la numeración que siguen porque será vuestra principal fuente
de errores.

I/O directo

La forma más sencilla de activar y desactivar un puerto, o de leer el estado es utilizando el acceso a
la memoria que nos expone gpiomem en forma de sistema de ficheros bajo la jerarquía
/sys/class/gpio.

Dependiendo de la distribución de linux y su configuración podremos hacer este procedimiento como


usuario o necesitaremos ser root.

Lo primero que haremos es "exportar" la patilla que queramos manejar. Así por ejemplo si queremos
utilizar la GPIO11 (llamada SCLK, que corresponde al terminal número 23, y al WiringPi 14)
ejecutaremos el comando:

echo 11 > /sys/class/gpio/export

Si ahora listamos el directorio /sys/class/gpio nos habrá creado un subdirectorio llamado


/sys/class/gpio/gpio11. Si queremos que GPIO11 actúe como una entrada usaremos

echo in > /sys/class/gpio/gpio11/direction

Y leeremos su valor reflejado en el fichero value:

$ cat /sys/class/gpio11/value 0

Mientras que si queremos que sea una salida, usaremos

9
Guía de laboratorio
Programa IE
echo out > /sys/class/gpio/gpio11/direction

y escribiremos el valor donde antes lo leíamos:

echo 1 > /sys/class/gpio/gpio11/value

I/O básico con ayuda de gpio

El método anterior es muy sencillo para probar aunque está bastante limitado. No se puede activar
la resistencia de pull up o pull down por hardware, por ejemplo.

La siguiente manera más sencilla es utilizando la interfaz por línea de comandos de WiringPi gpio.
En Raspbian basta instalar el paquete llamado wiringpi. Incluye la línea de comandos y también las
cabeceras C que usaremos en otros artículos. Hay más librerías, pero de momento los ejemplos los
haremos con WiringPi.

La idea es tener una herramienta por linea de comandos, que sin programar nos permita hacer uso
de ciertas características avanzadas de GPIO, tal como pull up/down, detección de flanco de
subida/bajada, i2c, spi, etc.

Veamos cómo se haría para encender y apagar un LED a intervalos regulares (el programa
equivalente a Hello World pero en electrónica). Sería fijar un pin como salida, ponerlo a 1, esperar
un momento, ponerlo a 0, esperar un momento y repetir.

En el ejemplo hemos elegido el pin 25, que equivale al 26 según la numeración del BCM, que también
es la GPIO26 (aunque en algunos sitios también aparece como GPIO25) y que en el conector físico
es el pin número 37.

Leer el estado es igual de fácil, fijando la patilla como entrada y configurando el pull up o pull down:
$ gpio mode 25 in
$ gpio mode 25 up
$ gpio read 25
1

$ gpio mode 25 down


$ gpio read 25
0

10
Guía de laboratorio
Programa IE

Quizá una de las características más útiles es leer el estado de toda la interfaz GPIO y mostrarlo en
forma de tabla; además nos sirve como tabla de equivalencia entre las diferentes numeraciones:2

Figura 7. Tabla de equivalencia obtenida al ejecutar gpio readall.

Procedimiento
Inicialmente se procede a hacer un código que prenda, apague y ponga en parpadeo un led
conectado a un pin GPIO de la Rapsberry pi. Para lograr lo anterior se propone los siguientes
códigos:

Figura 8. Código encendido led

Donde claramente se muestra la librería que se va a utilizar, el tipo de configuración de la tarjeta


board, es BCM, y el pin seleccionado, en este caso el pin 4 y por ultimo se lo activa con un alto.
Como comentario aparece la línea que limpia los pines GPIO, este se debería utilizar para dejar de
utilizar los pines mencionados.

2 http://electronicayciencia.blogspot.com/2016/11/conexion-gpio-de-raspberry-pi-3.html
11
Guía de laboratorio
Programa IE

Figura 9. Montaje encendido led

En la figura 9 se propone un montaje para el código anterior.

Para ejecutarlo solamente basta con digitar desde una consola en modo superusuario, la siguiente
línea. (nota: El archivo por comodidad para la siguiente parte de la guía se almaceno en la siguiente
ruta /var/www/html)

Python led_on.py

Es evidente que el archivo se debería llamar led_on_py.

Para apagar el led solamente se debe cambiar la línea de activación con HIGH a desactivación con
LOW, como se muestra en la siguiente imagen

12
Guía de laboratorio
Programa IE

Figura 10. Código apagado led

El montaje necesario es el mismo que se muestra en la figura 9. Para ejecutarlo, se procede de la


misma manera como el código previamente visto.

Continuando, para hacer un parpadeo del led se propone el siguiente código:

Figura 11. Código parpadeo led

Como en los códigos anteriores, claramente se ve que para activar se utiliza el comando HIGH y
para desactivarlo el comando LOW, también se puede observar se debe importar la librería time,
para poder darle una temporización al parpadeo. El ciclo for que se muestra realiza la función
parpadeo 5 veces, obviamente esto se puede reconfigurar para que sea mas o menos veces. La
línea time.sleep(1), sirve para que la anterior línea tenga una duración de 1 segundo.

Para hacer todo lo anterior desde una pagina web se puede hacer lo siguiente:

Dentro de la carpeta /var/www/html, se puede crear los archivos necesarios, por ejemplo leds.php,
quien se encargará de realizar las tres funciones previamente vistas, por lo tanto se propone el
siguiente código:

13
Guía de laboratorio
Programa IE

Figura 12. Encendido de leds desde página web

Los directorios típicamente utilizados por un servidor web en linux se sitúan en /var/www, y el usuario
típico para dicho entorno suele ser www-data. Ahora vamos a crear el grupo y usuario estándar para
nuestro servidor, a la par que otorgamos los permisos pertinentes y añadimos a nuestro usuario por
defecto, pi al grupo comentado. De esta forma no será preciso que el usuario root o superusuario
sea siempre el que pueda operar en /var/www.

Comenzamos cambiando el usuario y el grupo al directorio:

sudo chown www-data:www-data /var/www/

Damos los permisos a la carpeta www/:

sudo chmod 775 /var/www/

Agregamos el usuario pi al grupo www-data:

sudo usermod -a -G www-data pi

Ahora ponemos:

sudo visudo

14
Guía de laboratorio
Programa IE
Agregamos el siguiente código al final:

www-data ALL=(root) NOPASSWD:ALL

Reiniciamos el Servidor:

sudo /etc/init.d/apache2 restart

A continuación, se ve la página web de prueba de leds, desde apache

Figura 13. Prueba de encendido de leds desde página web

Tarea consultar como se hace para ingresar un dato a través de un pulsador para que permita encender
y apagar un led, a través de consola y como también a través de una pagina web, visualizando la
entrada y posteriormente apagando o encendiendo el led.

15

Vous aimerez peut-être aussi