En este nuevo paso de la construcción del robot, vamos a comprobar que las conexiones eléctricas entre la tarjeta y los servos son correctas. Es preciso que nos aseguremos de que el servo de la derecha gira cuando recibe señales procedentes de P13 y que el servo de la izquierda hace lo propio cuando recibe señales de P12 según el montaje realizado en el paso anterior.
En la siguiente imagen vemos nuestro robot con las indicaciones de posición que se seguirán de ahora en adelante para evitar confusiones:
5.1 Comprobando el funcionamiento de las ruedas
Vamos a ejecutar un sencillo programa para probar el servo conectado a la rueda derecha. Hará que la rueda gire en la dirección de las agujas del reloj durante 3 segundos, parará durante un segundo y, después, girará en sentido contrario durante otros 3 segundos.
- ‘ Programa de prueba de servos. Pruebaservoderecho.bs2
- ‘ El servo derecho gira en sentido horario 3s, se para 1s
- ‘ y vuelve a girar 3s en sentido antihorario
- ‘ {$STAMP BS2}
- ‘ {$PBASIC 2.5}
- Counter VAR Word
- FREQOUT 4, 2000, 3000 ‘señal de inicio/reset
- FOR counter = 1 TO 122 ‘giro horario durante 3s
- PULSOUT 13, 650
- PAUSE 20
- NEXT
- FOR counter = 1 TO 40 ‘parada 1s
- PULSOUT 13, 750
- PAUSE 20
- NEXT
- FOR counter = 1 TO 122 ‘giro antihorario durante 3s
- PULSOUT 13, 850
- PAUSE 20
- NEXT
- END
Para ponerlo en marcha, cargaremos el programa en el editor de Basic Stamp y lo introduciremos en la tarjeta del robot como hemos visto en pasos anteriores. Acto seguido colocamos el interruptor de energía en la posición 2 (que alimenta los servos) y ejecutamos el programa.
Los mismos pasos daremos con el servo de la rueda izquierda:
- ‘ Programa de prueba de servos. Pruebaservoderecho.bs2
- ‘ El servo derecho gira en sentido horario 3s, se para 1s
- ‘ y vuelve a girar 3s en sentido antihorario
- ‘ {$STAMP BS2}
- ‘ {$PBASIC 2.5}
- Counter VAR Word
- FREQOUT 4, 2000, 3000 ‘señal de inicio/reset
- FOR counter = 1 TO 122 ‘giro horario durante 3s
- PULSOUT 12, 650
- PAUSE 20
- NEXT
- FOR counter = 1 TO 40 ‘parada 1s
- PULSOUT 12, 750
- PAUSE 20
- NEXT
- FOR counter = 1 TO 122 ‘giro antihorario durante 3s
- PULSOUT 12, 850
- PAUSE 20
- NEXT
- END
Vemos cómo la única diferencia entre estos dos programas es que hemos sustituido el punto de enganche del servo derecho (P13) por el servo izquierdo (P12) en el segundo programa.
Ahora vamos a comprobar como el robot se mueve según las indicaciones de la programación: la rueda derecha girará en sentido horario durante tres segundos, se detendrá un segundo, y volverá a girar en sentido antihorario otros 3 segundos (lo mismo sucederá con la rueda izquierda).
5.2 Detector acústico de baja tensión y reinicio
Cuando el suministro de voltaje eléctrico cae por debajo del nivel que el dispositivo necesita para funcionar correctamente se produce un apagón parcial. La tarjeta se protege a sí misma de esta situación haciendo que el procesador y los microchips de memoria permanezcan en estado de reposo hasta que el suministro de energía vuelva a niveles normales.
Una bajada de tensión en Vin por debajo de 5,2 V provoca un voltaje inferior a 4,3 V en el regulador interno de la tarjeta, valor insuficiente que origina una anomalía y que provoca, como hemos señalado, que se ponga en marcha un mecanismo de autoprotección del sistema en el que tanto el procesador como la memoria pasan a un estado de reposo que detiene la ejecución de instrucciones. Cuando el voltaje vuelve a niveles adecuados, la tarjeta se pone en funcionamiento de nuevo pero no donde había quedado ejecutándose el programa, sino desde el principio del mismo. Es lo mismo que sucede cuando pulsamos el botón de reinicio del sistema.
Cuando las baterías están bajas, es posible que estas bajadas de tensión hagan reiniciarse al robot cuando menos lo esperamos, haciendo que tome direcciones erróneas, dé vueltas sobre sí mismo etc.
Esto hace que un programa que indique la posibilidad de reinicio del robot sea muy útil (de esta forma sabemos claramente cuál ha sido la causa del funcionamiento incorrecto de nuestro robot). Una forma para avisar de un posible reinicio es incluir una señal inconfundible al comienzo de todos los programas del robot. La señal se produce cada vez que se conecta el suministro de energía y cuando se produce un reinicio debido a una bajada de tensión.
En este ejercicio vamos a colocar un dispositivo llamado zumbador piezoeléctrico que se puede usar para generar diferentes tonos en función de la frecuencia de las señales que se envíen desde la tarjeta.
El programa que vamos a cargar a continuación produce un pitido a través del zumbador. Utiliza el comando FREQOUT para enviar las señales de la frecuencia que se deseemos por una patita de la tarjeta. Su sintaxis es como sigue:
FREQOUT Pin, duración, frecuencia1, {Frecuencia2
Un ejemplo sería FREQOUT 4, 2000, 3000: envía una señal de 3000 hercios (3 kHz) durante 2000 ms (2 segundos) por el pin 4.
En este punto debemos tener presente que la frecuencia es una magnitud que mide el número de repeticiones por unidad de tiempo de cualquier fenómeno o suceso periódico. Nuestro zumbador funciona gracias a la piezoelectricidad: es un fenómeno presentado por determinados cristales que al ser sometidos a tensiones mecánicas adquieren una polarización eléctrica en su masa, apareciendo una diferencia de potencial y cargas eléctricas en su superficie. Este fenómeno también se presenta a la inversa, esto es, se deforman bajo la acción de fuerzas internas al ser sometidos a un campo eléctrico. El efecto piezoeléctrico es normalmente reversible: al dejar de someter los cristales a un voltaje exterior o campo eléctrico, recuperan su forma.
De esta forma, cuando aplicamos cambios de voltaje a gran velocidad hacemos que el cristal piezoeléctrico cambie de forma rápidamente. Esto provoca una vibración. Los objetos que vibran hacen que el aire que los rodea vibre también, y esta vibración es lo que nuestros oídos detectan como sonido y tonos.
La frecuencia se mide en hercios (Hz). Un hercio representa un ciclo por cada segundo, entendiendo ciclo como la repetición de un suceso. De esta forma, un kHz representa mil ciclos por segundo.
Más abajo se muestra el símbolo del zumbador y el esquema de conexión del terminal positivo del zumbador a la patita P4 de E/S.
Para el montaje tomamos el zumbador y lo colocamos sobre la tarjeta. Vemos que una pegatina indica cuál de las dos patas es de signo positivo así que solo tenemos que presionar y listo. Para dejar más espacio para el resto de componentes, y dado que este elemento quedará fijo de forma permanente, es mejor colocarlo lo más esquinado posible.
Una vez colocado, sólo tenemos que realizar la conexión de los cables, uno conectando el polo positivo del zumbador a P4 (cable azul) y el otro al conector de energía (Vss)
Programa ejemplo
El siguiente programa emite un pitido del zumbador al iniciarse su ejecución y luego envía mensajes visualizadores de DEBUG cada medio segundo dentro de un bucle infinito. Se puede simular una bajada de tensión presionando el botón de reinicio o bien desconectando la batería del robot; entonces el programa se reiniciará, emitiendo un pitido de nuevo. Cada vez que se produce un pitido sabemos que el programa se ha iniciado desde el principio.
- ‘ Programa de reinicio. Indicadorinicioreinicio.bs2
- ‘ Prueba del altavoz piezoeléctrico.
- ‘ {$STAMP BS2}
- ‘ {$PBASIC 2.5}
- DEBUG CLS, “Beep!!!” ‘visualiza el mensaje mientras suena
- FREQOUT 4, 2000, 3000 ‘señal sonora
- DO ‘bucle DO…LOOP
- DEBUG CR, “Esperando el reinicio” ‘visualiza el mensaje
- PAUSE 5000 ‘cada medio Segundo
- LOOP ‘hasta que se reinicie el sistema
El programa comienza mostrando el mensaje (en la pantalla del ordenador) “Beep!!!” cuando se inicia su ejecución. Inmediatamente envía una señal de 3 kHz al zumbador durante 2 segundos. Como la tarjeta ejecuta muy rápidamente las instrucciones dará la sensación de que el mensaje se muestra al mismo tiempo que el zumbador comienza a pitar.
Cuando cesa el pitido, el programa entra en un bucle infinito mostrando una y otra vez el mensaje “Esperando el reinicio”. Cada vez que se produzca un reinicio, bien porque se aprieta el botón o porque se desconectan las baterías o pierden tensión, el programa se reiniciará.
De ahora en adelante vamos a usar este programa cada vez que escribamos otro. Lo consideraremos parte de la rutina de inicialización de cada programa.
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.
- ‘ 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.
Pingback: Pasos 5.1, 5.2 y 5.3 Diversas comprobaciones | …