Uso de la función seno para jugar

131 views
Skip to first unread message

Fernando F. Gallego

unread,
Aug 30, 2011, 3:09:24 PM8/30/11
to arduino...@googlegroups.com
Buenas,

os paso el código del limpiaparabrisas, el coche fantástico y la respiración led usando la función seno (también válido para la respiración del LED y para el coche fantástico)

Os explico un poco de trigonometría por encima para que sepáis como funciona:

La función seno (sin) recibe como parámetro un ángulo en radianes (90º son PI/2 radianes, 180º son PI radianes, 270º son 3*PI/2 radianes, 360º son 2*PI radianes y vuelta a empezar) pero no importa si el número es alto, ya que al ser una función sinusoidal, siempre estará entre -1 y 1 (sin(0) = 0). http://es.wikipedia.org/wiki/Seno_(trigonometr%C3%ADa)

En el caso del LED, queremos pasarle un valor entero entre 0 y 255 para simular la respiración, (no puede ser negativo), entonces tenemos que encontrar la manera de convertir los valores entre -1 y 1, a valores entre 0 y 255. Para esto, multiplicamos el seno por 125, para que nos de valores entre -125 y 125, y al resultado le sumamos 125, de modo que el resultado oscilará entre 0 y 250 y ese valor ya podemos pasárselo al pin PWM

analogWrite(9,125+sin(i)*125);

En la siguiente iteracion del loop, debemos incrementar el ángulo para obtener el siguiente valor, así que después de probar varios valores, con la velocidad el arduino, me ha servido sumar 0.01 al valor del ángulo, por eso ponemos i=i+0.01.

Aunque el valor del ángulo puede crecer hasta valores altos, conviene resetearlo a 0 al pasar de 2*PI para que nunca nos salgamos del rango permitido de valores.

if(i>2*PI) { i=0; }

En el caso del servo hice lo siguiente:
 f = (1+sin(i))*179/2;
  s.write(f);
  i=i+0.001;

Para valores entre 0 y 179 (oscila entre 0 y 2, por 179/2 sale entre 0 y 179)

En el caso del coche fantástico (cylon.pde) lo que cambia es el led que queremos encender en cada momento y es el valor que pasamos al digitalWrite (almacenando el valor anterior para apagarlo)

Si tenéis dudas me comentais :)

Intentaré subir luego o mañana unos vídeos de cómo quedan aunque algunos ya lo visteis en vivo :)

 
--

LimpiaParabrisas.pde
respiracionLed.pde
cylon.pde

victorelec14

unread,
Aug 30, 2011, 7:09:32 PM8/30/11
to arduino...@googlegroups.com

gracias por compartirlo !!

no conocía ese método, evitas usar bucles con lo que el arduino termina cada ciclo más rápido al no tener que esperar a que el bucle termine (si no me equivoco).

Fernando F. Gallego

unread,
Aug 31, 2011, 8:47:10 AM8/31/11
to arduino...@googlegroups.com
Si, pero si lo pones en otro que tenga distinta velocidad, afectará al resultado, lo suyo sería incrementar el ángulo en función del tiempo transcurrido entre ambas llamadas.

Por cierto, creo que perdí en ciball una bolsita con los soportes del servo... si alguien la ha encontrado... es mía :)

2011/8/31 victorelec14 <victor...@gmail.com>



--

Syvic

unread,
Sep 27, 2011, 1:03:31 PM9/27/11
to arduino...@googlegroups.com
Hola Fernando,

Disculpa el tremendo retraso en contestar, pero con el OSHWCon no he tenido tiempo de prácticamente nada de nada.

¡Mil gracias por currarte este trigonometría howto. ¡Es perfecto para inútiles matemáticos como yo!

Ahora que ya tengo más tiempo para cacharrear tengo que pensar en qué circuito implementarlo.

Muy buen curro, muchas gracias!

Jorge

On 30/08/11 21:09, Fernando F. Gallego wrote:
Buenas,

os paso el código del limpiaparabrisas, el coche fantástico y la respiración led usando la función seno (también válido para la respiración del LED y para el coche fantástico)

Os explico un poco de trigonometría por encima para que sepáis como funciona:

La función seno (sin) recibe como parámetro un ángulo en radianes (90º son PI/2 radianes, 180º son PI radianes, 270º son 3*PI/2 radianes, 360º son 2*PI radianes y vuelta a empezar) pero no importa si el número es alto, ya que al ser una función sinusoidal, siempre estará entre -1 y 1 (sin(0) = 0). http://es.wikipedia.org/wiki/Seno_(trigonometr%C3%ADa)

En el caso del LED, queremos pasarle un valor entero entre 0 y 255 para simular la respiración, (no puede ser negativo), entonces tenemos que encontrar la manera de convertir los valores entre -1 y 1, a valores entre 0 y 255. Para esto, multiplicamos el seno por 125, para que nos de valores entre -125 y 125, y al resultado le sumamos 125, de modo que el resultado oscilará entre 0 y 250 y ese valor ya podemos pasárselo al pin PWM

analogWrite(9,125+sin(i)*125);

En la siguiente iteracion del loop, debemos incrementar el ángulo para obtener el siguiente valor, así que después de probar varios valores, con la velocidad el arduino, me ha servido sumar 0.01 al valor del ángulo, por eso ponemos i=i+0.01.

Aunque el valor del ángulo puede crecer hasta valores altos, conviene resetearlo a 0 al pasar de 2*PI para que nunca nos salgamos del rango permitido de valores.

if(i>2*PI) { i=0; }

En el caso del servo hice lo siguiente:
 f = (1+sin(i))*179/2;
  s.write(f);
  i=i+0.001;

Para valores entre 0 y 179 (oscila entre 0 y 2, por 179/2 sale entre 0 y 179)

En el caso del coche fantástico (cylon.pde) lo que cambia es el led que queremos encender en cada momento y es el valor que pasamos al digitalWrite (almacenando el valor anterior para apagarlo)

Si tenéis dudas me comentais :)

Intentaré subir luego o mañana unos vídeos de cómo quedan aunque algunos ya lo visteis en vivo :)

 
--

Reply all
Reply to author
Forward
0 new messages