Hello, I have a problem.
The project: I am making a robot with 4 servomotors, 2 work for walking and two as arms. The servos move via Bluetooth with an app I made in my app inventor. (I attach blocks). And this is my circuit made in thinkercad:Login - Tinkercad
The problem:
Sometimes when I activate the servos that make it walk, the Bluetooth disconnects, this happens every 2 seconds or every minute, it is very variable. The bluetooth lights are on as if it were connected, sometimes the entire bluetooth turns off:(((
#include <Servo.h> // Incluye la biblioteca Servo.h para controlar servos
Servo patarriba;
Servo patabajo;
Servo manoarriba;
Servo manoabajo;
int estado = 'r'; // Declara una variable estado que guarda el carácter recibido desde el Bluetooth
bool patarribaPos90 = true; // Variable para rastrear la posición de patarriba
bool manoarribaPos90 = true; // Variable para rastrear la posición de manoarriba
bool aPos90 = true; // Variable para rastrear la posición de los servos controlados por A
bool reproducir = false; // Variable para controlar la reproducción continua de la melodía
bool moverServos = false; // Variable para controlar el movimiento repetitivo de los servos
const int tonePin = 8; // Pin para el tono
unsigned long previousMillis = 0; // Almacena el último tiempo en que se actualizó el tono
int noteIndex = 0; // Índice de la nota actual
float noteDuration = 0; // Duración de la nota actual
// Define las notas y sus duraciones en milisegundos con decimales
const int melody[] = {493, 1046, 622, 587, 523, 523, 587, 622, 523, 466, 391, 783, 622, 587, 523, 523, 587, 622, 587, 466, 523, 523, 1046, 622, 523, 523, 587, 622, 523, 466, 391, 783, 622, 698, 783, 523, 587, 698, 587, 293, 523, 195, 207, 207, 207, 207, 195, 146, 195, 195, 195, 207, 207, 207, 207, 207, 155, 195, 174, 195, 195};
const float noteDurations[] = {178.529481, 439.276485, 209.067418, 251.350716, 96.311957, 331.219168, 331.219168, 253.699788, 326.520957, 277.190509, 458.069063, 263.096077, 126.849894, 213.765629, 164.435229, 166.784301, 324.772019, 256.04886, 328.653429, 291.284942, 582.569885, 415.785764, 286.585731, 368.804322, 286.585731, 49.330514, 333.574907, 209.067418, 119.802678, 39.934226, 326.520957, 232.55814, 389.946304, 136.246183, 328.653429, 293.634014, 65.774019, 178.529481, 148.65821, 268.127554, 234.906211, 49.330514, 112.755462, 256.04886, 897.345548, 105.708246, 225.510924, 96.311957, 232.55814, 65.774019, 263.096077, 93.962886, 234.906211, 65.774019, 263.096077, 101.010035, 56.377731, 164.435229, 63.424947, 268.127554, 87.113001, 239.604422, 79.281184, 251.350716, 96.311957, 230.209068, 89.297407, 239.604422, 101.010035, 223.161852, 79.281184, 84.566596, 138.595255, 30.538938, 89.297407, 68.424291, 164.435229, 75.170307, 91.613812, 117.453606};
void setup() {
Serial.begin(9600); // Inicializa la comunicación serial a 9600 baudios
patarriba.attach(3); // Conecta el servo patarriba al pin 3 del Arduino
patabajo.attach(2); // Conecta el servo patabajo al pin 2 del Arduino
manoarriba.attach(5); // Conecta el servo manoarriba al pin 5 del Arduino
manoabajo.attach(4); // Conecta el servo manoabajo al pin 4 del Arduino
patarriba.write(90);
patabajo.write(90);
manoarriba.write(90);
manoabajo.write(80);
pinMode(tonePin, OUTPUT); // Configura el pin del tono como salida
}
void loop() {
if (Serial.available() > 0) {
estado = Serial.read();
}
if (estado == 'A') { // Si el valor recibido es 'A'
if (aPos90) {
manoarriba.write(90);
patarriba.write(90);
} else {
manoarriba.write(0);
patarriba.write(0);
}
aPos90 = !aPos90; // Alterna la posición
estado = 'r'; // Resetea el estado para evitar repetición continua
}
if (estado == 'B') { // Si el valor recibido es 'B'
if (patarribaPos90) {
patarriba.write(0);
} else {
patarriba.write(90);
}
patarribaPos90 = !patarribaPos90; // Alterna la posición
estado = 'r'; // Resetea el estado para evitar repetición continua
} // Cierra la condición 'B'
if (estado == 'D') { // Si el valor recibido es 'C'
manoabajo.write(80);
patabajo.write(90);
delay(200);
manoabajo.write (110);
patabajo.write(50); // Cambia a 70 para mover hacia atrás
delay(50);
} // Cierra la condición 'C'
if (estado == 'C') { // Si el valor recibido es 'D'
manoabajo.write(80);
patabajo.write(90);
delay(200);
manoabajo.write(50); // Cambia a 110 para mover hacia adelante
patabajo.write(110); // Cambia a 110 para mover hacia adelante
delay(50);
} // Cierra la condición 'D'
if (estado == 'E') { // Si el valor recibido es 'E'
if (manoarribaPos90) {
manoarriba.write(0);
} else {
manoarriba.write(90);
}
manoarribaPos90 = !manoarribaPos90; // Alterna la posición
estado = 'r'; // Resetea el estado para evitar repetición continua
} // Cierra la condición 'E'
if (estado == 'F') { // Si el valor recibido es 'F'
reproducir = true; // Activa la reproducción continua
estado = 'r'; // Resetea el estado para evitar repetición continua
} // Cierra la condición 'F'
if (estado == 'G') { // Si el valor recibido es 'G'
manoabajo.write(80);
patabajo.write(90);
delay(200);
manoabajo.write (50); // Cambia a 70 para mover hacia atrás
patabajo.write(50); // Cambia a 70 para mover hacia atrás
delay(50);
} // Cierra la condición 'G'
if (estado == 'I') { // Si el valor recibido es 'I'
reproducir = false; // Detiene la reproducción continua
moverServos = false; // Detiene el movimiento repetitivo
noTone(tonePin); // Detiene cualquier tono que esté sonando
patarriba.write(90); // Pone todos los servos a 90°
patabajo.write(90);
manoarriba.write(90);
manoabajo.write(90);
estado = 'r'; // Resetea el estado para evitar repetición continua
} // Cierra la condición 'I'
if (reproducir) {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= noteDuration) {
previousMillis = currentMillis;
tone(tonePin, melody[noteIndex], noteDurations[noteIndex]);
noteDuration = noteDurations[noteIndex];
noteIndex++;
if (noteIndex >= sizeof(melody) / sizeof(melody[0])) {
noteIndex = 0; // Reinicia la melodía
}
}
}
}
Subiendo: Captura de pantalla 2024-12-01 192805.png…