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 mayor Raspberry Pi 3 o equivalente
    Vista principal Un 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[/three-fourth][margin value=»5″ /]
  •  

    Pag 20 …………………………………………………………………….
    —————————————————
    LOS BLOQUES LÁPIZ EN S4A
    —————————————————

    Objetivos

     

  • Presentar la categoría de bloques “Lápiz”.
  • Aprender a utilizar la salida analógica A0 del sensor KY-038.
  • Dibujar el volumen de un sonido en el escenario.
  •  

    Material requerido.

    <

      Tienda España
    Imagen de Arduino UNO

    Arduino Uno o compatible y con el firmware para S4A cargado.


    conexiones
     Unos  cables.
    Img_3_4 Una Protoboard
    sensor sonido s4a Un sensor de sonido KY-038 o similar.

     

    LOS BLOQUES LÁPIZ

     

    Esta categoría de bloques se utiliza cuando queremos pintar algo en el escenario a partir el movimiento de un objeto. Podemos utilizarlo, por ejemplo, para marcar el recorrido que ha seguido un objeto, o para hacer gráficos y diagramas a partir de los valores que nos envíe un sensor.

    categoría lápiz scratch

    Para aclarar un poco como funciona, vamos a hacer un ejercicio muy sencillo en el que colocaremos un objeto en el centro del escenario varias veces y lo moveremos de forma aleatoria, de manera que vaya dejando un rastro  y haga una marca en el punto en el que termine cada movimiento.

    Lo primero que vamos a hacer será crear un disfraz para el objeto y borrar el que viene por defecto. Yo he importado una pelota de fútbol.

    Nada más empezar borramos lo que haya dibujado previamente en el escenario utilizando el bloque de “Lápiz” “borrar” y fijamos el grosor del trazo con el bloque “fijar tamaño del lápiz a …”.

    condiciones iniciales lápiz

    Utilizamos el bloque “repetir …” porque queremos que el objeto haga un número determinado de movimientos antes de parar el programa. Posicionamos el objeto en el centro del escenario, utilizamos el bloque “bajar lápiz” para que empiece a dibujar y fijamos el color del lápiz a un número aleatorio entre 0 y 200 con el bloque “fijar color del lápiz a …”.

    empezar a dibujar

    • El bloque “bajar lápiz” es el equivalente a presionar un lápiz en un papel. Hasta que no lo levantemos, todo movimiento del objeto dejará un rastro en el escenario de la forma en que lo indiquemos.
    • Fijamos el color a un número aleatorio para que cada repetición línea pinte la línea de un color diferente.
    • Los colores del lápiz en S4A van desde 0 a 200, por eso hemos cogido esos límites para el número aleatorio.

    A continuación hacemos que el objeto se mueva a una posición nueva utilizando el bloque de “Movimiento” “deslizar en … segundos a x: … y: …”, levantamos el lápiz con el bloque “subir lápiz” y utilizamos el bloque “sellar” para que deje una marca con la forma del objeto.

    sellar lápiz scratch

    • Recordad que las medias del escenario son 480×360, siendo el centro (0,0), de ahí los límites de los valores aleatorios.
    • Subimos el lápiz para que al volver a poner el objeto en el centro del escenario no pinte nada más.
    • El bloque “sellar” deja una impresión del objeto en el punto del escenario en el que se encuentre.

    Al terminar de ejecutarse el programa tendremos algo parecido a esto en el escenario.

    scratch lapiz y sello

    Podéis descargar el programa aquí: Dibujo balón.

     

    DIBUJANDO EL VOLUMEN DE UN SONIDO

     

    Vamos a utilizar lo que hemos aprendido en esta sesión y en la sesión 17 para dibujar un gráfico con el volumen de un sonido. Mediremos la señal que envía el sensor  KY-038 por el pin A0 y la dibujaremos en el escenario.

    • El pin A0 nos devolverá un valor entre 0 y 1023 en función del volumen del sonido.

    El esquema electrónico y el montaje en la protoboard son muy sencillos.

    diagrama electrónico ky-038 a0

    montaje ky-038 a0

    Empezaremos dibujando un objeto para dibujar a partir de él. Como no queremos que se note, podemos, por ejemplo, hacer un punto lo más pequeño posible y del color del que dibujaremos el gráfico.

    Fijamos las condiciones iniciales:

    • Borramos el escenario con el bloque “borrar”.
    • Fijamos el color del lápiz al que queramos. Antes hemos utilizado un número, pero hay otro bloque donde podemos seleccionar el color a partir de una paleta.
    • Levantamos el lápiz por si está el objeto en otra posición de la ejecución anterior.
    • Posicionamos el objeto en la parte izquierda del escenario y en el centro del eje Y.
    • Bajamos el lápiz para que comience a dibujar.

    dibujar sensor s4a

    Ahora ya podemos colocar el bloque “por siempre” para que repita las demás acciones en bucle. Empezamos sumándole 1 a la posición en x para que en cada ejecución pinte el volumen un poco más a la derecha en el escenario, de forma que no se vayan solapando.

    posición inicial gráfica sonido

    Si en este momento ejecutamos el programa veremos cómo se pinta una línea de izquierda a derecha.

    Para saber a qué nivel de sensibilidad tenemos ajustado el sensor, podemos guardar en una variable el valor recogido en la entrada analógica A0 y visualizarlo en el escenario como hemos aprendido.

    volumen sensor sonido

    • A mayor sensibilidad mayor será el cambio en la señal que envía el sensor por A0 en función del sonido.
    • Yo lo he ajustado en el mismo punto que en la sesión anterior, en el punto en el que justo se apaga el LED que nos muestra si está activado el pin D0.

    Para dibujar el volumen en cada iteración, tenemos que fijar la posición en y del objeto a la posición anterior (que fijamos a 0 en cada repetición para que pinte siempre a respecto al punto medio del eje Y) sumándole el valor de A0 que hemos guardado en la variable “volumen”. A ese valor le tenemos que restar un valor cercano al que hemos ajustado la sensibilidad, para que no nos pinte una raya muy gruesa cuando no hay sonido.

    posicion eje y sonido

    Sólo nos queda hacer que cada vez que llegue al final del escenario, vuelva a empezar a dibujar desde la izquierda. Para ello levamos el lápiz hasta la posición inicial y borramos el escenario para que empiece a dibujar de nuevo con el escenario en blanco.

    • Recordad que hay que subir el lápiz para llevarlo a la posición de inicio sin que pinte y volver a bajarlo para que empiece a pintar de nuevo.

    bloques dibujar sonido scratch

     

    ¡Accede al contenido!

    Si ahora ejecutamos el programa veremos cómo al hablar, silbar, soplar o hacer cualquier sonido en el micrófono, en el escenario se pinta la variación en el volumen.

    Yo le he acercado un altavoz pequeño con una canción y el resultado ha sido este:

    escenario valores sensor grafico

    Podéis descargar el programa completo aquí: Dibujar Sonido.

    Si queréis practicar un poco más podéis coger la sesión 16 del sensor de temperatura y, por ejemplo, registrar la temperatura cada cierto tiempo utilizando lo que hemos aprendido y variando un poquito el programa.

     

    RESUMEN DE LA SESIÓN

  • Podemos utilizar los bloques “Lápiz” para hacer dibujos en el escenario a partir del movimiento de un objeto.
  • Sabemos cómo funciona la salida analógica del sensor de sonido KY-038.
  • Hemos hecho un gráfico a partir de los valores recogidos por una entrada analógica, podríamos hacer lo mismo con entradas o salidas analógicas o digitales.
  •  

    Deja una respuesta