Estos últimos días he revivido el ordenador Amstrad PCW8256 que teníamos en casa hacia el 1986. Lo utilizaba mi padre para escribir, pero también lo utilizábamos para los trabajos del instituto. Venía con una pantalla monocroma verde, el teclado y la impresora de agujas. Toda la electrónica estaba en el monitor, incluso la placa de la impresora. Y en el monitor también había la disketera de 3”, que tenía dos caras.

He instalado el Joyce en la Raspberry Pi, y me ha gustado revivir este sistema. Evidentmente, se ha de escoger la opción de letras verdes, simulando la pantalla de fósforo verde.

El ordenador venía con dos disketes, que eran discos de arranque. El primer era el CP/M, el sistema operativo, desde el que se podía acceder al intérprete de Basic (Mallard Basic). El segudo diskette, tambié bootable, era el Locoscript, que es el processador de textos con que venía. He hecho un documento con LocoScript sobre los ríos de Catalunya, simulando como si fuese un trabajo del insti.

También he jugado un rato al Tetris. El emulador emula muy bien la máquina original. Si quieres jugar al Tetris, has de hacer eject del disket inserido (el CP/M)(el SO ya está cargado en la RAM), y meter el disket del Tetris (Insert). Entonces, ya desde la línea de comandos, ya se puede llamar al ejecutable y jugar al Tetris, com se ve en la imagen.

Qué tiempos aquéllos! El link en la wiki:

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:

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…

Page 1 of 1212345»...Last »