2020-11-28

              循迹小车的初步认识过程

本周进行循迹小车的认识学习,大致思路为通过先借鉴他人记录经验,逐步熟练后再涉及自己的程序,本周为借鉴他人经验环节。从手头资料了解红外探测传感器原理大致如下:由于黑色吸光,当红外发射管照射在黑色物体上时反射回来的光就较少,接收管接收到的红外光就较少,表现为电阻大,经施密特触发器整形后输出高电平;
同理,当照射在白色表面时发射的红外线就比较多,表现为接收管的电阻较小,经施密特触发器整形后输出低电平。
小车简单循迹时,一般装两个红外对管模块,且两个发射管要在黑线中间,而对两个对管模块的安装和黑线的宽度要合适。对管输出端为高电平则表示对管在黑线上,输出端为低电平则表示对管在黑线外。

从之前看帖获取程序,在此引用设计如下

1 //控制板引脚定义
2 int motor_L_ENA = 6; //左电机控制端连接于Arduino板的6,10,9引脚
3 int motor_L_IN1 = 10;
4 int motor_L_IN2 = 9;
5 int motor_R_ENB = 5; //右电机控制端连接于Arduino板的5,8,7引脚
6 int motor_R_IN3 = 8;
7 int motor_R_IN4 = 7;
8
9 int infrared_LL = A0; //左左侧红外传感器连接于Arduino板的A0引脚
10 int infrared_L = A1; //左侧红外传感器连接于Arduino板的A1引脚
11 int infrared_R = A2; //右侧红外传感器连接于Arduino板的A2引脚
12 int infrared_RR = A3; //右右侧红外传感器连接于Arduino板的A3引脚
13
14 int sensor_LL = 0; //左左侧红外传感器的检测值,默认值为1,在黑线外
15 int sensor_L = 1; //左侧红外传感器的检测值,默认值为1,在黑线上
16 int sensor_R = 1; //右侧红外传感器的检测值,默认值为1,在黑线上
17 int sensor_RR = 0; //右右侧红外传感器的检测值,默认值为0,在黑线外
18 int low_speed = 100; //左转右转时的高速低速设定,可调整
19 int high_speed = 200;
20
21 //子函数定义
22 void go_forward_high_speed() //小车前进
23 {
24 analogWrite(motor_L_ENA, high_speed); //左电机正转
25 digitalWrite(motor_L_IN1, 0);
26 digitalWrite(motor_L_IN2, 1);
27
28 analogWrite(motor_R_ENB,high_speed); //右电机正转
29 digitalWrite(motor_R_IN3, 0);
30 digitalWrite(motor_R_IN4, 1);
31 }
32
33 void stop_with_brake() //小车制动
34 {
35 digitalWrite(motor_L_ENA, 1); //左电机制动
36 digitalWrite(motor_L_IN1, 1);
37 digitalWrite(motor_L_IN2, 1) ;
38
39 digitalWrite(motor_R_ENB, 1); //右电机制动
40 digitalWrite(motor_R_IN3, 1);
41 digitalWrite(motor_R_IN4, 1) ;
42 }
43
44 void go_forward_left() //小车左转
45 {
46 digitalWrite(motor_L_IN1, 0);
47 digitalWrite(motor_L_IN2, 1);
48 analogWrite(motor_L_ENA, low_speed); //左轮低速
49
50 digitalWrite(motor_R_IN3, 0);
51 digitalWrite(motor_R_IN4, 1);
52 analogWrite(motor_R_ENB, high_speed); //右轮高速
53 }
54
55 void go_forward_right() //小车右转
56 {
57 digitalWrite(motor_L_IN1, 0);
58 digitalWrite(motor_L_IN2, 1);
59 analogWrite(motor_L_ENA, high_speed); //左轮高速
60
61 digitalWrite(motor_R_IN3, 0);
62 digitalWrite(motor_R_IN4, 1);
63 analogWrite(motor_R_ENB, low_speed); //右轮低速
64 }
65
66
67 void setup()
68 {
69 pinMode(motor_L_ENA, OUTPUT); //左电机使能和PWM调速口
70 pinMode(motor_L_IN1, OUTPUT); //左电机控制口1
71 pinMode(motor_L_IN2, OUTPUT); //左电机控制口2
72
73 pinMode(motor_R_ENB, OUTPUT); //右电机使能和PWM调速口
74 pinMode(motor_R_IN3, OUTPUT); //右电机控制口3
75 pinMode(motor_R_IN4, OUTPUT); //左电机控制口4
76
77 pinMode(infrared_L, INPUT); //左侧红外传感器
78 pinMode(infrared_LL, INPUT); //左左侧红外传感器
79
80 pinMode(infrared_R, INPUT); //右侧红外传感器
81 pinMode(infrared_RR, INPUT); //右右侧红外传感器
82 }
83
84 void loop()
85 {
86 sensor_LL=digitalRead(infrared_LL);
87 sensor_L=digitalRead(infrared_L);
88 sensor_R=digitalRead(infrared_R);
89 sensor_RR=digitalRead(infrared_RR);
90
91 if(sensor_LL0 & sensor_L1 & sensor_R1 & sensor_RR0) //小车在黑线上
92 {
93 go_forward_high_speed(); //前进
94 }
95
96 if(sensor_L1 & sensor_R0) //小车右偏
97 {
98 go_forward_left(); //小车左转100毫秒,时间可调整
99 delay(100);
100 }
101
102 if(sensor_L0 & sensor_R1) //小车左偏
103 {
104 go_forward_right(); //小车右转100毫秒,时间可调整
105 delay(100);
106 }
107
108 if(sensor_LL1 & sensor_L1 & sensor_R1 & sensor_RR1) //小车在停止线上
109 {
110 stop_with_brake(); //制动2秒
111 delay(2000);
112 }
113 }
对于程序的导入还在学习中,一些程序与组件还未购买,会在零件买回后进行初步学习,希望得到预期效果。
本次内容了解与学习对我对单片机的运用与实现有了更深刻的了解,希望在不断的学习中逐步会对单片机有了自己独立的思考,从而由学习别人转为自己创造。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值