可记录纸板机械臂
组件和用品
| × | 1 | ||||
| × | 3 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
|
应用和在线服务
| ||||
|
关于这个项目
关于
这是一个简单的机械臂,可以记录和回放位置。它由容易获得的材料制成,例如纸板和热胶,因此易于构建。
您可以使用计算机上的图形界面控制手臂,该界面将数据发送到控制手臂的 Arduino。有滑块来控制每个伺服器,还有按钮来记录位置和重放你记录的内容。您还可以保存和打开过去的录音。
这是它的实际演示:
说明
1.) 在页面底部的自定义部件和外壳部分下载并打印纸板剪切模板。使用该模板剪下纸板部分。
2.) 使用上面的视频作为指导组装手臂部件。构建从视频的 0:22 开始。
3.) 根据页面底部的原理图搭建电路。
4.) 在页面底部的第二个选项卡的代码部分下载“Robot Arm Arduino 代码”。然后将其上传到手臂。
5.) 在第一个选项卡的代码部分中下载页面底部的“Python 用户界面”代码。然后,打开它。您必须安装 Python 才能运行它,可以从这里下载:https://www.python.org/
您还需要 Python 的 PySerial 库 (https://pypi.org/project/pyserial/)。您可以通过运行“pip install pyserial”来安装它。
6.) 插入手臂,运行“Python 用户界面”代码,然后输入 Arduino 的 COM 端口(这可以在 Windows 的设备管理器中找到)。现在您可以使用它了!
如果它不起作用,请尝试将 Python 代码第 20 行的 time.sleep(0.15) 增加到更高的值,例如 0.2 或 0.3
代码
- Python 用户界面
- 机械臂 Arduino 代码
Python 用户界面Python
from tkinter import *from tkinter import filedialogimport serialimport timeport_opened=Falsedef set_port():global port_opened,arduino com_port=port_input.get() arduino=serial.Serial(com_port,9600) port_opened=True print ("COM 端口设置为:"+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()]);打印(“保存的位置:”+str(保存的位置))def play_positions():用于保存位置的位置:打印(“播放:”+str(位置))发送位置(位置); time.sleep(1)def clear_all_positions():global saved_positions saved_positions =[] print("清除所有位置")def clear_last_positions():global saved_positions removed =saved_positions.pop() print("removed:"+str(removed) ) print("保存的位置:"+str(saved_positions))def open_file():global saved_positions filename =filedialog.askopenfilename(initialdir ="/", title ="Select a File", filetypes =(("Text files", "*.txt*"),("所有文件","*.*"))) file =open(filename, "r") data=file.read() saved_positions=eval(data) file.close() print("打开:"+文件名)def save_file():save_file =filedialog.asksaveasfile(mode='w', defaultextension=".txt") save_file.write(str(saved_positions)) save_file.close() print("保存的文件")def 指令():打印("1.) 设置Arduino 的COM 端口并单击Enter。这可以在Windows 的设备管理器中找到") 打印("2.) 使用滑块移动手臂的伺服系统") print("3.) 要记录位置,请单击 Record Position") print("4.) 重播记录的位置位置,单击重放位置") print("\n要保存您录制的内容,请转到文件> 保存文件。") 打印("要打开以前保存的文件,请转到文件> 打开文件。")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)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="记录位置", command=save_positions)save_button.place(x=10,y=220 )clear_button=Button(window, text="清除最后位置", command=clear_last_positions)clear_button.place(x=120,y=220)clear_button=Button(window, text="清除所有位置", command=clear_all_positions)clear_button .place(x=120,y=255)play_button=Button(window, text="Replay Positions", command=play_positions, height=3)play_button.place(x=250,y=220)menubar =Menu(window) filemenu =Menu(menubar, tearoff=0)filemenu.add_command(label="打开文件", command=open_file)filemenu.add_command(label="保存文件", command=save_file)menubar.add_cascade(label="文件", menu=filemenu)editmenu =Menu(menubar,tearoff=0)editmenu.add_command(label="Clear last position", command=clear_last_positions)editmenu.add _command(label="清除所有位置", command=clear_all_positions)menubar.add_cascade(label="Edit", menu=editmenu)helpmenu =Menu(menubar, tearoff=0)helpmenu.add_command(label="如何使用(打印)在控制台中)", 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()])
机械臂Arduino代码Arduino
#include伺服伺服1;伺服伺服2;伺服伺服3;伺服伺服4;伺服伺服5;intservoPositions[5];void setup() { Serial.begin(9600);伺服1.附加(3);伺服2.附加(5);伺服3.附加(6);伺服4.附加(9);伺服5.attach(10);}void loop() { while(Serial.available()){ String input =Serial.readStringUntil('\n');伺服位置[0] =input.substring(0,3).toInt();伺服位置[1] =input.substring(3,6).toInt();伺服位置[2] =input.substring(6,9).toInt();伺服位置[3] =input.substring(9,12).toInt();伺服位置[4] =input.substring(12,15).toInt(); }servo1.write(servoPositions[0]);伺服2.写(伺服位置[1]);伺服3.写(伺服位置[2]);伺服4.写(伺服位置[3]);伺服5.写(伺服位置[4]);延迟(500);}
定制零件和外壳
示意图
制造工艺