Buenas. Es mi primera vez escribiendo en un foro de este tipo por lo que si falta algún tipo de información intentare darla lo antes posible si se solicita. Compré un modelo de coche con el que quería conseguir una función de autoaparcamiento. Este coche contiene una placa escudo conectada encima de la placa arduino 1(COM3). El modelo del coche es el zeus car kit de la empresa Sunfounder. Este coche viene ya con varios programas que funcionan con esta placa ya que han sido anteriormente configurados, pero como me era necesario he tenido que comprar mas piezas y modificar su estructura añadiendo 2 sensores de ultrasonido más (trasero y lateral derecho) aparte del delantero que tiene ya. Utiliza ruedas 360º y cada una va dirigida por un motor diferente. He intentado programarlo pero no funciona y no logro ver los errores. Dejo aqui el programa y el enlace al modelo del robot. https://docs.sunfounder.com/projects/zeus-car/en/latest/get_started/programming_mode.html
#include <Arduino.h>
#include <SoftPWM.h>
#include <NewPing.h>
// Definición de pines para los motores
#define MOTOR_PINS (uint8_t[8]) { 3, 4, 5, 6, A3, A2, A1, A0 }
#define MOTOR_DIRECTIONS (uint8_t[4]) { 1, 0, 0, 1 }
// Configuración de sensores de ultrasonidos
#define TRIG_PIN_FRONT 7
#define ECHO_PIN_FRONT 8
#define TRIG_PIN_BACK 9
#define ECHO_PIN_BACK 10
#define TRIG_PIN_SIDE 11
#define ECHO_PIN_SIDE 12
#define MAX_DISTANCE 200 // Distancia máxima que pueden detectar los sensores (en cm)
NewPing sonarFront(TRIG_PIN_FRONT, ECHO_PIN_FRONT, MAX_DISTANCE);
NewPing sonarBack(TRIG_PIN_BACK, ECHO_PIN_BACK, MAX_DISTANCE);
NewPing sonarSide(TRIG_PIN_SIDE, ECHO_PIN_SIDE, MAX_DISTANCE);
#define MOTOR_POWER_MIN 28
int8_t power = 80;
void setup() {
Serial.begin(115200);
SoftPWMBegin(); // Inicializa SoftPWM
carBegin(); // Inicializa motores
}
void loop() {
// Paso 1: Buscar un espacio para aparcar
carForward(power);
while (sonarSide.ping_cm() < 50) {
// Sigue avanzando hasta que detecte un espacio lateral mayor a 50 cm
}
carStop();
// Paso 2: Alinear para el aparcamiento
carBackward(power); // Retroceder un poco para empezar el giro
delay(1000);
carTurnRight(power); // Girar hacia el espacio
delay(1000);
carStop();
// Paso 3: Maniobra de aparcamiento
while (sonarBack.ping_cm() > 20 && sonarFront.ping_cm() > 20) {
// Mover el robot hacia atrás y adelante en maniobras hasta quedar en posición
carRightBackward(power); // Girar hacia atrás y alinear
delay(1500);
carStop();
carForward(power); // Avanzar un poco si es necesario
delay(1000);
carStop();
}
// Paso 4: Finalizar el aparcamiento
carStop();
Serial.println("Aparcamiento completado");
delay(5000); // Espera antes de intentar un nuevo aparcamiento
}
// Funciones para controlar los motores (similar al código anterior)
void carBegin() {
for (uint8_t i = 0; i < 8; i++) {
SoftPWMSet(MOTOR_PINS[i], 0);
SoftPWMSetFadeTime(MOTOR_PINS[i], 100, 100);
}
}
void carSetMotors(int8_t power0, int8_t power1, int8_t power2, int8_t power3) {
bool dir[4];
int8_t power[4] = { power0, power1, power2, power3 };
int8_t newPower[4];
for (uint8_t i = 0; i < 4; i++) {
dir[i] = power[i] > 0;
if (MOTOR_DIRECTIONS[i]) dir[i] = !dir[i];
if (power[i] == 0) {
newPower[i] = 0;
} else {
newPower[i] = map(abs(power[i]), 0, 100, MOTOR_POWER_MIN, 255);
}
SoftPWMSet(MOTOR_PINS[i * 2], dir[i] * newPower[i]);
SoftPWMSet(MOTOR_PINS[i * 2 + 1], !dir[i] * newPower[i]);
}
}
void carForward(int8_t power) {
carSetMotors(power, power, power, power);
}
void carBackward(int8_t power) {
carSetMotors(-power, -power, -power, -power);
}
void carLeft(int8_t power) {
carSetMotors(-power, power, -power, power);
}
void carRight(int8_t power) {
carSetMotors(power, -power, power, -power);
}
void carLeftForward(int8_t power) {
carSetMotors(0, power, 0, power);
}
void carLeftBackward(int8_t power) {
carSetMotors(-power, 0, -power, 0);
}
void carRightForward(int8_t power) {
carSetMotors(power, 0, power, 0);
}
void carRightBackward(int8_t power) {
carSetMotors(0, -power, 0, -power);
}
void carTurnLeft(int8_t power) {
carSetMotors(-power, power, power, -power);
}
void carTurnRight(int8_t power) {
carSetMotors(power, -power, -power, power);
}
void carStop() {
carSetMotors(0, 0, 0, 0);
}