Este verano estuve haciendo pruebas para captar la seal de un sensor LDR al ordenador, con un programa C++ que leía por el puerto serie los datos que enviaba el Arduino. Y se comprobaba como la luminosidad al atarcecer disminuye como una sigmoide (1).

Estas eran las primeras pruebas para el experimento que quería hacer y documentar, que es la búsqueda de la constante g a partir del experimento del péndulo. Resumiendo, medimos el periodo del péndulo para diferentes longitudes, y podemos encontrar la constante g=9.81 m/s2. Sabemos que el periodo del péndulo no depende de la masa, sino sólo de la longitud de la cuerda y de la constante g obviamente.

En la foto podemos ver el esquema del experimento. Tenemos un péndulo; un fotodetector con Arduino capaz de detectar el paso del péndulo; enviamos por el puerto serie al ordenador los datos; un programa C++/SDL lee los datos del puerto serie; procesamos los datos con Python y encontramos la recta de regresión; calculamos g y el error correspondiente. Todo esto es lo que desarrollaremos en el siguiente post.

A parte del experimento de encontrar la constant g, la idea es hacer una serie de experimentos que sigan el mismo esquema. Si tenemos diversos experimentos preparados, se podría hacer más adelante una propuesta didáctica para Secundaria.

Me está rondando por la cabeza hacer una serie de experimentos captando dades amb sensors y procesando los datos en el ordenador. Espero hablar de ello pronto, hay bastantes ideas chulas que se pueden desarrollar. Aquí va una pequeña muestra. Y una de las técnicas clave para hacer todo esto que quiero hacer es enviar por el protocolo serie los datos de un sensor (arduino) a un programa C++ que se está ejecutando en el ordenador.

En la foto se puede ver cómo se recogen los datos del sensor en el ordenador. Los datos se van grabando en un fichero, y se pueden procesar a posteriori. En este caso tengo un sensor LDR que capta la luz solar, y se trata de ver cómo decae la iluminación a medida que se va haciendo oscuro. ¿Qué comportamiento tendrá? El estado inicial es asintótico (iluminación plena), y el estado final también (oscuridad). ¿Qué pasa en medio? Sabemos que a la naturaleza no le gustan los cambios bruscos. Hemos de unir las dos rectas con una curva. Esto nos puede dar una curva sigmoide, en la que habría un punto de inflexión de cambio máximo en el decrecimiento de la iluminación? ¿Será cierto este comportamiento, este modelo matemático? Vamos a comprobarlo.

Una vez tenemos el fichero con los datos, los procesaremos con las librerías científicas numpy y scipy de Python. Como podemos ver en el código, se propone una línea de máximo ajuste de tipo sigmoide. Y efectivamente obtenemos una buena solución y un buen ajuste como se puede ver en la gráfica. En este caso, la ecuación obtenida es:

y =987.24 * (1 / 1 + exp(-0.07*(x-393.87))) +-8.02

No hemos de hacer demasiado caso a los datos del eje X, son tan sólo puntso. Sencillamente tener en cuenta que la distancia entre puntos son 30 segundos.

Esta es una sencilla y buena demostración de verano (un divertimento) de que la Naturaleza se describe con funciones matemáticas. Las mates son una buena herramienta para describir el comportamiento de la Naturaleza. Y que los fenómenos exponenciales son inherentes a la Física.

Este último año he estado estudiando métodos numéricos y las librerías científicas de Python, y realmente le veo muchas posibilidades, que quiero ir explorando este curso que comenzará de aquí poco.

# -*- coding: utf-8 -*-
#cel·la LDR que ha gravat com decau la llum al capvespre.
#La funció que s’ajusta a les dades és una sigmoide

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def sigmoid(x, a, b, c, d):
y = c / (1 + np.exp(-b*(x-a))) + d
return y

y = np.loadtxt(‘../dades/LDR_capvespre.txt’)
x = np.linspace(1,len(y),len(y))
#print (x)
#print (len(x))

popt, pcov = curve_fit(sigmoid, x, y, p0=[350, 0.001,1000, 2]) #és necessari ficar uns bons paràmetres inicials

print popt
print (‘y =c * (1 / 1 + exp(-b*(x-a))) +d ‘)
print (‘y =’ + ‘%.2f’%popt[2] + ‘ * (1 / 1 + exp(‘ + ‘%.2f’%popt[1] + ‘*(x-’ + ‘%.2f’%popt[0] + ‘))) +’ + ‘%.2f’%popt[3] )

plt.figure()
plt.plot(x, y, ‘k’, label=”Original Noised Data”)
plt.plot(x, sigmoid(x, *popt), ‘r-’, label=”Fitted Curve”)

plt.legend()
plt.show()

# Resultat:
#y =c * (1 / 1 + exp(-b*(x-a))) +d
#y =987.24 * (1 / 1 + exp(-0.07*(x-393.87))) +-8.02

Este es un proyecto divertido y sencillo para hacer con la Raspberry Pi, muy adecuado ahora para el verano. He estado configurando la Raspberry Pi y los diferentes módulos del proyecto MagicMirror, y ya puedo mostrar el video de cómo quedará todo. De todas maneras, el proyecto lo tendré que acabar más adelante cuando decidamos donde podemos colocar el espejo y las dimensiones que tendrá, pues veo que comprar el 2-way mirror es la parte más delicada, y un espejo grande se va del presupuesto.

Uno de los objetivos para realizar este proyecto es que últimamente me estoy concienciando de lo mal que hablamos nuestra lengua (el catalán) y de como se ha empobrecido en general. Para recuperar las expresiones más genuinas (rehusando el calco del castellano allí donde no haga falta), hay todo un movimiento de concienciación. Yo quiero aportar mi grado de arena haciendo este espejo mágico que nos dará una lección de buen catalán cada vez que nos miremos al espejo, por ejemplo cuando nos cepillemos los dientes.

Uno de los módulos por defecto de MagicMirror es la sindicación de contenidos para tener los titulares de las noticias del día. Por ejemplo, mi espejo está suscrito al periódico ARA. Pues bien, he adaptado este módulo para crear mi propio módulo de MagicMirror (el_catala_com_cal). Ha sido bastante fácil. Sólo falta crear y editar un fichero XML con las lecciones de catalán que quiero visualizar. De momento es esto: un fichero estático que tendré que editar cada vez que quiera añadir contenido.

Sería el mes de febrero o marzo que me puse a lidiar y estudiar LaTeX. El motivo principal era la edición de ecuaciones y la notación científica, que es donde LaTeX presenta grandes ventajas. Detrás de este trabajo hay la idea de hacer unos artículos (y/o libro) sobre aspectos curiosos y cotidianos relacionados con las ecuaciones diferenciales y métodos numéricos con Python.

Lejos de este objetivo científico, con el objetivo de aprender LaTeX, me puse a editar el Tirant lo Blanc (hubiese podido coger otra novela más corta!). Han pasado unos meses y al final he tenido tiempo de acabar mi edición del Tirant lo Blanc, que tengo el gusto de presentar en primicia mundial.

Como el text es muy largo (el pdf tiene casi 1000 páginas), se ha utilizado diversas técnicas de programación y substitución automática de texto, para así generar rápidamente el LaTex a partir de los textos originales (en formato txt o html). Esto quiere decir que, con los conocimientos adquiridos, la generación de un pdf de un texto o novela histórica la podría hacer de forma bastante rápida.

  • Edición del Tirant con LaTeX (pdf): Tirant lo Blanc
  • El texto original que proviene de cervantesvirtual.com: enlace
  • El Tirant lo Blanc en la Wikipedia: enlace

Ya hace días que no escribía en el blog, i es que este trimestre ha sido muy frenético y cansado con el cambio de piso. Por si no era poco, el día antes del traslado tenía comprometido llevar unas máquinas a la fiesta social de la aseguradora ARAG.

Se lo van pasaron en grande con tres máquinas bartop y un pinball que les llevé en la furgoneta. Después, por la noche, a recogerlo todo, cuando los más marchosos todavía estaban en la discoteca.

He estado haciendo dos pinballs en paralelo, de las mismas dimensiones, y con plunger analógico. El primero basado en el tema de Los Vengadores de Marvel; y el segundo basado en Jacks Open, tema que ya había hecho. Al contrario de la primera versión donde utilicé pintura y máscaras para pintar con spray, esta vez se me ha complicado mucho esta técnica y finalmente he encargado los vinilos, mucho mejor.

En un anterior artículo ya explicamos la construcción del tirador de muelle analógico. Ahora hemos querido acabarlo de explicar y hacer un pequeño video.

A continuación se detalla las conexiones de los botones, el potenciómetro (A0) y el acelerómetro (SDA, SCL) en el Arduino Pro Mini:

    Arduino Pro Micro
    (plunger, acceleròmetre, i 6 botons)

			*	*
			*	* GND
			*	*
			*	* VCC
		    SDA	*	*
 		    SCL	*	*
	  4: Left. BUT0	*	*
         5: Right. BUT1	*	* A0 (Pot)
          6: Exit. BUT2	*	*
         7: Start. BUT3	*	*
          8: Coin. BUT4	*	*
         9: Enter. BUT5	*	*

Finalmente, hay que cargar el firmware en el Arduino, que incorpora la librería Joystick. El acelerómetro, que detecta la fuerza lateral ejercida sobre el mueble, a partir de un umbral de fuerza simula el disparo de un botón joystick. Todas las acciones de los botones del joystick HDI se aocian a presiones del teclado gracias al software JoyToKey, que corre en background. La asociación de teclas es la típica de Visual Pinball (el emulador). Por ejemplo, COIN está asociado a la tecla 5, y la función Tilt/nudge dispara las teclas Z/X.

Tenía miedo que un potenciómetro deslizante se deteriorase con el tiempo, y hubiese preferido utilizar algún sensor no mecánico. Tengo que decir, pero, que de momento, el funcionamiento es muy estable.

He construido dos máquinas en paralelo, una basada en el tema del Jacks Open, y la otra basada en el tema de Avengers. En una de les máquinas el funcionament no va muy fino, y he de ver todavía cuál es la causa: el ordenador, la RAM, la tarjeta de video o el plunger.

Finalmente he finalizado el pinball de Avengers. He estado haciendo dos pinballs en paralelo, de las mismas dimensiones, y con plunger analógico.

He tardado bastante tiempo en repasar las 200 mesas para adaptarlas al plunger y tilt analógicos. Publicamos este artículo publicando la solución final de la construcción del tirador de muelle, basado en Arduino.

Estoy haciendo un par de pinballs, y esta vez sí que quiero incluir un plunger analógico. Esto es bastante trabajo, pues significa construir un tirador de muelle fiable, y configurar/repasar las 200 mesas con las que trabajo. Además del tirador analógico también incluiré la función de TILT, es decir, cuando dé un golpe lateral al mueble quiero cambiar la trayectoria lateral de la bola, y así evitar que la bola caiga en el sumidero.

Utilizaré un Arduino Pro Micro, que me hará de joystick/gamepad a través del puerto USB. Para que el sistema operativo lo reconozca como HID (Human Interface Device), el firmware del Arduino debe incluir la librería joystick. El Arduino tiene entradas digitales/analógicas y salidas digitales para conectar los sensores y los botones necesarios. De hecho, utilizando el Arduino ya no hará falta el I-PAC que se utiliza en este tipo de proyectos.

En la foto se puede ver el segundo prototipo de plunger analógico, que ya es funcional. Como sensor utilizaré finalmente un potenciómetro lineal deslizante. De momento el muelle que utilizo es un poco fuerte. Estoy buscando otro que sea más flojo, pero que me asegure el retorno del potenciómetro a su posición inicial. Ya sé que utilizar un potenciómetro (elemento mecánico) no es la mejor solución, pero de momento me está funcionando sin problemas. Otras opciones a considerar como sensores son un rotary encoder (que también es mecánico), y dos soluciones que no son mecánicas (larga vida) pero que son más difíciles y caras y que he viso por Internet: utilizar un CCD linear sensor array (TAOS TSL 1410R); y utilizar un sensor de distancia LVDT (es caro, pero unos se lo puede construir).

Como conclusión, le daré una oportunidad al potenciómetro lineal deslizante, y su valor se leerá en una entrada analógica del Arduino.

Para la función tilt necesito un acelerómetro. Usaré el MPU-6050 GY-521, que es un acelerómetro de tres ejes y giroscopio (sólo necesito leer la aceleración en un eje). Usa el bus I2C para conectarse al Arduino (entradas digitales). Además, el resto de botones (en principio 4 botones frontales y los dos botones laterales de los flippers) también utilizarán entradas digitales del Arduino.

Lo que lleva más trabajo es repasar las 200 mesas y modificarlas para que el plunger analógico funcione correctamente. Hay diversas maneras de implementar el tirador, unas mesas más fáciles que otras. Como siempre, muchas gracias a la comunidad de Visual Pinball y a la gente que ha importado todas las mesas para el uso y disfrute de todos.

Ahora ya estoy a punto de acabar, y cuando tenga finalmente el mueble montado y el plunger analógico colocado en un posición final se tendrán que hacer las pruebas definitivas y la versión final del firmware. Ahora ya falta poquito. Cuando lo tenga todo acabado haré un pequeño video.

Si a alguien le interesa mi solución final, que em contacte y lo hablamos.

Referencias:

Page 1 of 1712345»...Last »