前言9 m/ w) N, j7 q0 f' z/ O
我们通过分析从Openmv中发送到主控芯片的信息,从而对小车进行相应的控制。
" g- O0 O* a( A% F# ?% @+ e9 K; g) F& b: |" D
一、接收信息的处理 K9 `' O) f7 @6 {- L
我们使用Openmv发送的打包数组中,其中第1个数值为小车的状态,第2个数值为中线偏差量,从而使用的通过分析打包数据,对小车进一步控制。- Z" x e; `6 [6 C
9 C4 T- t; D+ x/ z9 Z8 p0 p部分代码如下:
0 n. k) S% U1 }' r9 p4 c/ g
6 p ?. }4 c( |- void Blueteeth_control()
; w2 L- N8 n1 X& s% d, n - {5 O! Y0 X( J5 r6 \' N
- unsigned char uart1_data;
9 L5 b9 U% Z% b$ P - while (HAL_UART_Receive_IT(&huart1, &res, 1))5 x! L, ?9 l: Q6 [- r' E# a( r
- {& }5 r! i1 O) \
- state=res[0]//接受传回的第一个值,即状态6 A- P' t2 s5 p' D6 K0 \# z
- angle_error=res[1]//PID角度偏差,先储存起来
% B! l" ]5 Y, n - switch (state)( p$ D, N) w8 K9 B( g
- { W' ?: K! g6 v K
- case 'x':Motor::RunPID(angle_error);break;//正常巡线
* | f4 L* q& V& L' p" _ - case '+':Motor::PID(0);break;//十字停车
* x7 ^- l# G1 s - case 'l':Motor::PID(1);break;//左转4 V! z4 L o9 A6 w
- case 'r':Motor::PID(1);break;//右转 q0 D Z2 s8 o# e; m; N9 W
- case 's':Motor::PID(0);break;//到达黑色虚线,停车
& \0 B7 M5 N1 L; J& k4 @* }; G" j+ k - }
3 \% A' U; g+ x- u - }. n. A' k& ~; ^# V& M
- }
& i: Z4 V/ g2 I0 r- O2 E
复制代码
! W4 j( c0 c. p. G$ N1 n% a; J二、电机PWM输出
" j m( H6 J+ t( g& u! [; ^1.正常巡线( p9 m; p8 Z5 F
因为我们是三轮车,左右转依靠差速来实现,所以我们利用差速因子来对中线偏差进行PID调控。
- R! ]8 U8 R! A9 ^- i
* O7 J) b- g( y' }6 S* I4 Q代码如下:
( l- w" `- w$ M, L6 W5 _6 a+ h4 _! g9 J
- if (error >= 0) //右
8 X- [1 G* k3 ~2 N) ~& Q9 O - {
8 t. Y/ s' M8 T3 f) `2 X6 H$ m5 n - L_motor.exp_speed = PWM_default - (int16)(Island_l_reduce * error) - PWM_decrease;1 f, M6 @+ x& |
- R_motor.exp_speed = PWM_default + (int16)(Island_r_add * error) - PWM_decrease;
* ~& d5 T& t) V2 b, l# t, a - }
" m9 I% |* ]; m8 V' g - else if (error < 0) //姿态在左
! \" `, ?3 {/ s) x - {
; }/ Y+ G& d; U - L_motor.exp_speed = PWM_default - (int16)(Island_l_add * error) - PWM_decrease;
3 {* _. F2 x# E7 z - R_motor.exp_speed = PWM_default + (int16)(Island_r_reduce * error) - PWM_decrease;7 K+ ^6 m5 ^: n N
- }
复制代码
' t# A. o0 o$ W2.特殊标志位
9 J0 X: s/ s6 D, U; v6 p5 `/ N1.停车
7 a3 [2 K6 P5 P$ r7 l停车我们直接让四路PWM等于0
, ?" s! x% ]+ a7 `, @$ V2 t' O$ k+ a1 r' E2 p
代码如下:
, z- M% O1 H# K; V m' z! j$ h, t+ l$ D/ M
- void Motor::Stop()
( ?- M* d% t5 o0 g/ B& e - {
4 h/ I& G; m3 F: @ E) J/ _4 z - Motor::PWM_OUT(0, 0, 0, 0);7 F! S% E6 k% d" c
- }
复制代码 9 I! x% z5 U. X) |: N& A
2.转向
! N+ z1 b3 s# v" @' X我们通过左右轮的差速进行转向,通过MPU6050判断是否达到相应的角度
- n7 Z# L& m" g" _; [! ?/ K& ?5 i, e) l+ _5 f
部分代码如下:: q* Y5 C% w: T) e% |
+ h* R7 {1 O6 C o( ?- void Motor::Turn(u8 dir)
/ O+ q# m* m q& i! N - {8 |: Y+ A# _8 u, w
- switch (dir)/ \! P! I4 _ a7 S- v
- {
7 a$ c1 [( Q' J8 U - /*左转弯*/4 i* l) H& p' G' f, ?8 {' u
- case 1:: d4 d/ s S/ [# ~- C+ F T
- Motor::PWM_OUT(0, 2000, 2000, 0);
. S9 m6 D/ ~) q# v - break;+ c: J1 }' ]5 E, T
- /*右转弯*/ 2 S* X6 Z, [7 e2 p" D) s4 u% B/ G
- default:- Q# g4 t: y# a. s! e
- Motor::PWM_OUT(2000, 0, 0, 2000);
8 A- Q) }) ~6 W, o* g( Y - break;
x1 J( s8 t# J# m# s6 p - }. y4 B5 p) g1 R, @# }
- }
复制代码
( v+ f5 {% ?' F8 e8 b& S- y s7 y6 h7 e5 L& K7 q( W1 m6 b, Y
总结
+ y4 W8 E4 S. |这个项目是完成了大部分代码,但小部分没有调试,因为个人时间关系也是不会再去完善和调试的了,这些思路希望对大家有所帮助。/ U. |9 h8 D, a1 a% ]* j
0 h3 o/ {" n5 X U: O3 D; L% G
5 Z+ o+ i2 @' B. e$ \& K6 y% M5 j9 |3 f
/ k" u! p- a/ a5 S+ B
|