Paso 4

Poco a poco vamos entrando en materia. En este paso vamos a conectar, ajustar y probar los motores del robot. Para ello necesitaremos comprender ciertos comandos del lenguaje PBASIC y unas técnicas de programación que determinarán la dirección, velocidad y duración del movimiento de los servomotores (llamados también servos).

Los motores del Boe-Bot

Los servos de rotación continua que vamos a emplear son los que aparecen en las siguientes imágenes:

Los servomotores estándar se diferencian de los de giro continuo en que éstos últimos pueden girar de forma continua en los dos sentidos, mientras que los primeros sólo giran 270o. Los servos estándar se han diseñado para recibir señales electrónicas que les dicen qué posición concreta mantener. En cambio, las señales que reciben los servos de rotación continua les dicen qué velocidad y dirección deben seguir, lo que los convierten en ideales para controlar ruedas y poleas (aquí dejo un tutorial para convertir un servo estándar en uno de rotación continua como una buena manera de conocer mejor el funcionamiento de ambos).

Primera tarea: medición del tiempo y control de repeticiones

Para controlar la velocidad de un servo y su dirección se requiere un programa que haga que el microcontrolador envíe el mismo mensaje de forma continua (las señales deben repetirse unas 50 veces por segundo para que el servo mantenga su velocidad y dirección). Para lograrlo, vamos a escribir varios programas de ejemplo en PBASIC que muestran cómo repetir la misma señal una y otra vez y controlar la duración de la misma.

En el paso 2, y con más detalle en el paso 3, aprendimos el funcionamiento del comando PAUSE que indica al microcontrolador que debe esperar un tiempo determinado antes de ejecutar el siguiente comando. Como recordarán, el formato es:

PAUSE duración

El valor del parámetro duración establece el tiempo de espera en milisegundos (por lo tanto, si queremos que el microcontrolador espere un segundo deberemos utilizar como valor 1000).

Vamos a utilizar un sencillo programa para comprobar otras funciones de este comando:

  1. ‘ Tercer programa de prácticas del robot Boe-Bot. Tercerprograma.bs2
  2. ‘ Mostrar cómo el comando PAUSE permite visualizar mensajes
  3. ‘ controlando el tiempo transcurrido
  4. ‘ {$STAMP BS2}
  5. ‘ {$PBASIC 2.5}
  6. DEBUG “Inicio…”
  7. PAUSE 1000
  8. DEBUG CR, “Ha transcurrido un segundo”
  9. PAUSE 2000
  10. DEBUG CR, “Han transcurrido tres segundos”
  11. DEBUG CR, “Fin”
  12. END

Es conveniente que tengamos en cuenta que el valor máximo de duración para el comando PAUSE es 65535 (poco más de un minuto y cinco segundos).

Uno de los motivos por los que son tan útiles un ordenador y un microcontrolador es que pueden hacer una y otra vez las mismas cosas aburridas sin quejarse. Vamos a ver el ejemplo de un programa que hace que se repita la misma operación constantemente. Para ello emplearemos los comandos DO y LOOP:

  1. ‘ Cuarto programa de prácticas del robot Boe-Bot. Cuartoprograma.bs2
  2. ‘ Visualizar un mensaje por segundo
  3. ‘ {$STAMP BS2}
  4. ‘ {$PBASIC 2.5}
  5. DO
  6. DEBUG “Hola!”, CR
  7. PAUSE 1000
  8. LOOP

Con la estructura del lenguaje PBASIC formada por DOLOOP se puede repetir de forma indefinida la secuencia de instrucciones que se encuentra entre dichos comandos.

También se puede modificar el programa de forma que parte de él se ejecute una sola vez y otra parte se ejecute varias veces:

  1. DEBUG “Hola!”
  2. DO
  3. DEBUG “!”
  4. PAUSE 1000
  5. LOOP

Segunda tarea: comando de control del servo

Antes de explicar los comandos que controlan los servos, necesitamos saber qué es un diagrama de tiempos porque lo emplearemos a menudo para representar la relación entre los niveles alto (HIGH — Vdd) y bajo (LOW — Vss) y el tiempo de duración de cada uno de esos estados (ya vimos la utilidad de los comandos HIGH y LOW en el paso anterior).

En el diagrama, el tiempo se representa de forma creciente de izquierda a derecha:

Este diagrama muestra un tren de pulsos de un segundo de duración en el que se envía un nivel alto durante medio segundo, y uno bajo durante otro medio segundo. Esto puede representar, por ejemplo, el encendido de un led durante medio segundo y su apagado durante otro medio segundo de forma reiterada (la línea de puntos de la derecha indica que la señal se repite continuamente).

Los niveles lógicos altos y bajos que genere el programa de control de giro de los servos deben durar una cantidad muy concreta de tiempo. Esto es así porque el circuito electrónico que gobierna los servos mide la cantidad de tiempo que una señal permanece alta y la usa como si se tratase de una instrucción para girar. Para controlar con precisión el giro, el tiempo que esas señales permanecen altas tiene que ser mucho más exacto de lo que se puede conseguir utilizando los comandos HIGH y PAUSE. En el caso del comando PAUSE, como hemos visto, sólo se puede controlar su parámetro duración con pasos de 1 ms.

Sin embargo, para una mayor precisión hay un comando diferente: PULSOUT, que proporciona señales de nivel alto durante periodos de tiempo muy pequeños (en este caso, su parámetro duración se expresa en valores de unidades de 2 millonésimas de segundo). Se escribe:

PULSOUT pin, duración

Tercera tarea: conexión de los servos

Vamos a montar los servos y los conectaremos a unas baterías de alimentación así como a la tarjeta. Emplearemos circuitos LED para controlar las señales que el microcontrolador envíe a los servos para determinar su movimiento ya que de esta forma las señales también iluminarán los LED.

En primer lugar, debemos asegurarnos que el interruptor de energía de la tarjeta está en la posición “0” de apagado.

La siguiente imagen muestra el lugar donde se conectan los servos. Pueden observar como entre los conectores X4 y X5 hay tres pines con una leyenda en la parte superior (Vdd) y otra en la inferior (Vin). Dos de estos pines aparecen conectados por un puente. En la imagen vemos cómo el puente está colocado en la posición superior (Vdd) así que tendremos que cambiarlo a la posición (Vin) ya que vamos a utilizar un bloque de 4 pilas como fuente de energía (los servos consumen bastante intensidad por lo que es recomendable utilizar pilas potentes y recargables):

Extraerlo es muy sencillo, basta utilizar unas pinzas para sacar el puente de su lugar. Luego lo insertaremos de nuevo a presión en la posición inferior:

Bien, una vez solucionado el tema de la alimentación, ya podemos conectar los servos como se muestra en las siguientes imágenes:

Importante: tengamos en cuenta que de los servos parten tres cables: el blanco se conecta a cualquiera de los conectores P12 o P13, el rojo a la toma Vin y el negro a la toma de tierra (Vss).

Como hemos indicado al inicio, montaremos el siguiente circuito LED para visualizar las señales que se envíen a los servos y comprobar que todo funciona correctamente:

Cuarta tarea: ajustando los servos

Vamos a ejecutar un programa que enviará una señal a los servos que les obligará a permanecer parados. Como los servos, por lo general, no vienen ajustados de fábrica, cuando se aplica la señal de “paro” es posible que mantengan un ligero movimiento que hay que eliminar (esta operación recibe el nombre de “centrar” los servos). Para realizar el ajuste emplearemos un destornillador con punta de estrella.

El siguiente diagrama muestra la señal que se enviará para calibrar los servos. Es la señal de centrado y consiste en una serie de pulsos de 1,5 ms de duración, con una pausa entre cada uno de ellos de 20 ms, que generaremos con el comando PULSOUT que ya hemos visto:

Los servos están preparados para permanecer detenidos cuando se les envía un pulso de 1,5 ms, así que daremos al comando PULSOUT un parámetro duración con valor 750 (recordemos que 1,5 milisegundos son 0,0015 segundos, por lo que al expresarse el valor del parámetro duración en unidades de 2 millonésimas de segundo, la cifra que tendremos que darle tendrá que ser el cociente entre ambas:

Es conveniente ajustar los servos de uno en uno ya que así podremos escuchar si el que estamos probando se está moviendo ligeramente. El siguiente programa va a ajustar el servo conectado a P12, cuando terminemos la operación, bastará cambiar a P13 para repetir el procedimiento con el otro servo:

  1. ‘ Programa de centrado de servo. Centradoservo.bs2
  2. ‘ Este programa envía un pulso de 1,5 ms al servo conectado a
  3. ‘ P12 para el centrado manual
  4. ‘ {$STAMP BS2}
  5. ‘ {$PBASIC 2.5}
  6. DO
  7. PULSOUT 12, 750
  8. PAUSE 20
  9. LOOP

Antes de cargar y ejecutar el programa deberemos encender la placa colocando el interruptor en la posición “2”, que es la que entrega energía a los servos. Una vez ejecutado el programa comprobaremos que el LED de monitorización conectado a P12 se enciende, lo que indica que se están transmitiendo pulsos al servo. Si el servo no está bien ajustado (lo más probable), su aspa comenzará a girar y oiremos el motor interno haciendo ruido.

Es posible que el servo no gire en absoluto. Esto puede significar que, o bien está ajustado de fábrica, o que está dañado o defectuoso. Más tarde realizaremos una comprobación antes de que instalemos los servos en el chasis del robot para verificar que el servo funciona correctamente.

Bien, esto es lo que debemos hacer:

Acto seguido repetiremos el proceso con el servo conectado a P13.

 

Quinta tarea: registrando valores y contando

Vamos a aprender qué son las variables y a utilizarlas en los programas para almacenar valores. Todos los programas que vamos a necesitar a partir de ahora utilizarán en gran medida las variables. La utilidad más importante cuando se guardan variables es que permite que el programa las use para contar. De esta forma podremos controlar el número de veces que se repiten las cosas.

Antes de que podamos usar una variable en lenguaje PBASIC, debemos nombrarla y establecer su tamaño, esto es lo que se llama “declarar” la variable:

Nombrevariable VAR tamaño

Podemos declarar cuatro tamaños diferentes:

Bit ― 0 a 1

Nib ― 0 a 15

Byte ― 0 a 255

Word ― 0 a 65535

Una vez declarada una variable, podemos inicializarla, es decir, podemos asignarle un valor inicial (si no lo hacemos el programa comenzará automáticamente almacenando el número 0 que es el valor por defecto):

valor = 500

otro_valor = 2000

El símblo «=» es un operador. Podemos utilizar distintos para realizar operaciones matemáticas y como por ejemplo, multiplicar «*»:

valor = 10 * valor

Programa de ejemplo: variablesymatemáticassimples.bs2

Este programa muestra la forma de declarar variables, inicializarlas y realizar algunas operaciones con ellas:

  1. ‘ Programa de declaración de variables. Variablesymatemáticassimples.bs2
  2. ‘ Declara variables que se emplean en diversos cálculos matemáticos
  3. ‘ {$STAMP BS2}
  4. ‘ {$PBASIC 2.5}
  5. valor VAR Word ‘Declaración de variables
  6. otrovalor VAR Word
  7. valor = 500 ‘Inicialización de variables
  8. otrovalor = 2000
  9. DEBUG ? valor ‘Visualiza valores
  10. DEBUG ? otrovalor
  11. valor = 10 * otrovalor ‘Cálculo matemático
  12. DEBUG ? valor ‘Visualiza resultados
  13. DEBUG ? otrovalor
  14. END

Conteo y control de repeticiones

La manera más adecuada de controlar el número de veces que se ejecuta un fragmento de código de programa es utilizando el bucle FOR…NEXT. Su sintaxis es la que sigue:

FOR contador = valorinicial TO valorfinal {STEP valorincremento}…NEXT

Los puntos suspensivos se sustituyen por el comando o comandos que deseamos repetir. Debemos declarar previamente las variables «contador» (esta variable la podemos llamar como queramos), «valorinicial» y «valorfinal» que pueden ser tanto números como variables o, incluso, una expresión (que veremos más adelante). Cuando veamos algo entre llaves { } en una descripción de la sintaxis de una instrucción, significa que es un parámetro opcional.

Programa de ejemplo: contarhastadiez.bs2

  1. ‘ Programa de cuenta. contarhastadiez.bs2
  2. ‘ Empleo de una variable en un bucle FOR…NEXT
  3. ‘ {$STAMP BS2}
  4. ‘ {$PBASIC 2.5}
  5. contador VAR Word
  6. FOR contador = 1 TO 10
  7. DEBUG ? contador
  8. PAUSE 500
  9. NEXT
  10. DEBUG CR, «He acabado!»
  11. END

Como vemos, lo que hace el programa es contar hasta diez. Si modificamos los valores inicial y final, por ejemplo, colocando como valor inicial un 9 y valor final un 1, lo que veremos será una cuenta atrás ya que el valor inicial es mayor que el final.

Del mismo modo, el parámetro STEP hace que el bucle cuente por pasos: en vez de números seguidos, podemos hacer que cuente de dos en dos, o de cien en cien según el valor que le demos:

  1. FOR contador = 100 TO 1 STEP 10
  2. DEBUG ? contador
  3. PAUSE 500
  4. NEXT

Sexta tarea: comprobando los servos

Antes de montar los servos en el robot debemos comprobar que responden correctamente. Para ello vamos a ejecutar un programa que enviará señales de giro a los servos en diferentes direcciones y a diferentes velocidades.

Control de la velocidad y la dirección

El circuito electrónico que gobierna el servo está preparado para que cuando reciba impulsos de 1,3 ms de duración cada 20 ms haga girar el eje del motor en el sentido de las agujas del reloj y a la máxima velocidad (oscila entre 50 y 60 revoluciones por minuto, RPM). Cuando se aumenta la duración del impulso de 1,3 ms a 1,5 ms la velocidad de giro decrece hasta que se para el motor. Cuando se aplica al servo un impulso de 1,7 ms de duración cada 20 ms, el eje del motor gira en sentido antihorario y a máxima velocidad. Cuando se reduce la duración del impulso a 1,5 ms decrece la velocidad de giro hasta detenerse.

Un esquema general de los impulsos necesarios para el movimiento del servo sería el siguiente:

Veamos los programas que controlan el giro:

Programa de ejemplo: servoP12sentidohorario.bs2

  1. ‘ Programa de control de servo. ServoP12sentidohorario.bs2
  2. ‘ Activa el servo P12 a velocidad máxima en sentido horario
  3. ‘ {$STAMP BS2}
  4. ‘ {$PBASIC 2.5}
  5. DO
  6. PULSOUT 12, 650
  7. PAUSE 20
  8. LOOP

Basta con realizar cambios en los parámetros de duración para hacer que los servos giren en un sentido o en el otro, o hacer que uno de ellos lo haga en sentido horario y el otro en el sentido antihorario. El que cada servo gire en diferente dirección es de gran importancia ya que una vez montados, ambos servos se encuentran enfrentados, por lo que si giran en el mismo sentido el robot no dejará de dar vueltas sobre su propio eje. Para que el robot avance en la misma dirección, cada uno de los servos deberá girar en un sentido distinto y a la misma velocidad:

Programa de ejemplo: P12horarioP13antihorario.bs2

  1. ‘ Programa de control de los servos. P12horarioP13antihorario.bs2
  2. ‘ Mueve el servo P12 a velocidad máxima en sentido horario
  3. ‘ Mueve el servo P13 a velocidad máxima en sentido antihorario
  4. ‘ {$STAMP BS2}
  5. ‘ {$PBASIC 2.5}
  6. DO
  7. PULSOUT 12, 650
  8. PULSOUT 13, 850
  9. PAUSE 20
  10. LOOP

Control del tiempo que gira el servo

Ya conocemos la forma de controlar la velocidad de giro y la dirección del servo, lo único que nos falta es determinar el tiempo que permanece girando. Para ello emplearemos el bucle FOR…NEXT:

  1. FOR contador = 1 TO 100
  2. PULSOUT 13, 850
  3. PAUSE 20
  4. NEXT

Para calcular el tiempo de forma adecuada necesitamos saber la cantidad exacta de tiempo que tarda el código en hacer que el servo gire. Cada vez que se recorre el bucle, el comando PULSOUT tarda 1,7 ms en ejecutarse, el comando PAUSE tarda 20 ms y el bucle en sí mismo tarda unos 1,3 ms en ejecutarse. Por lo tanto, un ciclo completo se completa en 23 ms o, lo que es lo mismo, en 0,023 segundos.

Ya que según el ejemplo anterior el bucle se ejecuta 100 veces, tardará 2,3 segundos en llevarse a cabo.

Programa de ejemplo: Controltiempofuncionamientoservo.bs2

  1. ‘ Programa de control de los servos. Controltiempofuncionamientoservo.bs2
  2. ‘ Mueve el servo P13 durante 2,3 s a velocidad máxima en sentido
  3. ‘ antihorario. A continuación, mueve el servo P12 el doble de tiempo
  4. ‘ {$STAMP BS2}
  5. ‘ {$PBASIC 2.5}
  6. contador VAR Byte
  7. FOR contador = 1 TO 100
  8. PULSOUT 13, 850
  9. PAUSE 20
  10. NEXT
  11. FOR contador = 1 TO 100
  12. PULSOUT 12, 850
  13. PAUSE 20
  14. NEXT
  15. END

Veamos un vídeo que resume lo hecho hasta ahora:







2 pensamientos en “Paso 4

Deje un comentario