Eficiente robot seguidor de paredes con sensor ultrasónico que funciona en interiores y exteriores

Así como los robots que siguen líneas son divertidos, crear un robot que sigue paredes es aún más emocionante. Un robot seguidor de paredes está diseñado para moverse a lo largo de una pared sin golpearla. Tiene sensores de detección de obstáculos montados en el cuerpo que detectan paredes y accionan motores de corriente continua unidos a las ruedas para que el robot continúe moviéndose a lo largo de la pared.
El robot puede diseñarse orientado hacia la derecha o hacia la izquierda o puede diseñarse para seguir cualquier lado. Se puede diseñar fácilmente un seguidor de pared orientado hacia la derecha o hacia la izquierda con la ayuda de sólo dos sensores. Aunque se pueden utilizar más sensores en la fabricación de dicho robot, lo que en última instancia mejorará la precisión de la trayectoria del robot. Para hacer un seguidor de pared que pueda estar de lado en cualquier dirección, se requieren al menos tres sensores y la lógica del programa es un poco compleja y sofisticada. Si se diseña un seguidor de pared orientado a la derecha, los sensores de detección de obstáculos deben montarse en la parte delantera y derecha del robot. Si se diseña un seguidor de pared orientado a la izquierda, los sensores de detección de obstáculos deben montarse en la parte delantera y en el lado izquierdo del robot. Si el robot está diseñado para seguir cualquier lado, se deben montar sensores de detección de obstáculos en los lados frontal, izquierdo y derecho del robot. En este proyecto se diseña una pared lateral izquierda siguiendo al robot.
Protótipo de Robô Seguidor de Parede
Fig. 1: Prototipo de robot que sigue la pared
El sensor de detección de obstáculos utilizado en un seguidor de pared puede ser un sensor de infrarrojos o un sensor ultrasónico. Los sensores IR se pueden usar para detectar una distancia predeterminada y calibrada desde la pared y, por lo tanto, al usar sensores IR, el robot está diseñado para mantener una distancia fija desde la pared. En este caso, no se puede lograr una alta precisión de trayectoria. En segundo lugar, en presencia de luz solar o reflejo de un punto negro en la pared, es posible que el robot no funcione como se desea debido a las limitaciones del sensor IR en estos casos. Aunque si se utiliza el sensor ultrasónico como detector de obstáculos, el robot puede diseñarse para mantener una distancia con la pared, lo que no sólo mejora la flexibilidad del camino sino que también mejora su precisión. Dado que los sensores ultrasónicos funcionan basándose en el reflejo de ondas ultrasónicas (sonido), se pueden utilizar en entornos donde hay luz solar u obstáculos negros en el camino. Teniendo en cuenta estas ventajas de los sensores ultrasónicos sobre los sensores IR, en este proyecto se utilizan sensores ultrasónicos para la detección de obstáculos o paredes.
La placa microcontroladora que proporciona inteligencia al robot es la Arduino Pro Mini. El robot también se puede diseñar en cualquier otra placa de microcontrolador. El código del programa desarrollado para este robot también es compatible con Arduino UNO y funcionará bien si los sensores y el controlador del motor IC están interconectados de la misma manera que funciona el programa. Arduino Pro Mini se utiliza debido a su pequeño tamaño y peso ligero. Además, Pro Mini tiene suficientes pines GPIO necesarios para fabricar este robot. El código del programa se escribe y graba utilizando Arduino IDE.
Componentes necesarios –
Lista de componentes necessários para o robô seguidor de parede
Figura 2: Lista de componentes necesarios para el robot seguidor de pared
Diagrama de bloques -
Diagrama de blocos do robô seguidor de parede
Figura 3: Diagrama de bloques del robot seguidor de pared
Conexiones de circuito –
Este robot de seguimiento de paredes está construido alrededor del Arduino Pro Mini. Los sensores ultrasónicos y el controlador IC del motor L293D interactúan con la placa controladora para convertirlo en un robot funcional.
Imagem do circuito eletrônico montado no robô seguidor de parede
Fig. 4: Imagen del circuito electrónico montado en el robot de seguimiento de paredes.
El circuito electrónico montado en el robot y que controla su movimiento se puede detallar en las siguientes secciones:
Fuente de alimentación: en el circuito, el Arduino Pro Mini y los sensores ultrasónicos necesitan 5 V CC regulados para su funcionamiento, mientras que el controlador del motor IC necesita 12 V CC. Se utiliza una batería NIMH de 12 V como fuente de alimentación principal. La energía de la batería se regula a 5 V y 12 V mediante circuitos integrados 7805 y 7812. El pin 1 de ambos circuitos integrados reguladores de voltaje está conectado al ánodo de la batería y el pin 2 de ambos circuitos integrados está conectado a tierra. Las respectivas salidas de voltaje se toman del pin 3 de los respectivos circuitos integrados reguladores de voltaje. También se conecta un LED junto con una resistencia pull-up de 10 K Ω entre la tierra común y el pin de salida para obtener una señal visual de la continuidad de la energía. A pesar de utilizar una batería de 12 V, el 7812 se utiliza para proporcionar una fuente de alimentación regulada y estable al circuito integrado del controlador del motor.
Arduino Pro Mini – Arduino Pro Mini es una placa microcontroladora basada en Atmega 168. Tiene 14 pines GPIO, 6 entradas analógicas, 6 pines PWM, 2 interrupciones externas y UART, SPI e I2C integrados. La placa mide solo 1,3 pulgadas por 0,7 pulgadas, seis veces más pequeña que la Arduino UNO. Con estas características en un tamaño reducido, esta placa es ideal para cualquier proyecto de robótica. En este proyecto, se utilizan 8 pines de entrada y salida del Pro Mini, cuatro pines para interconectar con sensores ultrasónicos y cuatro pines para interconectar con el controlador IC del motor.
Sensor ultrasónico HC-SR04: el sensor ultrasónico HC-SR04 utiliza un sonar para determinar la distancia a un objeto, al igual que lo hacen los murciélagos o los delfines. Proporciona una excelente detección de rango sin contacto con alta precisión y lecturas estables en el rango de 2 cm a 400 cm.
Se utilizan dos sensores ultrasónicos en el circuito, uno montado en la parte frontal del robot y otro montado en el lado izquierdo del robot. El sensor ultrasónico montado en el frente está conectado a los pines 5 y 6 de la placa Arduino y el sensor montado en el lado izquierdo está conectado a los pines 10 y 11 de la placa Arduino. El sensor ultrasónico tiene cuatro pines: Tierra (Pin 1), Eco (Pin 2), Gatillo (Pin 3) y Gatillo. Los pines VCC y tierra están conectados a VCC y tierra comunes, respectivamente. Los pines Echo del sensor frontal e izquierdo están conectados a los pines 5 y 11 de la placa Arduino respectivamente, mientras que los pines de disparo de los sensores frontal e izquierdo están conectados a los pines 6 y 10 de la placa Arduino.
El sensor ultrasónico funciona según el principio del eco de las ondas sonoras. Cuando se pasa un pulso ALTO de 10 μs al pin de disparo del sensor, transmite ocho ondas de 40 KHz de disparos de pulso sónico ALTO consecutivamente. Una señal de pulso alto sale del pin de eco a medida que se transmite la onda ultrasónica. Esta onda, al chocar con un obstáculo, se refleja y es detectada por el sensor. Cuando se vuelve a detectar la onda, se finaliza la señal de pulso alto del pin de eco del sensor. La señal recibida desde el pin de eco es de naturaleza analógica. La distancia al obstáculo se puede medir midiendo el tiempo máximo del pin de eco. Este es el tiempo entre la transmisión y la reflexión de la onda sonora. La distancia está dada por las fórmulas:
Distancia de prueba = (tiempo de alto nivel × velocidad del sonido (340 M/S)) / 2
El tiempo multiplicado por la velocidad se divide por 2, como el tiempo necesario para que la onda sónica alcance el obstáculo y regrese. Por lo tanto, la medida de la distancia en cm puede obtenerse mediante las fórmulas:
Distancia de prueba = (tiempo de alto nivel × velocidad del sonido (340 M/S)) / 2
= (tiempo de alto nivel (microsegundo) × velocidad del sonido (340 M/S)) / 2
= tiempo de alto nivel x 340/2000000 m
= tiempo de alto nivel x 34.000/2.000.000 cm
= tiempo de alto nivel x 34/2000 cm
Los sensores ultrasónicos emiten el pulso alto desde su pin 2, que se detecta en los pines 5 y 11 de la placa Arduino. El código del programa mide la duración del pulso y los digitaliza en valores de distancia utilizando las fórmulas indicadas anteriormente. Estos valores de distancia se utilizan para mantener una distancia definida con la pared lateral izquierda y evitar un obstáculo delante del robot desde una distancia predefinida. Los motores son accionados para mantener una distancia predeterminada desde la pared lateral izquierda.
IC de controlador de motor de CC L293D: el L293D es un circuito integrado (IC) de controlador de motor de puente H dual. Los controladores de motor actúan como amplificadores de corriente en el sentido de que reciben una señal de control de corriente baja y suministran una señal de corriente más alta. Esta señal de corriente más alta se utiliza para accionar los motores. Tiene 16 pines con la siguiente configuración de pines:
Tabela de listagem de configuração de pinos do IC do driver do motor L293D
Fig. 5: Tabla que enumera la configuración de pines del CI del controlador del motor L293D
Se utilizan dos motores de CC para fabricar el automóvil robótico. Los motores de CC interactúan entre los pines 3 y 6 y los pines 14 y 11 del IC del controlador del motor.
IC L293D controla motores de CC según las siguientes tablas de verdad:
Tabela verdade do IC do driver do motor L293D
Fig. 6: Tabla de verdad del CI del controlador del motor L293D
Tabela verdade do IC do driver do motor L293D
Fig. 7: Tabla de verdad del CI del controlador del motor L293D
Los pines 4, 5, 13 y 12 del L293D están conectados a tierra mientras que los pines 1, 16 y 9 están conectados a 5 VCC y el pin 8 está conectado a 12 VCC. Los pines 15, 2, 7 y 10 del IC del controlador del motor están conectados a los pines 8, 2, 3 y 7 de la placa Arduino. El motor DC conectado a la rueda derecha está conectado a los pines 11 y 14, mientras que el motor conectado a la rueda izquierda está conectado a los pines 3 y 6 del Arduino.
Motores de CC con engranajes: en este robot, los motores de CC con engranajes de 12 V están conectados a las ruedas. Los motores de CC con engranajes están disponibles con una amplia gama de RPM y par, lo que permite que un robot se mueva según la señal de control que recibe del controlador IC del motor.
Cómo funciona el circuito –
Cuando se enciende el robot, se inicializa para avanzar y continuar girando hacia la izquierda hasta alcanzar una distancia mínima con la pared izquierda. Para ello se hace que el robot comience a avanzar y comience a leer los valores de los sensores ultrasónicos. El robot también continúa girando hacia la izquierda girando el motor de CC del lado derecho más rápido hasta que la lectura del sensor izquierdo se acerque al valor mínimo. A partir de ahora, el robot puede enfrentar dos condiciones: o aparece algún obstáculo frente al robot o la distancia con la pared puede disminuir debido a la estructura o diseño de la pared. Si se detecta un obstáculo delante del robot a una distancia predefinida, el robot girará hacia la derecha hasta superar el obstáculo. Si no hay ningún obstáculo delante del robot, el robot seguirá avanzando. Si la distancia entre la pared izquierda y el robot se reduce por debajo del valor mínimo, el robot se moverá nuevamente en la dirección correcta activando el motor del lado izquierdo más rápidamente hasta que la distancia alcance un valor máximo. Arduino implementa el mismo algoritmo. Este algoritmo se resume en el siguiente diagrama de flujo:
Fluxograma do código Arduino usado para robô seguidor de parede
Fig. 8: Diagrama de flujo del código Arduino utilizado para el robot que sigue la pared
El boceto de Arduino mueve el robot según la siguiente tabla:
Tabela Lógica do Robô Seguidor de Parede
Fig. 9: Tabla lógica del robot seguidor de pared
Las acciones de seguimiento se pueden implementar activando los motores de la siguiente manera:
Tabela Resumindo o Plano de Ação para Robô Seguidor de Parede
Fig. 10: Tabla resumen del Plan de Acción del Robot Seguidor de Paredes
El robot se puede mover hacia adelante, hacia atrás, hacia la izquierda o hacia la derecha implementando la siguiente lógica de entrada en los pines del controlador del motor:
Tabela lógica do IC do driver do motor L293D para robô seguidor de parede
Fig. 11: Tabla lógica del IC del controlador del motor L293D para el robot seguidor de pared
Para ralentizar o acelerar movimientos robóticos específicos, se puede aplicar PWM a los pines de entrada del controlador L293D. Así, los sensores ultrasónicos detectan la distancia a la pared u obstáculo y los motores DC se activan para responder al cambio de situación. Así se mueve el robot siguiendo la pared y superando cualquier obstáculo.
En un seguidor de pared orientado a la derecha, el algoritmo será casi similar excepto que el robot estará diseñado para seguir la pared derecha y rotar según diferentes situaciones. Diseñar un robot siguiendo cualquiera de las paredes puede resultar un poco complejo ya que se enfrentará a nuevas situaciones y tendrá que decidir qué pared seguir en determinadas circunstancias.
Imagem do robô seguidor de parede baseado em Arduino
Fig. 12: Imagen del robot seguidor de pared basado en Arduino
Consulte el código del programa para ver cómo se implementa el algoritmo en el boceto de Arduino. Vea cómo Arduino lee los datos de los sensores ultrasónicos, compara las lecturas con los desplazamientos mínimo y máximo y cambia la rotación del motor en respuesta a situaciones percibidas.
Guía de programación –
El código utiliza la nueva biblioteca de ping para el sensor ultrasónico. Obtenga más información sobre la biblioteca de ping Arduino.CC y descargue NewPing.h.
#incluir
La directiva #define se usa para declarar algunos valores constantes que se asignarán a las variables utilizadas en el código. Estas constantes indican cuántos sensores ultrasónicos se utilizan, la distancia máxima a la que debe responder el sensor y el intervalo de ping es el tiempo entre los pings de dos sensores en milisegundos.
#definir SONAR_NUM 2
#definir MAX_DISTANCIA 500
#definir PING_INTERVAL 33
Las siguientes directivas #define se utilizan para determinar los números de pines de Arduino utilizados para conectar el sensor ultrasónico (pin de disparo y pin de eco) y los pines que deben conectarse al IC del controlador del motor.
#definir pinpin1 5
#definir echoPin1 6
#definir pinpin2 10
#definir echoPin2 11
#definir LM1 2
#definir LM23
#definir RM1 7
#definir RM2 8
El siguiente bloque describe el objeto sensor que define los dos sensores en la matriz. Crea una instancia del objeto de la biblioteca NewPing que describe el pin de disparo y los pines de eco conectados al Arduino y la distancia máxima que deben medir.
Nuevo ping de sonda (SONAR_NUM) = {
NuevoPing(trigPin1, echoPin1, MAX_DISTANCE),
NuevoPing(trigPin2, echoPin2, MAX_DISTANCE)
};
El siguiente bloque describe la función de configuración, que se utiliza para establecer velocidades en baudios y define si el pin Arduino debe usarse como entrada o salida digital. Se utiliza para configurar la velocidad en baudios para la comunicación serie entre Arduino y la PC.
Serie.begin(9600);
ent i;
Las siguientes instrucciones utilizan la función PinMode para declarar los pines conectados al controlador del motor Arduino como salida digital.
pinMode(LM1, SALIDA);
pinMode(LM2, SALIDA);
pinMode(RM1, SALIDA);
pinMode(RM2, SALIDA);
Las siguientes instrucciones utilizan la función PinMode para declarar los pines de activación como salida y los pines de eco como entrada en relación con la placa Arduino.
pinMode(trigPin1, SALIDA);
pinMode(echoPin1, ENTRADA);
escritura digital (trigPin1, BAJO);
pinMode(trigPin2, SALIDA);
pinMode(echoPin2, ENTRADA);
escritura digital (trigPin2, BAJO);
El siguiente bloque de código inicializa el rango de valores que el Arduino debe indicarle al controlador del motor para girar a la derecha o a la izquierda o seguir recto dependiendo de la distancia medida por el sensor ultrasónico.
int toCloseWall = 1000;
int para FarWall = 1500;
int toCloseFront = 1000;
La operación principal en el código se implementa mediante un bucle de toma de decisiones que se llama en la función principal. Cabe señalar que en el código fuente, las funciones serial.print se utilizan para verificar el rango de los sensores ultrasónicos durante la depuración y calibración del código. La función principal llama a la función readRangeFront para medir la distancia detectada por el sensor ultrasónico frontal.
rangoFront = leerRangeFront;
Llama a la función readRangeWall para medir la distancia entre la pared por la que se mueve el robot.
rangoMuro = leerRangoMuro;
La siguiente condición si se usa para verificar la distancia entre el sensor frontal y el objeto, si el objeto está más cerca de acuerdo con un rango predeterminado, llama a la función drive_backward, drive_forward y turn_left con algún retraso en el medio.
si (rangoFrontal
{
retraso(500);
conducir_hacia atrás;
retraso(500);
retraso(800);
siga adelante;
Gire a la izquierda ;
retraso(1000);
ir a Principal;
}
La siguiente condición se utiliza para verificar la distancia entre el sensor frontal y la pared frontal y el sensor de la pared lateral y la pared lateral. Si la distancia medida por los dos sensores está en el rango deseado, llama a la función drive_forward.
if(rangoPared > toCloseWall && rangoWall < toFarWall)
{
siga adelante;
ir a Principal;
}
Las siguientes condiciones se utilizan para verificar la distancia entre la pared lateral y el sensor y verificar el valor más cercano y más lejano. Si la distancia se acerca, llama a la función drive_left y a la función drive_forward y si la distancia se vuelve grande, llama a la función drive_right y a la función drive_forward.
si (rangoPared
{
retraso(100);
Gire a la izquierda ;
retraso(100);
siga adelante;
ir a Principal;
}
si (rangoPared > aFarWall)
{
retraso(100);
Gire a la derecha ;
retraso(100);
siga adelante;
ir a Principal;
}
Las declaraciones Goto se utilizan para ejecutar el ciclo continuamente. Consulte el código completo del proyecto y guárdelo en un Arduino para que el robot funcione. Esto completa el boceto de Arduino para el robot de seguimiento de paredes (lado izquierdo).

Código fuente del proyecto

###

 //Programa para

#incluir

#define SONAR_NUM 2 //define el número de sensores ultrasónicos utilizados

#define MAX_DISTANCE 800 //Distancia máxima entre el objeto y el robot

#definir PING_INTERVAL 33

#define trigPin1 6 // define las conexiones de pines para el sensor y el motor

#definir echoPin1 5

#definir pinpin2 11

#definir echoPin2 10

#definir LM1 2

#definir LM23

#definir RM1 7

#definir RM2 8

int rangoFrente = 0;

int rangeWall = 0;

Sonar NewPing(SONAR_NUM) = { // Definir una matriz Newping para medir la distancia

NuevoPing(trigPin1, echoPin1, MAX_DISTANCE),

NuevoPing(trigPin2, echoPin2, MAX_DISTANCE)

};

void setup // función de configuración para configurar el pin para definir si es entrada o salida

{

Serie.begin(9600);

ent i;

pinMode(LM1, SALIDA);

pinMode(LM2, SALIDA);

pinMode(RM1, SALIDA);

pinMode(RM2, SALIDA);

pinMode(en1, SALIDA);

pinMode(pt2, SALIDA);

pinMode(trigPin1, SALIDA);

pinMode(echoPin1, ENTRADA);

escritura digital (trigPin1, BAJO);

pinMode(trigPin2, SALIDA);

pinMode(echoPin2, ENTRADA);

escritura digital (trigPin2, BAJO);

}

int toCloseWall = 1800; //Inicializa y define los valores de la distancia entre la pared y el robot

int para FarWall = 2500;

int toCloseFront = 1000;

bucle vacío

{

Principal:

rangoFront = leerRangeFront; // Lee el valor del sensor llamando a la función

Serial.print(rangoFrontal);

Serial.print("Frente");

Serial.println;

rangoMuro = leerRangoMuro;

Serie.print(rangeWall);

Serial.print("Muro");

Serial.println;

if (rangeFront <= 400) //A medida que el valor del sensor lee los valores pequeños, estamos manipulando a valores altos

{

rangoFrontal = 3000;

}

si(intervaloPared <= 400)

{

rango de pared = 3000;

}

if (rangeFront < toCloseFront) //Condición para comprobar si el sensor frontal está cerca del robot

{

retraso(500);

conducir_hacia atrás;

retraso(500);

Serial.print("Volver");

//Gire a la derecha ;

Serial.print("Gire a la derecha");

Serial.println;

retraso(800);

siga adelante;

Gire a la izquierda ;

retraso(1700);

ir a Principal;

}

if(rangeWall > toCloseWall && rangeWall < toFarWall) //condición para comprobar si la distancia medida por el sensor frontal y lateral se mantiene correctamente

{

siga adelante;

Serial.print("Siguiente");

Serial.println;

ir a Principal;

}

if (rangeWall < toCloseWall) //condición para comprobar si la pared lateral está cerca del robot

{

retraso(100);

//Gire a la izquierda ;

Gire a la derecha ;

retraso(500);

Serial.print("Gire a la izquierda");

siga adelante;

Serial.print("Siguiente");

Serial.println;

ir a Principal;

}

if (rangeWall > toFarWall) //condición para comprobar si el robot está lejos de la pared lateral

{

retraso(100);

//Gire a la derecha ;

Gire a la izquierda ;

Serial.print("Gire a la derecha");

retraso(500);

siga adelante;

Serial.print("Siguiente");

Serial.println;

ir a Principal;

}

}

void motor_stop // función para detener el robot

{

escritura digital (LM1, ABAJO);

escritura digital (LM2, ABAJO);

escritura digital (RM1, BAJO);

escritura digital (RM2, BAJO);

}

void drive_forward // función para impulsar el robot hacia adelante

{

escritura digital (LM1, ALTA);

escritura digital (LM2, ABAJO);

escritura digital (RM1, ALTA);

escritura digital (RM2, BAJO);

}

void drive_backward // función para conducir el robot hacia atrás

{

escritura digital (LM1, ABAJO);

escritura digital (LM2, ALTA);

escritura digital (RM1, BAJO);

escritura digital (RM2, ALTA);

}

void turn_left // función para girar el robot a la izquierda

{

escritura digital (LM1, ALTA);

escritura digital (LM2, ABAJO);

escritura digital (RM1, BAJO);

escritura digital (RM2, BAJO);

}

void turn_right //función para girar el robot hacia la derecha

{

escritura digital (LM1, ABAJO);

escritura digital (LM2, ABAJO);

escritura digital (RM1, ALTA);

escritura digital (RM2, BAJO);

}

int readRangeFront //función para leer el valor del sensor frontal

{

retraso(50);

rangeFront sin signo = sonar(0).ping ;

sonda(0).timer_stop ;

rango de retornoFrente;

}

int readRangeWall // función para leer el valor del sensor izquierdo

{

retraso(50);

rangeWall sin signo = sonar(1).ping ;

sonda(1).timer_stop ;

rango de retornoPared;

}


###

Diagramas de circuito

Diagrama de circuito-Arduino-Seguidor de pared-Robot

Vídeo del proyecto

contenido relacionado

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.