你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32智能小车循迹教程

[复制链接]
STMCU小助手 发布时间:2022-5-20 17:35
前言
( J3 O! ~, ~; z8 u$ H: ^本篇文章将带大家学习STM32智能小车的循迹功能。0 F5 c  y; F/ k1 T. ^+ B" @' g  F
1 K0 f" e  F( f8 T( U, F
一、红外循迹模块工作原理及接线图4 _9 g, }% A7 U$ _9 Y4 _+ C& r
红外循迹模块工作原理
, n9 n1 d" m3 G3 U0 ]; u; E
电路工作描述
& f( N$ ]* K' V- B- U; |以其中一路为例
; K& \# L, t7 ]% ?2 M* C3 Z0 X" \1 D6 ^- E9 p
Y~1C~U16KT%H)ZR[X6860%4.png
) h6 x' A3 f5 A& P5 T7 n" l+ u8 ]2 j8 W) C0 k# `# b( y3 D
TCRT5000传感器的红外发射二极管不断发射红外线,当发射的红外线没有被反射回来或者反射回的强度不够大时,红外接收管一直处于关闭状态,此时比较器LM393的2脚的电压低于3脚的电压,输出OUT1为低电平,LED1为点亮状态;当红外反射强度足够且被接收到时,比较器LM3932脚的电压大于3脚的电压,输出OUT1为低电平,LED1为熄灭状态。简单的可以理解为遇到黑线灯亮,遇到白线灯灭。7 ]& p% c: C5 o0 _- a7 g/ L: [: S

) v# W1 W  M) ]3 d* d% j0 D红外循迹模块和STM32的接线图+ `3 Y7 B9 V* P. H9 q: k
此红外循迹模块使用到了4个IO口分别接到了STM32的PA4~PA7。
1 x9 N3 f# V; Q6 x' F
$ N9 q+ U$ Q; h& }3 w6 r% L1 i5 Y JENFP47~AD0CJ$~9VJZPF8L.png
+ i6 z! r" t6 \9 u
' O  k% g  c: [) k二、cubeMX配置1 Y: ^' _& _, y! d8 E+ S
将红外循迹的4个IO口都设置为上拉输入模式即可。3 F. z0 @$ j' I
2 U' ]: w- U, X
HDT[}~~VQ}G7{3TORDDXTQD.png
0 }' v  D/ q- z1 f1 H, F, I; k
( k- M  z# C: {* Q' N5 v$ ^( b三、代码解析

6 u8 [3 X5 l0 p/ _3 Y% V' N5 V5 S* Qfind.c
% p; D& N1 L7 J& z5 G% v
1 d0 u# g% d8 n; b
  1. #include "find.h"
    ! ]6 B4 V7 ]8 u0 |& E3 x9 ?7 f# E/ [
  2. #include "Moto.h"! P6 e* m+ o5 [3 d/ C" y

  3. . `2 Y3 p$ c- k2 s9 s  N7 N1 U
  4. extern TIM_HandleTypeDef htim3;
    & I# R5 O) R7 X( g
  5. ' x& a; B. z9 y3 d# j7 e$ R
  6. /*9 V, I% u8 _8 A3 T
  7. 函数功能:调节小车左右电机PWM
    ; H: q$ r- r8 }
  8. Left:左电机PWM
    - R- B$ Z- y5 s
  9. Right:右电机PWM6 @4 C' P0 ?* [) C! B
  10. */
    * w& z* p% z2 |5 d
  11. void Moto_speed_set(int Left,int Right)
    ) r+ }: A- R' \- A  J
  12. {
    4 C- ?2 I2 T$ R8 g$ t
  13.   __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, Right);3 O" ], G7 k% J8 Y6 S
  14.   __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, Left);
    9 v9 d5 X! Y; k0 _! f9 I
  15. }3 g7 Q4 J! D" n9 p6 ]

  16. ( G& c7 o1 J8 K% S, V+ l" t
  17. /*& R5 h: s* M- o
  18. 函数功能:循迹1 B, o9 C  ^& H" @
  19. */
    . V* X* x0 z$ o8 ~
  20. void Find(void)- ?1 `$ |( i  K% M" d5 e; U, }
  21. {9 U3 t+ k9 w3 z2 y* X& g2 t
  22.   //全是白线前进' [- Z5 {" z1 D! w
  23.   if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==0)&&(IO4_read()==0))* l# y, O% P' X: B1 g
  24.   {2 w6 F! K1 a5 d) M; {# B
  25.     Moto_speed_set(800,800);
    0 ?" }7 @$ g; D: x
  26.     car_move(0);   
    ! o6 L* Y3 N2 T% z7 e" ~+ o
  27.   }- ~2 O2 m  c" Q6 K; f
  28.   //右边有黑线小车向左即左轮加速右轮减速
    : U0 `3 F+ ?* A) |. P4 u7 r
  29.   else if((IO1_read()==0)&&(IO2_read()==1)&&(IO3_read()==0)&&(IO4_read()==0))
    7 I0 W7 n( V  @% x: P8 ?
  30.   {# |+ y5 s! |0 w
  31.     Moto_speed_set(800,0);
    6 a% k. p& o- c! f( b5 }7 F( S6 M: M
  32.     car_move(0);   
    : O* D# t! \4 }# C
  33.   }+ }) {+ o( M" C; W+ [8 E# _* d
  34.   //右边有黑线小车向左即左轮加速右轮减速# u2 n' a5 j* g0 {" W# L
  35.   else if((IO1_read()==1)&&(IO2_read()==1)&&(IO3_read()==0)&&(IO4_read()==0))5 w! Z% Z( D, s4 B& S5 @, |; f
  36.   {$ F/ ~+ b1 @4 a
  37.     Moto_speed_set(800,0);
    4 n/ h6 S' l6 L5 t. U' F1 Y1 w
  38.     car_move(0);    . f2 }0 J: `. Z  X
  39.   }9 T$ {6 ~+ p7 u9 O- l+ u0 r
  40.   //右边有黑线小车向左即左轮加速右轮减速
    " c; B5 \8 b) r" F* `7 a
  41.   else if((IO1_read()==1)&&(IO2_read()==0)&&(IO3_read()==0)&&(IO4_read()==0))
    0 g% w3 ~- P) T2 o% {
  42.   {
    8 [0 B2 C" Y2 H# \+ l. j" r+ g$ U
  43.     Moto_speed_set(800,0);
      Z$ e; h4 ]+ |2 }
  44.     car_move(0);    . V5 s. m* I0 e& a
  45.   }
    ; ^, d5 _' D0 X; i1 L* i0 b( s
  46. 2 C* h+ e& F- K; f8 J9 z
  47. : Y/ T: r' ^/ R: D+ M/ q7 W
  48.   //左边有黑线小车向右即右轮加速左轮减速1 d' L2 V( _; Q; [! h# W
  49.   else if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==1)&&(IO4_read()==0))
    ! v7 u( L* A+ Y! }' @+ w
  50.   {6 O8 o" i3 I9 m2 h" r9 f- {
  51.     Moto_speed_set(0,800);
    # x. D* u3 s( k. J# D
  52.     car_move(0);   
    ) d1 M! h% m' a, X8 c( e
  53.   }
    ' M7 M+ {+ `' `$ p9 Z9 A
  54.   //左边有黑线小车向右即右轮加速左轮减速
    + ~, R9 z2 E& y/ B8 |% O0 g2 J0 m
  55.   else if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==1)&&(IO4_read()==1))
    : K+ l: [3 j' ]2 t& `
  56.   {# X/ M$ H4 N9 z5 V8 q6 i
  57.     Moto_speed_set(0,800);" O! F- P, }8 {
  58.     car_move(0);   
    - j% A5 u) v* z
  59.   }
    ( e' h% L4 q3 {$ q
  60.   //左边有黑线小车向右即右轮加速左轮减速) L. K( a" Q) z3 M) [/ K/ N' ?7 W
  61.   else if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==0)&&(IO4_read()==1))" F7 n8 A0 S' Y/ }
  62.   {
    : |2 d1 Z3 b0 M( {4 x3 R
  63.     Moto_speed_set(0,800);
    5 I0 ]* L4 l4 x: y) {& `0 E! p! \
  64.     car_move(0);   
    9 e0 S. R* ?, F( f6 I) F
  65.   }6 P0 a9 k% |$ i1 G

  66. 1 R) O; g1 Q- U* q4 p$ ]  g6 H
  67.   //全是黑线停车) Y: k0 u& j/ ~
  68.   if((IO1_read()==1)&&(IO2_read()==1)&&(IO3_read()==1)&&(IO4_read()==1))- x$ J/ X1 u( d5 L; T9 w& \6 R
  69.   {
    1 `+ f( u( v: `
  70.     Moto_speed_set(0,0);
    1 _0 u- z) J% O% {
  71.     car_move(2);' S4 `& g( t& W& a+ l( e  O( ?+ R
  72.   }! _( u+ n; S' W& o! y
  73. }
复制代码

$ J$ `6 b3 ?2 t# o# w; g# tfind.h
1 a- A4 O/ [/ J$ U2 G7 R+ ?! d1 p- R7 _% `+ d; m: R, i% H5 `
  1. #ifndef _FIND_H_0 E* P: Y  }# a
  2. #define _FIND_H_. o+ c4 q+ v$ [# g) x) v
  3. 1 h* Z: N+ B, {+ E$ Q- h
  4. #include "main.h"
    6 C8 X8 L) K! m8 I) W: f1 M
  5. * S9 }! t' Z' v2 D
  6. #define u8 unsigned char
    3 o; D: Z2 k9 v1 q0 l/ c9 A
  7. #define u16 unsigned short+ n" a! V- |+ p; r% e; f! l1 X
  8. #define u32 unsigned int4 {$ d$ H+ r8 V% J

  9. , m2 v: i0 Y! \) M" l* q! L
  10. //红外循迹IO口定义
    ! K; y) p/ q- E# j
  11. //传感器从右到左  IO1 IO2 IO3 IO4
    1 G1 |% `+ y% x! i# b% P; R8 U- \
  12. #define IO1_read() HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4)
    - x% T& u4 M4 A8 P" ^) O
  13. #define IO2_read() HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)
    % F# {! U% u2 n& T4 D  K
  14. #define IO3_read() HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6)
    ; w/ p8 j( ~2 q4 \; s+ G5 }
  15. #define IO4_read() HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_7)
    - F! |5 ?: F0 J9 ?9 W. {5 N
  16. 9 N% o+ b/ g  w5 K, _
  17. ' A- g, _! A9 x9 W( V" J) `8 q
  18. void Find(void);3 B8 G0 ]8 y- S$ b/ o: J6 l  I4 ?, S
  19. void Moto_speed_set(int Left,int Right);
    3 t6 Z% [- a" X8 y

  20.   v0 q8 t1 R. n

  21. ' o% C3 E* z4 s" \
  22. #endif
复制代码

3 n- Q, j+ U+ ]; T) C  x* n总结4 m- O' }( G# L& C) F3 q1 K
循迹代码已经贴出希望大家可以好好理解一下循迹算法的编写。
4 M: N. ?4 Y/ l6 G$ I0 C, J: }5 p; l5 O% R) c
  B$ A0 c! P) u+ |2 T: d$ o; n
赞 收藏 评论0 发布时间:2022-5-20 17:35

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版