Librería para Rupertobot: sensores y actuadores

Introducción

En el artículo anterior ya dimos las pautas más básicas para dar órdenes de movimiento al Rupertobot. Toca ahora enriquecer nuestro acervo de comandos haciendo referencia a sus sensores de infrarrojos y ultrasonidos, así como a su único actuador hasta el momento, el zumbador.

Conceptos básicos

Si estás leyendo esto, es de suponer que cuentas ya con suficientes conocimientos como para crear un programa completo en Arduino que utilice librerías externas y que sea medianamente funcional. Así que intentaré no aburrirte demasiado con preliminares. Los comandos referentes a sensores y actuadores son de dos tipos:

  • Los que indican en qué pines están conectados. Se consignan en setup()
  • Los que nos proporcionan la lectura del sensor IR o US o que dan la orden al zumbador de pitar.

En el primer caso, hay que indicar entre paréntesis, simplemente, a qué pines digitales vamos a conectar el elemento:

COMANDO DESCRIPCIÓN
void zumbador(int pin); Vamos a utilizar el buzzer en el pin especificado
void IR(int izq,int der); Vamos a utilizar los sensores de infrarrojos. Especificar los pines del izquierdo y el derecho (por este orden)
void us(int trig, int echo); Vamos a utilizar el sensor de ultrasonidos. Indicar, primero, el pin de TRIGGER y luego el pin ECHO

En el segundo caso, podemos leer el valor obtenido en cada sensor o dar al buzzer la orden de que emita un pitido:

COMANDO DESCRIPCIÓN
void tono(int frequency, int time); Pide al zumbador que emita un pitido en la frecuencia requerida, durante el tiempo estipulado en milisegundos
long distancia(); Devuelve la distancia al obstáculo medida por el sensor de ultrasonidos, en centímetros
bool negroDerecha(); nos devuelve true o false si el sensor de infrarrojos derecho detecta o no el color negro
bool negroIzquierda(); nos devuelve true o false si el sensor de infrarrojos izquierdo detecta o no el color negro
bool blancoDerecha(); nos devuelve true o false si el sensor de infrarrojos derecho detecta o no el color blanco
bool blancoIzquierda(); nos devuelve true o false si el sensor de infrarrojos izquierdo detecta o no el color blanco

Como puedes ver, el único comando que pide que incluyamos parámetros es tono. Pero eso lo ilustraremos mejor en el próximo ejemplo.

Uso del zumbador

Como supongo que ya sabes incluir la librería y declarar el objeto de la clase Rupertobot, te paso un ejemplo que le va a ordenar emitir una pequeña melodía. Para ello, hay que hacer cuatro cosas:

En primer lugar, incluir (como he dicho) la librería con

#include <rupertobot.h>

En segundo lugar, Declarar el objeto que vamos a usar, al que pondremos el nombre ruperti:

rupertobot ruperti;

Despues indicar, en setup(), que vamos a usar el buzzer y en qué pin está conectado, con json ruperti.zumbador(12);

Por último, en loop(), consignar la relación de tonos que deseamos:

ruperti.tono(1000,1000);
ruperti.tono(1500,500);
ruperti.tono(800,200);
ruperti.tono(1100,600);
ruperti.tono(900,400);

El programa definitivo, por lo tanto, quedaría así:

#include <rupertobot.h>
//Declaramos nuestro rupertobot
rupertobot ruperti;
void setup() {
//Activamos el zumbador en el pin correspondiente
ruperti.zumbador(12);
}

void loop() {
// Desarrollamos la melodía y paramos el programa con while(1)
ruperti.tono(1000,1000);
ruperti.tono(1500,500);
ruperti.tono(800,200);
ruperti.tono(1100,600);
ruperti.tono(900,400);
while(1);
}

El resultado es estéticamente horroroso, pero ilustrativo a fines educativos. En fin, corramos un tupido velo. ¡Siguiente ejemplo!.

Uso del sensor de ultrasonidos

En esta ocasión, vamos a combinar el uso del sensor de ultrasonidos con el del buzzer para que emita dos tipos de pitidos, según pongamos un obstáculo a menos de 20 cm o a menos de 10 cm. Si no hay obstáculo o está más lejos, el robot permanecerá en silencio. Para ello, seguiremos los siguientes pasos:

Incluir la librería y declarar nuestro rupertobot:

#include <rupertobot.h>
rupertobot ruperti;

Declarar el zumbador y el sensor US en setup(), con los pines correspondientes:

ruperti.zumbador(12);
ruperti.us(10,11);

En loop(), usar sentencias if-else para comprobar la distancia que mide el sensor US, y actuar en consecuencia. (En esta ocasión, prescindimos de la sentencia while(1), para el programa, porque queremos que la medida se haga continuamente, en bucle)

if (ruperti.distancia()<10){
  ruperti.tono(1200,1000);
}else if (ruperti.distancia()<20){
  ruperti.tono(700,1000);
}

Y, de nuevo, te presento el programa definitivo:

#include <rupertobot.h>
//Declaramos nuestro rupertobot
rupertobot ruperti;
void setup() {
//Activamos el zumbador y el sensor US,
//indicando pines
ruperti.zumbador(12);
ruperti.us(10,11); 
}

void loop() {
//Medimos y avisamos según distancia
if (ruperti.distancia()<10){
  ruperti.tono(1200,1000);
}else if (ruperti.distancia()<20){
  ruperti.tono(700,1000);
}
}

Uso de los sensores de infrarrojos: robot siguelíneas

Bueno, pues vamos con uno de los clásicos en robótica educativa, que ya hemos desarrollado con MasayloBlockly en nuestra sección de Desafios robóticos: programar un robot siguelíneas. Por no aburrirte, no volveré a escribir el principio de funcionamiento en que se basa su algoritmo y me centraré directamente en su desarrollo para C++ con la librería del Rupertobot.
Para que nuestro robot siga una línea negra sobre fondo blanco, hay que seguir el siguiente proceso:
Incluir la librería y declarar nuestro rupertobot, como siempre:

#include <rupertobot.h>
rupertobot ruperti;

Declarar los sensores de infrarrojos en setup(), que por defecto están en los pines A0 y A1 (pero puedes modificarlo a tu gusto cambiando el conexionado):

ruperti.IR(14,15);

En loop(), usar sentencias if, combinadas con el operador lógico && (AND) que comprueba SIMULTÁNEAMENTE las lecturas de los sensores a derecha e izquierda(que devolverán verdadero si se produce el hecho comprobado, negro Derecha, negroIzquierda, blancoDerecha, o blancoIzquierda)

//Blanco a derecha e izquierda, avanzamos
if (ruperti.blancoDerecha()&&ruperti.blancoIzquierda()){
  ruperti.avanzacm(2,10);
}
//Piso negro por la izquierda, giro 15 º a la izquierda
if (ruperti.blancoDerecha()&&ruperti.negroIzquierda()){
  ruperti.giraIzquierda(15,10);
}
//Piso negro por la derecha, giro 15 º a la derecha
if (ruperti.negroDerecha()&&ruperti.blancoIzquierda()){
  ruperti.giraDerecha(15,10);
}

El programa completo (el último de esta sección, que ya es algo extensa) sería, por tanto, algo así:

#include <rupertobot.h>
//Declaramos nuestro rupertobot
rupertobot ruperti;
void setup() {
//Activamos el zumbador y el sensor US,
//indicando pines
ruperti.IR(14,15); 
}

void loop() {
//Blanco a derecha e izquierda, avanzamos
if (ruperti.blancoDerecha()&&ruperti.blancoIzquierda()){
  ruperti.avanzacm(2,10);
}
//Piso negro por la izquierda, giro 15 º a la izquierda
if (ruperti.blancoDerecha()&&ruperti.negroIzquierda()){
  ruperti.giraIzquierda(15,10);
}
//Piso negro por la derecha, giro 15 º a la derecha
if (ruperti.negroDerecha()&&ruperti.blancoIzquierda()){
  ruperti.giraDerecha(15,10);
}
}

Descarga los programas

Ejemplo de uso del zumbador
Ejemplo de medida de distancias con el sensor US
Ejemplo de uso de los sensores de infrarrojos para obtener un sensor siguelíneas