Archivo de la categoría: Raspberry Pi

Calibración del sensor de temperatura DS18B20

Ya tengo prácticamente acabado el proyecto IoT con una REST Api [3][4] para leer la temperatura de un sensor DS18B20.

El problema (y grave) es que las temperaturas que estoy cogiendo del sensor son erróneas. Para saber cuál es la temperatura real en mi barrio (Gràcia-Barcelona) cojo como referencia la web de meteo.cat. La estación meteorológica automática más cercana es la de Zona Universitaria, aunque en realidad la temperatura no será la misma exactamente. La calle Joan Blanques, donde tengo el sensor, es estrecha y enmedio de la ciudad y del barrio; la Zona Universitaria es un espacio más ancho y abierto, posiblemente las temperaturas mínimas tiendan a ser más bajas…

Calibrar el sensor DS18B20 puede ser una tarea difícil. Aquí tenemos un artículo [1] muy interesante sobre cómo proceder para la calibración. El artículo es realmente interesante, pero no tengo el tiempo (ni las ganas) de implementarlo. Lo que sí que tendría que haber hecho, y esto era fácil, era comprar 10 sensores DS18B20 (son baratos), descartar aquéllos que se desvíen bastante de la temperatura real, y promediar la temperatura con el resto de sensores escogidos, por ejemplo 5. Esto no sería ningún problema, en la RPi tengo muchos pines GPIO disponibles.

Otra posibilidad es utilizar otro sensor de temperatura. Peo ejemplo, utilizar el BMP280, que además de la temperatura también tengo la presión y la humedad relativa (y es barato). Es muy interesante este artículo [2] donde se utiliza el BMP280 para construir una estación meteorológica alimentada per un panel solar.

La conclusión es que confiar en que el sensor que tengo dé la temperatura correcta es un grave error. El objetivo del proyecto es hacer un ejemplo didáctico de IoT, RestFul API, y gráficas como frontend. Esto ya está implementado, ahora sólo falta que la temperatura que leo sea real. Por tanto, lo que haré es encontrar una recta de regresión para aproximarme a la temperatura real a partir de los datos que me da mi sensor, suponiendo que la mejor aproximación sea una recta.

En la imagen se pueden ver dos gráficas. En la de arriba se ve la diferencia entre la temperatura real y la de misensor. En la de abajo se puede deducir la recta de regresión para convertir los datos del sensor en datos reales. De todas maneras, estos datos se corresponden a dos días y medio. Esperaré una semana más (y que suban las temperaturea del mes de mayo, y así tener más rango) para poder hacer una recta de regresió.

Enlaces:

Internet of Things, Restful API con Python y Flask, Raspberry Pi Zero y sensor de temperatura

Estoy montando un proyecto académico de Internet of Things. Se pretende medir la temperatura exterior en mi barrio con un sensor DS18B20 conectado a una Raspberry Pi Zero. Tal como se ve en la foto, he tenido que conectar un lápiz Wifi USB. Idealmente sería mejor hacer el proyecto con la nueva Raspberry Pi Zero W que acaba de salir hace un mes, y que lleva wifi incorporada.

La temperatura se va almacenando cada 10 minutos en una base de datos MongoDB. La parte más interesante del proyecto es programar una Restful API, y para hacerlo lo haré con Python y el microframework Flask, a partir de algún ejemplo que he encontrado (ver los enlaces). En la versión 1 sólo había un servicio, que era el bolcado de todas las temperaturas. La versión 2 ya hace más cosas: bolcar todas las temperaturas; recuperar la temperatura actual; filtrar por un día; filtrar por varios días al mismo tiempo.

Otra parte importante es la capa de presentación, y para ello utilizo la librería Highcharts.com, que da unos resultados muy espectaculares. Para cada función de la API se dará un ejemplo html, para ejemplificar cómo se pueden digerir los datos.

En las futuras versiones de la API se calcularán las medias de temperatura diarias, mensuales y anuales, de manera que se puedan hacer comparativas entre días, meses,… De momento todavía no está disponible.

La API todavía no es pública, estoy en fase de desarrollo. En el momento que sea estable y pública ya lo anunciaré. De momento la tengo dentro de casa, bajo los efectos del termostato de la calefacción, con lo que los resultados no son interesantes. Pero la idea es después de Semana Santa trasladarlo todo al local, el sensor en el exterior, y la Raspberry Pi dentro del local. Se podrá acceder a la API en el domini ohttp://joanqc.no-ip.biz/, pero todavía no está disponible.

La idea de desarrollar esta API es, a parte de que programar es divertido, poder utilitzar open data en formato JSON en la asignatura de Javascript (M06) en el ciclo de Desarrollo de Aplicaciones Web (DAW), en el instituto. Evidentmente, hay muchos ejemplos disponibles de open data y format JSON. Pero un ejemplo donde los alumnos vean de dónde salen realmente los datos, siempre será interesante.

En el primer enlace tenemos la documentación y discusión de toda la puesta a punto. Es el punto de partida principal si se quiere reproducir el proyecto. En el segundo enlace se documenta la API, en sus diferentes versiones.

Adaptación de los emuladores MAME y gngeo para limitar el tiempo de partida

Tenía pendiente desde octubre conseguir esta funcionalidad. Se trata de una máquina en que la operación está controlada por el tiempo. Una moneda son 15 minutos de juego. Los emuladores MAME y gngeo (NeoGeo) tienen el botón de COIN que permite dar créditos para jugar. Ahora bien, el monedero controla el contador de tiempo, y es necesario meter monedas para dar tiempo a las partidas. La comunicación entre el front-end y los dos emuladores se hace sencillamente con un fichero de texto donde se lee y se graba el valor del contador. La funcionalidad implementada es:

  • Cuando estoy en el front-end el tiempo no corre. Si se mete una moneda, suma el tiempo establecido (15 minutos por defecto).
  • Cuando entro en el emulador (mame4all o gngeo), se lee el valor del tiempo restante, y empieza a descontar el tiempo, que está siempre visible.
  • Desde el emulador puedo poner una moneda, suma el tiempo, y se actualiza el contador correctamente.
  • Cuando salimos del emulador y volvemos al frontend, el tiempo queda bien guardado.
  • Si mientras juego se acaba el tiempo, se vuelve al front-end, esperando la inserción de una nueva moneda.

Cambios en el código y documentación:

    \t

  • http://wiki.joanillo.org/index.php/M%C3%A1quina_Arcade_amb_monedes_i_limitaci%C3%B3_de_temps._MAME_i_neogeo#Introducci.C3.B3_2

Y el video:

Máquina recreativa Big Arcade

Big Arcade

Big Arcade

Ya tengo acabada la nueva máquina de pie , que llamaré Big Arcade. El diseño viene directamente de un cliente que me hizo la petición (supongo que encontró las medidas por Internet), y realmente me gusta. En esta máquina se ha cuidado unos cuantos detalles. Concretamente, se ha puesto un monedero de Industrias Lorenzo, se ha cuidado el sonido, una TV de 21 pulgadas, vidrio protector, y se ha mejorado la colocación y los acabados de la marquesina.

En cuanto al monitor, se consiguió una TV de 21», aunque sólo tiene una resolución de 640x480px. Si bien la resolución no es ninguna maravilla, al final me gusta estos pixels un poco gordos, y es un consuelo saber que puedo montar máquinas con esta resolución. En esta ocasión el cable HDMI to VGA no me ha dado problemas, y esto es un gran avance pues tengo una pista de por qué en anteriorse ocasiones había tenido tantos problemas con este tipo de cables.

Otra mejora que se ha hecho en esta máuina es poder cambiar el volumen apretando dos botones, una solución totalmente software, tanto en el front-end como en los emuladores. Esta es una solución buena pues ya no es preciso acceder al potenciómetro del amplificador de sonido.

En definitiva, una nueva máquina en que he implementado unas cuantas mejoras en la construcción y en los acabados. Una máquina para disfrutar construyéndola y jugándola.

Y el video:

OpenCV y C++

Un proyecto para el 2017 será una recreativa de dardos. La idea no es original. Se trata de utilizar una diana de dardos real, de corcho, y los correspondientes dardos de punta metálica, y con un sistema de visión artificial ser capaz de saber a qué sector le hemos dado.

La solución pasa por tener dos webcams conectadas a la Raspberry Pi, pues con una sola webcam no se puede conseguir suficiente precisión. Se tendría que hacer bastantes pruebas para conseguir fiabilidad en la determinación de la posición del dardo. En principio cuento en que dos webcams baratas y compatibles con la RPi (por ejemplo la Logitech Quickcam Express) conectadas a una sola Raspberry Pi sean suficientes, ya veremos si será posible.

Mientras hemos instalado OpenCV en una Raspberry Pi 3 y estoy haciendo las primeras pruebas con OpenCV: capturar un frame de la webcam; diferencia entre dos imágenes; convertir una imagen a gris; convertir una imagen a binario a partir de un umbral; detección de un color; detección de una forma; detección de los contornos y centro de masas,… Todo con C++. Realmente es divertido esto del OpenCV.

En edx.org hay un curso de OpenCV.

Esperemos que todo funcione sin demasiados contratiempos. El siguiente paso sería hacer la interficie de usuario que nos permitirá jugar a los juegos más populares de dardos: 301, 501, Cricket,… y construir un mueble. Me imagino una madera grande con la diana a la derecha, una pantalla de 15» (protegida per un vidrio) a la izquierda, y una marquesina retroiluminada donde están escondidas las dos webcams dirigidas a la diana. Ya veremos, todo esá por hacer.

Jukebox/Rockola inspirada en una Seeburg Wallbox

Todavía no tengo acabada la que tiene que ser mi rockola original, con más de 2000 canciones, front-end, un sonido potente y efectos luminosos. Mientras tanto, me ha surgido la posibilidad de desarrollar rápidmente una rockola mínima y bonita. La fuente de inspiración son las Seeburg Wallbox, pensada com dice su nombre para colgarse de la paree. Puedes ver el resultado en la foto, estoy satisfecho de como ha quedado, aunque al final no se parece en nada a una Seeburg Wallbox.

La rockola consta de 6 bancos de canciones (1.Baladas; 2.Pop Rock Español; 3.Pop Rock; 4.Rock & Roll, R&B-Soul; 5.Heavy Metal; 6.Catalana), y cada banco son 36 canciones. Esto hace un total de 216 canciones, que he intentado que sean lo más representativas de cada categoría. La elección de Baladas (Julio Iglesias, Pantoja,…) o de los grupos de pop español de los años 80 (Mecano, etc) es porque me imagino estas rockolas funcionando en un bar cutre de los años 80. Ya se sabe, cuando hago un proyecto me meto en la piel del proyecto a fondo… Tiene un monedero que acepta monedas de 20 cts de euro, un led indicador, y 12 botones de madera, nada de plástico. Sin pantalla. Los altavoces son normales de ordenador, por tanto no cabe esperar ni potencia ni buena calidad en este primer prototipo. En cualquier caso es interesante una salida AUX de audio para conectar un amplificador potente.

El mueble está hecho en madera de pino barnizada. Las dimensiones son 26 cm de ancho por 38 cm de alto, y la idea es tenerlo colgado de la pared. Dentro tiene una Raspberry Pi 2 y con una tarjeta de 8Gb hay suficiente para el sistema operativo, la aplicación y las 216 canciones.

Como no hay pantalla, el LED indicador es la única fuente de comunicación con el usuario. Hay 3 modos: LED intermitente, quiere decir que no suena ninguna canción y que la rockola está esperando una moneda (una moneda, dos cancioness); LED encendido, quiere decir que hemos de introducir el código de la canción (con el formato BANCO-LETRA-NÚMERO); LED apagado, está sonando una canción y hemos gastado todos los créditos (las canciones pendientes de sonar están en la cola).

Los botones están conectados directamente a los pines GPIO, y el LED también. Para cambiar el estado del LED la aplicación ejecuta un script Python que es el que se encarga de encendre y apagar el LED.

Por si a alguien le interesa, aquí va el código fuente (las canciones escogidas están dentro del código fuente).

Arcade cocktail coffee table acabada

Arcade cocktail coffee table
En julio ya acabé la mesita arcade cocktail (finalmente!), pero hasta ahora no le había sacado unas fotos y el video. La sensación de jugar en modo cocktail es sencillamente fantástica. La mesita me ha quedado un poco pequeña y bajita, de hecho la pantalla es de tan sólo 15». Pero claro, en cuanto a gustos sobre mesitas de centro/tele/cafè no hay nada escrito, hay muchos diseños, o sea que la próxima que haga será muy diferente.

Maria y Pere tuvieros un buen pasatiempo jugando con la máquina. Una idea divertida para el futuro sería hacer una máquina cocktail a partir de un barril de vino. Buscar en Google Images por barrel arcade cocktail para ver ejemplos.

Efectos de luz para la rockola

La rockola ha estado mucho tiempo en stand-by, pero para este otoño ya estará acabada. Finalmente los efectos de luz los haré llamando a un script python des de la aplicación. La idea es que para cada canción cambiará el efecto de luz. El script python consume menos del 1% de CPU, y por tanto no representa ningún problema. Como utilizo el bus I2C, sólo ocupa dos pins de la Raspberry: SCL y SDL. El chip MCP23017 tiene dos bancos, y por tanto puedo redireccionar 16 bits, que son 16 leds. Esto va perfecto porque el mueble tendrá 15 módulos led, y después habrá otro módulo que hará intermitencias para recordar que hay que poner una moneda.

En el video se muestran 16 efectos diferentes: varias modalidades de led chaser, lluvia, intermitencia, zig-zag,… En la máquina real los 16 bits del xip MCP23017 activarán 16 módulos led, que se componen de un transistor y 3 led cada módulo, y así tengo unos módulos muy luminosos. A ver si acabo esta rockola (el proyecto está en http://wiki.joanillo.org/index.php/Rockola-Gramola-Jukebox), porque ara ya estoy pensando en otra modalidad de rockola que será pequeña y mona, sin pantalla.

Finalmente, Raspberry Pi Zero

Finalmente tengo una Raspberry Pi Zero, comprada en pimoroni.com, por 4 libras (lástima que el envío son 7 ibras más). Como sólo dejan comprar una en cada pedido, tendré que pensar en qué proyecto la utilizaré. La idea inicial es probarla en una máquina de marcianitos tipo arcade stick, pues en este tipo de mueble he tenido problemas de espacio, y me irá ideal el hecho de que los pines GPIO vayan soldados directamente a la placa.

  • 1Ghz, Single-core CPU
  • 512MB RAM
  • Mini HDMI and USB On-The-Go ports
  • Micro USB power
  • HAT-compatible 40-pin header
  • Composite video and reset headers

Enlace oficial de la Pi-Zero