INFORMACIÓN
El Kit Chasis de Metal MC300 con Llantas Omnidireccional + Joystick ofrece todo para la construcción de un carro o robot móvil con la movilidad en cualquier dirección por control inalámbrico y programación en Arduino; ya que incluye:
|
|
El Kit Chasis de Metal MC300 con Llantas Omnidireccional + Joystick es ideal para aplicaciones que requieren movimientos complejos y precisos como,: competiciones de robótica, investigación y desarrollo de prototipos o educación en tecnología permite una fácil integración de los motores, controladores y sensores, lo que lo convierte en una opción versátil tanto para aficionados como para profesionales en robótica.
ESPECIFICACIONES Y CARACTERÍSTICAS
Chasis
|
Motor
|
Llantas
|
DOCUMENTACIÓN Y RECURSOS
Datasheet
INFORMACIÓN ADICIONAL
Instrucciones para el manejo Robot Omnidireccional con Control
A continuación se detallan las conexiones entre los dispositivos involucrados:
- Arduino UNO R3: Conectado al Shield y al porta baterías 18650 para suministrar energía y control.
- Shield de expansión: Se utiliza para realizar las conexiones de los cuatro motores y el receptor , asegurando que todo funcione correctamente.

Código
Con el siguiente programa podrás controlar el movimiento de tu robot mediante el control PS2, con las siguientes funcionalidades:
- Adelante
- Atrás
- Derecha
- Izquierda
- Giro a la derecha/izquierda
Para que este código funcione correctamente, necesitas descargar e importar la siguiente librería en tu entorno de desarrollo Arduino IDE:
- Librería: Librería PS2X_lib.h
En el código, encontrarás algunas líneas comentadas. Estas líneas permiten habilitar la opción de leer los movimientos a través del joystick PS2, si deseas agregar esta funcionalidad.
#include "PS2X_lib.h"
PS2X ps2x; // create PS2 Controller Class
//en este momento, la biblioteca NO admite controladores conectables en caliente, es decir
//siempre debes reiniciar tu Arduino después de conectar el controlador,
//o llamar a config_gamepad(pins) nuevamente después de conectar el controlador.
int error = 0;
byte type = 0;
byte vibrate = 0;
// U1 Driver
// Motor 1 Izquierda
#define U1AN1 8
#define U1AN2 9
// Motor 2 Derecha
#define U1BN1 7
#define U1BN2 6
// U2 Driver
// Motor 3 IZquierda
#define U2AN1 4
#define U2AN2 5
// Motor 4
#define U2BN1 2
#define U2BN2 3
// FRENTE
// U2BN1 U2AN1
// U2BN2 U2AN2
// U1BN1 U1AN1
// U1BN2 U1AN2
// TRASERA
void adelante()
{
digitalWrite(U1AN1,HIGH);
digitalWrite(U1AN2,LOW);
digitalWrite(U1BN1,HIGH);
digitalWrite(U1BN2,LOW);
digitalWrite(U2AN1,HIGH);
digitalWrite(U2AN2,LOW);
digitalWrite(U2BN1,HIGH);
digitalWrite(U2BN2,LOW);
}
void atras()
{
digitalWrite(U1AN1,LOW);
digitalWrite(U1AN2,HIGH);
digitalWrite(U1BN1,LOW);
digitalWrite(U1BN2,HIGH);
digitalWrite(U2AN1,LOW);
digitalWrite(U2AN2,HIGH);
digitalWrite(U2BN1,LOW);
digitalWrite(U2BN2,HIGH);
}
void der()
{
digitalWrite(U1AN1,HIGH);
digitalWrite(U1AN2,LOW);
digitalWrite(U1BN1,LOW);
digitalWrite(U1BN2,HIGH);
digitalWrite(U2AN1,LOW);
digitalWrite(U2AN2,HIGH);
digitalWrite(U2BN1,HIGH);
digitalWrite(U2BN2,LOW);
}
void izq()
{
digitalWrite(U1AN1,LOW);
digitalWrite(U1AN2,HIGH);
digitalWrite(U1BN1,HIGH);
digitalWrite(U1BN2,LOW);
digitalWrite(U2AN1,HIGH);
digitalWrite(U2AN2,LOW);
digitalWrite(U2BN1,LOW);
digitalWrite(U2BN2,HIGH);
}
void giro_izq()
{
digitalWrite(U1AN1,LOW);
digitalWrite(U1AN2,HIGH);
digitalWrite(U1BN1,LOW);
digitalWrite(U1BN2,HIGH);
digitalWrite(U2AN1,HIGH);
digitalWrite(U2AN2,LOW);
digitalWrite(U2BN1,LOW);
digitalWrite(U2BN2,HIGH);
}
void giro_der()
{
digitalWrite(U1AN1,LOW);
digitalWrite(U1AN2,HIGH);
digitalWrite(U1BN1,HIGH);
digitalWrite(U1BN2,LOW);
digitalWrite(U2AN1,LOW);
digitalWrite(U2AN2,HIGH);
digitalWrite(U2BN1,HIGH);
digitalWrite(U2BN2,LOW);
}
void alto()
{
digitalWrite(U1AN1,LOW);
digitalWrite(U1AN2,LOW);
digitalWrite(U1BN1,LOW);
digitalWrite(U1BN2,LOW);
digitalWrite(U2AN1,LOW);
digitalWrite(U2AN2,LOW);
digitalWrite(U2BN1,LOW);
digitalWrite(U2BN2,LOW);
}
void setup(){
pinMode(U2AN1, OUTPUT);
pinMode(U2AN2, OUTPUT);
pinMode(U2BN1, OUTPUT);
pinMode(U2BN2, OUTPUT);
pinMode(U1AN1, OUTPUT);
pinMode(U1AN2, OUTPUT);
pinMode(U1BN1, OUTPUT);
pinMode(U1BN2, OUTPUT);
Serial.begin(115200);
error = ps2x.config_gamepad(12,11,10,13, true, false); // GamePad(clock, command, attention, data, Pressures?, Rumble?)
if(error == 0){
Serial.println("Controlador encontrado, configurado exitosamente");
Serial.println("Pruebe todos los botones, X hará vibrar el controlador más rápido a medida que presione más fuerte;");
Serial.println("Si mantienes presionado L1 o R1, se imprimirán los valores del joystick analógico.");
}
else if(error == 1)
Serial.println("No se encontró ningún controlador, verifique el cableado, consulte el archivo readme.txt para habilitar la depuración");
else if(error == 2)
Serial.println("Controlador encontrado pero no acepta comandos. consulte readme.txt para habilitar la depuración. ");
else if(error == 3)
Serial.println("Es posible que el controlador se niegue a ingresar al modo de presiones y no lo admita.");
type = ps2x.readType();
switch(type) {
case 0:
Serial.println("Tipo de controlador desconocido");
break;
case 1:
Serial.println("Controlador DualShock encontrado");
break;
case 2:
Serial.println("Controlador GuitarHero encontrado");
break;
default:
break;
}
alto();
}
void loop(){
/* Debes leer Gamepad para obtener nuevos valores
Leer GamePad y establecer valores de vibración
ps2x.read_gamepad (encendido/apagado de motor pequeño, potencia de motor más grande de 0 a 255)
si no habilita el ruido, use ps2x.read_gamepad(); sin valores
deberías llamar a esto al menos una vez por segundo
*/
ps2x.read_gamepad(true, vibrate); //lea el controlador y configure el motor grande para que gire a velocidad de "vibración"
if(ps2x.Button(PSB_START)) //será VERDADERO siempre que se presione el botón
{
Serial.println("Start presionado");
}
if(ps2x.Button(PSB_SELECT))
{
Serial.println("Select presionado");
}
if(ps2x.Button(PSB_PAD_UP)) { //será VERDADERO siempre que se presione el botón
Serial.println("Arriba presionado");
adelante();
}
if(ps2x.Button(PSB_PAD_RIGHT)){
Serial.println("Derecha presionado");
der();
}
if(ps2x.Button(PSB_PAD_LEFT)){
Serial.println("Izquierda presionado");
izq();
}
if(ps2x.Button(PSB_PAD_DOWN)){
Serial.println("Abajo presionado");
atras();
}
if (ps2x.NewButtonState()) //será VERDADERO si algún botón cambia de estado (encendido a apagado o apagado a encendido)
{
if(ps2x.Button(PSB_L3))
Serial.println("L3 presionado");
if(ps2x.Button(PSB_R3))
Serial.println("R3 presionado");
if(ps2x.Button(PSB_L2))
Serial.println("L2 presionado");
alto();
if(ps2x.Button(PSB_R2))
Serial.println("R2 presionado");
}
if(ps2x.ButtonPressed(PSB_RED))
{
Serial.println("Círculo recién presionado");
giro_der();
}
if(ps2x.ButtonReleased(PSB_RED))
{
Serial.println("Círculo recién lanzado");
}
if(ps2x.ButtonPressed(PSB_PINK))
{
Serial.println("Cuadrado presionado ");
giro_izq();
}
if(ps2x.ButtonReleased(PSB_PINK))
{
Serial.println("Cuadrado recién lanzado");
}
if(ps2x.ButtonPressed(PSB_GREEN)) {
Serial.println("Triangulo presionado");
}
//Puedes habilitar este para hacer lectura de los jostick
// if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1))
// Serial.print("Stick Values:");
// Serial.print(ps2x.Analog(PSS_LY), DEC); // LY
// Serial.print(",");
// Serial.print(ps2x.Analog(PSS_LX), DEC); // LX
// Serial.print(",");
// Serial.print(ps2x.Analog(PSS_RY), DEC); // RY
// Serial.print(",");
// Serial.println(ps2x.Analog(PSS_RX), DEC); // RX
delay(500);
}











































Valoraciones
No hay valoraciones aún.