Hola. Un saludo a todos.

Acabamos de regalarnos mi hijo de 123 años y yo, un Mbot Ranger, ya que parece que le interesa bastante el tema de la programación. Como buenos novatos ya tenemos las primeras dudas, paso a exponer la cuestión:
Hemos realizado un sencillo programa con el sensor se ultrasonidos (primera imagen). Todo correcto.

5a2ff4b0a1a0d.png

El problema viene cuando queremos meterle tonos o secuencias de colores. El robot no responde y parece que ejecuta las órdenes en algún orden especial.

5a2ff59946c28.png

Quisiera saber de que manera puedo hacer que el robot ejecute varias órdenes a la vez (movimiento, secuencia de sonido o secuencia de luces) pero sin dejar de ejecutar bien el programa principal que en este caso sería el de la primera imagen.

En resumen, quisiera que si no detecta obstáculos, vaya hacia delante mientras reproduce una serie de tonos y si detecta obstáculo vaya hacia atrás y gire con otra secuencia distinta de tonos.

MUCHAS GRACIAS DE ANTEMANO POR VUESTRA AYUDA.

Hola. Un saludo a todos. Acabamos de regalarnos mi hijo de 123 años y yo, un Mbot Ranger, ya que parece que le interesa bastante el tema de la programación. Como buenos novatos ya tenemos las primeras dudas, paso a exponer la cuestión: Hemos realizado un sencillo programa con el sensor se ultrasonidos (primera imagen). Todo correcto. ![5a2ff4b0a1a0d.png](serve/attachment&path=5a2ff4b0a1a0d.png) El problema viene cuando queremos meterle tonos o secuencias de colores. El robot no responde y parece que ejecuta las órdenes en algún orden especial. ![5a2ff59946c28.png](serve/attachment&path=5a2ff59946c28.png) Quisiera saber de que manera puedo hacer que el robot ejecute varias órdenes a la vez (movimiento, secuencia de sonido o secuencia de luces) pero sin dejar de ejecutar bien el programa principal que en este caso sería el de la primera imagen. En resumen, quisiera que si no detecta obstáculos, vaya hacia delante mientras reproduce una serie de tonos y si detecta obstáculo vaya hacia atrás y gire con otra secuencia distinta de tonos. MUCHAS GRACIAS DE ANTEMANO POR VUESTRA AYUDA.

Los procesadores Arduino son muy sencillos. No le puedes pedir peras al olmo. Si está reproduciendo un tono no está haciendo otra cosa. Es decir si las tres notas duran, digamos, un segundo en total, durante ese tiempo no estará comprobando la condición. Es programación puramente secuencial. Hay que dejar de pensar como se programa en un ordenador o móvil con sus múltiples hilos y multitarea.

Aquí sólo hay un hilo así que si pones una secuencia que, entretiene al procesador (tonos, luces, etc), durante ese tiempo no puede hacer nada más. Como le marcas sólo 10 cm de margen, lo más probable es que se estrelle contra la pared al no darle tiempo a reproducir los tonos antes de volver a comprobar la condición y rectificar la trayectoria.

Digamos que la forma en la que lo hace es la siguiente.
1.- Comprueba la condición
2.- Comienza a avanzar o sigue avanzando
3.- Reproduce los tonos (lo que duren). Durante este tiempo no puede hacer otra cosa.
4.- Vuelve al principio para volver a comprobar la condición.

Los procesadores Arduino son muy sencillos. No le puedes pedir peras al olmo. Si está reproduciendo un tono no está haciendo otra cosa. Es decir si las tres notas duran, digamos, un segundo en total, durante ese tiempo no estará comprobando la condición. Es programación puramente secuencial. Hay que dejar de pensar como se programa en un ordenador o móvil con sus múltiples hilos y multitarea. Aquí sólo hay un hilo así que si pones una secuencia que, entretiene al procesador (tonos, luces, etc), durante ese tiempo no puede hacer nada más. Como le marcas sólo 10 cm de margen, lo más probable es que se estrelle contra la pared al no darle tiempo a reproducir los tonos antes de volver a comprobar la condición y rectificar la trayectoria. Digamos que la forma en la que lo hace es la siguiente. 1.- Comprueba la condición 2.- Comienza a avanzar o sigue avanzando 3.- Reproduce los tonos (lo que duren). Durante este tiempo no puede hacer otra cosa. 4.- Vuelve al principio para volver a comprobar la condición.

Estoy de acuerdo con @Ivan_v en parte. Sin embargo me gustaría añadir que una correcta utilización del timer interno ayuda a generar una "pseudomultitarea" donde podemos vigilar el estado de un sensor como el de ultrasonidos, inclinación, etc mientras se ejecuta una secuencia de luces o sonidos. En nuestros cursos tocamos ese tipo de programación a través de bloques.

Los bloques para utilizar el timer interno son los marcados como "cronómetro" y "reiniciar cronómetro" en el area de robots de mBlock.

Y utilizando una programación más avanzada a través de código en Arduino se pueden utilizar interrupciones mejorando aún más este tipo de necesidad multitarea definiendo prioridades según eventos.

Pero efectivamente como dice @Ivan_v en una etapa inicial hay que pensar en que es una programación secuencial, lineal, en la que un delay (espera) o un tono con el zumbador detendrá momentáneamente el programa.

Saludos,

Dani S.

Estoy de acuerdo con @Ivan_v en parte. Sin embargo me gustaría añadir que una correcta utilización del **timer interno** ayuda a generar una "pseudomultitarea" donde podemos vigilar el estado de un sensor como el de ultrasonidos, inclinación, etc mientras se ejecuta una secuencia de luces o sonidos. En nuestros cursos tocamos ese tipo de programación a través de bloques. Los bloques para utilizar el timer interno son los marcados como "cronómetro" y "reiniciar cronómetro" en el area de robots de mBlock. Y utilizando una programación más avanzada a través de código en Arduino se pueden utilizar interrupciones mejorando aún más este tipo de necesidad multitarea definiendo prioridades según eventos. Pero efectivamente como dice @Ivan_v en una etapa inicial hay que pensar en que es una programación secuencial, lineal, en la que un delay (espera) o un tono con el zumbador detendrá momentáneamente el programa. Saludos, Dani S.

Pues tienes toda la razón del mundo. No había caído en los timers ni en las interrupciones. Y, la verdad, es que las estuve estudiando para hacer un aparatejo con Arduino aunque, al final, opté por Raspberry porque me facilitaba mucho crear la interfaz gráfica.

Además, no sabía que el "cronómetro" de los bloques se correspondía con el timer de C. Lo tendré que trastear porque permitiría hacer cosas interesantes.

Pues tienes toda la razón del mundo. No había caído en los timers ni en las interrupciones. Y, la verdad, es que las estuve estudiando para hacer un aparatejo con Arduino aunque, al final, opté por Raspberry porque me facilitaba mucho crear la interfaz gráfica. Además, no sabía que el "cronómetro" de los bloques se correspondía con el timer de C. Lo tendré que trastear porque permitiría hacer cosas interesantes.
1.63k
vistas
3
respuestas
3
seguidores
vista previa (en vivo)
introduzca al menos un 10 caracteres
Advertencia: Mencionaste a %MENTIONS%, pero ellos no pueden ver el mensaje y no serán notificados
Guardando...
Guardado
Todos los posteos de este tema serán borrados ?
Borrador pendiente ... Click para continuar editando
Descartar borrador