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.

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:

  • 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:

El Buscaminas (Pescamines, Minesweeper) es uno de los 1001 videojuegos a que tienes que jugar antes de morir. Si tienes una cierta edad, seguro que te has hartado, porque el Buscaminas ha venido en las diferentes versiones de Windows hasta el Windows 7.

Existen diferentes versiones para jugar online. Concretamente, con los alumnos hemos cogido la versión en Javascript de Andrew D. Birrell, que ya tiene unos años, y la hemos actualizado en diferentes aspectos. Cuanto a Javascript, se ha generalizado a NxM celdas. Esto implica crear la tabla de forma dinmica (createElement), y también los eventos (addEventListener). Recordar que en el Buscaminas hemos de distinguir entre el botón izquierdo y el derecho del ratón.

Además, hemos añadido una capa de programación con PHP y MySQL. Ahora que estamos estudiando llamadas asíncronas con AJAX, hemos creado una tabla MySQL, y podemos registrar el usuario y hacer estadísticas de las mejores puntuaciones.

Puedes probar el Buscaminas en:

La máquina de pinball ya no me pertenece, o sea que le he hecho un buen reportaje de fotos y el video. Ya tengo unas cuantas mejoras pensadas para cuando tenga que hacer una nueva. Me gustaría poner un plunger con muelle, con un sensor de fuerza, para disparar la bola. No es ningún invento, el Virtual Pinball ya lo tiene previsto. Y también, claro, poner un monedero.

Esta semana iré a Sant Climent de Llobregat para conseguir un monedero de Industrias Lorenzo, que he de poner en una máquina. Carísimo, a parte de que perderé media mañana para irlo a buscar. Miraré de hacer y documentar un monedero de 50 cts con frontal de hierro, negro, y botón iluminado. Creo que puede quedar bien.

Aquí va el video, y el enlace a Retroplaneta::

Ya tenemos aquí la virtual pinball coffee table. Han pasado 11 meses desde que inicié este proyecto (con muchas cosas por el medio). Al final se ha utilizado PinballX como frontend y Visual Pinball 9 como emulador de mesas pinball en formato FS (fullscreen). Estos programas corren bajo Windows, no utilizaba Windows desde hacía mucho tiempo… Se han incorporado 200 mesas que se han testeado, intentando que fuesen lo más representativas de las diferentes épocas y fabricantes.

En muchos casos se ha tenido que tocar los scripts asociados a las mesas para que la mesa arranque bien y que salga el score de forma correcta. Las mesas que han llevado más faena son las más antiguas (EM, electromecánicas), donde se ha tenido que reposicionar los reels de los scores.

Los high scores de casi todas las mesas son muy difíciles de batir. Se ha hecho el trabajo de rebajar los high scores tocando en el fichero nvram los valores hexadecimales asociados al high score. En la mayoría de los casos se ha conseguido. De esta manera es fácil batir el récord de puntos y poder poner las iniciales al acabar la partida (JQC en mi caso). Es un buen ejemplo y un buen ejercicio de hacking de ficheros binarios.

Después de pasarme tiempo jugando y probantdo estas mesas, puedo decir que las que más me han gustado son las mesas electromecánicas de los años 60 y 70. Valoro de ellas la simplicidad del juego y limpieza del diseño. Mejor que las mesas luminosas y estresantes de los modelos de estado sólido (SS).

Es imposible jugar y conocer en profundidad todas estas mesas. En general las reglas son bastante difíciles de entender y digerir, y yo soy ese tipo de jugador que me basta con que la bola no me caiga entre los flippers. La idea es coger 4 o 5 mesas preferidas y jugar con éstas, conociéndolas más a fondo e intentando batir el récord una y otra vez.

Hay mesas que son muy rápidas y estresantes. Pero hay otras que son más tranquilas y donde la bola no va tan rápida. Es importante tener en mente estas mesas pensando que los niños o gente mayor también se lo puedan pasar bien haciendo unas partiditas.

El hardware que se ha utilizado finalmente:

  • HP Elite 8000 Dual Core 3,2GHz SFF (Small Form Factor), 4GB de RAM y 250GB de Disco Duro
  • Gráfica: ATI 5770 DDR5
  • 2 fuentes de alimentación (la placa base era SFF)
  • I-PAC, 8 botones
  • TV 32 pulgadas

Presupuesto final: 500 euros.

Se han utilizado 8 botones. En el frontal 4 botones iluminados: Coin, Start, Exit, Plunger. En los laterales botones para los flippers y botones para subir y bajar el sonido. Además, los botones tienen doble función dependiendo de si estamos en el front-end o en el emulador.

Cabe decir que yo no conocía demasiado el mundo Pinball antes de este proyecto. De pequeño había jugado alguna vez, pero muy poco, la verdad. Me ha gustado mucho adentrarme en este mundo, ahora ya soy un fan. En resumen, una máquina que promete muchas horas de diversión, en formato coffee table. Fantástica para competir por parejas y pasar un buen rato. Fantástica para revivir el mundo de los pinballs (o petacos, máquinas del millón). De todas formas, es bueno de vez en cuando poder hacer una partida en un pinball de verdad, como el que hay en la Plaça Joanich (Bar De Copas).

Acabado de leer el libro El Mundo del Spectrum, de los autores del podcast y de la web del mismo nombre: Manuel J. Rico Borrego, Jesús Martínez del Vas, Alejandro Ibáñez Muñoz, Javier Ortiz Carrasco y Juan F. Torres Chica. Un libro entretenido y con una edición muy cuidada y colorida. Mientras lo iba leyendo he anotado la referencia de los juegos que salen, y a continuación lo pongo por si es de interés de alguien.

Mientras tanto, tengo pendiente de configurar el emulador ZEsarux en la Raspberry Pi 3 y clasificar unos cuantos juegos. Y también sacar el polvo del Spectrum + que compré de segunda mano hace un par de año. Pero lo que sería bueno para el 2017 sería pillarme para trastear el ZX-UNO, que es una FPGA clavada del Spectrum, que aunque no paricipé en el crowfunding del proyecto, veo que aún se puede conseguir. Bueno, tranquilo, voy a empezar el 2017 con calma… Y Buen Año! para los que lo lean.

Mientras, estos son los juegos que salen en el libro:

3D Space Wars pág 174
Abu Simbel Profanation pág 3, 105
Aeroporto pág 93
After the War pág 98
Albatrossity pág 217
Alchemist pág 207
Amazonia pág 94
Android One pág 76, 194
Android 2 pág 194
Ángel Nieto pág 151
Arc of Yesod pág 196
Arkanoid pág 166
Arkos pág 146
Army Moves pág 98, 109
Aspar pág 86, 110
Asteroids pág 102
Astro Marine Corps (AMC) pág 98, 113
Astrologia pág 94
Atic Atac pág 158, 159
Attack of the Mutant Zombie Flesh Eating Chickens from Mars pág 192
Automania pág 186
Avalon pág 174, 176
Babaliba pág 105
Back to Skool pág 200
Barbarian pág 203
Batman pág 160, 166, 167
Batman the Movie pág 170
Beyond pág 125
Bobby Bearing pág 198
Brian Bloodaxe pág 198
Bruce Lee pág 182
Brunilda, King's Valley pág 216
Bubbler pág 160
Bugaboo: the Flea pág 71
Buggy Ranger pág 95
Camelot Warriors pág 109
Cannon Bubble pág 216
Capitán Trueno pág 146
Carlos Sainz pág 146
Castlevania pág 99
Castlevania Spectral Interlude pág 96
Chequered Flag pág 64
Chichen Itza pág 118
Chuckie Egg pág 31
Cobra pág 166
Columns pág 216
Comando Quatro pág 146
Combat Lynx pág 178
Comercio Cosmico pág 93
Commando pág 128
Contact Sam Cruise pág 200
Cookie pág 159
Cop-Out pág 186
Copa do Mundo pág 94
Corsarios pág 150
Cortocircuito pág 166
Cosmos pág 194
Cozumel pág 118
Cray5 pág 216
Creador Musical II pág 93
Critical Mass pág 178
Curro Jiménez pág 146
Cybernoid pág 176
Cyberun pág 160
Cyclone pág 194, 195
Dangerous Kiss pág 95
Dariust pág 198
Deathchase pág 74
Decathlon pág 6, 127, 165
Deflektor pág 194
Digital Graffiti pág 186
Dizzy Y-Return to Russia pág 98
Dragontorc pág 175
Dustin pág 109
El Escalador Loco pág 73
El Jugador de Ajedrez pág 63
El Lingote pág 6, 128
El Poder Oscuro pág 146
El Quijote pág 118
El Zorro pág 184
Elite pág 98
Emilio Butragueño pág 130
Emilio Sánchez Vicario pág 146
Enduro Racer pág 88
Equinox pág 186, 188
Escuela de Ladrones pág 93
Esquiador pág 93
Everyone's a Wally pág 94, 186
Exolon pág 176
Fairlight pág 198
Fairlight II pág 198
Fernando Martín pág 110
Final Fight pág 184
Fist II pág 203
Flight Simulator pág 93
Forgotter Worlds pág 184
Fortune pág 15
Frankie Goes to Hollywood pág 166
Fred pág 72, 141
Freddy Hardest pág 98, 112
Freddy Hardest en Manhattan Sur pág 95, 210
Full Throttle pág 74
Game Over! pág 98, 107, 110
Garfield pág 198
Gauntlet pág 184
Génesis pág 216
Ghouls'n'Ghosts pág 184
Gift from the Gods pág 166
Goody pág 151
Green Beret pág 166
Gremlins 2 pág 146
Guild of Thieves pág 116
Gunfright pág 160
Hammer Head pág 146
Harrier Attack pág 178
Head Over Heels pág 160, 166, 169
Heartland pág 196
Herbert's Dummy Run pág 186
Highway Encounter pág 194
Hostile All Terrain Encounter pág 194
Hulk pág 119
Humprey pág 144
Hunchback pág 165
Hypersports pág 166
Invasion of the Zombie Monsters pág 216
Jai Alay pág 151
Javato pág 118
Jet Pac pág 61, 74, 158
Jet Set Willy pág 61, 74, 190, 193
Jogos Basicos 1 pág 93
Jogos Basicos 2 pág 93
Joust pág 198
Ke Rulen Los Petas pág 118
Knight Lore pág 158, 159, 162
Knights & Demons pág 94
Kong pág 165
Kung-Fu Master pág 6
La Abadía del Crimen pág 72, 144, 150, 152
La Aventura Espacial pág 118
La Aventura Original pág 117, 118
La Corona Encantada pág 216
La Diosa de Cozumel pág 116
La Guerra de las Vajillas pág 118
La Historia Interminable pág 166
La Pulga pág 71
Legionairo pág 93
Level 9 pág 116
Livingstone, I Presume pág 149
Livingstone, Supongo pág 149
Lorna pág 138
Los Inmortales pág 167
Los Intocables pág 167
Los Ladrones del Tiempo pág 72
Los Templos Sagrados pág 118
Luigi en Circusland pág 129
Lunar Attack pág 174
Lunar Jetman pág 159
Mad Mix Game pág 6, 124
Manic Miner pág 16, 61, 74, 164, 190, 191
Map Game pág 129
Mapsnatch pág 108
Martianoids pág 160
Match Day pág 165, 166
Match Day II pág 166
Metro Cross pág 184
Michel pág 110
Microbot pág 198
Mikie pág 166
Misterio del Nilo pág 144
Mithos pág 150
Moon Patrol pág 109
Mot pág 151
Mystery of the Nile pág 144
Narco Police pág 95, 111, 210
Navy Moves pág 109
Nebulus pág 176
Night Shift pág 185
Nightshade pág 160
Ninjajar pág 216
Noche Agitada pág 95
Nodes of Yesod pág 196
Nonamed pág 109
Olé Toro pág 110
Out Run pág 88
Paradroid pág 176
Paris-Dakar pág 144
Pentagram pág 160
Perico Delgado pág 86, 146
Petrovic pág 130
Phantis pág 98
Phantomas pág 108
Phantomas Saga Infinity pág 216
Phantomasa 1 pág 216
Phantomasa 2 pág 216
Ping Pong pág 166
Platoon pág 166
Pogaboo pág 151
Policarpo Díaz pág 151
Ponte A. pág 93
Presidente pág 94
Prince of Persia pág 59, 106, 143
Profanation pág 141
Pssst pág 8, 159
Psytron pág 119
Pyjamarama pág 186, 187
Quazatron pág 176
Rainbow Islands pág 173
Rambo pág 166
Renegade III pág 206
Revolution pág 194
Risky Woods pág 111
Robin of the Wood pág 196
Robocop pág 167, 170
Rocky pág 109
Saboteur I pág 178
Saboteur II pág 178
Sabre Wulf pág 119, 159
Sabrina pág 88
Saimazoom pág 104, 135
Scuba Dive pág 178
Seiddab Attack pág 174
Serra Pelada pág 94
Sgrizam pág 109
Shadow of the Unicorn pág 125, 186
Shadow Skimmer pág 198
Shao Lin's Road pág 198
Sir Ababol pág 216
Sir Fred pág 142, 143
Sito Pons pág 146
Skool Daze pág 200, 201
Snoopy pág 198
Softtime pág 198
Sokoban pág 216
Spectral Invaders pág 15, 16
Spectrum Micro Chess pág 71
Spirits pág 121
Spy Hunter pág 183
Stainless Steel pág 186
Star Trek pág 186
Starblitz pág 198
Stormlord pág 176
Street Fighter pág 184
Street Hawk pág 166
Strider pág 184
Strike Force SAS pág 186
Strooper pág 146
Styx pág 190
Summer Games pág 184
Super Scrylis pág 129
Survivor pág 123
Tapper pág 184
Taxman pág 192
Tetris pág 6
Thanatos pág 178, 180
The Artist pág 198
The Artist II pág 198
The Great Escape pág 166, 167
The Hobbit pág 202, 205
The Pawn pág 116
The Untouchables pág 170
The Way of the Exploding Fist pág 202, 203
The Way of the Exploding Fist + pág 203
Three Weeks in Paradise pág 186, 189
Top Gun pág 166
Tornado Low Level (TLL) pág 194
Transformers pág 166
Tranz-Am pág 159
Trapper pág 181
Turbo Esprit pág 178
Turbo Girl pág 146
Ulises pág 150
Underwurlde pág 159
Uridium pág 176
Uwol pág 216
Vaqueiro pág 93
Viaje al Centro de la Tierra pág 131, 138
Victory Road pág 206
Videolimpics pág 110
West Bank pág 98
Willy Great Adventure pág 192
Willy Meets pág 192
Winter Games pág 184
World Cup Football pág 94, 181
Wreckage pág 76
Yenght pág 102
Zombie Calavera pág 216
Zona 0 pág 132
Zork pág 116
ZX Columns pág 216
ZX Mines pág 216
Zynaps pág 176

Ya me ha llegado la 3040T-DQ, y esta es la primera prueba…

OpenCV y C++

20/12/2016

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.

Todavía tengo por clasificar fotos de insectos de este verano y del anterior. Con el tiempo he aprendido a ir más rápido clasificando insectos, y a no perder tiempo y ofuscarme cuando no encuentro la identificación correcta. A medida de ir haciéndolo he establecido un protocolo bastante claro para proceder. Básicamente necesito un editor de texto con 4 ó 5 documentos; tres ventanas del terminal, una de las cuales es el mysql en modo comando; tres carpetas del explorador de archivos (Nautilus); y tres o cuatro ventanas del Firefox.

Hasta ahora lo hacía una por una. Ahora se trata de ponerlo todo en un script y así ganar un poco de tiempo y comodidad. Además, no es necesario poner el password del mysql, que queda ofuscado. El script queda de la siguiente manera:

#!/bin/bash

MY=$(echo "7878Mx33xicdg444aaiJ5888aba" | tr -d "78" | tr -s "4" | tr -d "cd" | tr -d "b" | tr -s "a" | tr -d "x3" | tr -d "58" | tr -s "8")

#nautilus
/usr/bin/nautilus /home/joan/arthropoda/fotosarthropoda/fotos_que_falten
/usr/bin/nautilus /home/joan/arthropoda/fotosarthropoda/fotos_prov
/usr/bin/nautilus /home/joan/arthropoda/fotosarthropoda/fotos_prov2

#firefox
/usr/bin/firefox http://localhost/arthropoda/ www.flickr.com http://www.biodiversidadvirtual.org/insectarium/ www.google.es &

#gedit
/usr/bin/gedit /home/joan/arthropoda/script_mysql.txt
/usr/bin/gedit /home/joan/arthropoda/per_classificar.txt
/usr/bin/gedit /home/joan/arthropoda/pixtuffarthro/inserts.sql
/usr/bin/gedit /home/joan/arthropoda/pixtuffarthro/updates.sql

#gnome-terminal:
/usr/bin/gnome-terminal --working-directory=/home/joan/arthropoda/scripts
/usr/bin/gnome-terminal --working-directory=/home/joan/arthropoda/pixtuffarthro
mysql -u root -p$MY arthropoda

done

Por cierto, esta semana he abierto una nueva familia de escarabajos: Dasytidae. El bicho me lo han clasificado en IV-biodiversidadvirtual.org, aunque no me han dicho ni el género. Ha sido un poco de lío, pues parece ser que Dasytidae es sinónimo de Melyridae. A veces la ciencia de la taxonomía puede ser muy complicada… Suerte que no me dedico a ello… Yo sencillamente hago fotos de bichos y miro de aprender y maravillarme de lo que nos ofrece la naturaleza.

Mi colección de insectos online:

Page 1 of 1212345»...Last »