Construa um Braço Robótico de Papelão Programável – DIY Fácil com Arduino e Servos
Componentes e Materiais
| Componente | Quantidade |
|---|---|
| Arduino UNO | 1 |
| Servo de tamanho normal (standard) | 3 |
| Micro-servo SG90 | 1 |
| Protoboard (genérica) | 1 |
| Fonte de alimentação 5V | 1 |
Ferramentas Necessárias
- Pistola de cola quente
Software e Serviços Online
- Arduino IDE
- Python
Sobre o Projeto
Este é um braço robótico simples que pode gravar e reproduzir posições. Ele é construído com materiais de fácil acesso, como papelão e cola quente, o que torna a montagem muito acessível.
O controle do braço é feito através de uma interface gráfica no computador, que envia dados para o Arduino que comanda os servos. A interface possui controles deslizantes (sliders) para cada servo, além de botões para gravar posições e reproduzir as sequências gravadas. Também é possível salvar e carregar gravações anteriores.
Instruções de Montagem
- Baixe e imprima o modelo de recorte de papelão disponível na seção "Peças Personalizadas e Caixas" no final da página. Use o modelo para recortar as peças de papelão.
- Monte a estrutura do braço seguindo o vídeo demonstrativo (a montagem começa em 0:22).
- Monte o circuito conforme o esquema elétrico fornecido no final da página.
- Carregue o código no Arduino: Baixe o arquivo "Robot Arm Arduino Code" na seção "Código" (segunda aba) e faça o upload para a placa.
- Prepare a interface Python: Baixe o "Python User Interface" (primeira aba da seção Código). Você precisará ter o Python instalado (python.org) e a biblioteca PySerial (
pip install pyserial). - Execute: Conecte o braço, rode o script Python, informe a porta COM do Arduino (encontrada no Gerenciador de Dispositivos no Windows) e comece a usar!
Dica: Se houver problemas de comunicação, tente aumentar o valor time.sleep(0.15) na linha 20 do código Python para 0.2 ou 0.3.
Código
Interface do Usuário (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("Porta COM definida para: " + 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("Posições salvas: " + str(saved_positions))
def play_positions():
for position in saved_positions:
print("Reproduzindo: " + str(position))
send_positions(position)
time.sleep(1)
def clear_all_positions():
global saved_positions
saved_positions = []
print("Todas as posições limpas")
def clear_last_positions():
global saved_positions
removed = saved_positions.pop()
print("Removido: " + str(removed))
print("Posições salvas: " + str(saved_positions))
def open_file():
global saved_positions
filename = filedialog.askopenfilename(initialdir="/", title="Selecionar Arquivo",
filetypes=(("Arquivos de texto", "*.txt"), ("Todos os arquivos", "*.*")))
with open(filename, "r") as file:
data = file.read()
saved_positions = eval(data)
print("Arquivo aberto: " + filename)
def save_file():
save_file = filedialog.asksaveasfile(mode='w', defaultextension=".txt")
save_file.write(str(saved_positions))
save_file.close()
print("Arquivo salvo")
def instructions():
print("1) Defina a porta COM do Arduino e clique em Enter. Encontre no Gerenciador de Dispositivos no Windows")
print("2) Mova os servos do braço usando os sliders")
print("3) Para gravar uma posição, clique em 'Gravar Posição'")
print("4) Para reproduzir as posições gravadas, clique em 'Reproduzir Posições'")
print("\nPara salvar o que gravou, vá em Arquivo > Salvar Arquivo.")
print("Para abrir um arquivo salvo anteriormente, vá em Arquivo > Abrir Arquivo.")
window = Tk()
window.title("Controlador de Braço Robótico 2")
window.minsize(355, 300)
port_label = Label(window, text="Definir Porta:")
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)
# Sliders para 5 servos
servo_sliders = []
servo_labels = []
for i in range(5):
slider = Scale(window, from_=180, to=0)
slider.place(x=70*i, y=100)
servo_sliders.append(slider)
label = Label(window, text=f"Servo {i+1}")
label.place(x=70*i+10, y=80)
servo_labels.append(label)
save_button = Button(window, text="Gravar Posição", command=save_positions)
save_button.place(x=10, y=220)
clear_last_button = Button(window, text="Limpar Última Posição", command=clear_last_positions)
clear_last_button.place(x=120, y=220)
clear_all_button = Button(window, text="Limpar Todas Posições", command=clear_all_positions)
clear_all_button.place(x=120, y=255)
play_button = Button(window, text="Reproduzir Posições", command=play_positions, height=3)
play_button.place(x=250, y=220)
# Menu
menubar = Menu(window)
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="Abrir Arquivo", command=open_file)
filemenu.add_command(label="Salvar Arquivo", command=save_file)
menubar.add_cascade(label="Arquivo", menu=filemenu)
editmenu = Menu(menubar, tearoff=0)
editmenu.add_command(label="Limpar última posição", command=clear_last_positions)
editmenu.add_command(label="Limpar todas posições", command=clear_all_positions)
menubar.add_cascade(label="Editar", menu=editmenu)
helpmenu = Menu(menubar, tearoff=0)
helpmenu.add_command(label="Como usar (imprime no console)", command=instructions)
menubar.add_cascade(label="Ajuda", menu=helpmenu)
window.config(menu=menubar)
while True:
window.update()
if port_opened:
send_positions([s.get() for s in servo_sliders])
Código do Arduino para o Braço Robótico
#include
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);
}
Peças Personalizadas e Caixas
O modelo de recorte para o papelão está disponível para download na seção de anexos.
Esquemático
O diagrama de ligação do circuito está disponível na seção de esquemáticos.
Processo de manufatura
- Dados Digital com Arduino: Gere Números Aleatórios 1-6 em LCD 16x2
- Braço Robótico MeArm V1.0 – Construa seu Braço Robótico com Arduino e Raspberry Pi
- Construa um Homem de Ferro com Arduino: Componentes, Sensores e Guia Passo a Passo
- Find Me: Localizador Inteligente de Objetos com Arduino e Bluetooth
- Construa um Braço Robótico 3D Impresso Funcional com Arduino – Guia Passo a Passo
- Controlador de Umidificador DIY com Arduino e Relé – Configuração Segura de Alta Tensão
- MobBob: Construa Seu Próprio Robô Arduino, Controlado via Smartphone Android
- PiBot: Robô Pianista Arduino para Performance Musical de Precisão
- LittleArm 2C: Braço Robótico Arduino 3D-Printado Durável para Educação STEM
- Volante Joystick Arduino Personalizado para Jogos