Arduino机械手掌控制系统技术文档

项目概述

本项目实现了一个基于Arduino的机械手掌控制系统,通过5个伺服电机控制机械手掌的5个手指。系统可以接收0-1范围内的数值,并将其映射到伺服电机的角度范围(0-120度)。

硬件配置

  • 控制器:Arduino开发板
  • 执行器:5个伺服电机(连接到D1-D5引脚)
  • 通信:串口通信(波特率9600)

代码结构

1. 全局变量与对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 伺服电机对象
Servo finger1; // 拇指
Servo finger2; // 食指
Servo finger3; // 中指
Servo finger4; // 无名指
Servo finger5; // 小指

// 引脚定义
const int servoPin1 = 1; // 拇指
const int servoPin2 = 2; // 食指
const int servoPin3 = 3; // 中指
const int servoPin4 = 4; // 无名指
const int servoPin5 = 5; // 小指

// 角度范围
const int minAngle = 0; // 最小角度
const int maxAngle = 120; // 最大角度

// 初始位置
const int homePosition = 0;

// 当前角度值
int currentAngle1, currentAngle2, currentAngle3, currentAngle4, currentAngle5;

2. 主要函数

2.1 setup()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void setup() {
// 初始化串口通信
Serial.begin(9600);

// 连接伺服电机到对应引脚
finger1.attach(servoPin1);
finger2.attach(servoPin2);
finger3.attach(servoPin3);
finger4.attach(servoPin4);
finger5.attach(servoPin5);

// 手掌归位
resetHand();

// 输出使用说明
Serial.println("机械手掌控制系统启动");
Serial.println("手掌已归位,等待控制指令");
Serial.println("请输入5个0-1之间的值,用逗号分隔,例如:0.5,0.2,0.8,0.3,0.6");
}

2.2 loop()

1
2
3
4
5
6
7
8
9
10
void loop() {
// 检查是否有串口数据可读
if (Serial.available() > 0) {
// 读取串口输入
String input = Serial.readStringUntil('\n');

// 解析输入数据
parseAndControlFingers(input);
}
}

2.3 parseAndControlFingers()

1
2
3
4
5
void parseAndControlFingers(String input) {
// 解析逗号分隔的值
// 检查值是否在0-1范围内
// 控制每个手指
}

2.4 controlFinger()

1
2
3
4
5
void controlFinger(int fingerNumber, float value) {
// 将0-1的值映射到角度范围
// 根据手指编号控制对应的伺服电机
// 输出调试信息
}

2.5 resetHand()

1
2
3
4
5
void resetHand() {
// 将所有手指设置到初始位置
// 更新当前角度值
// 等待伺服电机到达位置
}

函数详解

1. setup()

功能:初始化系统,设置串口通信,连接伺服电机,并将手掌归位。

关键操作

  • Serial.begin(9600):初始化串口通信,设置波特率为9600
  • finger1.attach(servoPin1):将伺服电机对象连接到指定引脚
  • resetHand():调用手掌归位函数

2. loop()

功能:持续监听串口输入,当有数据时读取并处理。

关键操作

  • Serial.available():检查串口缓冲区是否有数据
  • Serial.readStringUntil('\n'):读取一行数据,直到遇到换行符
  • parseAndControlFingers(input):解析输入并控制手指

3. parseAndControlFingers(String input)

功能:解析输入字符串,提取5个控制值,并控制对应的手指。

参数

  • input:包含5个用逗号分隔的0-1之间的值的字符串

算法流程

  1. 使用indexOf()substring()方法解析逗号分隔的值
  2. 使用toFloat()将字符串转换为浮点数
  3. 检查每个值是否在0-1范围内
  4. 调用controlFinger()函数控制每个手指

错误处理

  • 检查输入格式是否正确(是否有5个值)
  • 检查每个值是否在0-1范围内

4. controlFinger(int fingerNumber, float value)

功能:控制单个手指的角度。

参数

  • fingerNumber:手指编号(1-5)
  • value:控制值(0-1)

算法流程

  1. 使用map()函数将0-1的值映射到角度范围(0-120度)
  2. 使用switch语句根据手指编号选择对应的伺服电机
  3. 使用write()方法设置伺服电机角度
  4. 更新当前角度值
  5. 输出调试信息

关键函数

  • map(value * 100, 0, 100, minAngle, maxAngle):将0-1的值映射到角度范围
  • finger1.write(angle):设置伺服电机角度

5. resetHand()

功能:将所有手指设置到初始位置(归位)。

算法流程

  1. 将所有伺服电机设置到初始角度(homePosition
  2. 更新当前角度值
  3. 等待伺服电机到达位置(delay(1000)

使用方法

  1. 将代码上传到Arduino开发板
  2. 打开串口监视器(波特率设为9600)
  3. 系统启动后会自动将手掌归位
  4. 在串口监视器中输入5个0-1之间的值,用逗号分隔,例如:0.5,0.2,0.8,0.3,0.6
  5. 系统会将这些值映射到0-120度的角度范围,并控制对应的伺服电机

注意事项

  1. 代码中使用了D1-D5引脚定义,这通常用于ESP8266/ESP32等开发板。如果使用标准Arduino板(如Uno、Nano等),需要将引脚定义修改为数字引脚(如2-6)。
  2. 伺服电机的角度范围设置为0-120度,可以根据实际使用的伺服电机调整这个范围。
  3. 初始位置设置为0度,可以根据需要调整为其他值。
  4. 如果某个伺服电机的运动方向与其他电机不一致,可以在controlFinger()函数中使用1-value来反转该电机的方向。

扩展与优化建议

  1. 添加平滑运动功能,使手指运动更自然
  2. 添加预设手势功能,如握拳、伸展、指向等
  3. 添加按钮控制或传感器输入,实现更多交互方式
  4. 实现与其他设备的通信,如蓝牙或WiFi控制
  5. 添加反馈机制,如LED指示灯或蜂鸣器提示

常见问题排查

  1. 伺服电机不动作:检查电源供应是否充足,伺服电机是否正确连接到指定引脚
  2. 伺服电机抖动:可能是电源不稳定或伺服电机质量问题,尝试使用更稳定的电源
  3. 角度范围不正确:调整minAnglemaxAngle参数,适应实际使用的伺服电机
  4. 方向相反:在controlFinger()函数中使用1-value来反转电机方向
  5. 编译错误:检查开发板类型是否正确选择,引脚定义是否与开发板兼容