Probando el control de velocidad del robot
En este paso de comprobación vamos a dibujar las curvas que relacionan la velocidad de giro de los servos con la amplitud de los pulsos que se aplican desde la tarjeta Home Work. Este gráfico nos resultará muy útil ya que cuando queramos obtener una velocidad concreta de las ruedas del robot sólo tendremos que consultar éste para saber la amplitud del pulso que se debe aplicar a cada una. Para ello vamos a utilizar el panel de transmisión del terminal DEBUG del programa de edición para enviar valores al programa de ejecución de la tarjeta.
Empleo del comando DEBUGIN
Ya hemos visto en anteriores ocasiones que gracias al comando DEBUG se visualizan los mensajes en la pantalla del ordenador que manda la tarjeta al ejecutar un programa determinado. El terminal DEBUG del programa de edición Basic Stamp también tiene una ventana de transmisión que nos permite enviar información al microcontrolador mientras se está ejecutando un programa. Esto lo hacemos a través del comando DEBUGIN, que toma el valor que introducimos con el teclado y lo envía al programa que está ejecutando la tarjeta para que una o más variables queden fijadas por dicho valor. Es decir, con este comando se introducen valores de variables que se usan en los programas de la tarjeta Home Work.
En el siguiente programa de ejemplo, utilizaremos la variable pulseWidth (amplitud de pulso) para almacenar los valores que el comando DEBUGIN recibe. Evidentemente, tendremos que declarar previamente esta variable al programa
pulseWidth VAR Word
Ahora, el comando DEBUGIN captura los valores decimales que introducimos con el teclado a través del panel de transmisión y los almacena en la variable pulseWidth:
DEBUGIN DEC pulseWidth
De esta forma podemos programar el microcontrolador para que use este valor. En el siguiente ejemplo se utiliza la variable pulseWidth como el argumento Duración del comando PULSOUT:
PULSOUT 12, pulseWidth
Programa ejemplo
Este programa nos va a permitir establecer el argumento Duración del comando PULSOUT introduciéndolo a través del panel de transmisión del terminal DEBUG del programa de edición.
- ‘ Programa de control de velocidad. Pruebavelocidadservo.bs2
- ‘ Introducir la amplitud del pulso y contar el número de vueltas
- ‘ que gira la rueda durante 6 segundos. Multiplicando por 10
- ‘ este valor conocemos las revoluciones por minuto (RPM)
- ‘ {$STAMP BS2}
- ‘ {$PBASIC 2.5}
- counter VAR Word
- pulseWidth VAR Word
- pulseWidthComp VAR Word
- FREQOUT 4, 2000, 3000 ‘ señal de inicio/reinicio
- DO
- DEBUG “Indicar la amplitud del pulso:”
- DEBUGIN DEC pulseWidth
- pulseWidthComp = 1500 – pulseWidth
- FOR counter = 1 TO 244
- PULSOUT 12, pulseWidth
- PULSOUT 13, pulseWidthComp
- PAUSE 20
- NEXT
- LOOP
Nota importante: cuando en un programa se definen variables, tanto el tipo como la dirección hay que colocarlas alineadas para su correcta ejecución.
Pasos a seguir
- Haremos una pequeña marca en la rueda del robot para tener un punto de referencia.
- Colocamos el interruptor de encendido del robot en la posición “2” (que envía energía a los servos).
- Ejecutar el programa Pruebavelocidadservo.bs2
- Introducir el valor 650 en el panel de transmisión del terminal DEBUG y pulsar ENTER
- Contar las vueltas que da la rueda izquierda (el servo habrá girado durante 6 segundos en el sentido de las agujas del reloj, por lo que si multiplicamos el número de vueltas por 10 obtendremos el número de RPM).
- Escribimos el valor en la tabla que reproducimos más abajo junto a la celda de 1300 ms.
- Introducir el valor 655.
- Contar las vueltas que da la rueda.
- Multiplicar el valor por 10 y escribirlo junto al valor 1310 ms de la tabla.
- Ir incrementando los valores de 5 en 5 (0,01 ms) hasta llegar a 850 (1700 ms).
- Repetir el proceso para el otro servo (para ello tendremos que modificar el comando PULSOUT del programa de forma que los pulsos se envíen a P12).
¿Cómo trabaja el programa?
Se declaran tres variables: counter para el bucle FOR…NEXT, pulseWidth para los comandos DEBUGIN y PULSOUT, y pulseWidthComp, que almacena un valor que se usa en un segundo comando PULSOUT.
counter VAR Word
pulseWidth VAR Word
pulseWidthComp VAR Word
El commando FREQOUT (como vimos en el paso 5.2) lo utilizamos para indicar mediante un pitido del zumbador que el programa se ha iniciado.
El resto del programa se incluye dentro del bucle DO…LOOP lo que indica que se ejecutará una y otra vez. El programa le pide al operador del terminal DEBUG (nosotros) que introduzcamos un valor decimal que determinará la duración del pulso que se va a guardar en la variable pulseWidth. Para lograr una medición del tiempo más exacta se envían dos comandos PULSOUT cuyos argumentos Duración sumarán 1500 entre los dos
pulseWidthComp = 1500 – pulseWidth
Así se consigue que el bucle FOR…NEXT tarde siempre el mismo tiempo en ejecutarse independientemente del valor del argumento Duración que hayamos introducido y, por tanto, que las mediciones de las RPM que hagamos sean más exactas. Este bucle FOR…NEXT envía pulsos al servo izquierdo (P12) durante 6 segundos. El valor de la variable pulseWidthComp se envía al servo derecho (P13), haciendo que gire en la dirección contraria.
En el paso 4 vimos cómo se calculaba el tiempo: recordemos que el argumento Duración del comando PULSOUT se expresa en unidades de 2 millonésimas de segundo por lo que un valor de 650 envía pulsos de 1,3 ms de duración (a lo que es lo mismo 1300 ms).
Con los datos que vayamos obtenido vamos a completar la siguiente tabla para obtener nuestra propia curva de transferencia (debemos tener en cuenta que nuestro programa de ejemplo controla la rueda izquierda con los valores que introducimos. La rueda derecha gira en dirección contraria).
Con la idea de facilitarles el trabajo he creado la tabla en formato excel para manejar mejor los datos y poder trasladarlos luego a cualquier programa de generación de gráficos. Puede descargarse aquí (la contraseña para abrirla es “afanporsaber”).
Una vez completada la tabla para la rueda izquierda, debemos modificar el comando PULSOUT para enviar el pulso a la rueda derecha, cambiando los parámetros como se indica
PULSOUT 13, pulseWidth
PULSOUT 12, pulseWidthComp
realizando a continuación las mismas mediciones.
Debemos tener en cuenta que los valores positivos de RPM se dan cuando la rueda gira en el sentido de las agujas del reloj, mientras que los valores negativos indican un giro de las ruedas en sentido antihorario. Recordar igualmente que, dada la disposición de los servos, para que el robot ande hacia adelante la rueda derecha tendrá que girar en sentido de las agujas del reloj, mientras que la izquierda en sentido antihorario.