| 使用H206传感器测量速度背后的逻辑 从传感器安装设置中,您应该知道H206传感器仅测量栅板中存在的间隙。安装时应确保车轮(其速度应测量)和挡板以相同的速度旋转。就像在这里一样,由于我们将车轮和车轮安装在同一根轴上,它们都会以相同的速度旋转。 
 在我们的设置中,我们为每个车轮安装了两个传感器,以测量机器人的角度。但如果您的目标是仅测量速度和距离,我们可以将传感器安装在任何一个车轮上。传感器的输出(触发信号)最常连接到微控制器的外部中断引脚。每次检测到栅板中的间隙时,将触发中断,并执行ISR(中断服务程序)中的代码。如果我们能够计算两个这样的触发器之间的时间间隔,我们就可以计算出车轮的速度。 
 在Arduino中,我们可以使用millis()函数轻松计算此时间间隔。从器件上电开始,这个毫秒功能将每毫秒递增1。因此,当第一个中断发生时,我们可以将millis()的值保存在虚拟变量中(如此代码中的pevtime),然后当第二个中断发生时,我们可以计算从millis()中减去pevtime值所需的时间 。 复制代码Time taken = current time – previous time
timetaken = millis()-pevtime; //timetaken in millisec
一旦我们计算了所用的时间,我们就可以使用下面的公式简单地计算rpm的值,其中(1000 / timetaken)给出RPS(每秒转数)并将其乘以60以将RPS转换为RPM(每分钟转数) 。 在计算转速后,我们可以使用下面的公式计算车辆的速度,前提是我们知道车轮的半径。 复制代码Velocity = 2π × RPS × radius of wheel.
v = radius_of_wheel * rpm * 0.104
注意,上面的公式用于计算以m / s为单位的速度,如果要以km / hr计算,则用0.376替换0.0104。如果您想知道如何获得值0.104,那么尝试简化公式V =2π×RPS×车轮半径。 
 即使使用霍尔传感器来测量旋转物体的速度,也使用相同的技术。但是对于H206传感器有一个缺陷,栅格板有20个插槽,因此用于测量两个插槽间隙之间的时间会使微控制器过载。因此,我们仅在车轮完全旋转时测量速度。由于每个间隙将产生两个中断(一个在开始处,另一个在间隙结束处),我们将获得总共40个中断,以便车轮完成一次完整的旋转。所以我们在实际计算车轮速度之前等待40次中断。代码如下所示 复制代码if(rotation>=40)
  {
    timetaken = millis()-pevtime; //timetaken in millisec
    rpm=(1000/timetaken)*60;    //formulae to calculate rpm
    pevtime = millis();
    rotation=0;
  }
 该方法的另一个缺点是,速度值不会降至零,因为中断将始终等待车轮完成一次旋转以计算rpm值。通过添加一个监视两个中断之间的时间间隔的简单代码可以很容易地克服这个缺点,如果它超过正常值,那么我们可以强制rpm和velocity的值为零。链接在下面的代码中我们使用变量dtime来检查时间差,如果它超过500毫秒,则速度和rpm的值被强制为零。 复制代码/*To drop to zero if vehicle stopped*/
 if(millis()-dtime>500) //no inetrrupt found for 500ms
 {
  rpm= v = 0; // make rpm and velocity as zero
  dtime=millis();
 }
 测量车轮行驶距离背后的逻辑 我们已经知道,当车轮完成一次完整旋转时,Arduino将感应到40次中断。因此,对于由车轮进行的每一次旋转,显然车轮行进的距离等于车轮的周长。由于我们已经知道了车轮的半径,因此我们可以使用以下公式轻松计算出所覆盖的距离 复制代码Distance = 2πr * number of rotations
distance = (2*3.141*radius_of_wheel) * (left_intr/40)
在使用公式2πr计算车轮周长的情况下,然后乘以车轮的转数。 
 测量机器人角度背后的逻辑 有很多方法可以确定机器人的角度。加速度计和陀螺仪通常用于确定这些值。但另一种廉价的方法是在两个车轮上使用H206传感器。通过这种方式,我们可以知道每个车轮的转弯次数。下图说明了如何计算角度。 
  
 初始化机器人时,它所面对的角度被视为0°。从那里它旋转左边初始化机器人时,它所面对的角度被视为0°。从那里它旋转左边,角度增加负,如果它向右旋转,角度增加正。为了理解,让我们考虑-90到+90的范围,如图所示。在这种布置中,由于两个轮子具有相同的直径,如果任何一个轮子完全旋转,我们将以90°的角度转动。 
 例如,如果左轮完成一次旋转(80次中断),那么机器人将向左转90°,同样如果右轮完成一次旋转(80次中断),机器人将向右转90°。现在我们知道如果Arduino在一个车轮上检测到80个中断,那么机器人已经转了90°并且根据我们可以判断机器人是通过正(右)还是负(左)来转动。因此可以使用以下公式计算左右角度 复制代码int angle_left = (left_intr % 360) * (90/80) ;
int angle_right = (right_intr % 360) * (90/80) ;
 其中90是中断80时所覆盖的角度。结果值乘以中断数。我们还使用了360的模数,使得结果值不超过36。一旦我们计算了左角和右角,可以通过从直角减去左角来简单地获得机器人面对的有效角度。 复制代码angle = angle_right - angle_left;
 |