- LM393速度传感器模块(H206)
- H206传感器的安装安排
- DIY Arduino LM393速度传感器机器人电路图
- LM393速度传感器模块进行速度测量的逻辑
- 测量车轮行驶距离的逻辑
- 测量机器人角度的逻辑
- Arduino机器人代码
- 测试Arduino机器人以测量距离,速度和角度
机器人已开始慢慢进入我们的社会,使我们的生活更简单。我们已经在英国的道路上找到了星际飞船上的六个轮式送餐机器人,它们在平民之间巧妙地导航以到达目的地。导航到环境中的每个移动机器人都应始终了解其相对于现实世界的位置和方向。通过使用不同的技术(例如GPS,RF三角测量,加速度计,陀螺仪等),可以通过多种方法来实现这一目标。每种技术都有其自身的优势,并且自身是独一无二的。在本Arduino LM393速度传感器教程中,我们将使用简单易用的LM393速度传感器模块使用Arduino测量一些重要参数,例如速度,行进距离和机器人角度。有了这些参数,机器人将能够知道其现实状态并可以使用它进行安全导航。
Arduino是构建机器人的爱好者中最受欢迎的选择,从简单的线路跟随器到更复杂的自平衡或地板清洁机器人。您可以在“机器人技术”部分中检查所有类型的机器人。
我们将建造一个由锂电池供电的小型机器人,并使用操纵杆驱动它。在运行期间,我们可以测量机器人的速度,距离和角度,并将其实时显示在与Arduino连接的LCD显示屏上。该项目仅能帮助您测量这些参数,完成此操作后,您就可以根据需要使用这些参数来自动操作机器人。听起来很有趣吧?因此,让我们开始吧。
LM393速度传感器模块(H206)
在进入该项目的电路图和代码之前,让我们了解LM393速度传感器模块,因为它在项目中起着至关重要的作用。该H206速度传感器模块包括一个红外光传感器与一个LM393电压比较IC故名LM393速度传感器集成在一起。该模块还包括一个栅板,必须将其安装到电动机的旋转轴上。下图标记了所有组件。
所述红外线传感器包括一个IR LED和由小GAB分离的光电晶体管的。整个传感器装置如上所示放置在黑色外壳中。栅格板由狭缝组成,该板以这样的方式设置在红外传感器的间隙之间:传感器可以感应栅格板中的间隙。栅板中的每个缝隙穿过缝隙时都会触发红外传感器。然后使用比较器将这些触发器转换为电压信号。比较器不过是安森美半导体的LM393 IC。该模块具有三个引脚,其中两个用于为模块供电,一个输出引脚用于计算触发次数。
H206传感器的安装安排
安装这些类型的传感器有些棘手。它只能安装在轴的两侧都突出的电动机上。轴的一侧连接到车轮,而另一侧用于安装格栅板,如上所示。
由于车轮和板连接到同一轴,两者均以相同的速度旋转,因此通过测量板的速度,我们可以测量车轮的速度。确保栅格板上的缝隙穿过红外传感器,只有这样,传感器才能够计算已穿过的缝隙的数量。您还可以提出自己的机械布置来安装传感器,只要它满足指定条件即可。红外传感器通常用于许多机器人项目中,以引导机器人注意障碍物。
上面显示的栅格板有20个插槽(栅格)。这意味着传感器将为车轮一整圈找到20个间隙。通过计算传感器检测到的间隙数量,我们可以计算出车轮行进的距离,类似地,通过测量传感器发现间隙的速度,我们可以检测出车轮的速度。在我们的机器人中,我们将这个传感器安装在两个车轮上,因此我们也可以找到机器人的角度。但是,可以使用加速度计或陀螺仪更灵敏地计算旋转角度,在此处学习将加速度计和陀螺仪与Arduino接口,并尝试使用它们来测量旋转角度。
DIY Arduino LM393速度传感器机器人电路图
该速度和距离感应机器人的完整电路图如下所示。 Bot的大脑由Arduino Nano组成,车轮的两个直流电动机由L298N H桥电动机驱动器模块驱动。操纵杆用于控制机器人的速度和方向,两个速度传感器H206用于测量机器人的速度,距离和角度。然后,测量值将显示在16x2 LCD模块中。连接到LCD的电位器可用于调整LCD的对比度,而电阻器可用于限制流向LCD背光的电流。
的完整的电路由7.4V锂电池为动力的。此7.4V提供给电机驱动器模块的12V引脚。然后,电机驱动器模块上的稳压器将7.4V转换为稳定的+ 5V,用于为Arduino,LCD,传感器和操纵杆供电。
电机由Arduino的数字引脚8,9,10和11控制。由于还必须控制电动机的速度,因此我们应将PWM信号提供给电动机的正极。因此,我们有引脚9和10都是PWM引脚。分别使用模拟引脚A2和A3读取操纵杆的X和Y值。
众所周知,当检测到格栅板中的间隙时,H206传感器会产生触发信号。由于不应该总是准确地读取这些触发器来计算正确的速度和距离,因此两个触发器(输出)引脚都连接到Arduino板的外部中断引脚2和3。按照说明将整个电路组装在机箱上并安装速度传感器,连接完成后,我的机器人看起来如下图所示。您也可以在本页结尾观看视频,以了解传感器的安装方式。
现在,硬件部分已经完成,让我们进入如何测量机器人的速度,距离和单个性的逻辑,然后继续进行编程部分。
LM393速度传感器模块进行速度测量的逻辑
从传感器安装设置中,您应该知道LM393速度传感器模块(H206)仅能测量栅板上的间隙。在安装时,应确保轮子(应测量其速度)和格栅板以相同的速度旋转。像这里一样,由于我们将轮子和板都安装在同一根轴上,因此它们显然将以相同的速度旋转。
在我们的设置中,我们为每个车轮安装了两个传感器以测量机器人的角度。但是,如果您的目的只是测量速度和距离,我们可以将传感器安装在任何一个车轮上。传感器的输出(触发信号)通常会连接到微控制器的外部中断引脚。每次检测到格栅板上的间隙时,都会触发一个中断,并执行ISR(中断服务程序)中的代码。如果我们能够计算两个触发之间的时间间隔,我们就可以计算出车轮的速度。
在Arduino中,我们可以使用 millis() 函数轻松地计算该时间间隔。自打开设备电源后,此毫秒功能将保持每毫秒增加1的速度。因此,当第一次中断发生时,我们可以将millis()的值保存在一个虚拟变量中(例如此代码中的 pevtime ),然后当第二次中断发生时,我们可以通过从millis()中减去 pevtime 值来计算所需的时间。
所用时间=当前时间-前一时间 timetaken =米利斯() - pevtime ; // timetaken在毫秒
一旦计算出所花费的时间,我们可以使用以下公式简单地计算rpm的值,其中(1000 / timetaken)给出RPS(每秒转数),然后乘以60将RPS转换为RPM(每分钟转数) 。
rpm =(1000 /耗时)* 60;
在计算了转速之后,我们可以使用以下公式来计算车辆的速度,前提是我们知道了车轮的半径。
速度=2π×RPS×车轮半径。 v =车轮半径* rpm * 0.104
注意,以上公式用于计算速度,单位为m / s,如果要以km / hr为单位,则将0.0104替换为0.376。如果您想知道如何获得值0.104,请尝试简化公式V =2π×RPS×车轮半径。
即使使用霍尔传感器测量旋转物体的速度,也使用相同的技术。但是对于H206传感器来说有一个陷阱,栅板有20个插槽,因此,测量两个插槽间隙之间的时间会使微控制器过载。因此,我们仅在车轮完全旋转时测量速度。由于将为每个间隙产生两个中断(一个间隙开始,另一个间隙结束),我们将总共获得40个中断,以便车轮完成一个完整的旋转。因此,在实际计算车轮速度之前,我们需要等待40次中断。相同的代码如下所示
if(rotation> = 40) { 耗时= millis()-pevtime; //以毫秒为单位的时间 rpm =(1000 / timetaken)* 60; //计算转速的公式 pevtime = millis(); 旋转= 0; }
这种方法的另一个缺点是,速度值不会降为零,因为中断将始终等待车轮完成一个旋转以计算rpm值。通过添加一个简单的代码来监视两个中断之间的时间间隔,可以轻松克服此缺点,如果该时间间隔超出正常范围,则可以将rpm和speed的值强制为零。在下面的代码中,我们使用变量 dtime 来检查时间差,如果时间差超过500毫秒,则将速度和rpm的值强制设为零。
/ *如果车辆停车则降至零* / if(millis()-dtime> 500)//在500毫秒内未发现无扰动 { rpm = v = 0; //将rpm和 speed 设为零dtime = millis(); }
测量车轮行驶距离的逻辑
我们已经知道,当轮子旋转一整圈时,Arduino将感应到40个中断。因此,车轮每旋转一圈,很明显,车轮行进的距离等于车轮的周长。由于我们已经知道了车轮的半径,因此可以使用以下公式轻松计算出所覆盖的距离
距离=2πr*转数 距离=(2 * 3.141 *车轮半径)*(left_intr / 40)
使用公式2πr计算车轮的周长,然后将其乘以车轮的转数。
测量机器人角度的逻辑
有很多方法可以确定机器人的天使。加速度计和陀螺仪通常用于确定这些值。但是另一种便宜的方法是在两个车轮上都使用H206传感器。这样,我们将知道每个车轮转了多少圈。下图说明了如何计算角度。
初始化机器人时,其面对的角度视为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;
Arduino机器人代码
此速度和角度测量机器人的完整Arduino代码可在此页末找到。该程序的目的是使用上述逻辑来计算机器人的速度,距离和角度,并将其显示在LCD屏幕上。除此之外,它还应该提供使用操纵杆控制机器人的选项。
我们通过为两个电机定义数字I / O引脚来启动程序。请注意,我们还必须控制电动机的速度,因此我们必须使用Arduino上的PWM引脚来控制电动机。在这里,我们使用了引脚8,9,10和11。
#define LM_pos 9 //左马达 #define LM_neg 8 //左马达 #define RM_pos 10 //右马达 #define RM_neg 11 //右马达 #define joyX A2 #define joyY A3
要测量覆盖的速度和距离,我们需要知道车轮的半径,测量值并以米为单位输入,如下所示。对于我的机器人,半径为0.033米,但根据您的机器人,半径可能会有所不同。
浮动radius_of_wheel = 0.033; //测量车轮的半径,并在此处以厘米为单位输入
在 设置 功能中,我们将所有值初始化为零,然后在LCD上显示Intro Text。我们还初始化了串行监视器以进行调试。然后我们提到速度传感器H206作为外部中断连接到引脚2和3。那就是检测到中断的地方,ISR函数 Left_ISR 和 Right_ISR 将相应执行。
void setup() { 旋转= rpm = pevtime = 0; //将所有变量初始化为零 Serial.begin(9600); lcd.begin(16,2); //初始化16 * 2 LCD lcd.print(“ Bot Monitor”); //简介消息行1 lcd.setCursor(0,1); lcd.print(“-CircuitDigest”); // Intro Message line 2 delay(2000); lcd.clear(); lcd.print(“ Lt:Rt:”); lcd.setCursor(0,1); lcd.print(“ S:D:A:”); pinMode(LM_pos,输出); pinMode(LM_neg,OUTPUT); pinMode(RM_pos,OUTPUT); pinMode(RM_neg,输出); digitalWrite(LM_neg,LOW); digitalWrite(RM_neg,LOW); attachInterrupt(digitalPinToInterrupt(2),Left_ISR,CHANGE); ///当触发 左轮 传感器时调用Left_ISR attachInterrupt(digitalPinToInterrupt(3),Right_ISR,CHANGE); //当触发右轮传感器时调用Right_ISR }
在Left_ISR例程中,我们简单地增加了一个名为left_intr的变量,该变量稍后将用于测量机器人的角度。在Right_ISR内部,我们做同样的事情,但是除此之外,我们还在这里计算速度。对于每个中断,变量旋转都会增加,然后使用上述逻辑来计算速度。
void Left_ISR() { left_intr ++; delay(10); } void Right_ISR() { right_intr ++; 延迟(10); 旋转++; dtime = millis(); if(rotation> = 40) { 耗时= millis()-pevtime; //以毫秒为单位的时间 rpm =(1000 / timetaken)* 60; //计算转速的公式 pevtime = millis(); 旋转= 0; } }
在主要的无限循环函数内部,我们从操纵杆监视X和Y的值。根据值(如果操纵杆移动),我们将相应地控制机器人。机器人的速度取决于操纵杆的推动距离。
int xValue = AnalogRead (joyX ); int yValue = AnalogRead (joyY ); int加速度=映射(xValue,500,0,0,200); 如果(xValue <500) { AnalogWrite(LM_pos,加速度); AnalogWrite(RM_pos,加速度); } else { AnalogWrite(LM_pos,0); AnalogWrite(RM_pos,0); } 如果(yValue> 550) AnalogWrite(RM_pos,80); 如果(yValue <500) AnalogWrite(LM_pos,100);
这将帮助用户移动机器人并检查所获得的值是否符合预期。最后,我们可以使用上述逻辑来计算机器人的速度,距离和角度,并使用以下代码将其显示在LCD上。
v =车轮半径* rpm * 0.104; //0.033是车轮的半径,以米为单位 =(2 * 3.141 * radius_of_wheel)*(left_intr / 40); int angle_left =(left_intr%360)*(90/80); int angle_right =(right_intr%360)*(90/80); angle = angle_right-angle_left; lcd.setCursor(3,0); lcd.print(“”); lcd.setCursor(3,0); lcd.print(left_intr); lcd.setCursor(11,0); lcd.print(“”); lcd.setCursor(11,0); lcd.print(right_intr); lcd.setCursor(2,1); lcd.print(“”); lcd.setCursor(2,1); lcd.print(v); lcd.setCursor(9,1); lcd.print(“”); lcd.setCursor(9,1); lcd.print(distance); lcd.setCursor(13,1); lcd.print(“”); lcd.setCursor(13,1); lcd.print(angle);
测试Arduino机器人以测量距离,速度和角度
硬件准备就绪后,将代码上传到Arduino,然后使用操纵杆移动机器人。机器人的速度,机器人所覆盖的距离以及角度将在LCD上显示,如下所示。
在LCD上,术语Lt和Rt分别表示左中断计数和右中断计数。您会发现这些值对于传感器检测到的每个间隙都会递增。项目S表示机器人的速度,单位为m / sec,术语D表示以米为单位的距离。机器人的角度显示在末尾,其中0°表示直线,反方向旋转时为负,顺时针旋转为正。
您也可以在本页结尾观看视频,以了解机器人的工作方式。希望您理解该项目并喜欢构建它。如果您有任何疑问,请将其留在评论部分,我会尽力答复。您也可以使用论坛来获得快速的技术帮助。