PDF de programación - Demo Python

Imágen de pdf Demo Python

Demo Pythongráfica de visualizaciones

Publicado el 9 de Enero del 2019
500 visualizaciones desde el 9 de Enero del 2019
1,4 MB
15 paginas
Creado hace 4a (19/03/2016)
#! /usr/bin/python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
import LCDLIB16x2 as LCD
GPIO.setmode(GPIO.BCM)

import spidev
spi = spidev.SpiDev()
spi.open(0, 0)

Manejo del puerto SPI

LCD.lcd_init()
LCD.lcd_string(" MCP3201 & PI",LCD.LINE_1)

Función que maneja el hardware del conversor.

def Conversor():
M0 =0
muestras =0
while muestras <= 15:
adc = spi.xfer2([0, 0])
hi = (adc[0] & 0x1F)
low = (adc[1] & 0xFe)
dato = (hi << 8) | low
M0 += dato
muestras += 1
dato = M0 / 16
Va = (long) (dato) * 3.3 / 8192.0
LCD.lcd_string("Voltios:%.2f" % Va, LCD.LINE_2)

Este trozo de código llama a la función que mide y
permite una salida prolija del programa cerrando el puerto SPI

while True:
try:
Conversor()
except (KeyboardInterrupt, SystemExit):
spi.close()
GPIO.cleanup()
raise

Un comentario especial merece la línea que da formato a la presentación en la pantalla.

LCD.lcd_string("Voltios:%.2f" % Va, LCD.LINE_2)

Esto mostrará la variable Va en un formato float con dos decimales (%.2f ) en la segunda línea de la
pantalla LCD.LINE_2, la palabra Voltios: aparecerá junto y antes de la variable a mostrar.

Electrónica Digital con RaspberryPI



Pagina 58 de 83

Conversor MCP3008 y sensor MCP9700.
El conversor MCP3008 es un conversor de 10 bits, se controla también mediante SPI, como ya se
dijo, es un protocolo de uso común en el mundo de la electrónica y microcontroladores.
El manejo de este conversor es un poco mas complejo que el anterior en función que este tiene ocho
canales, ocho fuentes de datos analógicos que podemos medir con una resolución de diez bits.
Si bien no podemos medir los ocho canales en “tiempo real” ya que el modulo que mide es uno con
ocho llaves conmutables mediante software a ocho pines diferentes, sin embargo como la medición
es tan rápida, a escala humana parecería que los ocho canales están disponibles al mismo tiempo.

Para este conversor usaremos el puerto SPI completo, todos sus pines de control estarán afectados al
manejo de este conversor, siendo el el pin chip-set (CS) el encargado de habilitar o no el chip.

Recuerde que la placa tiene dos puertos sin embargo ambos comparten los pines de control (CLK,
MOSI, MISO) siendo la habilitación de chip (CS) independiente. Esto dice que si bien podemos
tener dos dispositivos SPI en distinto puerto y controlarlos mediante el Chip-Set, solo podemos usar
uno a la vez ya que comparten los pines de control.
El protocolo en si mismo no es muy complejo, sin embargo la capa de software provista por Python
y su librería nos ahorra todo el problema de lidiar con ventanas de tiempo y control de bits. La
función encargada de la comunicación con el MCP3008 es:

adc = spi.xfer2([1,(8+channel)<<4,0])

spi.xfer2() envía tres bytes y retornan también tres bytes. El
primer byte enviado es siempre 1, es el bit de inicio, el
segundo byte es la configuración del chip de acuerdo a su
hoja de datos podemos ver la tabla 5-2. (ver imagen)
Donde Single/Diff son los dos modos en que este conversor
puede trabajar, simple o diferencial. Nos interesa el modo
simple, luego vemos D0, D1, D2, con tres bits podemos hacer
8 combinaciones de 000 a 111 que corresponde a los 8
canales del conversor. Con esos tres bits elegimos el canal.

(8+channel)

Ocho es la selección del modo “simple” mas el canal que
leemos, corremos todo cuatro lugares para ordenar los datos
como el chip espera recibirlos <<4 , el tercer byte no
importa y es siempre cero.
Los datos leídos llegan a nuestra placa por el pin MISO bit a
bit a bit al ritmo de los pulsos de reloj que salen por CLK.
Los datos recibidos se guardan en adc que es una cadena de
tres bytes. Son enviados por el conversor en formato Little-
Endian lo que hace la decodificación un tanto engorrosa.
La función encargada de la interpretación del dato es:

dato = ((adc [1] & 3) << 8) + adc[2]

Recordemos que el conversor tiene 10 bits por lo que pude generar datos comprendidos entre 0 y
1023. El dato mas alto será 0x3FF o lo que es igual al binario xxxxxx11 1111 1111

Electrónica Digital con RaspberryPI



Pagina 59 de 83

Mirando la hoja de datos vemos la forma en que nos llegan los tres bytes enviados por el conversor

El byte cero no tiene información de utilidad, el byte uno contiene los dos bits mas significativos
del dato y el byte dos los ocho bits de la parte baja del dato. Recuerde el conversor es de 10 bits.
Aquí ((adc [1] & 3) << 8) se toma el elemento 1 del la cadena de tres bytes contenida en adc[]
y se aplica una máscara and con el número 3 para cortar los dos primeros bits, desplaza 8 lugares a
la izquierda para dejar lugar a los ocho bits de la parte baja de la medición + adc[2] que están en
el vector dos de la cadena de tres bytes.
Para seleccionar dos de los ocho canales posibles podemos usar una función como se ve a
continucación.
def Canal_Selec():
canal = 0
global V1
V1 = Lee_Canal(canal)
canal += 1
global V2
V2 = Lee_Canal(canal) Lee el dato del conversor y lo amacena en la variable V2

Se lee en el canal 0
La variable V1 será global para leerla desde cualquier lugar
En V1 se guarda lo que se lee en el canal
Se incrementa el canal para medir en el canal 1
Variable V2 es global, visible desde cualquier parte del programa

Las variables V1 y V2 son las encargadas de recibir el dato
de los canales, podríamos leer desde el cana 0 al 7 sin
embargo solo nos interesan los canales de 0 y 1.Los canales
se encuentran ordenados desde el pin 1 al 8, el pin 16 y 15 se
conectan a +3.3 V. El pin 9 y 14 se conectan a masa (GND),
los pines de comunicaciones SPI se conectan de la siguiente
forma.

CLK
Din
Dout GPIO 9
CS/SHDN

GPIO 11
GPIO 10

GPIO 8

Electrónica Digital con RaspberryPI



Pagina 60 de 83

Suponiendo que estamos usando Raspberry PI mdelo B+, si tenemos otro modelo solo debemos
buscar los pines equivalentes.

Para “armar” el dato tal cual lo veremos en la pantalla usaremos la siguiente línea de código.

LCD.lcd_string("A0:%.2f A1:%.2f" % (V1, V2), LCD.LINE_2)

Vemos los caracteres de formato %.2f aplicados a las variables V1 y V2, datos que se mostraran en
la segunda línea de la pantalla.

Sensor MCP9700.
En nuestro ejemplo vamos a usar dos sensores fabricados por
Microchip, los MCP9700, estos sensores son analógicos similares al
clásico LM35. Básicamente el sensor envía un voltaje que es
proporcional a la temperatura a la que esta sometida su cubierta
plástica.
El sensor envía 10mV por cada grado de temperatura, debemos
saber que enviará 500 mV cuando el sensor esté a cero grados, es
decir que a cero grados el sensor ya envía ½ voltio que debemos
eliminar por software. (Este trabajo solo lee grados positivos, no se
utilizan voltajes de referencia exteriores ni masas virtuales)
Cuando se lea el conversor analógico debemos ajustar la lectura para una escala en grados
centígrados, en las líneas siguiente podemos ver el trozo de código que lee la información desde el
conversor y la escala a grados centígrados.
def Lee_Canal(channel):
adc = spi.xfer2([1,(8+channel)<<4,0])
dato = ((adc [1] & 3) << 8) + adc[2]
temp = dato – 0.5
temp = temp / float(10)
return temp
El sensor al ser analógico está sujeto a ruidos e interferencias eléctricas del medio ambiente para su
correcto funcionamiento es recomendable armar el siguiente circuito de conexión.

Se quitan los 500mV del “efecto cero grado”
Se ajusta la resolución a 10mV por grado

La resistencia de 2K podemos no conectarla pero es indispensable que el filtro compuesto por la
resistencia de 100 Ohms y el condensador de 100 nF (0,1 uF) estén presentes.
Los dos sensores se conectan de la misma forma y se vincula su salida (marcada como 3) a cada
uno de los canales que usaremos en el conversor MCP3008, pines 1 y 2.

Electrónica Digital con RaspberryPI



Pagina 61 de 83

Observe que hay un condensador de 100 nF junto al MCP3008 colocado entre los pines (+) y (–) de
alimentación.
El resultado final de la lectura de temperatura es como se aprecia en la siguiente imagen.

Siempre que usamos circuitos integrados debemos colocar
un condensador de 100 nF entre los pines de alimentación
para desacoplar la fuente de energía y siempre cerca del
propio chip y uno por cada integrado que estemos usando.
Recuerde que a medida que agrega electrónica a su
Raspberry agrega carga a su puerto USB, si alimenta todo
desde la propia computadora, algo no aconsejable cuando
trabajamos con electrónica experimental y poca experiencia
en el manejo de hardware, recuerde, si algo sale mal
nuestra computadora está conectada en la otra punta del
cable.
En nuestro caso hemos adaptado una fuente de
alimentación de un viejo modem en desuso que
proporciona +5 Voltios mismos que el USB.
De esta forma preservamos el puerto USB de posibles
errores de conexión que podrían terminar en la destrucción del puerto.
El código completo que maneja los sensores de temperatura se puede ver a continuación, también
está disponible en el material de curso.
Este ejemplo solo lee grados sobre cero, si buscamos medir grados negativos sería necesario un
voltaje de referencia (una masa virtual) para medir el voltaje que entrega el sensor respecto de esa
referencia si embargo esto puede resultar engorroso y en la actualidad hay formas muchos mas

Electrónica Digital con RaspberryPI



Pagina 62 de 83

simples y eficientes de obtener esto usando sensores digitales en lugar de sensores analógicos.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import
  • Links de descarga
http://lwp-l.com/pdf14806

Comentarios de: Demo Python (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad