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.