Configurando RPi para utilizar GPIO y SPI.
Notas. Las instrucciones siguientes se escriben después del signo de pesos; jorge@jorge-Satellite:~$ sudo…………… en la terminal.
- The pins labelled SCL and SDA can be used for I2C. The pins labelled MOSI, MISO and SCKL can be used to connect to high speed SPI devices. All the pins have 3.3V logic levels and are not 5V-safe so the output levels are 0-3.3V and the inputs should not be higher than 3.3V. If you want to connect a 5V output to a Pi input, use a level shifter.
Un vez hecha la configuración es factible probar el funcionamiento desarrollando el experimento de medir temperatura, humedad con un sensor DHT11 además de medir la temperatura, altitud, presión y altitud sobre el nivel del mar usando un sensor BMP180. Ademas de las lecturas anteriores se va a usar una fotocelda para medir los valores de resistencia a diferentes horas del día. Para lo cuál se registrarán muestras y se identificarán los rangos aproximados.
Las instrucciones las tenemos en la página siguiente pero básicamente se puede decir que las fotoceldas son resistencias que a medida que la intensidad de luz (lux) incrementa, su resistencia nominal (usualmente 10K Ohms) disminuye de acuerdo a la siguiente tabla (tomada del sitio referido).
referencia a las unidades la tenemos en el sitio the engineering toolbox. se tiene que :
- un lux = un lumen por metro cuadrado.
- 1 lux = 1 lumen / metro cuadrado .
Considerando que los pines del GPIO del Rpi solo reconocen entradas booleanas, se requiere un circuito que sea capaz de identificar variaciones en la cantidad que en cierto sentido es una lectura de carácter analógico.
Para compensar y así poder usar el RPi es necesario añadir un circuito(RC), es decir un circuito t = RC donde t = tiempo, R = resitencia (Ohms) y C = capacitancia (farads). Entonces el objetivo es medir el tiempo en el que el capacitor llega al 63% de su carga en Voltios, mismo que es proporcional a la intensidad de la luz en el ambiente cerca de la fotocelda. A este tiempo se le denomina constante de tiempo.
Un ejemplo de un sistema LDR para medir la intensidad de la luz en el RPi esta en la siguiente pagina.
Para implementar esto es necesario desarrollar el siguiente algoritmo:
Teoria
Here is the sequence of events :
- Set the GPIO pin as an output and set it Low. This discharges any charge in the capacitor and ensures that both sides of the capacitor are 0V.
- Set the GPIO pin as an input. This starts a flow of current through the resistors and through the capacitor to ground. The voltage across the capacitor starts to rise. The time it takes is proportional to the resistance of the LDR.
- Monitor the GPIO pin and read its value. Increment a counter while we wait.
- At some point the capacitor voltage will increase enough to be considered as a High by the GPIO pin (approx 2v). The time taken is proportional to the light level seen by the LDR.
- Set the GPIO pin as an output and repeat the process as required.
Exactitud
Dado que solo se requiere reconocer diferentes niveles de intensidad de luz no es necesario conocer el valor de la resistencia del LDR (fotocelda) o el tiempo exacto que toma al capacitor en cargarse. Entonces el valor registrado que en nuestro caso es el número de ciclos que le toma cargarse el capacitor, los datos se subirán al sitio ThingSpeak que al cargarse le añade un campo de fecha y hora en la que se registra la lectura.
También es necesario considerar que la ejecución del codigo se ve afectados por el sistema operativo del Rpi, es decir, el número de ciclos puede variar si existen otros procesos ejecutándose. Pero las diferencias se podrán observar como patrones una vez que se analice el comportamiento global de los datos.
Para realizar la operación de captura y registro en ThingSpeak se usará el siguiente código.
#!/usr/local/bin/python # Reading an analogue sensor with # a single GPIO pin # Author : Matt Hawkins # Modificado para subir a ThinkSpeak por J. Herrera # Distribution : Raspbian # Python : 2.7 # GPIO : RPi.GPIO v3.1.0a import sys import RPi.GPIO as GPIO from time import sleep import os import urllib2 myAPI = "GVW1V5305NMTZWCQ" myDelay = 10 #how many seconds between posting data baseURL = 'https://api.thingspeak.com/update?api_key=%s' % myAPI # Tell the GPIO library to use # Broadcom GPIO references GPIO.setmode(GPIO.BCM) # Define function to measure charge time def RCtime (PiPin): measurement = 0 # Discharge capacitor GPIO.setup(PiPin, GPIO.OUT) GPIO.output(PiPin, GPIO.LOW) sleep(1) GPIO.setup(PiPin, GPIO.IN) # Count loops until voltage across # capacitor reads high on GPIO while (GPIO.input(PiPin) == GPIO.LOW): measurement += 1 return measurement # Main program loop while True: f = urllib2.urlopen(baseURL + "&field1=%s&" % (int(RCtime(18)))) print f.read() print RCtime(18) # Measure timing using GPIO18 f.close() sleep(int(myDelay))
Análisis de datos
Para hacer el análisis se utiliza el programa R o bien MathLab incluido en el sitio http://thingspeak.com.
La gráfica anterior descargada del sitio thingspeack, es el comportamiento del numero de ciclos que tarda el capacitor para alcanzar el voltaje de disparo, que va a depender de la cantidad de iluminación en la habitación donde se encuentra ubicada la fotocelda.
Se puede observar que por la noche la cantidad se dispara de manera notable comparada con el día, ubicándose entre dos y cuatro millones de ciclos. con puntos extremos de hasta 5,300,000 a las 7.30 del dia 28 septiembre 2016.
Por tanto si se desea en el programa en lugar de cero o uno especificar si es de dia o de noche se puede indicar estos valores para que el mensaje o bien la información almacenada así lo refleje.
Instalando los sensores DHT y BMP 180
Continuando con la instalación del sensor de Temperatura DHT11 y el sensor de temperatura, presión y altitud BMP180. Para poder utilizar dichos sensores es necesario configurar el puerto GPIO, y los tipos SPI y I2c como a continuación se explica:
- Instalando Git. Comandos que permiten clonar Hubs desde https://github.com.
- sudo apt-get install git
- git clone http://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git
- cd Adafruit-Raspberry-Pi-Python-Code
- ls
- Para configurar el GPIO se teclean las siguientes instrucciones en la terminal.
- sudo apt–get update
- sudo apt–get install python–dev
- sudo apt–get install python–rpi.gpio
- Configuración del i2c:
- sudo apt–get install python–smbus
- sudo apt get install i2c–tools. Es posible que ya esté instalado y genere un mensaje de aviso, si es así ignorar y continuar.
- Configurando sensor DHT
- Bajar librería de github.
- git clone https://github.com/adafruit/Adafruit_Python_DHT.git
- cd Adafruit_Python_DHT
- sudo apt–get update
- sudo apt–get install build–essential python–dev python–openssl
- Si en los pasos anteriores se genera mensaje de que ya esta instalado continuar el proceso
- sudo python setup.py install
- Para probar que esta funcionando adecuadamente
- cd examples
- sudo ./AdafruitDHT.py 11 28, el codigo anterior permite verificar el funcionamiento de un DHT11 conectado al pin 28.
- Es factible subir los datos capturados a Google Docs de la siguiente manera:
- Ver sitio de Adafruit.
- Bajar librería de github.
- Para instalar la librería de BMP180 se siguen los siguientes pasos.
- sudo apt–get update
- sudo apt–get install git build–essential python–dev python–smbus
- git clone https://github.com/adafruit/Adafruit_Python_BMP.git
- cd Adafruit_Python_BMP
- sudo python setup.py install
- cd examples
- sudo python simpletest.py
-
- Al ejecutar los pasos anteriores se vera en pantalla los valores generados por el sensor.
- Temp = 20.20 *C
Pressure = 101667.00 Pa
Altitude = -28.27 m
Sealevel Pressure = 101665.00 Pa
- Temp = 20.20 *C
- Para subir los datos a ThingSpeak utilizamos la librería urllib2
- Al ejecutar los pasos anteriores se vera en pantalla los valores generados por el sensor.
- Es factible seguir las instrucciones de sourceforge aunque en realidad yo me guie por las de Adafruit,
Una vez que se han instalado se desarrolla el programa de captura y subida a la nube.