在需要速度、准确性和安全性的许多应用中,机械臂已被证明是有用的并且更高效。但对我来说,更重要的是这些东西在工作时看起来很酷。我一直希望有一个机械臂可以帮助我完成我的日常工作,就像Tony stark在他的实验室中使用的Dum-E和Dum-U一样。可以看到这两个机器人帮助他建造钢铁侠套装或使用摄像机拍摄他的作品。实际上Dum-E也曾经挽救过他的生命......除了虚构的世界,还有许多由Fanuc、Kuka、Denso、ABB、Yaskawa等制造的酷炫的现实世界机械臂。这些机械臂用于汽车、采矿厂、化学工业和许多其他地方的生产线。
因此,在本教程中,我们将使用Arduino和MG995伺服电机制作我们自己的机器人手臂。除了抓手之外,机器人总共有4个自由度(DOF),可以通过电位计进行控制。除此之外,我们还将其编程为具有录制和播放功能,以便我们可以记录动作并让机器人手臂重复多次,如我们所要求的那样。听起来很酷!!!所以让我们开始制作......
所需的材料 ● Arduino Nano开发板 ● MG-995伺服电机 ● 电位器 ● 螺母和螺丝
注意:机械臂的主体完全是由3D打印的。如果您有打印机,则可以使用给定的设计文件进行打印。否则,使用提供的3D模型并使用木材或丙烯酸加工零件。如果你没有任何东西,那么你可以使用纸板来构建简单的机械臂。
3D打印和组装机械臂 构建这个机械臂最耗时的部分是制作它的身体。最初我开始使用Solidworks设计车身身体,但后来意识到Thingiverse上有很多很棒的设计,而且没有必要重新发明车轮。所以我经历了设计,发现Ashing Robotic Arm V2.0将与我们的MG995伺服电机完美配合,完全符合我们的目的。
因此,请访问他的Thingiverse页面(上面给出的链接)并下载模型文件。共有14个部分需要打印,所有这些部分的STL文件都可以从Thingiverse页面下载。我使用Ultimaker的Cura 3.2.1软件切割STL文件和TEVO塔兰图拉3D打印机进行打印。
幸运的是,没有任何部件具有悬挂结构,因此不需要支撑。设计非常简单,因此可以通过任何基本的3D打印机轻松处理。大约4.5小时的印刷后,所有零件都准备好组装。 Ashing巧妙地解释了装配说明,因此我不打算介绍它。
一个小小的提示就是你需要对部件的边缘进行打磨/锉削以使电机适应。所有的电机都可以通过一点点机械力适合安装。如果它们看起来有点紧,请耐心并使用锉刀为电机创造空间。您需要20个3mm螺栓来组装机械臂。
一旦安装好电机,确保它可以旋转并到达所需位置,然后永久拧紧。组装后,您可以继续扩展前三个伺服电机的电线。我已经使用公对母线将它们延伸并将其带到电路板上。确保正确使用电线,以便在手臂工作时它们不会挡住。组装后,机械臂如下图所示。
电路原理图 MG995伺服电机工作在5V电压,Arduino开发板内部有一个5V稳压器。所以创建电路非常容易。我们必须将5个伺服电机连接到Arduino的PWM引脚,将5个电位器连接到Arduino模拟引脚,以控制伺服电机。下面给出了相关的电路图。
对于这个电路,我没有使用任何外部电源。 Arduino通过USB端口供电,电路板上的+ 5v引脚用于向电位器和伺服电机供电。在我们的机械臂中,在任何、时间内,只有一个伺服电机会运动,因此消耗的电流将小于150mA,这可以由Arduino开发板的板载电压调节器提供。
我们有5个伺服电机和5个电位器来分别控制它们。 这5个电位器连接到Arduino板的5个模拟引脚A0到A4。 伺服电机由PWM信号控制,因此我们必须将它们连接到Arduino的PWM引脚。 在Arduino Nano上,引脚D3、D5、D6、D9和D11仅支持PWM,因此我们使用前5个引脚用于伺服电机。 完成后电路板如下所示。 如果需要,我还添加了一个插孔,通过电池为设备供电。
编程Arduino机械臂 现在,有趣的部分是对Arduino开发板进行编程,以允许用户记录使用电位器进行的移动,然后在需要时播放。要做到这一点,我们必须为两种模式编程Arduino。一次是录制模式,另一种是播放模式。用户可以使用串口监视器在两种模式之间切换。接下来,我们将讲解程序的小片段,以便理解。
和平常一样,我们通过添加所需的头文件来开始该程序。这里Servo.h头文件用于控制伺服电机。我们有5个伺服电机,因此声明了5个对象,每个电机都有一个名称。我们还初始化了将在程序中使用的变量。我已将它们全部声明为全局,但如果您对优化程序感兴趣,可以更改其范围。我们还声明了一个名为saved_data的数组,其名称将保存机器人ARM的所有记录移动。 - #include <Servo.h> //Servo header file
- //Declare object for 5 Servo Motors
- Servo Servo_0;
- Servo Servo_1;
- Servo Servo_2;
- Servo Servo_3;
- Servo Gripper;
- //Global Variable Declaration
- int S0_pos, S1_pos, S2_pos, S3_pos, G_pos;
- int P_S0_pos, P_S1_pos, P_S2_pos, P_S3_pos, P_G_pos;
- int C_S0_pos, C_S1_pos, C_S2_pos, C_S3_pos, C_G_pos;
- int POT_0,POT_1,POT_2,POT_3,POT_4;
- int saved_data[700]; //Array for saving recorded data
- int array_index=0;
- char incoming = 0;
- int action_pos;
- int action_servo;
复制代码
在void setup()函数中,我们以9600波特率开始串行通信。 我们还指定了伺服电机所连接的引脚。 在我们的例子中,我们使用了使用attach函数指定的引脚3、5、6、9和10。 由于setup函数在启动期间运行,我们可以使用它将机器人手臂设置在起始位置。 所以我已经硬编码了所有五个电机的位置值。 这些硬编码值可以在以后根据您的偏好进行更改。 在setup函数结束时,我们打印一行代码,要求用户按R或P执行相应的操作。 - void setup() {
- Serial.begin(9600); //Serial Monitor for Debugging
- //Decalre the pins to which the Servo Motors are connected to
- Servo_0.attach(3);
- Servo_1.attach(5);
- Servo_2.attach(6);
- Servo_3.attach(9);
- Gripper.attach(10);
- //Write the servo motors to intial position
- Servo_0.write(70);
- Servo_1.write(100);
- Servo_2.write(110);
- Servo_3.write(10);
- Gripper.write(10);
- Serial.println("Press 'R' to Record and 'P' to play"); //Instrust the user
- }
复制代码
我定义了一个名为Read_POT的函数,它读取所有5个电位计的模拟值并将其映射到伺服位置值。 我们知道Arduino有一个8位的ADC,它给出了0-1023的输出,但伺服电机的位置值范围仅为0-180。 此外,由于这些伺服电机不是非常精确,因此将它们驱动到极端的0或180是不安全的,因此我们将10-170设置为我们的极限值。 我们使用map函数将所有五个电机的0-1023转换为10-170,如下所示。 - void Read_POT() //Function to read the Analog value form POT and map it to Servo value
- {
- POT_0 = analogRead(A0); POT_1 = analogRead(A1); POT_2 = analogRead(A2); POT_3 = analogRead(A3); POT_4 = analogRead(A4); //Read the Analog values form all five POT
- S0_pos = map(POT_0,0,1024,10,170); //Map it for 1st Servo (Base motor)
- S1_pos = map(POT_1,0,1024,10,170); //Map it for 2nd Servo (Hip motor)
- S2_pos = map(POT_2,0,1024,10,170); //Map it for 3rd Servo (Shoulder motor)
- S3_pos = map(POT_3,0,1024,10,170); //Map it for 4th Servo (Neck motor)
- G_pos = map(POT_4,0,1024,10,170); //Map it for 5th Servo (Gripper motor)
- }
复制代码
|