Arxiu de la categoria: Joan Quintana

Minesweeper-pescamines-buscaminas amb Javascript

El Pescamines (Buscaminas, Minesweeper) és un dels 1001 videojocs a què has de jugar abans de morir. Si tens una certa edat, segur que te n’has afartat, perquè el Pescamines ha vingut en les diferents versions de Windows fins al Windows 7.

Existeixen diferents versions per jugar online. Concretament, amb els alumnes hem agafat la versió en Javascript de Andrew D. Birrell, que ja té uns anys, i l’hem actualitzat en diferents aspectes. Quant a Javascript, s’ha generalitzat a NxM cel·les. Això implica crear la taula de forma dinàmica (createElement), i també els events (addEventListener). Recordar que en el pescamines hem de distingir entre el botó esquerre i el dret del ratolí.

A més, hem afegit una capa de programació amb PHP i MySQL. Ara que estem estudiant crides asíncrones amb AJAX, hem creat una taula MySQL, i podem registrar l’usuari i fer estadístiques de les millors puntuacions.

Pots provar el Pescamines a:

El video del moble de pinball

La màquina de pinball ja no em pertany, o sigui que li he fet un bon reportatge de fotos i el video. Ja tinc unes quantes millores pensades per quan n’hagi de fer una de nova. M’agradaria posar un plunger amb molla, amb un sensor de força, per disparar la bola. No és cap invent, el Virtual Pinball ja ho té previst. I també, clar, ficar un moneder.

Aquesta setmana anirá a Sant Climent de Llobregat per aconseguir un moneder de Industrias Lorenzo, que he de ficar en una màquina. Caríssim, a part de què perdré mig matí per anar-lo a buscar. Miraré de fer i documentar un moneder de 50 cts amb frontal de ferro, negre, i botó il·luminat. Crec que pot quedar bé.

Aquí va el video, i l’enllaç a Retroplaneta:

Màquina de Virtual Pinball acabada!

Ja tenim aquí la virtual pinball coffee table. Han passat 11 mesos des que vaig iniciar el projecte (amb moltes coses pel mig). Al final s’ha utilitzat PinballX com a frontend i Visual Pinball 9 com a emulador de taules pinball en format FS (fullscreen). Aquests programes corren sota Windows, no utilitzava Windows des de feia molt de temps… S’han incorporat 200 taules que s’han testejat, intentant que fossin el més representatives de les diferents èpoques i fabricants.

En molts casos s’ha hagut de tocar els scripts associats a les taules per tal de què la taula arrenqui bé i que sortís el score de forma correcta. Les taules que han portat més feina són les més antigues (EM, electro-mecàniques), on s’han hagut de reposicionar els reels dels scores.

Els high scores de quasi totes les taules són molt difícils de batre. S’ha fet la feina de rebaixar els high scores tocant en el fitxer nvram els valors hexadecimals associats al high score. En la majoria dels casos s’ha aconseguit. D’aquesta manera és fàcil batre el rècord i poder ficar les inicials en acabar la partida (JQC en el meu cas). És un bon exemple i un bon exercici de hacking de fitxers binaris.

Després de passar-me temps jugant i provant aquestes taules, puc dir que les que més m’han agradat són les taules electro-mecàniques dels anys 60 i 70. Valoro d’elles la simplicitat del joc i netedat del disseny. Millor que les taules lluminoses i estressants dels models d’estat sòlid (SS).

És impossible jugar i conèixer en profunditat totes aquestes taules. En general les regles són bastant difícils d’entendre i digerir, i jo sóc un tipus de jugador que en tinc prou amb què no em caigui la bola entre els flippers. La idea és agafar 4 ó 5 taules preferides i jugar amb aquestes, conèixer-les més a fons, i intentar batre el récord una i una altra vegada.

Hi ha taules que són molt ràpides i estressants. Però n’hi ha d’altres que són més tranquiles i on la bola no va tan ràpida. És important tenir en ment aquestes taules pensant que els nens o gent gran també s’ho puguin passar bé fent unes partidetes.

El hardware que s’ha utilitzat finalment:

    \t

  • HP Elite 8000 Dual Core 3,2GHz SFF (Small Form Factor), 4GB de RAM i 250GB de Disc Dur
  • \t

  • Gràfica: ATI 5770 DDR5
  • \t

  • 2 fonts d’alimentació (la placa base era SFF)
  • \t

  • I-PAC, 8 botons
  • \t

  • TV 32 polzades

Pressupost final: 500 euros.

S’han utilitzat 8 botons. En el frontal 4 botons il·luminats: Coin, Start, Exit, Plunger. En els laterals botons per als flippers i botons per pujar i baixar el so. A més, els botons tenen doble funció depenent de si estem en el front-end on en l’emulador.

Val a dir que jo no coneixia massa del món Pinball abans d’aquest projecte. De petit hi havia jugat alguna vegada, però molt poc, la veritat. M’ha agradat molt endinsar-me en aquest món, ara ja en sóc un fan. En resum, una màquina que promet moltes hores d’entreteniment, en format coffee table. Fantàstica per competir per parelles i passar una bona estona. Fantàstic per reviure el món dels pinballs (o petacos, màquines del millón). De totes formes, és bo de tant en tant poder fer una partida a un pinball de veritat, com el que hi ha a la Plaça Joanich (Bar De Copas).

OpenCV i C++

Un projecte per al 2017 serà una recreativa de dards. La idea no és original. Es tracta d’utilitzar una diana de dards real, de suro, i els corresponents dards de punta metàl·lica, i amb un sistema de visió artificial ser capaç de saber en quin sector hem tocat.

La solució passa per tenir dues webcams connectades a la Raspberry Pi, doncs amb una sola webcam no es pot aconseguir prou precisió. S’haurà de fer bastantes proves per tal d’aconseguir fiabilitat en la determinació de la posició del dard. En principi compto en què dues webcams barates i compatibles amb la RPi (per exemple la Logitech Quickcam Express) connectades a una sola Raspberry Pi puguin fer el fet, ja veurem si serà possible.

Mentrestant he instal·lat OpenCV a una Raspberry Pi 3 i estic fent les primeres proves amb OpenCV: capturar un frame de la webcam; diferència entre dues imatges; convertir una imatge a gris; convertir una imatge a binari a partir d’un llindar; detecció d’un color; detecció d’una forma; detecció dels contorns i centre de masses,… Tot amb C++. Realment és divertit això del OpenCV.

A edx.org hi ha un curs de OpenCV.

Esperem que tot funcioni sense massa contratemps. El següent pas seria fer la interfície d’usuari que ens permetrà jugar als jocs més populars de dards: 301, 501, Cricket,… i construir un moble. M’imagino una fusta gran amb la diana a la dreta, una pantalla de 15” (protegida per un vidre) a l’esquerra, i una marquesina retroiluminada on estan amagades les dues webcams dirigides a la diana. Ja veurem, tot està per fer.

Anar ràpid classificant insectes

Encara tinc per classificar fotos d’insectes d’aquest estiu i de l’anterior. Amb el temps he après a anar més ràpid classificant insectes, i a no perdre temps i encaparrar-me quan no trobo la identificació correcta. A mida d’anar fent-ho he establert un protocol bastant clar per procedir. Bàsicament necessito un editor de text amb 4 ó 5 documents; tres finestres del terminal, un dels quals és el mysql en mode comanda; tres carpetes de l’explorador d’arxius (Nautilus); i tres o quatre finestres del Firefox.

Fins ara ho feia un a un. Ara es tracta de posar-ho tot en un script i així guanyar una mica de temps i comoditat. A més, no cal ficar el password del mysql, que queda ofuscat. El script queda de la següent 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

Per cert, aquesta setmana he encetat una nova família d’escarabats: Dasytidae. Me l’han classificat a IV-biodiversidadvirtual.org, encara que no m’han dit ni el gènere. Ha sigut una mica embolic, doncs sembla ser que Dasytidae és sinònim de Melyridae. A vegades la ciència de la taxonomia pot ser molt complicada… Sort que no m’hi dedico… Jo senzillament faig fotos de cuques i miro d’apredre i meravellar-me del que ens ofereix la natura.

La meva col·lecció d’insectes online:

CNC: Del dxf al G-Code. Optimització de camins

El workflow del CNC consta de tres passos:

  1. Disseny del model o peça. Es fa amb software de CAD, com per exemple LibreCAD, i el format de sortida estàndar és dxf
  2. Generar el G-Code (del que va aquest article). Necessites un programa que sàpiga llegir el format dxf (on estan definides línies, arcs, polilínies, splines, etc.) i generi el codi (G-code) que entenen les fresadores CNC.
  3. El software que sap interpretar el G-Code i sap enviar les comandes a la màquina CNC a través del port paral·lel. Per exemple, LinuxCNC o EMC.

De tota aquesta tool chain el procés més complicat és el segon. Concretament l’optimització dels camins que farà la màquina CNC té molta importància en el resultat final.

Anem a veure-ho amb un exemple senzill i entenedor. Estem utilitzant el dxf2gcode, i realment va molt bé. Està escrit en Python. Té una interfície gràfica, però el millor és que també es pot executar en mode consola. Davant d’un problema que he tingut i que ja està resolt, vaig buscar una alternativa. M’he trobat amb el projecte dxf2G (els noms no són molt originals, ja veieu), que està escrit en llenguatge C, són 3000 línies de codi, i s’executa en línia de comandes.

El segon és un projecte senzill que funciona molt bé per petits projectes, i que és interessant estudiar el codi. Mirant què fa i com ho fa, es troba a faltar que no separa les capes del dxf (normalment es treballa amb capes perquè associem les capes a un canvi d’eina, per treballar amb diferents diàmetres de broca), i sobretot l’optimització de camins, que seria la part difícil d’implementar (es fan tesis doctorals sobre aquesta matèria).

Ho veiem amb un exemple de dibuixar una línia amb profunditat de 3mm, fent dues passades de 1,5mm. La manera correcta, com ho fa el dxf2gcode és fer una passada a 1,5mm, foradar fins a 3mm, i desfer el camí fins a tornar a l’inici de la recta. El tros de G-Code que genera el dxf2gcode és:

(*** LAYER: 0 ***)
T1 M6
S6000


(* SHAPE Nr: 0 *)
G0 X 0.000 Y 0.000
M3 M8
G0 Z 3.000
F150
G1 Z -1.500
F400
G1 X 60.000 Y 0.000
F150
G1 Z -3.000
F400
G1 X 0.000 Y 0.000
F150
G1 Z 3.000
G0 Z 15.000
M9 M5

En canvi, el dxf2G fa la implementació fàcil i costosa en temps: anem a l’origen de la recta; foradem a -1,5; fem la passada de la recta; pujem fins a 6mm per no tocar la peça; tornem a l’origen de la recta; foradem fins a -3mm; tornem a repassar la recta fresant a -3mm.

G0 X0.000000 Y0.000000
G0 Z3.000000
G1 Z0
G1 Z-1.500000
G1 X60.000000 Y0.000000
G0 Z6.000000
G0 X0.000000 Y0.000000
G0 Z3.000000
G1 Z-3.000000
G1 X60.000000 Y0.000000
G0 Z6.000000

Total, el segon codi pot trigar el doble de temps que el primer. I és que implementar algorismes d’optimització de camins (toolpath optimization en anglès) no és cosa fàcil.

Rockola inspirada en una Seeburg Wallbox

Encara no tinc acabada la que ha de ser la meva rockola original, amb més de 2000 cançons, front-end, un so potent i efectes lluminosos. Mentrestant, m’ha sorgit la possibilitat de desenvolupar ràpidment una rockola mínima i bonica. La font d’inspiració són les Seeburg Wallbox, pensada com diu el seu nom per ser penjades de la paret. Pots veure el resultat en la foto, estic satisfet de com ha quedat, tot i que al final no s’assembla gens a una Seeburg Wallbox.

La rockola consta de 6 bancs de cançons (1.Baladas; 2.Pop Rock Español; 3.Pop Rock; 4.Rock & Roll, R&B-Soul; 5.Heavy Metal; 6.Catalana), i cada banc són 36 cançons. Això fa un total de 216 cançons, que he intentat que siguin el més representatives de cada categoria. L’el·lecció de Balades (Julio Iglesias, Pantoja,…) o dels grups de pop espanyol dels anys 80 (Mecano, etc) és perquè m’imagino aquestes rockoles funcionant en un bar cutre dels anys 80. Ja se sap, quan faig un projecte em fico dins la pell del projecte… Té un moneder que accepta monedes de 20 cts d’euro, un led indicador, i 12 botons de fusta, res de plàstic. Sense pantalla. Els altaveus són normals d’ordinador, per tant no es pot esperar ni potència ni bona qualitat en aquest primer prototip. En tot cas és interessant una sortida AUX d’àudio per connectar un amplificador potent.

El moble està fet amb fusta de pi vernissada. Les dimensions són 26 cm d’ample per 38 cm d’alt, i la idea és penjar-lo de la paret. A dins té una Raspberry Pi 2 i amb una targeta de 8Gb n’hi ha prou per al sistema operatiiu, l’aplicatiu i les 216 cançons.

Com que no hi ha pantalla, el LED indicador és l’única font de comunicació amb l’usuari. Hi ha 3 modes: LED intermitent, vol dir que no sona cap cançó i que la rockola està esperant una moneda (una moneda, dues cançons); LED encès, vol dir que hem d’introduir el codi de la cançó (amb el format BANC-LLETRA-NÚMERO); LED apagat, està sonant una cançó i hem gastat tots els crèdits (les cançons pendents de sonar estan a la cua).

Els botons estan connectats directament als pins GPIO, i el LED també. Per canviar l’estat del LED l’aplicatiu executa un script Python que és el que s’encarrega d’encendre i apagar el LED.

Per si a algú li interessa, aquí va el codi font (les cançons escollides estan dins el codi font).

Portàtil de fa 13 anys amb port paral·lel

Ja estic decidit a aconseguir una màquina CNC. Segurament serà la 3040T. Han passat dos anys des que volia construir-me la màquina CNC, o sigui que al final decideixo tirar pel dret.

He repassat tots els apunts que tenia de fa dos anys, torno a mirar el projecte LinuxCNC, i veig que les coses no han canviat molt. El port paral·lel (LPT, connector DB25) continua sent necessari. Per comunicar-se amb màquines CNC el port USB no és una opció fiable, no per la velocitat, sinó per la latència i precisió en l’enviament de pulsos. Evidentment avui dia existeixen solucions basades en Raspberry Pi o Arduino, però no són solucions estàndar en el sentit de què es pugui connectar qualsevol màquina CNC. A més, si utilitzes una Raspberry Pi com a controladora, igualment necessites un ordinador per dissenyar les peces.

Tenia una torre preparada amb LinuxCNC, de fa 2 anys, però buscant una solució més confortable, he pensat en un portàtil amb port paral·lel. A l’institut en tenim uns quants al taller per desmuntar, i n’he provat un, que ha complert les expectatives. He instal·lat LUbuntu 12.04, LinuxCNC, LibreCAD i dxf2gcode, sense especials problemes. És un Pentium III a 1,6GHz i 1GB de RAM, i compleix prou bé les expectatives, encara que una mica lent, clar. Quan pugui el conectaré als drivers i motors pas a pas que tinc per comprovar que tot funciona correctament.