Arduino, Mini Sonar Robot: 3 pasos

Arduino, Mini Sonar Robot: 3 pasos

Tabla de contenido:

Anonim

En este proyecto quiero hacer un robot mini-sonar con arduino pro mini. Los sensores de sonda o ultrasonidos funcionan según un principio similar al radar o la sonda, que evalúan los atributos de un objetivo al interpretar los ecos de la radio o las ondas de sonido, respectivamente. Los sensores ultrasónicos activos generan ondas de sonido de alta frecuencia y evalúan el eco que recibe el sensor, midiendo el intervalo de tiempo entre el envío de la señal y la recepción del eco para determinar la distancia a un objeto.

He usado un sensor HC-SR04 que es uno de los precios más baratos en este tipo. Tiene 4 pines Vcc 5V, Gnd y otros dos pines para disparo (salida) y eco (entrada). El mecanismo es simple, algunas ondas se disparan, el eco recibe.

Partes necesarias:

  • 1x Arduino Pro mini
  • Sensor de sonda 1x SR-04 (precio bajo)
  • 2x Paquete de caja de engranajes de dos ruedas + motor de corriente continua 3V ~ 6V
  • 4x ruedas de plastico
  • 1 caja de plástico (depende del tamaño de la caja de engranajes)
  • 2 pilas dobles AA
  • 4x batería AA (se sugiere recargable)
  • 1x Mini altavoz
  • 1x LED
  • 1x resistencia 470 ohm
  • 1x L293D IC
  • 1x conector IC 16 pines
  • 2x encabezado de pin (tanto de tipo F y M)
  • Mini interruptor 1x
  • 1x alambres de fibra + soldador + alicates de corte + superglue

Déjame empezar el proyecto con estructura mecánica.

Suministros:

Paso 1: Cuerpo de robot

Encontrar una caja de plástico depende del tamaño del paquete de la caja de cambios. He utilizado una caja de auriculares (2 piezas). Use el pegamento para unir las partes como se muestra en la imagen.

Paso 2: Circuito

Realiza el circuito como se menciona en la imagen. Alguien puede querer abandonar la fuente de alimentación del motor y la lógica (micro, ic, …).

De hecho, se recomienda tener fuentes de alimentación separadas para la parte lógica y de alto consumo (dispositivos electromecánicos como motores), pero creo que no es tan importante para el arduino de baja potencia como Pro-mini. Por otro lado, con solo 4 baterías, no puedes hacer ningún otro enfoque.

Paso 3: Código

He intentado escribir el código lo suficientemente fácil como para ser sencillo para los principiantes también. Pero si tiene algún problema, preguntas y sugerencias, me gustaría saber.

Algunos consejos:

  • La distancia mínima es la distancia de frenado para evitar choques. La mejor distancia desde cualquier bloque para detener el robot, depende de la velocidad de la caja de cambios.
  • El robot vuelve a la distancia máxima.
  • backDist y turnDist deben personalizarse dependiendo de la velocidad del robot.
  • Se ha utilizado un comportamiento aleatorio que incluye una parada, una melodía y un movimiento aleatorio.

//******************************

// * Por: http://blog.mshams.ir *

//******************************

// números de pin

const byte pinMotor1 = 4, pinMotor2 = 5, pinMotor3 = 6, pinMotor4 = 7;

const byte pinLed = 8, pinTone = 10, pinSonar1 = 11, pinSonar2 = 12;

// frecuencia de sonido

const int toneFreq = 800;

// distancias de sonar

const byte minDistance = 45, maxDistance = 1000;

// estados del motor

byte const M_STOP = 0, M_GO = 1, M_BACK = 2, M_RIGHT = 3, M_LEFT = 4, M_RIGHT2X = 5, M_LEFT2X = 6;

// estados del robot

byte const R_START = 0, R_DRIVE = 1, R_BLOCK = 2, R_TURN = 3;

// detectar resaca

const int hangoverWait = 5000;

// bloque de detección volver

const int backDist = 1000, turnDist = 300;

// comportamiento aleatorio

const int randomChance = 300, randomStopWait = 10000, randomTurnWait = 200;

estado de byte = R_START;

int i, contador = 0;

int dist;

configuración vacía () {

randomSeed (analogRead (1));

// pines del motor de inicio

pinMode (pinMotor1, SALIDA);

pinMode (pinMotor2, SALIDA);

pinMode (pinMotor3, SALIDA);

pinMode (pinMotor4, SALIDA);

pinMode (pinSonar1, SALIDA);

pinMode (pinSonar2, INPUT);

// pin LED de inicio

pinMode (pinLed, SALIDA);

}

bucle de vacío () {

interruptor (estado) {

caso R_START:

Motor (M_GO);

Melodía();

estado = R_DRIVE;

descanso;

caso R_DRIVE:

dist = Pingu ();

if (dist <minDistance) {

Motor (M_STOP);

estado = R_BLOCK;

}

else if (random (0, randomChance) == 5) {

RandomTone ();

Motor (M_STOP);

retraso (randomStopWait);

Motor (aleatorio (M_BACK, M_LEFT2X + 1));

retraso (randomTurnWait);

Motor (M_GO);

}

descanso;

caso R_BLOCK:

Bip();

Motor (M_BACK);

retraso (backDist);

Motor (aleatorio (M_RIGHT2X, M_LEFT2X + 1));

retraso (turnDist);

estado = R_TURN;

descanso;

caso R_TURN:

dist = Pingu ();

if (dist> = maxDistance) {

Motor (M_STOP);

Motor (M_GO);

Bip();

estado = R_DRIVE;

}

más{

contador + = 1;

if (counter> = hangoverWait) {

contador = 0;

Motor (M_STOP);

RandomTone ();

estado = R_BLOCK;

}

}

descanso;

}

}

Vacío Blink (estado de byte) {

digitalWrite (pinLed, estado);

}

pitido vacío () {

Parpadeo (1);

SpeakTone (2);

SpeakTone (1);

Parpadeo (0);

}

Melodía vacía () {

Parpadeo (1);

para (int i = 1; i <10; i ++) {

SpeakTone (i);

}

Parpadeo (0);

}

void RandomTone () {

Parpadeo (1);

para (int i = 1; i <10; i ++) {

SpeakTone (aleatorio (1, 10));

}

Parpadeo (0);

}

void SpeakTone (nota de byte) {

tone (pinTone, toneFreq * nota);

retraso (100);

noTone (pinTone);

}

motor vacío (estado de byte) {

byte m1, m2, m3, m4;

interruptor (estado) {

caso M_STOP:

m1 = m2 = m3 = m4 = BAJO;

descanso;

caso M_GO:

m1 = ALTO;

m2 = BAJO;

m3 = ALTO;

m4 = BAJO;

descanso;

caso M_BACK:

m1 = BAJO;

m2 = ALTO;

m3 = BAJO;

m4 = ALTO;

descanso;

caso M_RIGHT:

m1 = ALTO;

m2 = BAJO;

m3 = BAJO;

m4 = BAJO;

descanso;

caso M_LEFT:

m1 = BAJO;

m2 = BAJO;

m3 = ALTO;

m4 = BAJO;

descanso;

caso M_RIGHT2X:

m1 = ALTO;

m2 = BAJO;

m3 = BAJO;

m4 = ALTO;

descanso;

caso M_LEFT2X:

m1 = BAJO;

m2 = ALTO;

m3 = ALTO;

m4 = BAJO;

descanso;

}

digitalWrite (pinMotor1, m1);

digitalWrite (pinMotor2, m2);

digitalWrite (pinMotor3, m3);

digitalWrite (pinMotor4, m4);

}

int pingu () {

digitalWrite (pinSonar1, LOW);

delayMicroseconds (5);

digitalWrite (pinSonar1, HIGH);

delayMicroseconds (5);

digitalWrite (pinSonar1, LOW);

delayMicroseconds (2);

larga duración = pulseIn (pinSonar2, HIGH);

retorno (duración / 29/2);

}