A través de este proyecto, el desarrollador puede jugar, mejorar y ser probado en múltiples áreas. Puede decir que es un proyecto de «conocimiento múltiple», porque necesitará habilidades y aprender en los campos de la mecánica, la ingeniería eléctrica, la programación de computadoras y el cálculo / métodos numéricos en general. Se pondrá a prueba su capacidad para resolver problemas, y para tener éxito necesitará también una cierta dosis de creatividad.

Aquí está la lista de sus características generales:

  • Robot 2WD, un motor para cada rueda;
  • La limpieza se realiza utilizando una barredora de alfombras conectada a un motor de CC adicional;
  • Los motores se controlan por separado a través de dos puentes en H;
  • Utiliza el método de control PID, implementado a través de Arduino;
  • La brújula digital da las direcciones hacia donde va el robot, para controlar sus ruedas;
  • La detección de obstáculos se obtiene con sensores ultrasónicos; *
  • La posición atascada se puede encontrar comprobando los resultados de los sensores ultrasónicos; **
  • Batería recargable capaz de funcionar durante aproximadamente una hora;
  • Se puede controlar a través de Bluetooth, y esta interfaz ya está implementada; ***
  • Tiene un software específico para Windows Phone, hecho por mí, pero también puedes usar otras plataformas;

 ¿Qué necesitas?

  • Brújula digital HMC5883L 
  • Arduino Uno
  • Chasis de coche 2WD
  • Módulo Bluetooth HC-06 (opcional) 
  • 2 x puentes H dobles (necesitará dos de estos) 
  • Prototipo de escudo para Arduino Uno 
  • Batería recargable por encima de 5V 
  • Pantalla LCD I2C 1602 (opcional) 
  • 3 Sensor ultrasónico HC-SR04 (al menos) 
  • Soporte fijo del sensor ultrasónico o similar (opcional) 
  • Dos piezas de acrílico para hacer las capas del robot;
  • Un motor extra de 12 V
  • Un montón de separadores de latón 
  • Barredora de alfombras 

Si desea que el optoacoplador en las ruedas funcione como codificador, le sugiero:

  • Optoacoplador 

Y, si desea un sensor fotoeléctrico para detectar paredes:

  • Sensor infrarrojo 

LO QUE NECESITAS SABER:

Antes de comenzar a soldar, debe observar la figura anterior. Puede usar entre 3 y 6 sensores ultrasónicos. Si usa 3, debe colocar uno frente al robot, y los otros dos 120 grados separados entre sí. El que está delante detectará objetos a medida que se acercan, y los otros dos apuntarán hacia la parte posterior del robot. Ambos encontrarán la distancia al objeto más cercano (detrás), por lo que el » SweeperBot » puede decidir, si después de encontrar una pared, volverá más a su lado derecho, o más a su lado izquierdo. Esto se debe a que, por supuesto, si después de encontrar una pared el robot se fue directamente hacia atrás, siempre iría en línea recta y nunca limpiaría toda la habitación.

Si desea más lecturas, más información, y para que el robot detecte objetos que vienen de los lados, y también para detectar objetos justo detrás de él, puede usar los 6 sensores posibles. Un método de control posible de usar para evitar obstáculos son los campos potenciales, que harían un gran uso de toda esta información. Sin embargo, aún no lo he implementado.

Aún escribiendo sobre los sonares, otra cosa a tener en cuenta es que, usando el código que proporcionaré de la siguiente manera, puede usar solo un cableado para los seis como pin de activación, lo que significa que activará los 6 juntos, con el mismo comando De esta manera evitará usar más 5 cables para activarlos. Por lo general, al usar la biblioteca estándar de este sensor, no podría hacerlo, porque cada sensor tendría problemas uno con el otro. Sin embargo, cada sensor tendrá su propio eco (pin y cableado) porque, dado que sus lecturas difieren, cada uno de ellos enviará diferentes señales al Arduino.

Los otros dos pines del sonar HC-SR04 son el positivo y el suelo. Estos dos son iguales a todos los demás componentes electrónicos: la brújula, la pantalla y el bluetooth. La brújula tendrá comunicaciones a través de I2C (IIC), conectando su SDA y SCL a las del Arduino. El Bluetooth conectará su pin transmisor y pin receptor a los pines digitales 0 y 1 del microcontrolador. Observe que su configuración se realiza mediante software, y si cambia estos pines, el Bluetooth no podrá emparejarse con el dispositivo. La pantalla también conectará I2C en los mismos pines que la brújula, porque al usar I2C, el Arduino puede controlar muchos dispositivos simultáneamente con los mismos pines.

En relación con el puente H, debe conectar habilitar A y habilitar B al pin positivo (que está a su lado, solo use un puente) de lo contrario los motores no funcionarán. Luego, conecte cada motor a un terminal positivo y negativo desde el puente H (las patillas laterales con los tornillos), y los tres conectores restantes con tornillos son: la tierra, que irá al arduino y a todos los demás dispositivos, incluidos los batería, el positivo de 9V-12V que proviene exclusivamente de la batería y la salida de 5V que suministrará todos los demás dispositivos que no sean motores de CC. Los conectores restantes son dos pares de señales lógicas para controlar la dirección y la potencia dada a cada motor.

EL PINOUT:

  • Brújula digital HMC5883L;
    • PIN 0 – SDA >>> Pin analógico Arduino A4;
    • PIN 1 – SCL >>> Pin analógico Arduino A5;
    • PIN 2 – GND >>> GND;
    • PIN 3 – VCC >>> VCC 5V

HC-06 Bluetooth;

  • PIN 0 – RX >>> Pin digital Arduino 0;
  • PIN 1 – TX >>> Arduino Digital Pin 1;
  • PIN 2 – GND >>> GND;
  • PIN 3 – VCC >>> VCC 5V;

1er puente doble en H;

  • PIN 0 >>> Pin digital Arduino 4;
  • PIN 1 >>> Arduino Digital Pin 5;
  • PIN 2 >>> Arduino Digital Pin 6;
  • PIN 3 >>> Arduino Digital Pin 7;
  • Habilite A >>> VCC;
  • Habilite B >>> VCC;
  • Energía >>> Batería Positiva 9 – 12V;
  • GND >>> Batería GND y Arduino GND;
  • + 5V OUT >>> Arduino VCC

2do puente doble H;

  • PIN 0 >>> Arduino Digital Pin 3;
  • PIN 1 >>> GND;
  • PIN 2 >>> No conectado;
  • PIN 3 >>> No conectado;
  • Habilite A >>> VCC;
  • Habilite B >>> GND;
  • Energía >>> Batería Positiva 9 – 12V;
  • GND >>> Batería GND y Arduino GND;
  • + 5V OUT >>> No conectado;

Pantalla LCD I2C 1602;

  • Pin 0 – GND >>> Arduino GND;
  • Pin 1 – VCC >>> Arduino VCC;
  • Pin 2 – SDA >>> Pin analógico Arduino A4;
  • Pin 3 – SCL >>> Pin analógico Arduino A5;

6 Sensor ultrasónico HC-SR04;

  • Pin 0 – VCC >>> Arduino VCC;
  • Pin 1 – Disparador >>> Arduino Digital Pin 2;
  • Pin 2 – Eco >>> Conectado en Arduino Digital Pines 8, 9, 10, 11, 12 y 13;
  • Pin 3 – GND >>> Arduino GND.

MONTAJE DEL ROBOT

Obtenga el sensor ultrasónico fijo cada uno de ellos con ángulos iguales entre sí, por ejemplo, si usa seis, coloque el primero frente al robot y los otros a 60 grados de él. Use los tableros acrílicos como capas del robot, para que sea más fácil montar y colocar las piezas en su posición. Atornille todo en las capas y coloque la batería justo encima de los motores, pero debajo de la electrónica. De esta manera, bajará su centro de gravedad, lo que lo hará más estable.

Suelde todos los cables positivos juntos y los pines de tierra también. Hice un conector con todos los pines de los sensores y otro con los 5 pines de los motores de CC, para que fuera más fácil de entender al montar y desmontar. Coloque una capa final sobre los puentes H y coloque el Arduino allí. Utilicé un Prototyping Shield sobre el microcontrolador, porque es más fácil soldar y arreglar la brújula, esa es una parte que necesita atención especial. No es necesario colocarlo en el centro del robot, pero debe estar alejado de las grandes partes metálicas, como los motores y la batería.

Es posible montar el motor de CC junto con la barredora de alfombras de muchas maneras diferentes, pero algunas son mejores que otras. Como solo tenía un barrendero, el mío se puso un poco feo durante mis intentos. Descubrí que pegar el eje del motor al eje de la barredora era realmente difícil, y generalmente después de algunos minutos de trabajo, se romperían, especialmente porque no hay forma de unirlos correctamente. Así que quité el eje de reducción de los motores y coloqué un pequeño engranaje pegado en el eje de la barredora. Luego puse el engranaje del motor en contacto y todo funcionó de maravilla. Sin embargo, desearía tener una impresora 3D, las cosas serían mucho más fáciles y mucho más profesionales.

Código

LAS BIBLIOTECAS

El «SweeperBot» utiliza Wire, I2Cdev, TimerOne (para interrupciones), Adafruit Sensor, HMC5883 y bibliotecas LCD. Puede descargar el archivo Zip, que contiene el código para Arduino, y todas las bibliotecas. También contiene el proyecto Bluetooth para Windows Phone.

EL CÓDIGO DE WINDOWS PHONE 8.1:

El proyecto que controla el robot a través de Bluetooth desde Windows Phone se adaptó de un ejemplo disponible en Internet. Fue alterado para tener cuatro botones, uno para cada dirección. Arriba, abajo, izquierda y derecha. Cada botón envía una carta al robot, respectivamente U, D, L y R. Cuando el robot los recibe, realiza una de las siguientes acciones:

  • U – el robot establecerá la dirección a seguir en línea recta;
  • D – el robot se volverá hacia atrás y se irá derecho;
  • L – el robot establecerá la dirección para seguir exactamente 90 grados a la izquierda desde donde está actualmente «mirando»;
  • R – el robot establecerá la dirección para seguir exactamente 90 grados desde donde está «mirando» actualmente;

La forma en que el robot maneja estos comandos se puede cambiar con el código del Arduino. Es posible agregar más botones para encender el robot, detenerlo o incluso hacer que retroceda. Este código es solo un ejemplo. También es posible hacer programas similares a otros dispositivos, como Androids y para iOS. Lo único que tiene que enviar al robot son estas letras: U, D, L o R.

vacío privado asíncrono RedButton_Click_1 (remitente del objeto, RoutedEventArgs e) {
    comando de cadena = "U";
    aguardar connectionManager.SendCommand (comando);
}

vacío privado asíncrono GreenButton_Click_1 (remitente del objeto, RoutedEventArgs e) {
    comando de cadena = "L";
    aguardar connectionManager.SendCommand (comando);
}

privado async void YellowButton_Click_1 (remitente del objeto, RoutedEventArgs e) {
    comando de cadena = "R";
    aguardar connectionManager.SendCommand (comando);
}

vacío privado asíncrono RedButton_Copy_Click (remitente de objeto, RoutedEventArgs e) {
    comando de cadena = "D";
    aguardar connectionManager.SendCommand (comando);
} 

Para implementar este código en su Windows Phone, necesitará Visual Studio y un teléfono desbloqueado para desarrolladores. 

EL CÓDIGO ARDUINO:

En resumen, la lógica principal del robot es la siguiente:

  1. Distancia al objeto más cercano encontrado en cada uno de los 6 sensores posibles;
  2. Comportamiento de las distancias del proceso del robot y señalar la dirección deseada con un vector X, Y (sin embargo, si se recibe un mensaje desde el teléfono inteligente, el paso 2 se sustituye por la dirección enviada desde el dispositivo);
  3. La brújula digital da la dirección en la que va el robot, para controlar sus ruedas;
  4. La información X ‘, Y’ de la brújula se normaliza al espacio [-1,1];
  5. El producto cruzado entre el vector de la dirección deseada y la dirección real encuentra un error entre ellos;
  6. El método PID calcula PWM (potencia) para cada motor de CC para las dos ruedas (2WD);
  7. La interrupción activa PWM;

A medida que el proyecto evolucionó, descubrí que la biblioteca estándar disponible en GitHub para los sensores ultrasónicos estaba en conflicto con la activación PWM de los motores, porque ambos usaban el mismo temporizador. Como este proyecto usa 5 pines para configurar el PWM de los tres motores de CC (y esto solo es posible porque la barredora de alfombras solo gira en una dirección), y más 7 para los sensores, que el microcontrolador debe verificar constantemente si se recibió la lectura, no fue posible utilizar el material disponible en internet.

Entonces, para evitar conflictos, se configuró solo la interrupción del temporizador 1. A través de esta interrupción, el Arduino puede verificar si hubo lecturas en cada sensor: si no, aumenta una variable para cada uno de ellos, que se utilizará como parámetro para encontrar la distancia al objeto.

void callback () {// callback es el nombre de la interrupción
  noInterrupts ();
  // si no hay lectura, aumenta la variable sonarCount [n], donde n es el número de sensor
  if ((sonar [0] == 1) && (digitalRead (ECHO))) sonarCount [0] ++; 
  // si hay readind en ese sensor, la sonda [n] = 2 acusa al objeto encontrado
  if ((sonar [0] == 1) && (! digitalRead (ECHO)) && (sonarCount [0]> 0)) sonar [0] = 2;

Además, dentro de esta interrupción, arroja toda la potencia al motor. Si ha habido un cierto número de interrupciones que excede el número de variables PWM_R o PWM_L, entonces arroja una potencia cero a ese motor dado.

 if (PWMCount == 0) {
    if (PWML) {// si pwm left es positivo, gire de cierta manera
      digitalWrite (MOTOR + 2, ALTO);
      digitalWrite (MOTOR + 3, BAJO);
    } else {// sino gira hacia el otro lado el motor izquierdo
      digitalWrite (MOTOR + 2, BAJO);
      digitalWrite (MOTOR + 3, ALTO);
    }

  (...)

  if (PWMCount> = abs (PWM_L)) {// si el contador es igual a la potencia que queremos
    digitalWrite (MOTOR + 2, BAJO); // apaga los dos pines de este motor
    digitalWrite (MOTOR + 3, BAJO);
  }

  (...)

  PWMCount ++; // aumenta el contador
  if (PWMCount == 250) PWMCount = 0; // si el contador es igual al valor máximo que queremos
  Timer1.attachInterrupt (devolución de llamada); // 250 es igual a 100% de potencia
}

Durante el ciclo principal, el robot permanece buscando obstáculos y calculando rutas para evitarlos, o cambiar su camino. Si el desarrollador desea configurar el método de control de Campos potenciales, o cambiar el comportamiento del robot, solo tiene que trabajar una mejor función obst (). Las otras partes del programa son necesarias y no necesitan ser cambiadas. Cuando el robot recibe un mensaje a través de Bluetooth, deja de evitar obstáculos y simplemente escucha las entradas del usuario.

bucle vacío () // bucle principal
{
  lcd.clear (); // borra mensajes anteriores en lcd
  retraso (10); 
  buscar(); // busca obstáculos y guarda el valor de distancia a cada sensor
  lecturas (); // lee la brújula y calcula el error desde la dirección deseada
  calcPWM (); // calcula el PWM para cada motor en función del PID
  if (! mensagem) {// mensaje de Bluetooth? si no, continúa haciendo esto
    obst (); // aquí es donde el robot define su comportamiento
  } // y donde define la dirección a la que quiere ir
  
(...) 

De todas las partes del código, todas son bastante básicas, la única función que es interesante tomar nota aquí, son las lecturas (). En su interior, el robot obtiene el valor X, Y y Z para la posición actual en la brújula digital. Entonces, ¿cómo convertir esa lectura en algo que haga que el robot sepa en qué dirección está mirando?

Primero obtienes los valores en bruto:

doble rawX = event.magnetic.x;
doble rawY = event.magnetic.y;
doble rawZ = event.magnetic.z;

Luego verifique si el robot está en el plano correcto. Esto se puede hacer viendo si el Z (eje perpendicular) tiene un valor entre cierto rango pequeño

if ((rawZ> Zprim + 10) || (rawZ <Zprim - 10)) devuelve; // si no está bien, regrese

Ahora es el momento de normalizar los valores X e Y a un espacio entre [-1,1], para calcular sin () y cos () a partir de estos valores.

// Ymin, Ymax, Xmin y Xmax se obtienen cuando se produce la calibración
vector [1] = ((rawY) - ((Ymax + Ymin) / 2)) / ((Ymax - Ymin) / 2);
vector [0] = ((rawX) - ((Xmax + Xmin) / 2)) / ((Xmax - Xmin) / 2);

Ahora hacemos que vectorOBJ [n] sea un vector bidireccional que señala hacia dónde, en el plan, queremos que vaya el robot. Entonces, para encontrar el error entre dos vectores tenemos que hacer el producto cruzado entre ambos. El valor resultante es otro vector, pero perpendicular a ambos, apuntando hacia arriba o hacia abajo, dependiendo de su signo.

error = (vectorOBJ [0] * vector [0] + vectorOBJ [1] * vector [1]) / 
	 	(sqrt (vectorOBJ [0] * vectorOBJ [0] + vectorOBJ [1] * vectorOBJ [1]) 
		* sqrt (vector [0] * vector [0] + vector [1] * vector [1]));

error = (acos (error)) * 180 / PI; // de rad a grados
// descubre la forma en que apunta el vector de resultados
sentido = vector [0] * vectorOBJ [1] - vector [1] * vectorOBJ [0];
if (sentido> 0) error = -error

ULTIMAS PALABRAS

Después de la soldadura, monte el robot e implemente el código en el Arduino y en su teléfono, aún necesitará configurar muchos de sus atributos. Por ejemplo, tal vez un valor PWM positivo en el código gire la rueda haciendo que el robot retroceda, no avance. Tal vez positivo hará que un motor se mueva hacia un lado y el otro hacia el contrario. En este caso, simplemente cambie los cables en los terminales de los motores, y eso está bien.

Quizás tenga que cambiar la lectura de la variable, en lugar de X e Y, quizás el plan de su brújula sea con X y Z, o Y y Z. Depende de cómo haya colocado y configurado la brújula digital. Quizás su sensor llamado 0 (cero) no esté delante del robot, y tendrá que conectarlos o configurarlos de manera diferente.

Después de todo esto, probablemente habrá terminado su robot. Puede cambiar su comportamiento como lo desee, pero puedo garantizarle que funcionará, o al menos el código lo hará. El robot leerá correctamente la brújula, calculará hacia dónde se dirige, en qué dirección quiere ir, cuánta potencia proporcionará a cada motor y verá qué tan lejos están los obstáculos para cada sensor. Queda mucha memoria ROM, por lo que puede implementar una estrategia diferente como desee.

https://www.instructables.com/

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *