Hola tengo una duda hice un proyecto de un brazo robótico móvil pero tengo una duda dónde debe ir conectada la tabla protoboard donde están conectados los servomotores de el brazo robotico si en el puente h o en el Arduino
También quiero saber si el siguiente código me sirve para el carro y el brazo
#include <SoftwareSerial.h>
#include <Servo.h>
// ===================================
// === 1. CONFIGURACIÓN DE BLUETOOTH ===
// ===================================
// Usamos pines 2 y 3 para la comunicación serial por SoftwareSerial (Bluetooth)
int bluetoothTx = 2; // Pin de transmisión (Conecta a RX del módulo BT)
int bluetoothRx = 3; // Pin de recepción (Conecta a TX del módulo BT)
SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);
// ===============================
// === 2. CONTROL DE LLANTAS (Bluetooth) ===
// ===============================
// Pines de control del Motor Derecho (Motor 1)
int Motor1A = 5; // Pin PWM para control de velocidad/dirección
int Motor1B = 6; // Pin PWM para control de velocidad/dirección
// Pines de control del Motor Izquierdo (Motor 2)
int Motor2A = 9; // Pin PWM para control de velocidad/dirección
int Motor2B = 10; // Pin PWM para control de velocidad/dirección
// Banderas de estado del motor (para evitar reescribir pines innecesariamente)
int flag1 = -1; // Estado de movimiento principal (Adelante/Reversa)
int flag2 = -1; // Estado de giro/freno
// ===============================
// === 3. CONTROL DE SERVOS (Serial/USB) ===
// ===============================
// Asignación de Pines para el Brazo (Libres de conflicto con Bluetooth y Llantas)
#define SERVO_BASE_PIN 4 // Base
#define SERVO_HOMBRO_PIN 7 // Hombro
#define SERVO_CODO_PIN 8 // Codo
#define SERVO_GARRA_PIN 11 // Garra
// Objetos Servo
Servo base_servo;
Servo hombro_servo;
Servo codo_servo;
Servo garra_servo;
// Variables para lectura de comandos de ángulo (a través de Serial/USB)
char servo_objetivo = ' ';
int angulo = 0;
void setup (){
// --- INICIALIZACIÓN DEL BLUETOOTH (9600 bps) ---
bluetooth.begin(115200);
// Comando para entrar en modo AT
bluetooth.print("$$$");
delay(100);
// Comando para configurar baudrate a 9600 bps (típico para HC-05/06)
bluetooth.println("U,9600,N");
bluetooth.begin(9600); // Iniciamos el Bluetooth a la velocidad de comunicación final
// --- CONFIGURACIÓN DE PINES DE MOTOR ---
pinMode( Motor1A, OUTPUT );
pinMode( Motor2A, OUTPUT );
pinMode( Motor1B, OUTPUT );
pinMode( Motor2B, OUTPUT );
// Asegurar que los motores estén detenidos al inicio
digitalWrite( Motor1A, LOW );
digitalWrite( Motor2A, LOW );
digitalWrite( Motor1B, LOW );
digitalWrite( Motor2B, LOW );
// --- CONFIGURACIÓN DE SERVOS (Brazo) ---
base_servo.attach(SERVO_BASE_PIN);
hombro_servo.attach(SERVO_HOMBRO_PIN);
codo_servo.attach(SERVO_CODO_PIN);
garra_servo.attach(SERVO_GARRA_PIN);
// Posición inicial de los servos
base_servo.write(90);
hombro_servo.write(90);
codo_servo.write(90);
garra_servo.write(0);
// --- INICIALIZACIÓN DE COMUNICACIÓN SERIAL (USB) ---
Serial.begin(9600);
Serial.println("Sistema iniciado. Brazo controlado por Serial (b, h, c, g + angulo).");
}
void loop() {
// ----------------------------------------------------
// I. CONTROL DE LLANTAS (Recibe comandos por Bluetooth)
// ----------------------------------------------------
if(bluetooth.available())
{
char toSend = (char)bluetooth.read();
// 1. Comando de PARADA (Stop)
if(toSend == 'S')
{
flag1 = 0;
flag2 = 0;
// Ambos LOW apagan los motores
digitalWrite( Motor1A, LOW);
analogWrite( Motor1B, 0); // analogWrite con 0 es seguro
digitalWrite( Motor2A, LOW);
analogWrite( Motor2B, 0);
}
// 2. Comando de AVANCE (Forward)
if( toSend == 'F' || toSend == 'G' || toSend == 'I')
{
if (flag1 != 1)
{
flag1 = 1;
// Motor 1 (Derecho) Adelante: A=HIGH, B=LOW/0
digitalWrite( Motor1A, HIGH);
analogWrite( Motor1B, 0 );
// Motor 2 (Izquierdo) Adelante: A=HIGH, B=LOW/0
digitalWrite( Motor2A, HIGH);
analogWrite( Motor2B, 0 );
}
}
// 3. Comando de REVERSA (Backward)
if(toSend == 'B' || toSend == 'H' || toSend == 'J')
{
if(flag1 != 2)
{
flag1 = 2;
// Motor 1 (Derecho) Reversa: B=HIGH, A=LOW/0
digitalWrite( Motor1B, HIGH);
analogWrite( Motor1A, 0 );
// Motor 2 (Izquierdo) Reversa: B=HIGH, A=LOW/0
digitalWrite( Motor2B, HIGH);
analogWrite( Motor2A, 0 );
}
}
// 4. Comando de GIRO IZQUIERDA (Left Turn)
if(toSend == 'L' || toSend == 'G' || toSend == 'H')
{
if(flag2 != 1)
{
flag2 = 1;
// Motor 2 (Izquierdo) REVERSA: B=HIGH, A=LOW/0
digitalWrite( Motor2B, HIGH);
analogWrite( Motor2A, 0 );
// Motor 1 (Derecho) ADELANTE: A=HIGH, B=LOW/0
digitalWrite( Motor1A, HIGH);
analogWrite( Motor1B, 0 );
}
}
// 5. Comando de GIRO DERECHA (Right Turn)
else if(toSend == 'R' || toSend == 'I' || toSend == 'J')
{
if(flag2 != 2)
{
flag2 = 2;
// Motor 1 (Derecho) REVERSA: B=HIGH, A=LOW/0
digitalWrite( Motor1B, HIGH);
analogWrite( Motor1A, 0 );
// Motor 2 (Izquierdo) ADELANTE: A=HIGH, B=LOW/0
digitalWrite( Motor2A, HIGH);
analogWrite( Motor2B, 0 );
}
}
// 6. Comando de PARADA (Si no es un comando de movimiento conocido)
else // Este "else" captura cualquier otro caracter que no sea L, R, I, J.
{
if(flag2 != 3)
{
flag2 = 3;
// Ambos motores a LOW detienen el movimiento
digitalWrite ( Motor2A, LOW);
digitalWrite ( Motor2B, LOW);
digitalWrite ( Motor1A, LOW);
digitalWrite ( Motor1B, LOW);
}
}
}
// --------------------------------------------------
// II. CONTROL DE BRAZO (Recibe comandos por Serial/USB)
// --------------------------------------------------
if (Serial.available()) {
char dato = Serial.read();
// Comandos de Servo: 'b' (Base), 'h' (Hombro), 'c' (Codo), 'g' (Garra)
if (dato == 'b' || dato == 'h' || dato == 'c' || dato == 'g') {
servo_objetivo = dato;
angulo = 0;
// Opcional: imprimir en consola para debug
// Serial.print("Mover servo "); Serial.print(dato); Serial.print(" a: ");
}
// Lectura de dígitos para formar el ángulo (ej: '9', '0' -> 90)
else if (servo_objetivo != ' ' && isDigit(dato)) {
angulo = angulo * 10 + (dato - '0');
}
// Ejecución del comando de Servo (al detectar fin de línea o espacio)
else if (servo_objetivo != ' ' && (dato == '\n' || dato == '\r' || dato == ' ')) {
angulo = constrain(angulo, 0, 180);
if (servo_objetivo == 'b') base_servo.write(angulo);
else if (servo_objetivo == 'h') hombro_servo.write(angulo);
else if (servo_objetivo == 'c') codo_servo.write(angulo);
else if (servo_objetivo == 'g') garra_servo.write(angulo);
Serial.print("Servo "); Serial.print(servo_objetivo); Serial.print(" movido a: ");
Serial.println(angulo);
servo_objetivo = ' ';
angulo = 0;
}
}
}
Usó Arduino uno, y un módulo Bluetooth hc05
Titulo editado por moderador punto 5 de las normas.
También quité espacios al código para hacerlo más fácil de leer