Programando nuestro robot para que avance al frente y hacia atrás Requerimientos Para el desarrollo de esta actividad se requiere que: Contemos con un robot BoeBot armado con placa Arduino. Observemos el video en la comunidad virtual para ver cómo se deberá comportar nuestro BoeBot una vez que se encuentre programado. Configurando Arduino Antes de que iniciemos la programación de los servos necesitamos configurarlos para que sean reconocidos como tales indicando los puertos en los cuales se deberán conectar los motores. Como tenemos los servos de movimiento conectados a los pines 10 y 11, debemos crear dos objetos tipo servo para indicar los motores conectados, estos serán llamados leftServo (servo conectado al lado izquierdo) y rightServo (servo conectado al lado derecho). Esto nos ayudará al hacer la codificación más simple. Además tenemos que indicar los valores para establecer el movimiento de los servos, debido a que los servos de rotación continua están colocados en espejo, esto quiere decir que están simétricamente invertidos tendremos que establecer dos variables para indicar las velocidades de movimiento de los servos, para el servo conectado al lado derecho se establece el valor 0 (para indicar la potencia máxima de movimiento en sentido de las manecillas del reloj); para el servo conectado al lado izquierdo del robot, se establece el valor 180 (para indicar la potencia máxima de movimiento en se ntido inverso de las manecillas del reloj). Recordemos que uno de los motores se activa en sentido contrario al movimiento de las manecillas del reloj debido a la posición en que están montados. De esta forma logramos que el robot avance hacia el frente por un determinado periodo de tiempo, indicado por la pausa del comando delay. Mientras que es bueno que nosotros no tengamos que revisar manualmente en qué sentido es hacia al frente para cada servo de manera individual, el problema surge cuando los servos están montados en forma de ‘espejo’ uno con respecto al otro, notaremos que ambos están rotando en la misma dirección (manecillas del reloj) si se envía el mismo valor (0) para el comando write. Sin embargo, como los servos están montados en forma de espe jo e invertidos, uno de los servos (en este caso, el servo derecho) gira el robot hacia atrás. Como tal cuando enviamos a ambos servos la misma señal, uno moverá el robot hacia al frente y otro lo moverá hacia atrás, resultando en que el robot gire sobre su propio eje. www.smartcubo.com 1 Enviando distintos valores de movimiento a los servos se invertirá la “dirección” del movimiento del servo izquierdo, permitiendo que se mueva el robot en línea recta hacia el frente. Programando el Comportamiento Por ahora nosotros sólo queremos que nuestro robot avance al frente por dos segundos, se detenga por un segundo, se mueva hacia atrás por dos segundo, después se detenga por otro segundo. Queremos que el robot haga esto indefinidamente por eso empezaremos por colocar un ciclo loop (infinito). Controlando los Servos Para controlar un servo, en este caso el servo que mueve el lado izquierdo, utilizaremos el siguiente comando write Donde iAvanceServoRight es un valor tipo entero (0 a 180). Cuando lo usamos con un motor (servo de rotación continua), este comando es utilizado para fijar la velocidad ( 0 a 180), donde los valores entre 90 y 180 indican que el motor se mueve en reversa; los valores entre 0 y 90 indican que el motor se mueve hacia al frente y el 90 que el motor se encuentra detenido. Noventa es la posición “central” del servo, y 0 a 180 es el rango del servo. Experimentemos con valores más pequeños a los límites para verificar el movimiento de los servos y evitar romperlos. Para activar los servos recordemos que debemos utilizar el valor 0 y 180 para el servo derecho e izquierdo respectivamente. Haciendo que los servos se muevan hacia el frente Para hacer que el robot avance hacia el frente, necesitamos fijar ambos servos para que avancen al frente a la misma velocidad. Fijando ambos servos al nivel de poder correspondiente y añadiendo un tiempo de espera de 2 segundos se completará la primera parte de nuestra meta: Al colocar este código dentro del ciclo loop, el robot solamente continuaría avanzando hacia el frente. Esto es porque el código se mantendría iterando sobre el ciclo sin ningún código que hiciera que se detuviera. www.smartcubo.com 2 Deteniendo los servos Como necesitamos hacer que el robot se detenga por un segundo, necesitamos fijar ambos servos a velocidad 90 y contar con un comando delay de un segundo. Podemos utilizar una versión modificada del código previo cambiando el nivel de poder de cada servo a “90” y el valor de 2000 ms del comando delay a 1000 ms: Haciendo que los servos se muevan en reversa Tenemos segmentos de código para hacer que el robot se mueva hacia el frente por dos segundos y que se detenga por un segundo. Sin embargo, seguimos necesitando el código para hacer que el robot vaya hacia atrás por dos segundos. Para hacer esto, podemos nuevamente utilizar el código para avanzar hacia el frente, pero ahora fijaremos los servos a un valor contrario al indicado para hacerlos avanzar hacia el frente, de tal forma que el robot se mueva hacia atrás. Uniendo todos los bloques Ahora tenemos los bloques de código para hacer que el robot se mueva hacia el frente por dos segundos, se detenga por un segundo, y se mueva en reversa por dos segundos. Sin embargo, necesitamos colocar los bloques juntos para ir hacia el frente, se detenga, se mueva en reversa, se detenga y repita las acciones. Entonces lo que necesitamos hacer es colocar el comportamiento del código de arriba en el siguiente programa. www.smartcubo.com 3 Una vez que todo está organizado y se han juntado los bloques de código, terminaremos con algo como esto: www.smartcubo.com 4 Nota: debido al diseño del Parallax BoeBot, necesitaremos mover el switch a la posición 2 para que los servos funcionen. www.smartcubo.com 5 Realicemos las siguientes pruebas: ¿Qué sucede si disminuyo el nivel de poder de los motores cuando avanza hacia el frente? a. El avance sigue siendo igual. b. La distancia que el robot avanza en reversa es mayor. c. El robot avanza una mayor distancia. El comando delay permite que nuestro robot… a. Pueda avanzar hacia el frente o en reversa. b. Se detenga. c. Haga una pausa entre instrucciones. ¿Qué pasa si duplicamos todos los valores de los comandos delay utilizados en nuestro programa? a. Nuestro robot avanza al frente y en reversa más lento. b. Los desplazamientos hacia el frente y hacia atrás, y el tiempo que se queda detenido el robot son mayores. c. El robot se queda detenido y no se mueve. d. Todo sigue igual. www.smartcubo.com 6 Comandos utilizados en esta actividad. write servo.write(int ángulo) (int) Ángulo de desplazamiento del servo. Envía un valor al servo, controlando el eje de acuerdo al valor. En un servo estándar, esto fijará el ángulo del eje (en grados), moviendo el eje en esa dirección. En un servo de rotación continua, este valor establecerá la velocidad del servo (siendo 0 la velocidad máxima de movimiento en una dirección, 180 siendo la velocidad máxima de movimiento en la dirección contraria y el valor de 90 indicando que el servo se detenga). Parámetro servo ángulo Explicación Una variable de tipo servo Valor que se envía al servo, de 0 a 180 www.smartcubo.com Tipo de Dato Servo Entero 7