Arduino机械臂
# MeArm机械臂
# 介绍
MeArm是一款开源的桌面级机械臂套件,专为机器人教育和创客项目设计,自2014年发布以来经过多次迭代,成为全球广泛使用的入门级机器人教学工具。
# 基本工作原理
MeArm机械臂是通过四个电机来控制机械臂运动的,电机又由Arduino板来控制以实现我们想要的动作。
如图中,1号电机用于控制机械臂底座的左右转动,2号电机用于控制机械臂前臂的上下运动,3号电机用于控制机械臂后臂的前后运动,4号电机用于控制机械臂钳子的开合。

# 所需材料
材料 | 数量 | 作用 |
---|---|---|
Arduino Uno R3 | 1 | 作为控制器使用。 |
面包板 | 1 | 作为电路连接的载体。 |
面包板电源模块 (5V/3.3V电源输出) | 1 | 为MeArm单独供电。 |
充电器/充电宝 + 公对公USB线 | 1 | 连接电源模块来供电,有其他供电方式也行。 |
杜邦线、面包板条线 | 若干 | 连接电路。 |
meArm机械臂散件 | 1 | 用于拼装出机械臂。 |
直流伺服电机(舵机) | 4 | 启动驱动机械臂。 |
HC-06无线蓝牙串口透传模块 | 1 | 用于蓝牙控制机械臂。 |
10k + 20k 欧姆电阻 | 各1个 | 保护HC-06蓝牙模块。 |
# 面包板电源模块
面包板的电源模块用于给用电器供电使用,将面包板两边的供电引脚,根据面包板正负极以正确的方向插入进面包板。并且一定要将电源模块、开发板、其他元器件进行共地,也就是将负极连接在一起。
注意使用时一定不能将电源模块的正负极连接在一起,否则可能烧坏电源模块或供电设备。
建议在搭建电路时先不要通电,等搭建好之后,再检查一下电路的正负极有没有接错到一起,等检查完之后再通电。
通电后要注意鼻子闻,如果有异味要立马要断电,并检查哪里烧了,如果供电是充电宝则需要格外小心。

# 直流伺服电机
# 介绍
直流伺服电机又称舵机,其中直流指使用的是直流电,伺服(servo)指根据指令进行工作,电机是能把电能转换成机械能的一种设备。
# 作用
伺服电机通过闭环控制系统来执行我们的指令,比如我们想让伺服电机的转子转到90度。发送90度指令后,伺服电机会将转子旋转一个固定角度,然后电机会将当前角度和目标角度进行比对,判断是否完成我们指令的要求,完成则结束,没有完成则继续旋转,直到完成为止。
每次旋转的角度,是根据电机型号而定的。

# 原理
伺服电机的控制电路接收到指令后,伺服电机会比对当前的转子角度和目标角度。如果不一致则驱动内部的直流电机,电机会带动齿轮组旋转,从而控制转子(输出轴)旋转。
因为转子和电位器是连接在一起的,所以不同的角度对应着电位器不同的电压,控制电路就能通过读取模拟信号得到当前转子的角度。接着控制电路会继续比对角度,不一致则继续旋转,直至达到我们指令要求的角度。
伺服电机的三条引线中,其作用如下:
伺服电机引线 | 作用 |
---|---|
红色线 - VCC | 供电,连接正5V引脚。 |
棕色线 - GND | 接地,连接GND引脚。 |
橙色线 - PWM控制信号 | 控制信号,连接PWM模拟输出引脚。 |
# 示例
// 导入Servo伺服电机库,ArduinoIDE中已经内置该库。
#include <Servo.h>
// 创建Servo对象用以控制舵机。
Servo myservo;
// 存储舵机角度信息。
int pos = 0;
void setup() {
// 将Servo对象连接到9号PWM引脚。
myservo.attach(9);
Serial.begin(9600);
}
void loop() {
// 控制舵机从0度到180度,每次加45度。
for (pos = 0; pos <= 180; pos += 45) {
// 发送控制信号,控制舵机转动到指定角度,最大角度取决于舵机参数。
myservo.write(pos);
//输出角度变量。
Serial.println(pos);
// 等待1秒以确保舵机可以达到目标角度。
delay(1000);
}
// 控制舵机从180度到0度。
for (pos = 180; pos >= 0; pos -= 45) {
myservo.write(pos);
Serial.println(pos);
delay(1000);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <Servo.h>
Servo myServo;
// 存储通信序号
int serialIndex = 0;
void setup(){
Serial.begin(9600);
myServo.attach(9);
Serial.println("串口通信启动成功。");
Serial.println("请输入需要的角度: ");
}
void loop() {
if (Serial.available() > 0) {
serialIndex++;
Serial.print("[ ");
Serial.print(serialIndex);
Serial.print(" ] ");
int pos = Serial.parseInt();
if ((pos < 0) || (pos > 180)) {
Serial.println("你输入的值超出范围。");
} else {
Serial.print("设置伺服电机角度为: ");
Serial.println(pos);
myServo.write(pos);
delay(15);
}
Serial.println("请输入需要的角度: ");
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
‘
# HC-06蓝牙模块
# 介绍
HC-06蓝牙模块的全称是HC-06无线蓝牙串口透传模块,其中串口的意思是串口通信。而透传的意思是透明传输,蓝牙传输数据的过程中,数据是不发生任何形式改变的,数据原封不动地从发送者到接受者。
HC-06是一款应用广泛且配置比较简单的蓝牙模块,虽然并非最先进的,但作为学习使用是刚好的。
# 通信方式
HC-06蓝牙模块由于使用串口模式进行通信,因此Arduino板的TX需要连接HC-06的RX,Arduino板的RX需要连接HC-06的TX,并且两者GND共地。
注意:在我们通过USB连接Arduino串口上传程序时,Arduino板的RX和TX引脚不能插任何东西。
该模块背面的LEVEL3.3V表示串口通信时,HC06模块的RX引脚高电平为3.3V,因此我们必须使用分压电阻去降低流向该引脚的电压(5V→3.3V)。
# 示例
// 导入软件串口库
#include <SoftwareSerial.h>
// 建立软件串口对象,将2设为RX引脚,将3设为TX引脚。
// 设定的软件串口RX和TX需要与蓝牙模块的RX和TX交叉连接。
SoftwareSerial BTserial(2, 3);
void setup()
{
// 设定硬件串口的波特率。
Serial.begin(9600);
Serial.print("HC-06 DEMO ");
// 设定软件串口(BTserial对象)的波特率。
BTserial.begin(9600);
// 通过TX引脚3发送数据给蓝牙HC06模块的RX。
// 如果发送时蓝牙模块已经建立连接,则蓝牙主端会收到这条信息。
// 如果发送时蓝牙模块没有建立连接,则蓝牙模块会处理该条AT指令。
BTserial.print("AT+VERSION");
// 测试用的灯
pinMode(11, OUTPUT);
}
void loop()
{
// 通过BTserial串口接收数据并进行处理。
if(BTserial.available()){
// 将BTserial串口(蓝牙设备)发送的信息输出给硬件串口(串口监视器)。
char BTserialData = BTserial.read();
Serial.write(BTserialData);
// 判断收到1则开灯,0则关灯。
if(BTserialData == '1'){
digitalWrite(11, HIGH);
}else if(BTserialData == '0'){
digitalWrite(11, LOW);
}
}
// 通过硬件Serial串口接收数据并进行处理。
if(Serial.available()){
// 将硬件串口(串口监视器)发送的信息输出给BTserial串口(蓝牙设备)。
char serialData = Serial.read();
BTserial.write(serialData);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45