Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Robot de ruedas Arduino Mecanum

En este tutorial, aprenderemos cómo construir un robot Arduino Mecanum Wheels que sea capaz de moverse en cualquier dirección. Esta movilidad única del robot se logra mediante el uso de un tipo especial de ruedas, llamadas Ruedas Mecanum.

Puede ver el siguiente video o leer el tutorial escrito a continuación.

Resumen

De hecho, diseñé e imprimí en 3D estas ruedas porque pueden ser un poco caras de comprar. Funcionan bastante bien y debo decir que conducir esta plataforma robótica es muy divertido. Podemos controlar el robot de forma inalámbrica usando los módulos de transceptor de radio NRF24L01, o en mi caso, estoy usando mi transmisor RC DIY que hice en uno de mis videos anteriores.

También hice posible que se controlara usando un teléfono inteligente a través de la comunicación Bluetooth. Hice una aplicación Android personalizada a través de la cual podemos controlar el robot de ruedas Mecanum para moverse en cualquier dirección. Además, mediante el control deslizante de la aplicación podemos controlar la velocidad de movimiento.

El cerebro de esta plataforma robótica es una placa Arduino Mega que controla cada rueda individualmente. Cada rueda está unida a un motor paso a paso NEMA 17, y sabiendo que los motores paso a paso se pueden controlar con precisión, agregué una característica interesante más en la aplicación a través de la cual podemos programar el robot para que se mueva automáticamente. Usando el botón Guardar podemos guardar cada posición o paso y luego el robot puede ejecutar automáticamente y repetir estos pasos. Con el mismo botón podemos pausar el funcionamiento automático así como resetear o borrar todos los pasos para poder almacenar otros nuevos.

Robot Mecanum Wheels Modelo 3D

Para empezar, diseñé este robot Mecanum Wheels utilizando un software de modelado 3D. La plataforma base de este robot es una caja simple que fabricaré con tableros MDF de 8 mm.

Los cuatro motores paso a paso están unidos a esta plataforma y las ruedas Mecanum están unidas a los ejes del motor.

Puede buscar y descargar este modelo 3D, así como explorarlo en su navegador en Thangs.

Descargue el modelo 3D de ensamblaje de Thangs.

Archivos STL para impresión 3D:

Cómo funcionan las ruedas Mecanum

Una rueda Mecanum es una rueda con rodillos unidos a su circunferencia. Estos rodillos se colocan en diagonal o en un ángulo de 45 grados con respecto al eje de rotación de la rueda. Esto hace que la rueda ejerza fuerza en dirección diagonal cuando se mueve hacia adelante o hacia atrás.

Entonces, al girar las ruedas en cierto patrón, utilizamos estas fuerzas diagonales y, por lo tanto, el robot puede moverse en cualquier dirección.

También debemos señalar aquí que necesitamos dos tipos de ruedas Mecanum, a menudo denominadas ruedas Mecanum para zurdos y para diestros. La diferencia entre ellos es la orientación de los rodillos y deben instalarse en el robot en ubicaciones específicas. El eje de rotación del rodillo superior de cada rueda debe apuntar al centro del robot.

Aquí hay una demostración rápida de cómo se mueve el robot según la dirección de rotación de las ruedas.

Si las cuatro ruedas se mueven hacia adelante, el movimiento resultante del robot será hacia adelante y viceversa, si todas las ruedas se mueven hacia atrás, el robot se moverá hacia atrás. Para moverse hacia la derecha, las ruedas de la derecha deben girar dentro del robot, mientras que las ruedas de la izquierda deben girar fuera del robot. La fuerza resultante debida a los rodillos colocados en diagonal hará que el robot se mueva hacia la derecha. Lo mismo pero al contrario sucede cuando se mueve hacia la izquierda. Con estas ruedas también podemos lograr el movimiento en dirección diagonal girando solo dos ruedas.

Haciendo el robot de ruedas Mecanum

Sin embargo, ahora déjame mostrarte cómo construí esta plataforma de robot. Como mencioné, para hacer la base de la plataforma estoy usando tableros MDF de 8 mm. Usando una sierra de mesa, primero corté todas las piezas de acuerdo con las dimensiones del modelo 3D.

A continuación, con un taladro de 3 mm y una broca Forstner de 25 mm, hice las aberturas en los paneles laterales para colocar los motores paso a paso. Una vez que tuve las piezas listas, continué con el montaje. Usé un pegamento para madera y algunos tornillos para asegurarlos. Lo más importante aquí es tener las aberturas para los motores hechas con precisión para que todas las ruedas tengan un contacto parejo con la superficie más adelante.

Por supuesto, también podría imprimir en 3D esta plataforma base, en lugar de hacerlo con MDF, por lo que incluiré un archivo 3D en el artículo del sitio web. Finalmente, pinté con spray la base y su cubierta con color blanco.

A continuación están las ruedas Mecanum. Como dije antes, estas ruedas pueden ser un poco caras de comprar, por eso decidí diseñarlas e imprimirlas en 3D. Las ruedas están hechas de dos partes, el lado exterior y el interior, que se unen con pernos y tuercas M4. Tienen 10 rodillos cada uno y un acoplador de eje diseñado específicamente para adaptarse a un motor paso a paso NEMA 17.

Imprimí en 3D todas las piezas de las ruedas Mecanum con mi impresora 3D Creality CR-10.

Aquí hay un enlace a esta impresora 3D en caso de que quieras echarle un vistazo.

Entonces, una vez que tuve listas las piezas impresas en 3D, continué con la fabricación de los ejes de los rodillos. Para ello, utilicé alambre de acero de garrapatas de 3 mm. La longitud de los ejes debe ser de unos 40 mm, por lo que con una herramienta giratoria corté el cable a esa longitud.

Empecé a montar la rueda Mecanum asegurando los dos lados y el acoplador del eje con cuatro tornillos y tuercas M4. La longitud de los pernos debe ser de 45 mm.

Para instalar los rodillos, primero debemos insertar ligeramente el eje a través de los orificios ubicados en la circunferencia del lado interior.

Luego podemos insertar una pequeña arandela M3, insertar el rodillo y empujar el eje hasta el final en la ranura del lado exterior de la rueda. Usé una sola arandela porque no tenía suficiente espacio para insertar una segunda arandela en el otro lado.

Repetí este proceso para los 10 rodillos. En realidad, es fácil y divertido ensamblar estas ruedas. Lo importante aquí es que los rodillos deben poder moverse libremente.

Al final, usé unas gotas de pegamento AC en cada uno de los orificios internos para asegurarme de que los ejes no se aflojaran.

Bien, una vez que las ruedas estén listas, podemos continuar con el montaje de todo el robot. Primero, necesitamos unir los motores paso a paso a la plataforma base. Para asegurarlos en su lugar, utilicé pernos M3 con una longitud de 12 mm.

A continuación, debemos unir las ruedas a los ejes del motor. El acoplador del eje que hice tiene una ranura para insertar una tuerca M3, a través de la cual pueden pasar tornillos M3 y así podemos asegurar la rueda al eje.

Luego, para asegurar la tapa superior a la base, coloqué varillas roscadas en dos esquinas de la base. Hice agujeros en la misma posición en la tapa y así pude insertar y asegurar fácilmente la tapa a la base.

En la parte posterior de la base, hice un orificio de 20 mm para colocar un interruptor de encendido más adelante, así como un orificio de 5 mm para colocar un LED.

Diagrama de circuito

Ahora podemos continuar con la electrónica. Aquí está el diagrama de circuito completo de este proyecto.

Entonces controlaremos los cuatro motores paso a paso NEMA 17 usando cuatro controladores paso a paso DRV8825, o también podríamos usar los controladores paso a paso A4988. Para alimentar los steppers y todo el robot usaremos una fuente de alimentación de 12V, y en mi caso, usaré una batería Li-Po 3S que proporciona alrededor de 12V. Para la comunicación por radio estamos usando el módulo NRF24L01, y para la comunicación por Bluetooth estamos usando el módulo Bluetooth HC-05. También incluí un divisor de voltaje simple que se usará para monitorear el voltaje de la batería y una conexión LED para indicar cuándo el voltaje de la batería caerá por debajo de 11 V.

También incluí un regulador de voltaje de 5V dedicado que puede proporcionar alrededor de 3A de corriente. Esto es opcional, pero estoy planeando en un video futuro combinar este proyecto con mi proyecto Arduino Robot Arm, y para ese propósito necesitaría 5V para impulsar sus servomotores.

Puede obtener los componentes necesarios para este proyecto en los siguientes enlaces:

  • Motor paso a paso:NEMA 17………………
  • Controlador paso a paso DRV8825……………………
  • Módulo transceptor NRF24L01…….…
  • Módulo Bluetooth HC-05 …………….…
  • Batería Li-Po ……………………………….……
  • Megaplaca Arduino …………………….…

Diseño de PCB

Sin embargo, para mantener los componentes electrónicos organizados y deshacerme del desorden del cableado, diseñé una PCB personalizada utilizando el software gratuito de diseño de circuitos en línea EasyEDA. Este PCB en realidad actuará como un escudo Arduino MEGA porque podremos conectarlo directamente en la parte superior de la placa Arduino Mega. Usé tanto la capa superior como la inferior para ejecutar las conexiones. Para aquellos pines de Arduno que no usé, incluí conexiones de encabezado de pin para que estén disponibles en caso de que queramos usarlos para algo en el futuro. También incluí pines de conexión de 12 V, 5 V y GND, así como pines para seleccionar la resolución de paso de los controladores.

Aquí hay un enlace a los archivos de proyecto de este diseño de PCB. Entonces, una vez que terminé el diseño, generé el archivo Gerber necesario para fabricar la PCB.

Archivo Gerber:

Luego ordené el PCB de JLCPCB, que también es el patrocinador de este video.

Aquí podemos simplemente arrastrar y soltar el archivo Gerber y una vez cargado, podemos revisar nuestro PCB en el visor de Gerber. Si todo está bien, podemos continuar y seleccionar las propiedades que queremos para nuestra PCB. Esta vez elegí que el color de la PCB fuera azul para que coincidiera con el color de la placa Arduino. Y eso es todo, ahora podemos simplemente pedir nuestro PCB a un precio razonable. Tenga en cuenta que si es su primer pedido de JLCPCB, puede obtener hasta 10 PCB por solo $2.

Después de varios días han llegado los PCB. La calidad de los PCB es excelente y todo es exactamente igual que en el diseño.

Ensamblaje de la PCB

Bien, ahora podemos continuar y ensamblar la PCB. Empecé soldando primero los componentes más pequeños, las resistencias y los condensadores. Luego inserté y soldé los cabezales de clavijas macho a la PCB que se usarán para conectarla a la placa Arduino.

A continuación, coloqué todos los cabezales de clavijas hembra en su lugar y también los soldé. En cuanto a las conexiones de los motores paso a paso y los pines para seleccionar la resolución de paso, utilicé cabezales de pines macho. De esta manera, podemos conectar directamente los motores a la PCB y usar puentes para seleccionar la resolución de paso. Luego soldé los bloques de terminales, la recortadora y el regulador de voltaje.

Y eso es todo, la PCB ahora está lista y podemos continuar con la inserción de los controladores y la conexión de los motores. Primero, coloqué los puentes para seleccionar la resolución de paso. Seleccioné la resolución de paso 16 conectando los pines MS3 de los controladores a 5 V.

Luego encima de ellos coloqué los drivers DRV8825, así como también conecté el módulo NRF24L01 y el módulo Bluetooth HC-05. Ahora podemos simplemente conectar la PCB a la placa Arduno.

A continuación, conecté la batería al bloque de terminales apropiado y los coloqué en la plataforma base.

Aquí inserté el interruptor de encendido en su lugar y lo conecté al otro bloque de terminales. Justo encima del interruptor de encendido, también inserté el LED indicador de batería.

Lo que queda ahora es conectar los motores a la PCB. Debemos tener en cuenta aquí que al conectar motores opuestos, también debemos conectar sus conectores opuestos. Esto es necesario más adelante al programar el robot, de modo que, por ejemplo, el comando de avance, movería ambos motores en la misma dirección, aunque en realidad están volteados y uno haría la rotación en el sentido de las agujas del reloj y el otro en el sentido contrario.

Al final, simplemente puedo insertar la cubierta en la parte superior, y así hemos terminado con este proyecto de robot Mecanum Wheels.

Mecanum Wheels Robot Arduino Code

Lo que queda para este video es echar un vistazo al código de Arduino. En realidad, hay dos códigos Arduino separados. Este es para controlar el robot usando los módulos NRF24L01 y el otro es para controlar el robot usando un teléfono inteligente.

Código Arduino para controlar el robot usando los módulos NRF24L01:

/*
   === Arduino Mecanum Wheels Robot ===
     Radio control with NRF24L01 
  by Dejan, www.HowToMechatronics.com
  Libraries:
  RF24, https://github.com/tmrh20/RF24/
  AccelStepper by Mike McCauley: http://www.airspayce.com/mikem/arduino/AccelStepper/index.html

*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#include <AccelStepper.h>

RF24 radio(48, 49);   // nRF24L01 (CE, CSN)

const byte address[6] = "00001";
unsigned long lastReceiveTime = 0;
unsigned long currentTime = 0;

// Define the stepper motors and the pins the will use
AccelStepper LeftBackWheel(1, 42, 43);   // (Type:driver, STEP, DIR) - Stepper1
AccelStepper LeftFrontWheel(1, 40, 41);  // Stepper2
AccelStepper RightBackWheel(1, 44, 45);  // Stepper3
AccelStepper RightFrontWheel(1, 46, 47); // Stepper4

int wheelSpeed = 1500;

// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
  byte j1PotX;
  byte j1PotY;
  byte j1Button;
  byte j2PotX;
  byte j2PotY;
  byte j2Button;
  byte pot1;
  byte pot2;
  byte tSwitch1;
  byte tSwitch2;
  byte button1;
  byte button2;
  byte button3;
  byte button4;
};
Data_Package data; //Create a variable with the above structure

void setup() {
  // Set initial seed values for the steppers
  LeftFrontWheel.setMaxSpeed(3000);
  LeftBackWheel.setMaxSpeed(3000);
  RightFrontWheel.setMaxSpeed(3000);
  RightBackWheel.setMaxSpeed(3000);

  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_LOW);
  radio.startListening(); //  Set the module as receiver

  Serial.begin(115200);
}

void loop() {
  // Check whether we keep receving data, or we have a connection between the two modules
  currentTime = millis();
  if ( currentTime - lastReceiveTime > 1000 ) { // If current time is more then 1 second since we have recived the last data, that means we have lost connection
    resetData(); // If connection is lost, reset the data. It prevents unwanted behavior, for example if a drone jas a throttle up, if we lose connection it can keep flying away if we dont reset the function
  }
  // Check whether there is data to be received
  if (radio.available()) {
    radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure
    lastReceiveTime = millis(); // At this moment we have received the data
  }
  // Set speed - left potentiometer
  wheelSpeed = map(data.pot1, 0, 255, 100, 3000);
  
  if (data.j1PotX > 150) {
    moveSidewaysLeft();
  }
  else if (data.j1PotX < 100) {
    moveSidewaysRight();
  }
  else if (data.j1PotY > 160) {
    moveForward();
  }
  else if (data.j1PotY < 100) {
    moveBackward();
  }
  else if (data.j2PotX < 100 & data.j2PotY > 160) {
    moveRightForward();
  }
  else if (data.j2PotX > 160 & data.j2PotY > 160) {
    moveLeftForward();
  }
  else if (data.j2PotX < 100 & data.j2PotY < 100) {
    moveRightBackward();
  }
  else if (data.j2PotX > 160 & data.j2PotY < 100) {
    moveLeftBackward();
  }
  else if (data.j2PotX < 100) {
    rotateRight();
  }
  else if (data.j2PotX > 150) {
    rotateLeft();
  }
  else {
    stopMoving();
  }
  // Execute the steps
  LeftFrontWheel.runSpeed();
  LeftBackWheel.runSpeed();
  RightFrontWheel.runSpeed();
  RightBackWheel.runSpeed();
  
  // Monitor the battery voltage
  int sensorValue = analogRead(A0);
  float voltage = sensorValue * (5.0 / 1023.00) * 3; // Convert the reading values from 5v to suitable 12V i
  // If voltage is below 11V turn on the LED
  if (voltage < 11) {
    digitalWrite(led, HIGH);
  }
  else {
    digitalWrite(led, LOW);
  }
}

void moveForward() {
  LeftFrontWheel.setSpeed(wheelSpeed);
  LeftBackWheel.setSpeed(wheelSpeed);
  RightFrontWheel.setSpeed(wheelSpeed);
  RightBackWheel.setSpeed(wheelSpeed);
}
void moveBackward() {
  LeftFrontWheel.setSpeed(-wheelSpeed);
  LeftBackWheel.setSpeed(-wheelSpeed);
  RightFrontWheel.setSpeed(-wheelSpeed);
  RightBackWheel.setSpeed(-wheelSpeed);
}
void moveSidewaysRight() {
  LeftFrontWheel.setSpeed(wheelSpeed);
  LeftBackWheel.setSpeed(-wheelSpeed);
  RightFrontWheel.setSpeed(-wheelSpeed);
  RightBackWheel.setSpeed(wheelSpeed);
}
void moveSidewaysLeft() {
  LeftFrontWheel.setSpeed(-wheelSpeed);
  LeftBackWheel.setSpeed(wheelSpeed);
  RightFrontWheel.setSpeed(wheelSpeed);
  RightBackWheel.setSpeed(-wheelSpeed);
}
void rotateLeft() {
  LeftFrontWheel.setSpeed(-wheelSpeed);
  LeftBackWheel.setSpeed(-wheelSpeed);
  RightFrontWheel.setSpeed(wheelSpeed);
  RightBackWheel.setSpeed(wheelSpeed);
}
void rotateRight() {
  LeftFrontWheel.setSpeed(wheelSpeed);
  LeftBackWheel.setSpeed(wheelSpeed);
  RightFrontWheel.setSpeed(-wheelSpeed);
  RightBackWheel.setSpeed(-wheelSpeed);
}
void moveRightForward() {
  LeftFrontWheel.setSpeed(wheelSpeed);
  LeftBackWheel.setSpeed(0);
  RightFrontWheel.setSpeed(0);
  RightBackWheel.setSpeed(wheelSpeed);
}
void moveRightBackward() {
  LeftFrontWheel.setSpeed(0);
  LeftBackWheel.setSpeed(-wheelSpeed);
  RightFrontWheel.setSpeed(-wheelSpeed);
  RightBackWheel.setSpeed(0);
}
void moveLeftForward() {
  LeftFrontWheel.setSpeed(0);
  LeftBackWheel.setSpeed(wheelSpeed);
  RightFrontWheel.setSpeed(wheelSpeed);
  RightBackWheel.setSpeed(0);
}
void moveLeftBackward() {
  LeftFrontWheel.setSpeed(-wheelSpeed);
  LeftBackWheel.setSpeed(0);
  RightFrontWheel.setSpeed(0);
  RightBackWheel.setSpeed(-wheelSpeed);
}
void stopMoving() {
  LeftFrontWheel.setSpeed(0);
  LeftBackWheel.setSpeed(0);
  RightFrontWheel.setSpeed(0);
  RightBackWheel.setSpeed(0);
}


void resetData() {
  // Reset the values when there is no radio connection - Set initial default values
  data.j1PotX = 127;
  data.j1PotY = 127;
  data.j2PotX = 127;
  data.j2PotY = 127;
  data.j1Button = 1;
  data.j2Button = 1;
  data.pot1 = 1;
  data.pot2 = 1;
  data.tSwitch1 = 1;
  data.tSwitch2 = 1;
  data.button1 = 1;
  data.button2 = 1;
  data.button3 = 1;
  data.button4 = 1;
}Code language: Arduino (arduino)

Descripción: Entonces, aquí estamos usando la biblioteca RF24 para la comunicación por radio y la biblioteca AccelStepper para controlar los motores paso a paso. Primero, debemos definir los pines a los que todos ellos están conectados, definir algunas variables necesarias para el programa a continuación y, en la sección de configuración, establecer la velocidad máxima de los motores paso a paso y comenzar la comunicación por radio.

En la sección de bucle, comenzamos leyendo los datos que provienen del transmisor RC. El código del transmisor RC, así como más detalles sobre cómo funciona esta comunicación, se pueden encontrar en mi tutorial particular.

Entonces, dependiendo de los datos recibidos, por ejemplo, si el Joystick izquierdo se mueve hacia adelante, su valor será superior a 160 y, en tal caso, llamará a la función personalizada moveForward(). Si echamos un vistazo a esta función, podemos ver que todo lo que hace es establecer la velocidad de los motores en positivo. Para moverse hacia atrás, la velocidad se establece en negativo. Entonces, para movernos en todas las demás direcciones, solo tenemos que configurar las rotaciones de las ruedas de manera adecuada, como se explicó al principio.

Para ejecutar estos comandos, en la sección de bucle necesitamos llamar a las funciones runSpeed() para todos los motores paso a paso. En la sección de bucle también leemos la entrada analógica del divisor de voltaje proveniente de la batería, y de acuerdo con este valor podemos saber cuándo el voltaje de la batería caerá por debajo de 11 V para que podamos encender el indicador LED.

Código Arduino para controlar un robot usando un teléfono inteligente:

/*
   === Arduino Mecanum Wheels Robot ===
     Smartphone control via Bluetooth 
  by Dejan, www.HowToMechatronics.com
  Libraries:
  RF24, https://github.com/tmrh20/RF24/
  AccelStepper by Mike McCauley: http://www.airspayce.com/mikem/arduino/AccelStepper/index.html

*/

#include <SoftwareSerial.h>
#include <AccelStepper.h>

SoftwareSerial Bluetooth(A8, 38); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX)

// Define the stepper motors and the pins the will use
AccelStepper LeftBackWheel(1, 42, 43);   // (Type:driver, STEP, DIR) - Stepper1
AccelStepper LeftFrontWheel(1, 40, 41);  // Stepper2
AccelStepper RightBackWheel(1, 44, 45);  // Stepper3
AccelStepper RightFrontWheel(1, 46, 47); // Stepper4

#define led 14

int wheelSpeed = 1500;

int dataIn, m;

int lbw[50], lfw[50], rbw[50], rfw[50]; // for storing positions/steps
int index = 0;

void setup() {
  // Set initial seed values for the steppers
  LeftFrontWheel.setMaxSpeed(3000);
  LeftBackWheel.setMaxSpeed(3000);
  RightFrontWheel.setMaxSpeed(3000);
  RightBackWheel.setMaxSpeed(3000);

  Serial.begin(38400);
  Bluetooth.begin(38400); // Default baud rate of the Bluetooth module
  Bluetooth.setTimeout(1);
  delay(20);

  pinMode(led, OUTPUT);

}

void loop() {
  // Check for incoming data

  if (Bluetooth.available() > 0) {
    dataIn = Bluetooth.read();  // Read the data

    if (dataIn == 0) {
      m = 0;
    }
    if (dataIn == 1) {
      m = 1;
    }
    if (dataIn == 2) {
      m = 2;
    }
    if (dataIn == 3) {
      m = 3;
    }
    if (dataIn == 4) {
      m = 4;
    }
    if (dataIn == 5) {
      m = 5;
    }
    if (dataIn == 6) {
      m = 6;
    }
    if (dataIn == 7) {
      m = 7;
    }
    if (dataIn == 8) {
      m = 8;

    }
    if (dataIn == 9) {
      m = 9;
    }
    if (dataIn == 10) {
      m = 10;
    }
    if (dataIn == 11) {
      m = 11;
    }

    if (dataIn == 12) {
      m = 12;
    }
    if (dataIn == 14) {
      m = 14;
    }
    // Set speed
    if (dataIn >= 16) {
      wheelSpeed = dataIn * 10;
      Serial.println(wheelSpeed);
    }
  }
  if (m == 4) {
    moveSidewaysLeft();
  }
  if (m == 5) {
    moveSidewaysRight();
  }
  if (m == 2) {
    moveForward();
  }
  if (m == 7) {
    moveBackward();
  }
  if (m == 3) {
    moveRightForward();
  }
  if (m == 1) {
    moveLeftForward();
  }
  if (m == 8) {
    moveRightBackward();
  }
  if (m == 6) {
    moveLeftBackward();
  }
  if (m == 9) {
    rotateLeft();
  }
  if (m == 10) {
    rotateRight();
  }

  if (m == 0) {
    stopMoving();
  }
  //Serial.println(dataIn);
  // If button "SAVE" is pressed
  if (m == 12) {
    if (index == 0) {
      LeftBackWheel.setCurrentPosition(0);
      LeftFrontWheel.setCurrentPosition(0);
      RightBackWheel.setCurrentPosition(0);
      RightFrontWheel.setCurrentPosition(0);
    }
    lbw[index] = LeftBackWheel.currentPosition();  // save position into the array
    lfw[index] = LeftFrontWheel.currentPosition();
    rbw[index] = RightBackWheel.currentPosition();
    rfw[index] = RightFrontWheel.currentPosition();
    index++;                        // Increase the array index
    m = 0;
  }

  if (m == 14) {
    runSteps();
    if (dataIn != 14) {
      stopMoving();
      memset(lbw, 0, sizeof(lbw)); // Clear the array data to 0
      memset(lfw, 0, sizeof(lfw));
      memset(rbw, 0, sizeof(rbw));
      memset(rfw, 0, sizeof(rfw));
      index = 0;  // Index to 0
    }
  }

  LeftFrontWheel.runSpeed();
  LeftBackWheel.runSpeed();
  RightFrontWheel.runSpeed();
  RightBackWheel.runSpeed();

  // Monitor the battery voltage
  int sensorValue = analogRead(A0);
  float voltage = sensorValue * (5.0 / 1023.00) * 3; // Convert the reading values from 5v to suitable 12V i
  //Serial.println(voltage);
  // If voltage is below 11V turn on the LED
  if (voltage < 11) {
    digitalWrite(led, HIGH);
  }
  else {
    digitalWrite(led, LOW);
  }

}

void runSteps() {
  for (int i = index - 1; i >= 0; i--) { // Run through all steps(index)
    LeftFrontWheel.moveTo(lfw[i]);
    LeftFrontWheel.setSpeed(wheelSpeed);
    LeftBackWheel.moveTo(lbw[i]);
    LeftBackWheel.setSpeed(wheelSpeed);
    RightFrontWheel.moveTo(rfw[i]);
    RightFrontWheel.setSpeed(wheelSpeed);
    RightBackWheel.moveTo(rbw[i]);
    RightBackWheel.setSpeed(wheelSpeed);

    while (LeftBackWheel.currentPosition() != lbw[i] & LeftFrontWheel.currentPosition() != lfw[i] & RightFrontWheel.currentPosition() != rfw[i] & RightBackWheel.currentPosition() != rbw[i]) {
      LeftFrontWheel.runSpeedToPosition();
      LeftBackWheel.runSpeedToPosition();
      RightFrontWheel.runSpeedToPosition();
      RightBackWheel.runSpeedToPosition();

      if (Bluetooth.available() > 0) {      // Check for incomding data
        dataIn = Bluetooth.read();
        if ( dataIn == 15) {           // If button "PAUSE" is pressed
          while (dataIn != 14) {         // Wait until "RUN" is pressed again
            if (Bluetooth.available() > 0) {
              dataIn = Bluetooth.read();
              if ( dataIn == 13) {
                stopMoving();
                break;
              }
            }
          }
        }
        if (dataIn >= 16) {
          wheelSpeed = dataIn * 10;
          dataIn = 14;
        }
        if ( dataIn == 13) {
          break;
        }
      }
    }
  }
  // Go back through steps
  for (int i = 1; i <= index - 1; i++) { // Run through all steps(index)

    LeftFrontWheel.moveTo(lfw[i]);
    LeftFrontWheel.setSpeed(wheelSpeed);
    LeftBackWheel.moveTo(lbw[i]);
    LeftBackWheel.setSpeed(wheelSpeed);
    RightFrontWheel.moveTo(rfw[i]);
    RightFrontWheel.setSpeed(wheelSpeed);
    RightBackWheel.moveTo(rbw[i]);
    RightBackWheel.setSpeed(wheelSpeed);

    while (LeftBackWheel.currentPosition() != lbw[i]& LeftFrontWheel.currentPosition() != lfw[i] & RightFrontWheel.currentPosition() != rfw[i] & RightBackWheel.currentPosition() != rbw[i]) {

      LeftFrontWheel.runSpeedToPosition();
      LeftBackWheel.runSpeedToPosition();
      RightFrontWheel.runSpeedToPosition();
      RightBackWheel.runSpeedToPosition();
      //Serial.print("  current: ");
      //Serial.println(LeftBackWheel.currentPosition());

      if (Bluetooth.available() > 0) {      // Check for incomding data
        dataIn = Bluetooth.read();
        if ( dataIn == 15) {           // If button "PAUSE" is pressed
          while (dataIn != 14) {         // Wait until "RUN" is pressed again
            if (Bluetooth.available() > 0) {
              dataIn = Bluetooth.read();
              if ( dataIn == 13) {
                stopMoving();
                break;
              }
            }
          }
        }
        if (dataIn >= 16) {
          wheelSpeed = dataIn * 10;
          dataIn = 14;
        }
        if ( dataIn == 13) {
          //Serial.println("DEKI");
          break;
        }
      }
    }
  }
}

void moveForward() {
  LeftFrontWheel.setSpeed(wheelSpeed);
  LeftBackWheel.setSpeed(wheelSpeed);
  RightFrontWheel.setSpeed(wheelSpeed);
  RightBackWheel.setSpeed(wheelSpeed);
}
void moveBackward() {
  LeftFrontWheel.setSpeed(-wheelSpeed);
  LeftBackWheel.setSpeed(-wheelSpeed);
  RightFrontWheel.setSpeed(-wheelSpeed);
  RightBackWheel.setSpeed(-wheelSpeed);
}
void moveSidewaysRight() {
  LeftFrontWheel.setSpeed(wheelSpeed);
  LeftBackWheel.setSpeed(-wheelSpeed);
  RightFrontWheel.setSpeed(-wheelSpeed);
  RightBackWheel.setSpeed(wheelSpeed);
}
void moveSidewaysLeft() {
  LeftFrontWheel.setSpeed(-wheelSpeed);
  LeftBackWheel.setSpeed(wheelSpeed);
  RightFrontWheel.setSpeed(wheelSpeed);
  RightBackWheel.setSpeed(-wheelSpeed);
}
void rotateLeft() {
  LeftFrontWheel.setSpeed(-wheelSpeed);
  LeftBackWheel.setSpeed(-wheelSpeed);
  RightFrontWheel.setSpeed(wheelSpeed);
  RightBackWheel.setSpeed(wheelSpeed);
}
void rotateRight() {
  LeftFrontWheel.setSpeed(wheelSpeed);
  LeftBackWheel.setSpeed(wheelSpeed);
  RightFrontWheel.setSpeed(-wheelSpeed);
  RightBackWheel.setSpeed(-wheelSpeed);
}
void moveRightForward() {
  LeftFrontWheel.setSpeed(wheelSpeed);
  LeftBackWheel.setSpeed(0);
  RightFrontWheel.setSpeed(0);
  RightBackWheel.setSpeed(wheelSpeed);
}
void moveRightBackward() {
  LeftFrontWheel.setSpeed(0);
  LeftBackWheel.setSpeed(-wheelSpeed);
  RightFrontWheel.setSpeed(-wheelSpeed);
  RightBackWheel.setSpeed(0);
}
void moveLeftForward() {
  LeftFrontWheel.setSpeed(0);
  LeftBackWheel.setSpeed(wheelSpeed);
  RightFrontWheel.setSpeed(wheelSpeed);
  RightBackWheel.setSpeed(0);
}
void moveLeftBackward() {
  LeftFrontWheel.setSpeed(-wheelSpeed);
  LeftBackWheel.setSpeed(0);
  RightFrontWheel.setSpeed(0);
  RightBackWheel.setSpeed(-wheelSpeed);
}
void stopMoving() {
  LeftFrontWheel.setSpeed(0);
  LeftBackWheel.setSpeed(0);
  RightFrontWheel.setSpeed(0);
  RightBackWheel.setSpeed(0);
}Code language: Arduino (arduino)

Descripción: El otro código para controlar el robot usando la aplicación de Android es muy similar y funciona de la misma manera. Aquí, en lugar del módulo de radio, necesitamos definir el módulo Bluetooth e inicializar su comunicación en la sección de configuración. Entonces, nuevamente, primero leemos los datos entrantes del teléfono inteligente o la aplicación de Android y, de acuerdo con ellos, le indicamos al robot en qué dirección debe moverse.

Si echamos un vistazo a la aplicación de Android, podemos ver que simplemente envía números del 0 al 15 a través del Bluetooth cuando se presionan los botones.

La aplicación se realiza utilizando la aplicación en línea MIT App Inventor y puede encontrar más detalles al respecto en mi tutorial particular.

Aquí puede descargar esta aplicación, así como el archivo del proyecto editable:

Para programar el movimiento automático del robot con esta aplicación, cuando presionamos el botón "GUARDAR" simplemente almacenamos las posiciones actuales de los motores paso a paso en matrices. Luego, cuando presionamos el botón "EJECUTAR", llamamos a la función personalizada runSteps() que ejecuta o recorre todos los pasos almacenados usando algunos bucles for y while.

Espero que hayas disfrutado este tutorial y hayas aprendido algo nuevo. No dude en hacer cualquier pregunta en la sección de comentarios a continuación y consulte mi Colección de proyectos de Arduino.


Proceso de manufactura

  1. Robot Raspberry Pi controlado por Bluetooth
  2. Obstáculos que evitan el robot con servomotor
  3. Robot seguidor de línea
  4. Robot controlado por voz
  5. Robot de piano controlado por Arduino:PiBot
  6. Littlearm 2C:Construya un brazo robótico Arduino impreso en 3D
  7. Robot asistente doméstico autónomo
  8. Controla el brazo del robot Arduino con la aplicación de Android
  9. Robot para navegación interior supercogedora
  10. WiDC:Robot FPV controlado por Wi-Fi
  11. ¡Robot humanoide parlante inteligente solo con Arduino!