lunes, 6 de noviembre de 2023

Steam Farmer (programa en Arduino)

 


Estamos creando nuestro primer brazo robótico, para ello hemos empleado los siguientes materiales:
  • Palitos de helado pequeños y grandes
  • Pistola de silicona
  • Amarras plásticas de 15cm
  • Servomotores SG90, inicialmente se construyó con tres de ellos, pero en la práctica nos dimos cuenta que es mejor utlizar los MG90, entonces se usaron un SG90 y dos MG90
  • Cables hembra macho, macho macho para las conexiones
  • Un arduino uno
  • Dos joystick, uno para girar y alzar el brazo y otro para abrir y cerrar el gancho.
  • Una mini protoboard
  • Una fuente de 5V, aunque en este caso utilizamos un módulo que nos ayuda regular el voltaje de un adaptador que entrega 12V, pero sirve también un adaptador de 5V/2A (mejor de 2A)
  • El conector hembra que recibe el plug del adaptador
  • Unas tablitas para la base y otras pequeñas para pegar el servo de la base al que nos regula la altura.
Procedimiento

Esto ha sido de paciencia, por ejemplo, es importante inicialmente usar un programa para leer la posición actual de los servomotores, creo que por eso fue que se quemamos dos SG90, debido a que en el gancho hacían mucha fuerza para cerrarse luego de que ya estaba cerrado al iniciar el programa, tener claro en qué ángulo está al iniciar.

Programa


#include <Servo.h>

Servo baseServo;   // Servo para el giro horizontal
Servo alturaServo; // Servo para subir y bajar el brazo
Servo ganchoServo; // Servo para abrir o cerrar el gancho

int baseAngle = 90;    // Ángulo inicial del servo horizontal
int alturaAngle = 90;  // Ángulo inicial del servo de altura
int ganchoAngle = 90;  // Ángulo inicial del servo de gancho


const int joyXPin = A0;   // Pin analógico para la posición X del joystick
const int joyYPin = A1;   // Pin analógico para la posición Y del joystick
const int joyYGPin = A2;   // Pin analógico para la posición X del joystick2 gancho

int baseIncremento = 1; // Incremento de ángulo para el servo de la base
int alturaIncremento = 1; // Incremento de ángulo para el servo de la altura
int ganchoIncremento = 1; // Incremento de ángulo para el servo del gancho

void setup() {
  Serial.begin(9600);  // Inicializa la comunicación serial
  baseServo.attach(8);    // Conecta el servo horizontal al pin 8
  alturaServo.attach(9);  // Conecta el servo de altura al pin 9
  ganchoServo.attach(7);  // Conecta el servo de gancho al pin 10

  baseAngle = baseServo.read();
  alturaAngle = alturaServo.read();
  ganchoAngle = ganchoServo.read();

}

void loop() {
   
  int joyX = analogRead(joyXPin);
  int joyY = analogRead(joyYPin);
  int joyYG = analogRead(joyYGPin);

  // Control de la base (eje X)
  baseAngle += map(joyX, 0, 1023, baseIncremento, -baseIncremento);
  baseAngle = constrain(baseAngle, 0, 180);

  // Control de la altura (eje Y)
  alturaAngle += map(joyY, 0, 1023, -alturaIncremento, alturaIncremento);
  alturaAngle = constrain(alturaAngle, 0, 126);

  // Control de apertura gancho (eje X)
  ganchoAngle += map(joyYG, 0, 1023, ganchoIncremento, -ganchoIncremento);
  ganchoAngle = constrain(ganchoAngle, 86, 180);

 // Envía las señales a los servos
  baseServo.write(baseAngle);
  alturaServo.write(alturaAngle);
  ganchoServo.write(ganchoAngle);

  // Muestra información en el Monitor Serie
  Serial.print("Base: ");
  Serial.print(baseAngle);
  Serial.print(" Altura: ");
  Serial.print(alturaAngle);
  Serial.print(" Gancho: ");
  Serial.println(ganchoAngle);
  delay(50);  // Pequeña pausa para estabilidad
}