Robotica de Colombia

¿Como Mover tu Brazo Robótico de 6 Servos con Computadora?

bnr-arrow-1-1.png
Nivel AVANZADO
Brazo Robótico Kimo

¿Cómo Mover tu Brazo Robótico
de 6 Servos con Computadora?

El Brazo Robótico Kimo es un manipulador que contiene 6 servomotores SG90 o MG90S. Es un sistema de Código Abierto diseñado para fines educativos, totalmente manipulable con placas de desarrollo estándar.

En la siguiente guía encontrarás los pasos para controlar tu Brazo Kimo mediante un mando a distancia infrarrojo (IR Remote) y su sensor receptor.

Esquema de Conexión Kimo

Materiales Necesarios:

Brazo Robótico Kimo con Servomotores Negros

$98,990.00

Arduino Uno R3 ATmega328P + Cable de Datos

$24,990.00

Control Remoto Infrarrojo HX1838 + Receptor

$15,000.00

Protoboard Mini 170 Puntos

$5,500.00

Adaptador Fuente 5V 1A para Arduino

$10,500.00

Cable Dupont Macho - Macho 30 cm (40 und)

$7,000.00

Explicación Código:

Primero abriremos Arduino IDE, si tienes dudas sobre cómo utilizar esta aplicación por favor revisa la siguiente guía dedicada donde encontrarás la versión recomendada para Arduino de origen Chino o genuinos:
¿Cómo Cargar Códigos a Arduino?

📄 Código Completo:

A continuación, encontrarás el código completo para controlar el Brazo Robótico Kimo con 6 servomotores mediante control por infrarrojos.

✨ Solo copia, carga en tu tarjeta Arduino, y comienza a disfrutar del control total de tu robot. ¡Es así de fácil! ⚙️🎮

Código Oficial Robótica de Colombia
#include <Servo.h>

/*Movimiento Brazo Robotico con Monitor Serial
   Desarrollado por RDC - Robotica de Colombia
   Visitanos:
   www.facebook.com/roboticadecolombia
   www.youtube.com/@RoboticadeColombia
   www.instagram.com/roboticadecolombia/
   Mercadolibre: www.mercadolibre.com.co/perfil/ROBOTICADECOLOMBIA
*/

Servo rotacion;
Servo Hombro1;
Servo Hombro2;
Servo Codo;
Servo muneca;
Servo Garra;

int angulorotacion = 90;
int angulohombro1 = 90;
int angulohombro2 = 90;
int angulocodo = 20;
int angulomuneca = 90;
int angulogarra = 10;

void setup() {
  Serial.begin(115200);
  Serial.println("Iniciando... ");
  Serial.println("Bienvenido a Control PC 4 Servomotores... ");

  rotacion.attach(2);
  Hombro1.attach(4);
  Hombro2.attach(5);
  Codo.attach(6);
  muneca.attach(7);
  Garra.attach(8);

  rotacion.write(angulorotacion);
  Hombro1.write(angulohombro1);
  Hombro2.write(angulohombro2);
  Codo.write(angulocodo);
  muneca.write(angulomuneca);
  Garra.write(angulogarra);
  delay(500);
}

void loop() {
  unsigned char comando = 0;
  if (Serial.available()) {

    comando = Serial.read();

    if (comando == 'a') {
      angulorotacion += 60;
      rotacion.write(angulorotacion);
    } else if (comando == 's') {
      angulorotacion -= 60;
      rotacion.write(angulorotacion);
    } else if (comando == 'e') {
      angulohombro1 += 30;
      angulohombro2 -= 30;
      Hombro1.write(angulohombro1);
      Hombro2.write(angulohombro2);
    } else if (comando == 'd') {
      angulohombro1 -= 30;
      angulohombro2 += 30;
      Hombro1.write(angulohombro1);
      Hombro2.write(angulohombro2);
    } else if (comando == 'r') {
      angulocodo += 10;
      Codo.write(angulocodo);
    } else if (comando == 'f') {
      angulocodo -= 10;
      Codo.write(angulocodo);
    } else if (comando == 't') {
      angulomuneca += 10;
      muneca.write(angulomuneca);
    } else if (comando == 'g') {
      angulomuneca -= 10;
      muneca.write(angulomuneca);
    } else if (comando == 'z') {
      angulogarra = 40;
      Garra.write(angulogarra);
    } else if (comando == 'x') {
      angulogarra = 0;
      Garra.write(angulogarra);
    }

    Serial.println("----------------------------------");
    Serial.println("Nueva Posicion: ");
    Serial.println(" ");
    Serial.print("Motor Base    : "); Serial.println(angulorotacion);
    Serial.print("Motor Hombro 1: "); Serial.println(angulohombro1);
    Serial.print("Motor Hombro 2: "); Serial.println(angulohombro2);
    Serial.print("Motor Codo    : "); Serial.println(angulocodo);
    Serial.print("Motor Muñeca  : "); Serial.println(angulomuneca);
    Serial.print("Motor Garra   : "); Serial.println(angulogarra);

    delay(500);
  }
}
a. Inclusión de librería:

Esta línea importa la librería Servo.h, que proporciona funciones para controlar servo motores en Arduino.

#include <Servo.h>
b. Declaración de objetos Servo:

Se declaran seis objetos de tipo Servo que representan cada uno de los servos conectados a los pines del Arduino.

Servo rotacion;
Servo Hombro1;
// se agregan los demás servomotores
c. Definición de variables de ángulo:

Se inicializan variables para almacenar los ángulos de posición de cada servo motor.

int angulorotacion = 90;
int angulohombro1 = 90;
int angulohombro2 = 90;
int angulocodo = 0;
int angulomuneca = 90;
int angulogarra = 0;
d. Función setup():

La función setup() se ejecuta una vez al inicio del programa y se utiliza para realizar la configuración inicial del microcontrolador y sus periféricos. En este caso particular:

  • Inicialización del puerto serial: Esta línea inicializa la comunicación serial a una velocidad de 115200 baudios. Esto permite la comunicación entre el Arduino y un dispositivo externo, como una computadora, a través de un cable USB.
  • Asignación de pines a los objetos Servo: Después los objetos "rotacion", "Hombro1", “Hombro2", "Codo", "muneca" y "Garra" a los pines específicos del Arduino. Esto establece la comunicación entre el microcontrolador y los servo motores.
  • Establecimiento de posiciones iniciales de los servos: Seguido se establecen las posiciones iniciales de cada servo motor. Estos valores provienen de las variables definidas al principio del código ("angulorotacion", "angulohombro1", etc.).
  • Pequeño retardo: Se agrega un pequeño retardo de 500 milisegundos (0.5 segundos) después de inicializar los servos. Esto puede ser útil para asegurarse de que todos los dispositivos estén listos antes de continuar con el programa.
e. Función loop():

La función loop() es el corazón del programa y se ejecuta continuamente después de que setup() haya completado su ejecución. En este caso:

  • Recepción de datos desde el puerto serial: Esta parte del código verifica si hay datos disponibles en el puerto serial. Si hay datos disponibles, se lee el primer byte recibido y se almacena en la variable comando.
  • Procesamiento de comandos: Dependiendo del valor de comando, se ejecuta una acción específica. Por ejemplo, si se recibe el carácter 'a', se aumenta el ángulo de rotación del servo rotacion en 10 grados y se actualiza su posición. Si se recibe el carácter 's', se disminuye el ángulo de rotación del mismo servo en 10 grados, y así sucesivamente para los demás comandos.
  • Impresión de información en el puerto serial: Al final del loop(), se imprime información sobre la posición actual de cada servo en el puerto serial. Esto permite monitorear el estado de los servos durante la ejecución del programa.

Control Manual

Iniciaremos por el control primario, esta parte es 100% necesaria para un correcto funcionamiento de tu proyecto. Si te saltas directamente al control por bluetooth, posiblemente no te funcione y tu manipulador robótico no presente movimiento.

Esquema Electrónico

Deberás seguir el siguiente esquema electrónico para tu manipulador robótico. Si compraste un kit completo, verifica que los pines de conexión del Arduino a tus servomotores estén correctos:

Esquema Electrónico MeArm

(Recuerda dar click sobre la imagen para descargar el esquema de conexión en Fritzing)

CONEXIÓN EN ARDUINO NANO:

CONEXIÓN EN ARDUINO UNO

Esquema de Conexión
Esquema Conexión Arduino Uno
Fritzing

Si no tienes el programa Fritzing, puedes descargarlo en el siguiente link:
Descargar Fritzing aquí

Uso del Monitor Serial

Con el Código cargado correctamente procederemos a abrir el monitor serial como se indica en la siguiente imagen.(Recuerda tener tu tarjeta conectada a tu Arduino correctamente con el puerto COM indicado ya seleccionado en la pestaña herramientas).

Monitor Serial

En el monitor serial en la opción 1 escribimos el comando y en la opción 2 enviamos el comando.

Enviaremos a través del monitor serial letras, que serán interpretadas por el código como como comandos de movimiento del servomotor, según los condicionales que están creados.

Ejemplo de Condicionales Creados

Veremos un ejemplo del condicional creado:

Código Condicionales

Donde:

  • En la fila 43 indicamos que si el puerto serial recibe el comando (letra) “a” realizara la acción contemplada en las filas 44 a la 46
  • En la fila 44 indicamos al servomotor que aumente su posición actual 30 grados en sentido positivo.
  • En la fila 45 le ordenamos al servomotor escribir en el pin digital 2 el Angulo actual de rotación.
  • En la fila 46 escribimos el Angulo de rotación en el puerto serial.
  • En la fila 48 inicia el segundo condicional para el mismo servomotor pero esta vez se activa cuando recibe el comando (letra) “s“
  • En la fila 49 indicamos que gire el servomotor 30 grados pero esta vez en sentido negativo.
  • En la fila 50 escribimos el nuevo Angulo en el pin digital 2.
  • En la fila 51 escribimos el Angulo de rotación en el puerto serial para que puedas visualizarlo cuando controles el brazo robótico de forma manual.
Comandos de control de tu Brazo Robótico

Comandos a escribir en el puerto serial para el movimiento de las articulaciones:

Articulación Acción / Comando
Cadera Derecha = a | Izquierda = s
Hombro Arriba = e | Abajo = d
Codo Arriba = r | Abajo = f
Muñeca Arriba = t | Abajo = g
Garra Abrir = z | Cerrar = x
Nombre Articulaciones
Nombre de los motores Kimo
Tags: