Saltar a contenido

Coche de ruedas Mecanum

  • Cómo construir un coche de ruedas Mecanum controlado a distancia.

En el curso de sistemas embebidos, se nos pidió diseñar un chasis de coche, así que construí un coche de ruedas Mecanum.


Principio

Ruedas Mecanum:

Las ruedas Mecanum tienen la característica de moverse suavemente en todas las direcciones, adaptándose a terrenos estrechos o con giros complicados. Sin embargo, tienen la desventaja de tener un alto consumo de energía, ser costosas, difíciles de fabricar y de mantener, y tener una vida útil relativamente corta.

Principio de dirección:

Lista de componentes

Nombre Enlace de referencia
Chasis de coche Mecanum (con motores TT) Enlace
Arduino UNO No requerido
Controlador de motores L293D No requerido
Módulo Bluetooth HC-06 No requerido
Servomotor 9g No requerido
Sensor ultrasónico HC-SR04 No requerido
Batería de litio 11.1V No requerido

Implementación del código

El control principal del coche utiliza Arduino UNO.

Archivos del proyecto: Mis proyectos de Arduino / Coche de ruedas Mecanum

Librería L293D: AFMotor.rar

Código:

//por YX Lin
#include <AFMotor.h> //Archivo de biblioteca de controlador L293D
#include <Servo.h> //Archivo de biblioteca de servo

#define SR04_Trig 11
#define SR04_Echo 12

int distancia = 0;
int tiempo_retardo = 300;
int tiempo_retardo_micro = 100;
int pos = 0;
int velocidad_motor = 200;

AF_DCMotor motor1(1);
AF_DCMotor motor2(4);
AF_DCMotor motor3(3);
AF_DCMotor motor4(2);

Servo myservo;

void setup() {
  Serial.begin(9600);
  myservo.attach(2);
  motor1.setSpeed(velocidad_motor);
  motor2.setSpeed(velocidad_motor);
  motor3.setSpeed(velocidad_motor);
  motor4.setSpeed(velocidad_motor);
  pinMode(SR04_Trig, OUTPUT);
  pinMode(SR04_Echo, INPUT);
  //servir();
}
void loop() {
  if (Serial.available()) {
    Serial.println("Hola");
    char x = Serial.read();
    if (x == 'W') mover_adelante();
    if (x == 'S') mover_atras();
    if (x == 'D') mover_derecha();
    if (x == 'A') mover_izquierda();
    if (x == 'E') derecha_delante();
    if (x == 'Q') izquierda_delante();
    if (x == 'C') rotar_derecha();
    if (x == 'Z') rotar_izquierda();
    if (x == 'X') apagar();

    if (x == 'F') servir();
    if (x == 'V')sr04(); //Medir distancia con ultrasonido

    Serial.println("ok");
  }
  delay(5);
}

void mover_adelante() {
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
  delay(tiempo_retardo);
  apagar();
}
void mover_atras() {
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);
  delay(tiempo_retardo);
  apagar();
}
void mover_derecha() {
  motor1.run(FORWARD);
  motor2.run(BACKWARD);
  motor3.run(FORWARD);
  motor4.run(BACKWARD);
  delay(tiempo_de_retardo);
  apagar();
}
void mover_izquierda() {
  motor1.run(BACKWARD);
  motor2.run(FORWARD);
  motor3.run(BACKWARD);
  motor4.run(FORWARD);
  delay(tiempo_de_retardo);
  apagar();
}
void derecha_delante() {
  motor1.run(FORWARD);
  motor2.run(RELEASE);
  motor3.run(FORWARD);
  motor4.run(RELEASE);
  delay(tiempo_de_retardo);
  apagar();
}
void izquierda_delante() {
  motor1.run(RELEASE);
  motor2.run(FORWARD);
  motor3.run(RELEASE);
  motor4.run(FORWARD);
  delay(tiempo_de_retardo);
  apagar();
}
void rotar_derecha() {
  motor1.run(FORWARD);
  motor2.run(BACKWARD);
  motor3.run(BACKWARD);
  motor4.run(FORWARD);
  delay(tiempo_de_retardo_micro);
  apagar();
}
void rotar_izquierda() {
  motor1.run(BACKWARD);
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(BACKWARD);
  delay(tiempo_de_retardo_micro);
  apagar();
}
void apagar() {
  motor1.run(RELEASE);
  motor2.run(RELEASE);
  motor3.run(RELEASE);
  motor4.run(RELEASE);
}
void servir() {
  for (pos = 0; pos <= 180; pos += 5) { // va desde 0 grados hasta 180 grados
    // en incrementos de 1 grado
    myservo.write(pos);              // indica al servo que vaya a la posición en la variable 'pos'
    delay(15);                       // espera 15ms para que el servo alcance la posición
  }
  for (pos = 180; pos >= 0; pos -= 5) { // va desde 180 grados hasta 0 grados
    myservo.write(pos);              // indica al servo que vaya a la posición en la variable 'pos'
    delay(15);                       // espera 15ms para que el servo alcance la posición
  }
}
void sr04() {
  digitalWrite(SR04_Trig, LOW); // envía un nivel bajo a Trig
  delayMicroseconds(2);    // espera 2 microsegundos
  digitalWrite(SR04_Trig, HIGH); // envía un nivel alto a Trig
  delayMicroseconds(10);    // espera 10 microsegundos
  digitalWrite(SR04_Trig, LOW); // envía un nivel bajo a Trig
  distance = ((float(pulseIn(SR04_Echo, HIGH)) * 17 ) / 100); // convierte el tiempo de eco en milímetros y resta la diferencia de distancia
}
if (distance < 9999 && distance > 0) {
  Serial.print("Distancia: ");
  Serial.println(distance);
} else {
  Serial.println("Distancia demasiado grande");
}
}

Control remoto por Bluetooth: Descarga la aplicación Arduino bluetooth controller y configura las teclas correspondientes según el código para poder controlar el vehículo a distancia.

Preguntas frecuentes

P: ¿Habrá seguimiento del proyecto en el futuro? R: Sí, tengo planeado trasladar el código a un STM32 y utilizar un controlador PS2 para el control remoto.

Conclusión

El vehículo en general puede realizar las funciones básicas, pero el control remoto por Bluetooth tiene limitaciones de distancia y no es muy suave. Se optimizará gradualmente mediante algoritmos en el futuro.

Referencias y agradecimientos

Dirección original del artículo: https://wiki-power.com/ Este artículo está protegido por la licencia CC BY-NC-SA 4.0. Si desea reproducirlo, por favor indique la fuente.

Este post está traducido usando ChatGPT, por favor feedback si hay alguna omisión.