Paso 5.3

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.

  1. ‘ Programa de control de velocidad. Pruebavelocidadservo.bs2
  2. ‘ Introducir la amplitud del pulso y contar el número de vueltas
  3. ‘ que gira la rueda durante 6 segundos. Multiplicando por 10
  4. ‘ este valor conocemos las revoluciones por minuto (RPM)
  5. ‘ {$STAMP BS2}
  6. ‘ {$PBASIC 2.5}
  7. counter                       VAR       Word
  8. pulseWidth                 VAR       Word
  9. pulseWidthComp       VAR       Word
  10. FREQOUT 4, 2000, 3000                ‘ señal de inicio/reinicio
  11. DO
  12.                 DEBUG “Indicar la amplitud del pulso:”
  13.                 DEBUGIN DEC pulseWidth
  14.                 pulseWidthComp = 1500 – pulseWidth
  15.                 FOR counter = 1 TO 244
  16.                                PULSOUT 12, pulseWidth
  17.                                PULSOUT 13, pulseWidthComp
  18.                                PAUSE 20
  19.                 NEXT
  20. 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

  1. Haremos una pequeña marca en la rueda del robot para tener un punto de referencia.
  2. Colocamos el interruptor de encendido del robot en la posición “2” (que envía energía a los servos).
  3. Ejecutar el programa Pruebavelocidadservo.bs2
  4. Introducir el valor 650 en el panel de transmisión del terminal DEBUG y pulsar ENTER
  5. 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).
  6. Escribimos el valor en la tabla que reproducimos más abajo junto a la celda de 1300 ms.
  7. Introducir el valor 655.
  8. Contar las vueltas que da la rueda.
  9. Multiplicar el valor por 10 y escribirlo junto al valor 1310 ms de la tabla.
  10. Ir incrementando los valores de 5 en 5 (0,01 ms) hasta llegar a 850 (1700 ms).
  11. 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…NEXTpulseWidth para los comandos DEBUGIN 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.







Deje un comentario