bclose

Leyendo valores analógicos con Raspberry Pi

Raspberry y las entradas analogicas

 

 

    • Vamos a ver como leer señales analogicas con la Raspi.
    • Veremos cómo usar las puertas serie desde Python
    • Usaremos unos datos que leemos en arduino  para enviarlos a al aRaspi.
 

 

 Material requerido.

Vista mayorRaspberry Pi 3 o equivalente
arduino-uno-perspective-transparentUn arduino UNO

 

Raspberry Pi y las salidas analógicas

 

En entradas anteriores especialmente en Arduino ya hablamos de lo que son las señales analógicas y las diferencias que estas presentan con las digitales.

 
  • Para quienes acaben de llegar pueden encontrar una pequeña digresión al respecto aquí, que aunque se refiere a Arduino, básicamente sirve igual para una primera aproximación al asunto  

El mundo de los ordenadores es básicamente digital, es decir, todo está codificado con dos valores básicos y únicos que son el 0 y 1. El mundo real puede ser digital, podemos recibir información sobre algo que solo acepta valores absolutos como si o no. Por ejemplo la puerta puede estar abierta o cerrada, lo que a veces lleva a discusiones infinitas de si esta más o menos a medias, pero podríamos por ejemplo usar el caso de si tu mujer está embarazada o no. O lo está o no, pero no hay términos intermedios (Se ponga como se ponga nadie)

Pero normalmente l mundo real presenta mucho más a menudo variables que llamamos analógicas porque pueden variar de modo continuo sin saltos. Imagínate la temperatura ambiente. Puedes pasar de 12º por la mañana a 25º al mediodía recorriendo todos los valores intermedios sin solución de continuidad

A este tipo de valores les llamamos analógicos, porque pueden devolver cualquier valor entre los extremos, sin encontrar nunca saltos discretos entre puntos. Por eso necesitamos un sistema de leer este tipo de valores analógicos y convertirlos en valor digitales, cuantificados en un momento dado mediante un sistema de medida.

Este sistema de convertir una señal analógica continua en un valor digital discreto en un momento dado se realiza con lo que llamamos un convertidor analógico digital (ADC Analog to Digital Converter) y son un mecanismo muy habitual de muestrear señales del mundo real.

Cuando veíamos nuestro pequeño Arduino UNO vimos que incluía 6 de estos convertidores. Como ahora toca hablar de nuestra querida amiga la Raspberry Pi, es conveniente que sepáis de cuantos de estos convertidores analógicos a digital o ADC dispone.

La respuesta es sencilla y precisa. Ninguno.

¿Qué? ¿Ninguno? ¿Y cómo hacemos para leer valores analógicos externos con la Raspi?

De nuevo la respuesta es fácil: ¡Con ayuda de algo externo!

Cuando os recuperéis de la impresión podemos seguir viendo que básicamente hay dos sistemas principales añadir esta capacidad a la Raspberry Pi, a saber: Un chip externo de convertidor ADC, lo que suele ser más o menos engorroso, por los múltiples cablecitos a conectar… o bien mi solución preferida, usar un Arduino y enviar las señales de este a la Raspi por el puerto USB

En algún momento buscaremos algún integrado con convertidores ADC, pero en esta primera aproximación vamos a usar un sencillo Arduino UNO que seguro que la mayoría tenéis por ahí disponible.

 

Enviando datos desde Arduino

 

Podemos escribir rápidamente un programa Arduino que lea uno o más puertos analógicos de los suyos y luego enviarlos a través de la puerta USB. Veamos un sencillo ejemplo:

void setup()
   { Serial.begin(115200); 
   }

void loop()
   { for (int x = 0; x <100 ; x++)
       {  Serial.print("Lectura arduino ");
          Serial.print(x); 
          Serial.print(" : ");
          Serial.println(analogRead(A0));
          delay(300);
       }
   }

Simplemente he programado la puerta Com a 115.200 baudios para que vaya rapidito y luego una iteración sencilla de 0 a 99, va enviando unos textos junto con la lectura a la puerta serie que como todos sabemos es el USB.

Ni siquiera voy a conectar nada a la puerta analógica por lo que leerá ruido sin más, pero lo mismo nos da a nivel de ejemplo. Aquí tenéis una muestra de mi salida de consola:

salida arduino

¿Y como enviamos esto a nuestra Raspberry para poderlo leer allí?

De nuevo en este punto se requiere un proceso de extrema precisión que debe ser realizado por personal experto para evitar accidentes, pero que básicamente consiste en… soltar el cable USB que va de tu Arduino al PC… y conectarlo a la Raspberry en su lugar. Y eso es todo.

Los mensajes que antes enviaba Arduino al PC los envía ahora por el USB a una puerta serie de tu Raspberry, que por cierto también es un PC, ya que estamos, y ahora es tan sencillo como leer la puerta com de la Raspberry y listo

Aunque esto tiene un problema. Tenemos que leer la puerta serie en Raspberry desde Python y hasta ahora no hemos visto cómo hacerlo, pero seguro que la gente que habeis ido a colegios caros ya os habeis imaginado de qué va la próxima sección

 

Leyendo la puerta serie desde Raspberry con Python

 

Lo de las puertas series en Linux puede complicarse lo suyo por lo que lo primero que debemos hacer es identificar que puerta serie se levanta cuando enchufamos el USB de nuestro pequeño Arduino.

Para ello, en primer lugar asegúrate de tener desconectado el USB de Arduino de tu Raspi y a continuación usa el comando:

ls /dev/tty*
Listando puertas TTY

Esta orden nos lista todas las puertas series disponibles en nuestro Raspbian, que como veis dan asco por lo abundantes.

Ahora ya podemos conectar nuestro Arduino al USB de la Raspberry y repitiendo la operación veremos las nuevas instancias y podremos jugar a buscar las diferencias:

ls /dev/tty*
Nueva puerta TTY

Si te fijas un poco y evitas despistojarte, en la última columna ha aparecido una nueva puerta que en mi caso (y muy probablemente en el tuyo) se llama ttyACM0, que es un nombre razonable y muy fácil de recordar por cualquier novicio.

Y una vez que sabemos el nombre del puerto en cuestión basta con escribir un pequeño programa en Python que lea este puerto ttyACM0. ¿Cómo leemos una puerta serie desde Python? Pues como siempre usando un import al uso:

import serial

Esto nos permite importar una librería standard que nos ayude a usar la puerta serie sin complicarnos la vida. Después necesitamos abrir un objeto serie con esa puerta que nos permita leerla:

arduino = serial.Serial("/dev/ttyACM0", baudrate=115200, timeout=3.0)

Donde creamos un objeto llamado Arduino del tipo serial al que le pasamos los parámetros habituales como el nombre de la puerta que hemos averiguado previamente, la velocidad de la comunicación y un time out de 3 segundos por si acaso.

El resto del programa no tiene perdida:

while True:
    val = arduino.readline()
    print(val)

Hemos usado la instrucción arduino.readline() que asigna a la variable val una línea completa (Que termina en CR+LF) de lo que va mandando arduino por la puerta serie, para luego imprimirlo.

Y por último para terminar, es buena política cerrar las cosas ordenadamente antes de acabar y salir (Aunque en este ejemplo, no salimos nuca)

arduino.close()

A riesgo de ponerme pesado os repito el programa completo por aquello de la afición a copiar y pegar:

import serial
import time

arduino = serial.Serial("/dev/ttyACM0", baudrate=115200, timeout=3.0)

while True:
    val = arduino.readline()
    print(val)
arduino.close()

Y esto nos genera este bonito resultado en pantalla:

Consola Linux

Recuerda que la variable val recibe líneas completas de información desde Arduino y que podemos limpiarla para recoger la información que nos interese, haciendo que usar un Arduino para leer las señales analógicas que nos envía Arduino sea trivial y muchas veces más barato que comprar integrados raros que hay por ahí.

 

Resumen de la sesión

 

 

    • Vimos que la  Raspberry Pi. no tiene entradas analógicas por lo que para leerlas debemos usar elementos externos
    • Propusimos usar un Arduino UNO para hacer las lecturas y enviarlas por el USB a la Raspi
    • Vimos como abrir el USB en Raspbian para leer datos desde alli

 

 

 

No Comments

Give a Reply

WordPress Anti-Spam by WP-SpamShield

¡Ofertón!

Robot Rover 4×4

Ahora por sólo

50€ + IVA

¡Lo quiero!