一、项目概述
本项目为参加FastBond第四季活动而设计,创意方向为“感知”,项目内容为机械臂、工业自动化。
本项目基于ESP32-S3模组,设计了一款舵机控制板,命名为ESP32-S3-MotorCtrlBoard。
该控制板具有6路PWM接口及3个总线舵机接口,可同时控制多个舵机。
为测试控制板功能,本人动手制作了一款4自由度机械臂,机械臂含有3个旋转关节和1个夹爪,命名为“小黑机械臂”。可通过操作控制板手柄或触摸屏485通讯接口控制各关节动作,实现手动或自动控制功能。

二、机械臂设计
为了尽量控制成本,本人没有购买成品机械臂,而是通过散件和自制的方式,自己攒了一个机械臂。这样机械臂(含舵机)成本可以控制在150元以内。
一方面,自己动手丰衣足食,可以学到很多知识。
另一方面,网上的机械臂性价比不高。

自制机械臂有4个舵机,四个自由度,分别控制腰部、大臂、小臂和夹爪。下面是机械臂物料明细。总成本约150元。
序号 | 名称 | 型号 | 数量 | 单位 | 单价 | 总价 | 备注 |
|---|---|---|---|---|---|---|---|
1 | 双轴总线舵机 | ZP15D | 2 | 个 | 35 | 70 | 15kg270°兼容PWM |
2 | PWM舵机 | MG996R 180° | 2 | 个 | 15 | 30 | 13kg180° |
3 | 金属机械爪 |
| 1 | 个 | 10 | 10 |
|
4 | 斜U型支架 |
| 1 | 个 | 5 | 5 |
|
5 | 短U型支架 |
| 1 | 个 | 5 | 5 |
|
6 | L型支架 |
| 1 | 个 | 5 | 5 |
|
7 | 舵轮(主动轮) |
| 4 | 个 | 2 | 8 |
|
8 | 舵轮(从动轮) |
| 2 | 个 | 2 | 4 |
|
9 | 杜邦线 | 30cm 40P | 1 | 排 | 5 | 5 | 公对母 |
10 | PP塑料板 |
| 2 | 块 | 1.5 | 3 |
|
本人开始制作第一版时,大臂和小臂都较长,因选用的电机功率相对较小,无法承受自身载荷,更换大功率舵机又需要增加成本,所以无奈将两个臂都做了“截肢”。

最初版机械臂
三、控制板硬件设计
3.1控制板主要物料
序号 | 名称 | 型号 | 厂商 | 备注 |
1 | RS-485芯片 | MAX3485CSA+ | ADI/Maxim | 赞助商 |
2 | 静电和浪涌保护芯片TVS | 1KSMB6.8CA | Littelfuse | 赞助商 |
3 | 接线端子 | Term Block HDR 2POS 5.08mm | TE | 赞助商 |
4 | 控制器(无线模块) | ESP32-S3-WROOM-1 |
|
|
5 | DC-DC电源芯片 | XL1509-5.0 |
|
|
6 | 线性稳压器LDO | AMS1117-3.3 |
|
|
7 | 双轴手柄 | FJM10K-N |
|
|
8 | USB转换芯片 | CH343G |
|
|
9 | 八路总线收发器 | 74HCT245D |
|
|
10 | 双向电压电平转换器 | TXS0102DCTR |
|
|
11 | 单路缓冲器 | SN74LVC1G125DBV |
|
|
12 | 反相器 | 74HC1G04GW |
|
|
3.2原理框图

注:舵机单独供电,舵机电源和控制板电源需要共地。
3.3硬件电路介绍
电源电路
电源使用XL1509-5.0降压,支持宽电压供电。再经过AMS1117-3.3降压到3.3V。
舵机电源使用外部电源适配器单独供电,舵机电源的电压5V,最大输出电流3A。

MCU电路
MCU使用乐鑫的ESP32-S3-WROOM-1模组。使用了GPIO、ADC、PWM、UART、I2C、USB等资源。

输入输出电路
控制板设计了两个按键、两个LED、两个双轴手柄(4路ADC)。

USB转串口电路
使用USB转串口芯片CH343G,设计了程序下载电路。

RS485电路
控制板支持485和电脑或触摸屏通讯,下面是RS485电路。485芯片使用的ADI(MAXIN)的MAX3485,使用S8050实现自动换向功能,无需MCU控制换向。静电浪涌保护(TVS)元件使用的Littelfuse的SMB6.8CA.

PWM电平转换电路
MG996R舵机支持3.3V和5V的PWM,而总线舵机只兼容5V的PWM,所以使用74HCT245D进行电平转换,将3.3V的PWM信号转成5V,以驱动总线舵机。

总线舵机驱动电路
总线舵机也支持单线串口驱动,当系统中使用的舵机较多时,推荐使用总线舵机,可以对每个舵机设置ID号,也能减少MCU引脚资源占用。

PCB设计图
PCB使用的是双层板,用Kicad完成设计。控制板尺寸为80*80mm


控制板实物图

四、软件设计
4.1 软件平台
编程环境:Arduino 2.3.7

开发板库:

4.2 主要功能
设计了五种工作模式,通过按下按键1,可以在各个模式之间顺序切换。
模式一至模式三为手动模式,模式四为示教模式,模式五为自动模式。
模式一:两个手柄共4个轴分别控制4个关节。
模式二:两个手柄只控制回转和夹爪。
模式三:两个手柄只控制大臂和小臂。
模式四:类似于示教器。可以通过触摸屏控制机械臂四个关节动作。
模式五:全自动功能,可根据编程位置自动动作。
4.3 主要代码
初始化程序
void setup() {
Serial.begin(115200);
Serial1.begin(9600, SERIAL_8N1, 18, 17);//485
slave.start();
delay(1000); // 等待 初始化完成
// 设置LED引脚为输出模式
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
// 设置按键引脚为输入模式(使用内部上拉电阻)
pinMode(KEY1_PIN, INPUT_PULLUP);
pinMode(KEY2_PIN, INPUT_PULLUP);
// 初始化LED状态
digitalWrite(LED1_PIN, HIGH);//灭
digitalWrite(LED2_PIN, HIGH);
// 初始状态:LED1亮
updateLEDs();
// 附加中断(按键按下时触发)
attachInterrupt(digitalPinToInterrupt(KEY1_PIN), buttonISR, FALLING);
Serial.println("\n[初始化] ESP32-S3 舵机控制");
//初始化PWM
ledcAttach(SERVO_PIN0, PWM_FREQ, PWM_RESOLUTION);
//ledcAttach(SERVO_PIN1, PWM_FREQ, PWM_RESOLUTION);
ledcAttach(SERVO_PIN2, PWM_FREQ, PWM_RESOLUTION);
ledcAttach(SERVO_PIN3, PWM_FREQ, PWM_RESOLUTION);
//ledcAttach(SERVO_PIN4, PWM_FREQ, PWM_RESOLUTION);
ledcAttach(SERVO_PIN5, PWM_FREQ, PWM_RESOLUTION);
// 初始姿态设置
setServoAngle(90, SERVO_PIN0, 0, 180); // 1轴,腰关节,MG996R 默认90
//setServoAngle(90, SERVO_PIN1, 0, 180); //
setServoAngle(120, SERVO_PIN2, 0, 270); // 2轴,大臂,总线舵机ZP15D 默认120
setServoAngle(165, SERVO_PIN3, 0, 270); // 3轴,小臂,总线舵机ZP15D 默认165
//setServoAngle(90, SERVO_PIN4, 0, 180);
setServoAngle(75, SERVO_PIN5, 0, 180); // 4轴,夹爪,MG996R 默认75
}
主程序
主程序具有5种模式,可以按下按键1,在各种模式之间切换。
void loop() {
//读取手柄信号
iADC_Handle1X = analogRead(ADC1_PIN); //0-4095
iADC_Handle1Y = analogRead(ADC2_PIN);
iADC_Handle2X = analogRead(ADC3_PIN); //0-4095
iADC_Handle2Y = analogRead(ADC4_PIN);
//手柄值映射到控制角度
iHandleSetServoAngle_alxe1 = map(iADC_Handle1X, 1024, 3072, 180, 0);
iHandleSetServoAngle_alxe2 = map(iADC_Handle1Y, 1024, 3072, 75, 165);
iHandleSetServoAngle_alxe3 = map(iADC_Handle2Y, 1024, 3072, 210, 120);
iHandleSetServoAngle_alxe4 = map(iADC_Handle2X, 1024, 3072, 110, 40);
// 处理按键状态变化
if (buttonPressed) {
handleButtonPress();
}
//发送状态到485屏幕
modebusData[0] = state;
slave.poll(modebusData, 5 );
//根据状态机,控制指示灯效果及工作模式
//四个轴均可动作
if (state == 1) {
setServoAngle(iHandleSetServoAngle_alxe1, SERVO_PIN0, 0, 180); // 1轴 默认90
delay(100);
//setServoAngle(iHandleSetServoAngle, SERVO_PIN1, 0, 180); //
setServoAngle(iHandleSetServoAngle_alxe2, SERVO_PIN2, 0, 270); // 2轴 默认120
delay(100);
setServoAngle(iHandleSetServoAngle_alxe3, SERVO_PIN3, 0, 270); // 3轴 默认165
delay(100);
//setServoAngle(iHandleSetServoAngle, SERVO_PIN4, 0, 180);
setServoAngle(iHandleSetServoAngle_alxe4, SERVO_PIN5, 0, 180); // 4轴 默认75
delay(100);
}
else if (state == 2) { //只控制1轴和4轴
setServoAngle(iHandleSetServoAngle_alxe1, SERVO_PIN0, 0, 180); // 1轴 默认90
delay(100);
setServoAngle(iHandleSetServoAngle_alxe4, SERVO_PIN5, 0, 180); // 4轴 默认75
delay(100);
}
else if (state == 3) { //只控制2轴和3轴
setServoAngle(iHandleSetServoAngle_alxe2, SERVO_PIN2, 0, 270); // 2轴 默认120
delay(100);
setServoAngle(iHandleSetServoAngle_alxe3, SERVO_PIN3, 0, 270); // 3轴 默认165
delay(100);
}
else if (state == 4) { //示教器模式
handleBlinking(); // 两个LED交替闪烁
handleModbusCmd(); //处理modbus虚拟手柄位置指令
}
else if (state == 5) {
// 状态5:两个LED同时闪烁
handleSimultaneousBlink();
// 自动演示:8个位置循环运动
handleAutoDemo();
}
delay(50);
}
五、演示效果
下面是触摸屏界面,详细演示效果请看视频。

六、心得体会
本项目设计并制作了一款4轴机械臂,初步实现了本地控制和远程控制、自动控制等功能。
机器人是一个交叉学科,涉及机械、电子、软件、控制等多方面知识。此项目只是一个起点,初步完成了一个机械臂雏形。
因本人技术水平、时间精力、预算等有限,此项目还有很多需要完善和进一步拓展的空间。
机械:目前只有4个自由度,不够灵活。机械结构靠散件拼搭,精度不够。后续考虑全新设计,3D打印。
电路:后续增加摄像头接口,加入视觉系统,以太网接口,算力升级。
软件:与计算机通讯,与ROS2结合、建模与解算、数字孪生仿真、图像识别。
感谢电子森林、硬禾学堂、得捷电子,为大家的创意插上翅膀!
感谢我的同事甘师傅对我在机械结构方面的帮助!
感谢家人的陪伴与支持!