PC 控制机械臂
组件和用品
| × | 1 | ||||
| × | 4 |
应用和在线服务
| ||||
|
关于这个项目
我一直很欣赏现代制造技术以及这些机器在不同制造领域发挥的重要作用,例如:提升材料、安装和收集零件、焊接和切割,最后但并非最不重要的是它在仓库中的可用性。
我建造这个机械臂的经历是一个挑战。所以一开始我选择了一个由 fortzeroas 在 2016 年设计的简单机械臂,然后我决定不再像往常一样手动控制它,所以我通过“C# Windows 应用程序”创建了一个自动化应用程序,我让它看起来像制造自动化应用程序。
所以根据我的编程技能经验,我创建了这个自动化应用程序来完全控制机械臂,监控它的运动,给它不同的任务。
第一步:材料 图>
主要材料是MDF木材,我用了2mm的结构和4mm的底座。
蓝图可以在最后一步下载,您必须打印图案然后将其直接粘在MDF上。
沿着轮廓切割并钻孔。我用旋转工具钻孔和切割木材,对于底座我没有蓝图,但我认为你可以即兴创作。
第 2 步:绘画和造型 图>
为了使项目具有吸引力,我使用了相同的蓝图,然后我使用 Photoshop 设计了一个封面,以创建一些贴花和几何形状以使其看起来逼真,然后我使用白胶将其粘在木头上。
第 3 步:框架组装 图>
这个机械臂很容易组装,因为一切都是提前计划好的,所以它只需用螺丝将伺服电机固定到位,在工作时我做了一些小调整。
然后我用粗木棒固定左右两侧,并用长螺丝的强力胶将其粘合以减少重量。
第 4 步:夹持器(夹紧机构) 图>
我用钳子弯曲一根两根金属棒,然后使用旋转工具钻在一块 3 毫米厚的木头内钻一个大厅,并用强力胶将其粘合。
第 5 步:制作底座 图>
底座由 4 毫米厚的 MDF 木材制成,我用台锯切割了大约 17 厘米 * 10 厘米的正方形,然后钻了一个大厅来安装底座伺服电机 9 克。为了减少底座和气缸之间的摩擦,我切了一部分高 2.5 厘米、直径 10 厘米的坚固纸板,然后钻孔以连接伺服电机轴。
第 6 步:电子产品 图>
当 Arduino 使用两个以上的伺服系统时,您必须为它们使用外部电源,在这个项目中我使用了 三个 微型舵机 9g 和 one 大伺服电机。
当然,第一个演示测试是在 tinkercad.com 上虚拟进行的,用于模拟舵机并测试电路。
因此,在这种情况下,我使用了 4 节 AA 1.5 v 电池,等于 6 v,然后我进行了面包板测试设置,之后我为 Arduino nano 制作了非常简单的扩展坞。
第 7 步:Arduino 代码
1. 下载并安装Arduino IDE最新版本,您可以在Arduino的网站上找到适用于Windows、Linux或MAC OSX的最新版本:https://www.arduino.cc/en/main/software
2. 将您的 Arduino 板插入 USB 端口。
3. 转到工具> 板> 然后选择您的板。
4. 将代码复制粘贴到IDE编辑器中。
5. 单击 (✔) 图标按钮验证您的代码。
6. 单击 (➤) 图标按钮将代码上传到您的开发板。
第八步:自动化应用 图> 图> 图> 图>
其实这是我最喜欢的部分是使用 PC 自动化一个 Arduino 项目,在我看来,这是一个很好的开始,可以学习如何提高未来控制板和任何其他项目的能力。
达到一个固定的角度位置并不容易,所以一开始我使用了一个名为“Processing 3”的第三方应用程序解决了这个问题。
在初始阶段,我制作了一个支持的接口,通过键盘模拟机器人手臂舵机(Base、Shoulder、Elbow 和 Gripper),并分别“逐个角度”移动它们,直到到达预先准备好的固定位置。
然后当它到达准备好的位置时,我将这四个角度记录在代码数组(A,B,C,D)中,然后我稍后在我的 Windows 应用程序中使用了这些多数组,它帮助我了解了每个伺服电机各有一个角度。
这些收集到的限制我把它作为用户界面侧边栏的指导方针,以保持 ARM 处于可控状态并支持播放功能。
因此,通过使用此应用程序,您可以控制、记录、监控机械臂,如下所示:
1.运动控制:
控制这个机械臂有两种心情,第一种是手动通过拖动轨迹条来控制痉挛伺服,例如
- 夹持器:单击打开和关闭按钮可打开和关闭机器人夹持器。
- 底座:左右拖动跟踪栏,甚至使用键盘箭头(右/左)来左右移动底座。
- 肩部:左右拖动跟踪栏,甚至使用键盘箭头(向上/向下)向上和向下移动肩部。
- 肘部:左右拖动跟踪栏,甚至使用键盘键(w/s)上下移动肘部电机。
2.运动记录:
一旦你想自动化机器人手臂的运动,你必须通过单击“记录位置”按钮或按键盘上的 (R) 来记录每一步的位置。然后应用程序会处理它。
在每一步中,您记录应用程序检测到的移动电机位置并将其单独保存在列表中。
通过点击“开始自动情绪”按钮,应用程序将以序列订单的形式发送这些保存的头寸。
3.监控:
我创建了一个图形界面,它在图表中绘制每一步,让用户注意到可能发生的任何异常变化。同时右侧有一个数据表,给出了它移动的具体角度和准确时间。
因此,通过使用这些功能,您可以编写自己的动作并将其作为任务发送到机械臂,就像它们在制造自动化中所做的一样。
第 9 步:更新
2018 年 8 月:
图>
最近我在使用 3 mm MDF 的激光切割机上添加了一些修改后做了相同的设计,实际上这个额外的想法很酷,尤其是当我添加一个自定义操纵杆时。
代码
- Task.ino
- RobotArm.ino
Task.inoArduino
int delayT =350;void Home() //当你想将手臂设置在原位时调用这个函数 { MyServo0.write(valGripper); // 夹持器延迟(15); MyServo.write(valBase); // 基础延迟(30); MyServo2.write(valShoulder); // 肩部延迟(30); MyServo3.write(valElbow); //肘部延迟(延迟T); }void Pick() // 这是固定的拾取位置。 { MyServo.write(4); // 基础延迟(delayT); MyServo3.write(125); // 肘部 MyServo2.write(95); // 肩部延迟(delayT); MyServo0.write(50); // 夹爪张开延迟(delayT); MyServo0.write(2); // 夹持器关闭延迟(delayT); MyServo2.write(60); // 扛起小 MyServo3.write(80); // 增加一点延迟(delayT); Serial.println("选择对象"); }void Drop() // 这是固定的 Drop 位置。 { MyServo.write(145); // 基础延迟(delayT); MyServo2.write(80); // 肩部延迟(15); MyServo3.write(115); //肘部延迟(延迟T); MyServo0.write(40); // 夹爪张开延迟(delayT); MyServo3.write(90); // 增加一点延迟(delayT); Serial.println(F("Object Dropped")); }void Playback() { // https://arduino.stackexchange.com/questions/1013/how-do-i-split-an-incoming-string // 输入必须是数组(servoId:Position&servoId:Position&servoId :Position ) // 字符串短语; // 短语 =String(短语 + ByteReceived); // 将输入的字符转换为stirng 可以拆分 // 读取每个命令对 char* command =strtok(ByteReceived, "&"); while (command !=0) { // 将命令分成两个值 char* separator =strchr(command, ':'); if (separator !=0) { // 实际上将字符串分成 2 份:用 0 替换 ':' 为 0 *separator =0; int伺服Id =atoi(命令); ++分隔符; int 角 =atoi(分隔符); // 用servoId 和angle 做一些事情 if (servoId =1) { MyServo.write(angle);延迟(延迟T); } else if (servoId =2) { MyServo2.write(angle);延迟(延迟T); } else if (servoId =3) { MyServo3.write(angle);延迟(延迟T); } } // 在输入字符串中查找下一个命令 command =strtok(0, "&"); } }
RobotArm.inoArduino
// 由 AhmedAzouz 编写#includeServo MyServo,MyServo2,MyServo3,MyServo0;char ByteReceived;int MyPosition,MyPosition2,MyPosition3,MyPositionG;int runCounter =0;int ledPin =A5;// 设置默认主伺服位置 int valGripper =30;int valBase =70;int valShoulder =25;int valElbow =150;void setup(){ Serial.begin(9600); pinMode(ledPin,输出);数字写入(13,低); MyServo0.attach(12); // 夹具附加 MyServo.attach(11); // 基础附加 MyServo2.attach(13); //肩附MyServo3.attach(10); //弯头连接//设置启动位置 MyServo0.write(valGripper); // 夹持器延迟(15); MyServo.write(valBase); // 基础延迟(30); MyServo2.write(valShoulder); // 肩部延迟(30); MyServo3.write(valElbow); // 肘部延迟(300);} void loop(){ Serial.print("Base :"); Serial.print(valBase); Serial.print("\t"); Serial.print("收:"); Serial.print(valShoulder); Serial.print("\t"); Serial.print("肘部:"); Serial.print(valElbow); Serial.print("\t"); Serial.print("抓地力:"); Serial.println(valGripper); //if(Serial.available()) //Byte=Serial.read(); //读取它 //{ while (Serial.available()> 0 ) { ByteReceived =Serial.read(); switch (ByteReceived) { // ************* LED case 'n':digitalWrite(ledPin,HIGH); //打开 LED Serial.println("LED 亮");休息; case 'f':digitalWrite(ledPin,LOW); //关闭 LED Serial.println("LED 关闭");休息; // ************* 基本情况 'l':MyPosition =MyServo.read() + 2; // L 为左移基点 MyServo.write(MyPosition); Serial.print("Base"); Serial.print("\t"); Serial.println(MyServo.read());延迟(15);休息; case 'r':MyPosition =MyServo.read() - 2; // R 用于向右移动基地 MyServo.write(MyPosition); Serial.print("Base"); Serial.print("\t"); Serial.println(MyServo.read());延迟(15);休息; // ************* 肘节 'u':MyPosition2 =MyServo2.read() + 2; // U 向上移动肘部 MyServo2.write(MyPosition2); Serial.print("肘部"); Serial.print("\t"); Serial.println(MyServo2.read());延迟(15);休息; case 'd':MyPosition2 =MyServo2.read() - 2; // D 向下移动肘部 MyServo2.write(MyPosition2); Serial.print("肘部"); Serial.print("\t"); Serial.println(MyServo2.read());延迟(15);休息; // ************* 肩带 'w':MyPosition3 =MyServo3.read() + 2; // W 向下移动肩部 MyServo3.write(MyPosition3); Serial.print("肩膀"); Serial.print("\t"); Serial.println(MyServo3.read());延迟(15);休息; case 's':MyPosition3 =MyServo3.read() - 2; // S 为上移肩 MyServo3.write(MyPosition3); Serial.print("肩膀"); Serial.print("\t"); Serial.println(MyServo3.read());延迟(15);休息; // ************* 夹持器外壳 'o':MyServo0.write(30); // O 打开 Gripper Serial.print("Gripper Open"); Serial.print("\t"); Serial.println(MyServo0.read());延迟(15);休息; case 'c':// C 打开 Gripper MyServo0.write(1); Serial.print("夹持器关闭"); Serial.print("\t"); Serial.println(MyServo0.read());延迟(15);休息; // ************* 默认放置位置(快速放置位置) case 'q':digitalWrite(ledPin,HIGH); Serial.println("默认删除已激活!");挑选();降低();家();数字写入(ledPin,低);休息; // ************* 强制停止并返回原位 case 'h':Home();数字写入(ledPin,低);休息; // ************* 自动心情运行 回放功能 // 串行读取 必须是这种格式:1:90&2:80&3:180 // 拾取位置是固定的,此功能将自动丢弃位置。默认值:digitalWrite(ledPin,HIGH); Serial.println("自动情绪激活!");挑选();回放();家();数字写入(ledPin,低);休息; }}}
定制零件和外壳
f98t2axin238k2n_khGWAEIqdl.skp示意图
制造工艺