装上了电机驱动,小车就可以跑起来了,但是如果希望能够精确的控制小车移动的距离就需要加上测速模块,下图是我使用的测速模块:
测速模块四个引脚定义为 +5V GND OUT1 OUT2,其中OUT1 OUT2为电平输出,直接接入单片机IO口,每一路带一个LED指示其输出状态,模块的工作电压3.3V—5V。然后在小车轮子的轴上固定上码盘,当轮子转动时,码盘会随轮子一起转动。
通过对射式计数传感器模块可以检测出和轮子同轴固定的码盘转过的栅格数n,由于我使用的是6栅格的码盘,就可以算出轮子转动的圈数为N=n/6,然后根据轮子的直径R可以算出轮子的周长L,用圈数N乘以周长L就是小车前进的距离S=N*L,然后通过Arduino板的时钟计算出小车运动时间T,则小车的平均速度V=S/T。
由于我使用的是6栅格的码盘,小车车轮直径为6.5cm,我们就可以计算该码盘能检测到的最小精度为:3.14*6.5cm/6 = 3.4 cm 可以满足小车运动的普通精度控制。如果需要提高小车运动最小精度的控制,可以使用更多栅格的码盘。
将测速模块的OUT1连接到Arduino板IO口的13,下面用编程来测量速度。
int pin = 13; //测速模块的OUT1连接到pin 13
int i;
int j;
int n = 0; //码盘读数(即状态跳变次数),初始化为0
int flag = 0; //因为初始读数可能为0或1,该标志是用来读取初始状态的
int s;
int t;
int v;
void setup() {
Serial.begin(9600);
pinMode(pin, INPUT);
}
void loop() {
i = digitalRead(pin); //读取码盘状态(0或1)
if(!flag){ //获取初始状态读数存储在变量j中
j = i;
flag = 1;
}
if(i != j){ //每次状态发生跳变的时候,即和初始状态j不同时,码盘读数增加1
n += 1;
j = i;
}
s = 3.4*n; //小车运动的距离(cm)=码盘的最小精度3.4cm*码盘读数n
t = millis()/1000; //小车运动的时间(s)
v = s/t; //小车的速度(cm/s)
Serial.println(v);
}
这样就可以得到小车实时的平均速度了,但是这只是一个轮子的平均速度,如果得到两个轮子的速度,可以通过调节两个轮子的速度来达到改变行驶方向的目的。