0 前言
🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 毕业设计 单片机机械臂设计与实现
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:3分
🧿 选题指导, 项目分享:
1 简介
本项目中,我们使用Arduino和MG995伺服电机制作我们自己的机器人手臂。机器人总共有4个自由度(DOF),可以通过电位计进行控制。还可将其编程为具有录制和播放功能,以便我们可以记录动作并让机器人手臂重复多次。
2 主要器件
- Arduino Nano开发板
- MG-995伺服电机
- 电位器
- 螺母和螺丝
3 实现效果
4 硬件设计
3D打印和组装机械臂
机械臂的主体完全是由3D打印的。如果您有打印机,则可以使用给定的设计文件进行打印。否则,使用提供的3D模型并使用木材或丙烯酸加工零件。
构建这个机械臂最耗时的部分是制作它的身体。最初使用Solidworks设计车身身体,但后来意识到Thingiverse上有很多很棒的设计,而且没有必要重新发明车轮。所以经历了设计后,发现Ashing Robotic Arm V2.0将与MG995伺服电机可以完美配合,完全符合实验最初目的。
因此,访问他的Thingiverse页面(上面给出的链接)并下载模型文件。共有14个部分需要打印,所有这些部分的STL文件都可以从Thingiverse页面下载。我使用Ultimaker的Cura 3.2.1软件切割STL文件和TEVO塔兰图拉3D打印机进行打印。
安装好电机,确保它可以旋转并到达所需位置,然后永久拧紧。组装后,您可以继续扩展前三个伺服电机的电线。我已经使用公对母线将它们延伸并将其带到电路板上。确保正确使用电线,以便在手臂工作时它们不会挡住。
电路原理图
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个引脚用于伺服电机。 完成后电路板如下所示。 如果需要,我还添加了一个插孔,通过电池为设备供电。
5 软件说明
添加所需的头文件来开始该程序。这里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)
}