Bueno, primera parte "terminada".
Al final he usado una betería LiPo. La he pegado con velcro, no está demasiado bien sujeta, pero bueno, para este primer proyecto lo dejo así.
He usado un L298N en vez del L293D que tenía para usar los 4 motores en vez de dos como tenía pensado al principio.
Los cables de la batería los tenía puestos antes directamente al L298N y de ahí sacaba uno al VIN del arduino. Ahora he puesto una mino proto, porque tengo pensado conectar desde aquí los Servos del brazo mecánico cuando lo ponga.
Si veis que algo está mal hecho o podría mejorarse de otra manera decidme, que esto es para aprender!
¿Sería bueno haber puesto un fusible en el cable de la batería?
Bueno, cuando tenga hecha la segunda parte del proyecto con el brazo mecánico lo subo.
Os pego el código, no está muy bien hecho porque el mando que compré en Aliexpress no va muy allá. Detecta botones pulsados cuando no he pulsado nada ni tampoco detecta bien la lectura analógica para saber cuánto tiempo se tiene pulsado un botón para según eso dar más potencia o no a los motores.
Quería controlar el coche usando solo el joystick, sin pulsar ningún botón, pero no lee bien del todo el joystick tampoco...
así que nada os pego el código un poco hecho de aquella manera.
#include <PS2X_lib.h>
PS2X ps2x;
int error = 0;
//byte type = 0;
byte vibrate = 0;
int IN1 = 7;
int IN2 = 8;
int IN3 = 12;
int IN4 = 13;
int ENA = 6;
int ENB = 11;
void motores(int v,int m1,int m2);
void setup()
{
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
pinMode(ENA,OUTPUT);
pinMode(ENB,OUTPUT);
Serial.begin(9600);
delay(300); // se añade algo de tiempo para dejar que se conecte el mando inalámbrico antes de configurarlo
error = ps2x.config_gamepad(41,31,37,29, false, false); //(clock, command, attention, data)
if(error == 0){
Serial.println("Mando encontrado y configurado correctamente"); }
else Serial.println("Mando no encontrado");
}
void loop()
{
int ruedas_izq_ena;
int ruedas_dcha_enb;
// Si hubo error al detectar el mando no entramos en el bucle
if (error!=0) return;
//Leemos teclas pulsadas
ps2x.read_gamepad(false, vibrate);
// -------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------
// Motores
// -------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------
// Comprobamos si se ha pulsado alguna de las teclas que controla los motores
// concatenamos IF para dar prioridad a los primeros botones que se pongams en este código:
// -------------------------------------------------------------------------------------
if(ps2x.Button(PSB_PAD_UP)){
Serial.println("has pulsado flecha arriba");
//Giramos el coche
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
//Potencia de ruedas
analogWrite(ENA,200);
analogWrite(ENB,200);
}
// -------------------------------------------------------------------------------------
else if(ps2x.Button(PSB_PAD_DOWN)){
Serial.println("has pulsado flecha abajo");
//Giramos el coche en el otro sentido
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
//Potencia de ruedas
analogWrite(ENA,200);
analogWrite(ENB,200);
}
// -------------------------------------------------------------------------------------
else if(ps2x.Button(PSB_BLUE)){
Serial.println("has pulsado X, nos movemos hacia adelante");
//Con X pulsado el coche anda hacia adelante
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
// lo ideal sería ver cuánto tiempo se ha pulsado X para dar más o menos potencia
// con una sentencia tal que así: tiempo = ps2x.Analog(PSAB_BLUE),DEC;
// pero este mando de Aliexpress no funciona muy bien y no detecta el PSAB_BLUE
// Así que damos potencia máxima siempre...
ruedas_izq_ena = ruedas_dcha_enb = 255;
//Comprobar si mientras tenemos X pulsado vamos a la izq o derecha
//Para disminuir la potencia de esas ruedas y que gire
if(ps2x.Button(PSB_PAD_RIGHT)) ruedas_dcha_enb = 50;
else if(ps2x.Button(PSB_PAD_LEFT)) ruedas_izq_ena = 50;
//Potencia de ruedas
analogWrite(ENA,ruedas_izq_ena);
analogWrite(ENB,ruedas_dcha_enb);
}
// -------------------------------------------------------------------------------------
else if(ps2x.Button(PSB_RED)){
Serial.println("has pulsado círculo, nos movemos hacia atrás");
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
if(ps2x.Button(PSB_PAD_RIGHT)) ruedas_izq_ena = 200;
else if(ps2x.Button(PSB_PAD_LEFT)) ruedas_dcha_enb = 200;
//Potencia de ruedas
analogWrite(ENA,ruedas_izq_ena);
analogWrite(ENB,ruedas_dcha_enb);
}
// -------------------------------------------------------------------------------------
else {
// Serial.println("No has pulsado ningún botón para controlar los motores; los apagamos");
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);
analogWrite(ENA,0);
analogWrite(ENB,0);
}
// -------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------
// Brazo mecánico
// -------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------
//PENDIENTE de hace esta parte !!!
// -------------------------------------------------------------------------------------
delay(50); //Dar algo de tiempo en cada vuelta...
}