( L% z& l* C' Q4 Q5 w" _ 8 u& k2 \/ u0 D4 b
+ \/ r3 I# b4 ?" M5 w, o 前言本文为手把手教学STM32的机械臂项目——Robot Arm本次项目采用的是STM32作为MCU。该机械臂的基础模型为国外开源项目诸多前辈经过长时间的验证与改进其机械臂精度可以满足日常需求。本项目机械臂为三自由度机械臂42步进电机搭配TB6600驱动器作为动力支撑。整体项目框架具有极高的可拓展性方便后期实现视觉抓取等高级嵌入式开发应用。 机械臂的控制选用JDY-31蓝牙控制结合手机上位机APP进行联动。文末有代码与3D打印件开源8 k2 G4 O3 n& P' |/ ]" q! [( D. D
% b. O% p1 R H D 实验硬件STM32F103ZET6TB6600驱动器42步进电机JDY-31蓝牙模块5V步进电机ULN2003驱动板机械臂3D打印件$ |7 h" T j; d4 q2 R$ i; ^
! Z$ L9 g5 q$ l! Y4 z- @; g. f 硬件实物图 . p" T$ y$ I6 q( ^" M/ C! }0 i " z, p | B: y1 N3 Q. Q% D 0 G. @! B9 Q: k. G7 I , n: i J6 b @" L/ `/ n6 s) K6 U, T. B! h. E! p! S! d) b9 A
0 [ p( z/ `& \ X C; I $ }- @. m3 ?' T2 _8 {1 Z% Z , }- s, K% A8 n- ^! |% m
一、机械臂简介 3 c0 q/ X( R& z* s' P7 [: F
机械臂是机械人技术领域中得到最广泛实际应用的自动化机械装置在工业制造、医学治疗、娱乐服务、军事、半导体制造以及太空探索等领域都能见到它的身影。尽管它们的形态各有不同但它们都有一个共同的特点就是能够接受指令精确地定位到三维或二维空间上的某一点进行作业。机械臂是指高精度多输入多输出、高度非线性、强耦合的复杂系统。因其独特的操作灵活性已在工业装配、安全防爆等领域得到广泛应用。 $ d" d0 L0 [$ P8 y5 ` & c4 Q1 u" g: S" t i Y 本项目的机械臂目前为被动控制方案需要使用手机蓝牙APP作为上位机人为控制抓取目标物。考虑到目前设计的机械臂已拥有较高的机械精度后续可以附加树莓派等开发板进行视觉抓取开发。 $ W. Q; c; x% Y+ C5 D! k $ t# h& ?* n! N, e# ~" N' j, a! I1 a8 W/ N1 U. {
2 P& m- t: [$ Y
二、42步进电机与TB6600驱动器 & q/ t' f5 k# C/ }1 q
2.1 42步进电机 . T0 V- ~8 G: r# { 42步进电机是指安装机座尺寸是42mm×42mm的步进电机又叫NEMA 17步进电机这里的NEMA是National Electrical Manufacturers Association的缩写美国电气制造商协会是美国最大的电气设备制造商协会如下图所示相同机座尺寸的步进电机又有不同长度和不同绕组参数的型号一般相同机座尺寸的情况下步进电机越长定子上能够绕下的绕组就越多电机的输出力矩就越大。! Z8 e! L2 D$ ^9 @, V$ a3 L
& N7 t( Z! l8 k8 E1 I$ p : a! N5 h. A% g# x 42 57 86步进电机的主要区别是什么即42 57 86的意义是什么& k7 A0 j8 q1 e' V
1 g* K7 ~# Q, u) p% `- l0 D答42 57 86步进电机的区别主要是步进电机的机座不同尺寸分别是42×42mm、57×57mm、86×86mm一般来说步进电机的机座尺寸越大电机的静力矩就越大电机运行时的转矩就越大电机能够承受的负载就越大。 5 {# w0 ]( g' j& A, C ) [2 H) ^* g2 B3 g * {. K1 \' C6 B% Q/ Q& h- f, q
- o( N- F! g6 v
" \5 @# b" i; a& x( g
本项目中所使用的为四线二相的42步进电机步距角是1.8度在无细分的情况下转一圈走200步360/1.8=200。切记42这个数字的含义仅与电机的尺寸有关。而电机步距角细分程度只与电机驱动器的配置有关。9 w. l6 A1 `; @. f5 G$ ^) q9 r
6 D, N2 G' C$ b. I8 m
, I, _4 Y# P4 Z! |3 A$ L+ P# l + O$ m0 m+ u# N * V& O# m% t5 x$ c5 n/ F 机械臂由3台42步进电机驱动实现三自由度控制。限位器则可以用来初始化机械臂位置合理校准机械臂对应的笛卡尔空间坐标下的状态。5 I& l2 z3 g& }) i0 f5 i
; m/ C* @3 y: ^+ T- f+ V
8 h+ b1 q5 U7 a! h; g. {2.2 TB6600驱动器 ' W) }) |' p9 `" B& J& Y! j3 L/ T 驱动步进电机往往需要驱动器帮助常见的步进电机驱动器有TB6600、A4988、DM542、DMA860H和ULN2003等。其中大部分步进电机驱动器用法和接线思路大致相同驱动电机的原理也基本一样。 ( h' q! h8 ~) J # z) p5 h6 D9 U4 _* D0 |
项目中使用的步进电机驱动器为TB6600TB6600是一款专业的两相步进电机驱动器兼容STM32、Arduino和其他多种主控器可实现电机正反转控制旋转角度控制等功能。步进电机驱动是一种电子设备通常作为桥梁来连接控制器、电源和步进电机。虽然控制器的处理性能很强大但是它本身的输出能力电流却很弱小。它需要一个中间桥梁去连接电机和主控并同时为电机提供足够的电源。 : c- q2 u5 |( f7 f1 y , u! A9 y7 _/ m+ A% v9 K* l, B TB6600步进电机驱动器采用H桥双极恒相流驱动可直接用9~42VDC供电可选择7档细分控制1、2/A、2/B、4、8、16、328档电流控制0.5A、1A、1.5A、2A、2.5A、2.8A、3.0A、3.5A。最高支持4A电流输出。信号端都有配有高速光电隔离防止信号干扰并且支持共阴、共阳两种信号输入方式。出于安全考虑驱动器支持脱机保持功能能够让用户在通电状态下调试。内置温度保护和过流保护可适应更严苛的工作环境。 驱动器适合驱动57、42型两相、四相混合式步进电机能达到低振动、低噪声、高速度的驱动效果。可以适用于机械人控制3D打印等高精度应用领域中。 ) A K0 [% I1 S/ V2 d) W+ u " t0 w+ f, E8 a! q; \8 W2 w0 f 5 p( h% {& n: I( T $ C$ q$ K4 K& m, x$ m$ z: N
4 J: n7 G9 d' h% L: \9 P9 v ; ]; ]" I* K& M9 ?! P
通过拨动TB6600侧边的拨码开关设置步进电机的细分与电流 当拨码开关向下拨动则为ON上图为作者设置的步进电机为16细分电流设置为1.0A。分析正常情况下步进电机的步距角为1.8°转动一圈需要200脉冲当设置为16细分则需要16×200=3200脉冲一个脉冲步距角为0.1125°。而电流拨码开关的设置只要保证输出电流别超过步进电机电流的运载上限就行。 3 q [/ L, }$ w& a G# g ; w0 b+ ~" y- Z 4 Y8 M0 W4 F4 e5 ]; R5 bTB6600信号线的共阴和共阴接法) e/ k4 H# \- K* C8 G5 k4 b
# T0 j& e3 w8 b( r$ R" m (1)共阴接法分别将PUL-DIR-EN-连接到控制系统的地端脉冲输入信号通过PUL+接入方向信号通过DIR+接入使能信号通过EN+接入。若需限流电阻限流电阻R的接法取值与共阳极接法相同。7 |' v" x) ~$ A; _* Z, w
: f) ]9 }/ H$ z0 ]: b(2)共阳接法分别将PUL+DIR+EN+连接到控制系统的电源上如果此电源是+5V则可直接接入如果此电源大于+5V则须外部另加串联限流电阻R保证给驱动器内部光藕提供8到15mA的驱动电流。脉冲输入信号通过PUL-接入方向信号通过DIR-接入使能信号通过EN-接入。" U; A( C2 p( q; J$ |
7 C/ m& E3 @5 |- i( p 特别注意作者建议大家采用共阴接法方便且不容易犯错。 ! U) e. N$ U: ]& @8 _8 w2 G ' b6 o* l) `/ M , A8 S' G# r4 d# e! Q$ B A* h 7 k: V, E$ J9 {( i, t' y 特别注意" p1 O4 L$ |0 j! w- h
) r" t+ O6 N4 ]9 p% c, U& ] S 初学者接触步进电机与步进电机驱动器时很容易接错相位线导致出现缺陷漏项发现。所以当发现信号线电源线都满足驱动要求但无法驱动步进电机亦或是步进电机驱动异常时出现丢步转动噪音等。问题往往可能出现在相位线接错了读者朋友们可以去找步进电机厂商去拿一下步进电机的相位线说明。 0 E6 h3 S6 d% O1 }" o; D 4 @- d1 K+ n1 }3 T ( }6 L5 i }8 e
三、5V步进电机与ULN2003驱动器 4 [/ a! e2 f1 q, S+ u 5V五线四相步进电机是一种常见的小扭矩电机本项目中采用此电机通过机械结构驱动机械臂爪子进行物体抓取。该型号电机往往使用ULN2003驱动器配合使用UNL2003器件是高电压大电流达林顿晶体管阵列。% M( v' U m8 |: L A, L
( e* R: Z5 N& |
8 L' C) D' t3 z% l* k3 \ 5 L9 O9 ~! |# R; W! m2 R四、机械臂控制 , H* z( V. i1 B. l7 _: l
4.1 JDY-31蓝牙控制 5 ~# d5 D8 S9 M, G' V; l JDY-31蓝牙模块基于蓝牙3.0 SPP设计这样可以支持 Windows、Linux、android数据透传工作频段 2.4GHZ调制方式GFSK最大发射功率8db最大发射距离30米支持用户通过AT命令修改设备名、波特率等指令方便快捷使用灵活。( I( T+ s4 M: ` D2 _$ M- w
5 r7 E* Z7 V$ @$ W" B$ K 其通常使用时接入串口引脚UART即可成功与蓝牙模块建立通信后会发送CONNECTED。简单的说JDY-31蓝牙模块本质上就是一个蓝牙转串口的设备使用的时候直接当串口通讯进行使用即可。$ o% _& B- u2 W6 A5 l) g" A
# P/ i! x4 z5 F! h# @ 2 ^! G# Q" P' s) Y7 M& k7 R6 H ; k. ? }3 n& L4 z8 Q" C9 d7 t# O 而上位机作者则选用现成开源的蓝牙调试器APP直接创建一个针对本项目机器人的控制上位机工程。利用该APP极大的缩短了上位机开发的时间与工作量也可以快速检验出机器人的运动控制是否满足要求需要蓝牙调试APP的可以私信作者提供。 " A; _6 `5 { P( N2 v8 x' k7 O - V5 g- c; b! x5 o5 GJDY-31蓝牙模块的AT指令集% r5 i3 k+ p5 r: ?
$ E* i/ E' F1 k' E/ l
序号 & q' j4 R+ S7 o) s
目的 7 d3 V" L1 Q# u! u0 }$ z4 C2 J! p; C
指令$ Y" m% ]+ H# | G( H
参数 + y. a, m. Q/ [4 S
响应 : R! y, a% J4 L( ]( y8 ?! v
备注 # {0 _' W/ L7 E+ b6 X
12 O: I! ]$ W2 `
查询版本号 $ _, s" F: R6 R0 O
AT+VERSION * g, h- A! W0 N4 Z" V5 s4 B: G9 v, ` u
NONE% N0 B! `) o0 ~
+VERSION=… & m2 I% v% ~- U! m
2 4 `9 C* H" S3 X% n- u- d6 u" v
复位8 T3 W+ k0 Q! o
AT+RESET* R$ H( n- e B1 b7 k, c# l( r% o
NONE / x3 j1 M/ F& K" W4 i# F
+OK ( f& v) D# }, \6 w. g4 }
3* m, O, m H7 o1 N$ ]: {3 A
断开连接7 O. g5 a3 Z* i" s# t
AT+DISC p% Z# l: @- ^& O! R; w
NONE % p5 s- H9 `" K8 F
+OK1 H2 H4 }9 o3 [. }+ W7 F
蓝牙连接后有效! b" I- t8 J/ E3 E( g8 Y) R
4 ! z) |# \# D# q
BLE蓝牙MAC地址 % ?/ @* n& V7 j
AT+LADDR * E7 I, h) T. W# G6 A8 K( U- J; P% V' s
NONE) `! t3 ?1 @& U' m, s+ @; Y
+LADDR=…1 U" o0 K2 c, t" m$ ~. A
5 9 H. z" B6 Y) x& V
波特率设置/查询+ A& b; ?4 Z7 ~& C z3 g
AT+BAUD[参数] , N% p, ^* I- B; v
4-9600;5-19200;6-38400;7-57600;8-115200;9-128000 8 i+ a/ p1 g( x; u
+OK: r5 Y3 c0 _: Q% m2 o" B( k
128000也不丢包4 N2 C# s$ S- C$ o+ f( W: j, a' w
6; Y" S5 }6 H# P0 r9 m3 V5 l1 J
SPP蓝牙密码配对/查询 2 A# Y$ D3 k7 ^! _) s( z& a+ z" S
AT+PIN[参数] $ D" Y% Y7 d5 U! u0 q
4位密码 ! Y% B& Y. |6 f* ^( R
+OK2 b# w% l; y3 _' T% x6 @0 ]3 j3 B
默认12344 j' L! @* X# f
7! _; ~% {+ j9 \
广播名设置/查询 6 s7 u% I1 G% a+ w+ p
AT+NAME[参数]1 X. i9 z: H* t5 F. A
18字节以下 * R; G# F9 U! j& V" e
OK + e$ L0 e& @) u0 a: X
8 W. Q. t' t- T) o/ Y% K
恢复出厂设置 1 `( C$ z3 f4 P. Z) v+ z/ f- y
AT+DEFAULT 6 y5 p3 P; ?% V
NONE / F- V- @! q0 d" q+ p& M
OK 1 S _. u1 i( g/ B% m4 P I
默认JDY-31-SPP 4 F" s } v- P5 h
9 3 _; L% u0 ^0 x0 G6 ]) h/ @
串口输出状态使能查询 " u4 Q# e5 Y6 R% z [# d
AT+ENLOG . W* l3 E) G: i
1:打开 0关闭6 s! p' N5 ^ S* t1 d! A( G
OK 6 X, T- C' p- D
默认为1 3 u6 l( e/ k$ S6 R0 s5 @- _/ t! O
. N& [: @- r; D* k; `1 H* ] M6 g! Z, I* c" b特别注意购买的JDY-31蓝牙模块可能初试化的波特率不一样读者朋友一定要去询问到厂家的初试波特率或自己使用AT指令去设置一下否则对后续的蓝牙控制会造成很大影响。 4 i8 A, b- g4 z# U) [ ' F0 k" D( G# `# `$ f2 a. }: R+ S # y6 r% V2 W- u( F0 x4.2 机械臂运动学建模 % A) e; \- f' y6 v' q' H& m
合格的机械臂产品往往都需要根据其设计的机械结构去解算其运动模型即仅输入需要的笛卡尔空间坐标系下的位置点% F. x4 a" e! t) s
7 Q8 {2 c! ], r# { P' E/ R2 V. z
即可解算出各台电机需要运转的情况。考虑到博客篇幅有限这里仅给大家提供该机械臂的几何模型算法后续基于树莓派与STM32的视觉抓取机械臂给大家详细介绍一下。7 M) @$ h9 ~ C1 s& c$ d
0 b" H+ i' ]- P2 [$ l
3 x" ^$ Z2 _7 |, P
' f3 X- {/ c" C7 V1 v
五、 CubeMX配置 9 z" a1 m$ ]% x% q# \6 @1、RCC配置外部高速晶振精度更高——HSE$ M/ J) O4 J" [9 j' j4 p
* z- |! g9 s) J: K: ]
3 b0 W1 W2 r7 N$ s% E9 {$ c* W1 f . @+ q: d$ C9 Y8 `2、SYS配置Debug设置成Serial Wire否则可能导致芯片自锁 0 Q( _5 b2 @5 p; C & N$ T/ W3 c9 d: I4 ?$ b5 B+ `/ o) |
; o- e, u6 ?4 Y, X% q
( f, r, B1 o% y8 W 3、TIM2配置利用TM2定时器配置us级脉冲 ) {) f4 j) k# r# u5 \" {3 w! o 2 Q/ u+ n8 }/ c% j; X z2 ~3 {* y
) `" v7 x: m( i( n5 B* Y4、UART3配置 JDY-31模块与STM32的蓝牙串口通讯开启串口中断 8 E! o3 ~" c) C% w 5 ? J) K" {3 O! }9 e - |1 Q* R: C R. a6 C. j U0 {9 Z + ^& n' ^ G. r
L' P6 a. ?, M* b+ A }
4 m; P* C3 |: b! k+ F5、GPIO配置PA5、PA6、PA7为机械臂方向控制引脚PD9、PD10、PD11、PD12为5V步进电机的四相输入PF13、PF14、PF15为机械臂电机驱动脉冲输入引脚 ( ~! r/ B+ P. g / v+ K: g7 M6 g# b1 w4 H: z: I; s' Q6 W8 @. Q2 O- X
: W, I, f) ?7 L! x, u R9 W3 l6、时钟树配置 " e! m+ U: J' a& ~ {) M( t ! b N+ Z2 W: S9 r2 ^. x+ D! f/ o% A/ x% K
, X+ V' W s1 d% p4 \- M 7、工程配置 ! ^) i7 `; C* } 6 T/ _& w/ _ L) w6 a9 r6 S' Q " r4 F- z; z4 W, ]* ^& r) G
t! {% |. w1 O7 o( }六、代码与解析 7 S5 _5 ~% t9 G) F0 \" }' I6 ?1 G
6.1 机械臂电机控制代码 " ~$ p+ H9 a3 p' F* g 机械臂的驱动器件为3台42步进电机通过TB6600驱动器进行驱动。单片机MCU主要控制的是TB6600上的DIR与PUL端口其控制过程也很简单——GPIO控制即可作者选择共阴接法DIR-与PUL-都需接地只需要控制DIR+与PUL+即可。 4 s8 I2 s1 I b# y9 `% n. p# U # h3 B' L4 L$ }) v2 w+ x5 U6 z' L 其中DIR+端口的控制为GPIO的高低电平控制该DIR+端口的高低电平输入决定了步进电机的转动方向。PUL+端口则需要输入脉冲信号进行控制脉冲频率的高低决定了步进电机的转速。当然这里的PUL+端口的脉冲输入有2种主流方式1us级延迟函数GPIO电平翻转2设置定时器翻转GPIO这里作者使用us级延迟函数翻转实现脉冲。 , I$ J1 N- B2 p ! B. Q, I7 R S* oMotordrive.h代码" R: h# @2 V4 ^% X. h; Y