Construye un Brazo Robótico de Cartón Programable – DIY Fácil con Arduino y Servos
Componentes y materiales
| Componente | Cantidad |
|---|---|
| Arduino UNO | 1 |
| Servo estándar (tamaño normal) | 3 |
| Micro-servo SG90 | 1 |
| Protoboard (genérico) | 1 |
| Fuente de alimentación 5V | 1 |
Herramientas necesarias
- Pistola de silicona caliente
Software y servicios en línea
- Arduino IDE
- Python
Sobre el proyecto
Este es un brazo robótico simple que puede grabar y reproducir posiciones. Está fabricado con materiales fácilmente disponibles, como cartón y silicona caliente, lo que lo hace muy accesible para construir.
El brazo se controla mediante una interfaz gráfica en el ordenador que envía datos al Arduino que controla los servos. La interfaz incluye deslizadores para cada servo y botones para grabar posiciones y reproducir las secuencias grabadas. También permite guardar y cargar grabaciones anteriores.
Instrucciones de montaje
- Descarga e imprime la plantilla de recorte de cartón (disponible en la sección "Custom Parts and Enclosures" al final). Usa la plantilla para recortar las piezas de cartón.
- Ensambla el brazo siguiendo el video guía (el montaje comienza en el minuto 0:22).
- Construye el circuito según el esquema eléctrico proporcionado.
- Descarga y sube el código de Arduino ("Robot Arm Arduino Code") desde la sección Code.
- Descarga la interfaz de usuario en Python ("Python User Interface") desde la sección Code. Necesitarás tener Python instalado (python.org) y la librería PySerial (
pip install pyserial). - Conecta el brazo, ejecuta el script de Python e introduce el puerto COM del Arduino (visible en el Administrador de dispositivos en Windows). ¡Listo para usar!
Solución de problemas: Si no funciona, intenta aumentar el valor time.sleep(0.15) en la línea 20 del código Python a 0.2 o 0.3.
Código
Interfaz de usuario en Python
from tkinter import *
from tkinter import filedialog
import serial
import time
port_opened = False
def set_port():
global port_opened, arduino
com_port = port_input.get()
arduino = serial.Serial(com_port, 9600)
port_opened = True
print("Puerto COM configurado a: " + com_port)
def send_positions(position):
message = "{0:0=3d}".format(position[0]) + "{0:0=3d}".format(position[1]) + \
"{0:0=3d}".format(position[2]) + "{0:0=3d}".format(position[3]) + \
"{0:0=3d}".format(position[4]) + "\n"
arduino.write(str.encode(message))
print(message, end='')
time.sleep(0.2)
saved_positions = []
def save_positions():
saved_positions.append([servo1_slider.get(), servo2_slider.get(),
servo3_slider.get(), servo4_slider.get(), servo5_slider.get()])
print("Posiciones guardadas: " + str(saved_positions))
def play_positions():
for position in saved_positions:
print("Reproduciendo: " + str(position))
send_positions(position)
time.sleep(1)
def clear_all_positions():
global saved_positions
saved_positions = []
print("Todas las posiciones borradas")
def clear_last_positions():
global saved_positions
removed = saved_positions.pop()
print("Eliminada: " + str(removed))
print("Posiciones guardadas: " + str(saved_positions))
def open_file():
global saved_positions
filename = filedialog.askopenfilename(initialdir="/", title="Seleccionar archivo",
filetypes=(("Archivos de texto", "*.txt"), ("Todos los archivos", "*.*")))
file = open(filename, "r")
data = file.read()
saved_positions = eval(data)
file.close()
print("Archivo abierto: " + filename)
def save_file():
save_file = filedialog.asksaveasfile(mode='w', defaultextension=".txt")
save_file.write(str(saved_positions))
save_file.close()
print("Archivo guardado")
def instructions():
print("1.) Configura el puerto COM del Arduino y pulsa Enter. Lo encuentras en el Administrador de dispositivos de Windows")
print("2.) Mueve los servos del brazo usando los deslizadores")
print("3.) Para grabar una posición, pulsa 'Record Position'")
print("4.) Para reproducir las posiciones grabadas, pulsa 'Replay Positions'")
print("\nPara guardar lo grabado, ve a File > Save File.")
print("Para abrir un archivo guardado, ve a File > Open File.")
window = Tk()
window.title("Robot Arm Controller 2")
window.minsize(355, 300)
port_label = Label(window, text="Set Port:")
port_label.place(x=10, y=10)
port_input = Entry(window)
port_input.place(x=10, y=35)
port_button = Button(window, text="Enter", command=set_port)
port_button.place(x=135, y=32)
# Deslizadores para 5 servos
servo1_slider = Scale(window, from_=180, to=0)
servo1_slider.place(x=0, y=100)
servo1_label = Label(window, text="Servo 1")
servo1_label.place(x=10, y=80)
servo2_slider = Scale(window, from_=180, to=0)
servo2_slider.place(x=70, y=100)
servo2_label = Label(window, text="Servo 2")
servo2_label.place(x=80, y=80)
servo3_slider = Scale(window, from_=180, to=0)
servo3_slider.place(x=140, y=100)
servo3_label = Label(window, text="Servo 3")
servo3_label.place(x=150, y=80)
servo4_slider = Scale(window, from_=180, to=0)
servo4_slider.place(x=210, y=100)
servo4_label = Label(window, text="Servo 4")
servo4_label.place(x=220, y=80)
servo5_slider = Scale(window, from_=180, to=0)
servo5_slider.place(x=280, y=100)
servo5_label = Label(window, text="Servo 5")
servo5_label.place(x=290, y=80)
save_button = Button(window, text="Record Position", command=save_positions)
save_button.place(x=10, y=220)
clear_button = Button(window, text="Clear Last Position", command=clear_last_positions)
clear_button.place(x=120, y=220)
clear_button2 = Button(window, text="Clear All Positions", command=clear_all_positions)
clear_button2.place(x=120, y=255)
play_button = Button(window, text="Replay Positions", command=play_positions, height=3)
play_button.place(x=250, y=220)
# Menús
menubar = Menu(window)
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="Open File", command=open_file)
filemenu.add_command(label="Save File", command=save_file)
menubar.add_cascade(label="File", menu=filemenu)
editmenu = Menu(menubar, tearoff=0)
editmenu.add_command(label="Clear last position", command=clear_last_positions)
editmenu.add_command(label="Clear all positions", command=clear_all_positions)
menubar.add_cascade(label="Edit", menu=editmenu)
helpmenu = Menu(menubar, tearoff=0)
helpmenu.add_command(label="How to use (printed in console)", command=instructions)
menubar.add_cascade(label="Help", menu=helpmenu)
window.config(menu=menubar)
while True:
window.update()
if port_opened:
send_positions([servo1_slider.get(), servo2_slider.get(),
servo3_slider.get(), servo4_slider.get(), servo5_slider.get()])
Código para Arduino
#include <Servo.h>
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
int servoPositions[5];
void setup() {
Serial.begin(9600);
servo1.attach(3);
servo2.attach(5);
servo3.attach(6);
servo4.attach(9);
servo5.attach(10);
}
void loop() {
while (Serial.available()) {
String input = Serial.readStringUntil('\n');
servoPositions[0] = input.substring(0, 3).toInt();
servoPositions[1] = input.substring(3, 6).toInt();
servoPositions[2] = input.substring(6, 9).toInt();
servoPositions[3] = input.substring(9, 12).toInt();
servoPositions[4] = input.substring(12, 15).toInt();
}
servo1.write(servoPositions[0]);
servo2.write(servoPositions[1]);
servo3.write(servoPositions[2]);
servo4.write(servoPositions[3]);
servo5.write(servoPositions[4]);
delay(500);
}
Esquemático
Consulta el esquema de conexiones en la sección "Schematics" al final del proyecto.
Proceso de manufactura
- Proyecto Dados Digitales Arduino: Construye tu Propio Generador de Números Aleatorios con LCD
- Brazo Robótico MeArm V1.0 – Construye tu Brazo Robótico con Arduino y Raspberry Pi
- Construye un Iron Man animado con Arduino: componentes, sensores y guía paso a paso
- Find Me: Localizador Inteligente de Objetos con Arduino y Bluetooth
- Construye un Brazo Robótico Impreso en 3D Controlado por Arduino – Guía Paso a Paso
- Controlador de Humidificador DIY con Arduino y Relé: Configuración Segura de Alto Voltaje
- MobBob: Robot Arduino Impreso en 3D, Controlado por Smartphone Android
- PiBot: Robot Pianista con Arduino para Interpretación Musical de Precisión
- LittleArm 2C: Brazo Robot 3D Imprimible para Educación STEM con Arduino Nano
- Construye un volante joystick personalizado con Arduino para gaming
- Arduino 101: Construye un Podómetro con Sensor DHT11 y Pantalla LCD