风筝
发表于: 2018-9-15 20:57:53 | 显示全部楼层

测量车辆或电动机的速度/转速一直是一个值得尝试的迷人项目。在本篇文章中,我们将使用Arduino开发板制作一个模拟车速表。我们将使用红外传感器模块来测量速度。还有其他方法/传感器,如霍尔传感器测量速度,但使用红外传感器很容易,因为红外传感器模块是非常常见的设备,我们可以很容易地从市场上购买到,并且它也可以用于任何类型的车辆或电动机。


在本篇文章中,我们将以模拟和数字形式显示速度。通过本文,我们还将提高学习Arduino和步进电机的技能,因为本文涉及使用中断和定时器。在本文结束时,您将能够计算任何旋转物体所覆盖的速度和距离,并以数字格式显示在液晶屏LCD1602和模拟仪表。让我们开始学习Arduino开发板制作的车速表和里程表吧!


所需的材料

●     Arduino开发板

●     双极步进电机(4线)

●     步进电机驱动器(L298n模块)

●     红外传感器模块

●     LCD显示屏1602

●     2.2k电阻

●     连接导线

●     面包板

●     电源

Assembled-Analog-Speedometer-Using-Arduino-and-IR-Sensor.jpg


计算速度并在模拟车速表上显示

IR传感器是一种可以检测其前方物体存在的设备。我们使用了两个叶片转子(风扇)并将IR传感器放置在它附近,使得每次风扇旋转时,IR传感器都会检测到它。然后我们使用Arduino中的定时器和中断来计算电机一次完整旋转所需的时间。

IR-Sensor.jpg


在本篇文章中,我们使用了最高优先级的中断来检测rpm,我们已经将它配置为上升沿模式。因此,只要传感器输出从低电平变为高电平,就会执行RPMCount()函数。由于我们使用了两个叶片转子,这意味着该函数将在一次旋转中被调用4次。


一旦知道所花费的时间,我们就可以使用下面的公式来计算RPM,其中1000 /时间将给出RPS(每秒转数)并进一步乘以60将得到RPM(每分钟转数)

  1. rpm = (60/2)*(1000/(millis() - time))*REV/bladesInFan;
复制代码

获得RPM后,速度可以通过给定公式计算:

  1. Speed = rpm * (2 * Pi * radius) / 1000
复制代码

我们知道Pi = 3.14,半径是4.7英寸


但首先我们需要将半径从英寸转换为米:

  1. radius = ((radius * 2.54)/100.0) meters
  2. Speed= rpm * 60.0 * (2.0 * 3.14 * radius)/ 1000.0) in kilometers per hour
复制代码

在这里,我们将rpm乘以60将rpm转换为rph(每小时转数)并除以1000以将米/小时转换为公里/小时。


在以kmh为速度后,我们可以直接在LCD上以数字形式显示这些值,但为了以模拟形式显示速度,我们需要再做一次计算以找出步数,步进电机应移动以显示模拟仪表的速度。


这里我们使用了4线双极步进电机用于模拟仪表,它的1.8度代表着每转200步。

4-wire-bipolar-stepper-motor.jpg


现在我们必须在车速表上显示280 Kmh。因此要显示280 Kmh步进电机需要移动280度

所以我们有maxSpeed = 280

而maxSteps将是

  1. maxSteps = 280/1.8 = 155 steps
复制代码

现在我们在Arduino代码中有一个函数,即map函数,用于将速度映射到步数。

  1. Steps = map(speed,0,maxSpeed,0,maxSteps);
复制代码

引入相关参数,于是公式变为:

  1. steps=map(speed,0,280,0,155);
复制代码

在计算步数后,我们可以直接在步进电机函数中应用这些步骤来移动步进电机。我们还需要通过使用给定的计算来处理步进电机的当前步数或角度。

  1. currSteps=Steps
  2. steps= currSteps-preSteps
  3. preSteps=currSteps  ​
复制代码

这里currSteps是来自上次计算的当前步骤,preSteps是最后执行的步数。


电路图和连接方式

这款模拟速度表的电路图很简单,这里我们使用LCD液晶屏1602显示数字形式的速度,步进电机用于旋转模拟速度表。


LCD1602连接在Arduino的以下模拟引脚上。

RS - A5

RW - GND

EN - A4

D4 - A3

D5 - A2

D6 - A1

D7 - A0

Circuit-Diagram-for-Analog-Speedometer-Using-Arduino-and-IR-Sensor.png


2.2k电阻用于设置LCD的亮度。红外传感器模块用于检测风扇的叶片以计算转速,它连接到中断0,也就是Arduino的D2引脚。


这里我们使用了步进电机驱动器即L293N模块。步进电机驱动器的IN1、IN2、IN3和IN4引脚直接连接到Arduino的D8、D9、D10和D11。其余的连接在Circuit Diagram中给出。

Circuit-Hardware-for-Analog-Speedometer-Using-Arduino-and-IR-Sensor.jpg


编程说明

在文章末尾处给出了Arduino车速表的完整代码,这里我们解释一些重要部分。


在编程部分,我们已经包含了所有必需的库,如步进电机库、LiquidCrystal LCD库,并且声明了它们使用的引脚。

  1. #include<LiquidCrystal.h>
  2. LiquidCrystal lcd(A5,A4,A3,A2,A1,A0);
  3. #include <Stepper.h>
  4. const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution
  5. Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
复制代码

在此之后,我们定义了一些变量和宏来执行计算。

  1. volatile byte REV;
  2. unsigned long int rpm,RPM;
  3. unsigned long st=0;
  4. unsigned long time;
  5. int ledPin = 13;
  6. int led = 0,RPMlen , prevRPM;
  7. int flag = 0;   

  8. int flag1=1;
  9. #define bladesInFan 2
  10. float radius=4.7;   // inch
  11. int preSteps=0;
  12. float stepAngle= 360.0/(float)stepsPerRevolution;
  13. float minSpeed=0;
  14. float maxSpeed=280.0;
  15. float minSteps=0;
  16. float maxSteps=maxSpeed/stepAngle;
复制代码

在此之后,我们在setup函数中初始化LCD、串口、中断和步进电机

  1. void setup()
  2. {
  3.   myStepper.setSpeed(60);
  4.   Serial.begin(9600);
  5.   pinMode(ledPin, OUTPUT);
  6.   lcd.begin(16,2);
  7.   lcd.print("Speedometer");
  8.   delay(2000);
  9.   attachInterrupt(0, RPMCount, RISING);
  10. }
复制代码

在此之后,我们在loop函数中读取rpm,执行计算以获得速度,并将其转换为步数以运行步进电机以模拟形式显示速度。

  1. void loop()
  2. {
  3.     readRPM();
  4.     radius=((radius * 2.54)/100.0);  // convering in meter
  5.     int Speed= ((float)RPM * 60.0 * (2.0 * 3.14 * radius)/1000.0);
  6.     // RPM in 60 minute, diameter of tyre (2pi r) r is radius, 1000 to convert in km
  7.     int Steps=map(Speed, minSpeed,maxSpeed,minSteps,maxSteps);
  8.   
  9.    if(flag1)
  10.    {
  11.     Serial.print(Speed);
  12.     Serial.println("Kmh");
  13.      lcd.setCursor(0,0);
  14.      lcd.print("RPM: ");
  15.      lcd.print(RPM);
  16.      lcd.print("           ");
  17.      lcd.setCursor(0,1);
  18.      lcd.print("Speed: ");
  19.      lcd.print(Speed);
  20.      lcd.print(" Km/h       ");
  21.     flag1=0;
  22.    }
  23.     int currSteps=Steps;
  24.     int steps= currSteps-preSteps;
  25.     preSteps=currSteps;
  26.     myStepper.step(steps);
  27. }
复制代码

下面的reapRPM()函数计算RPM。

  1. int readRPM()
  2. {
  3.   if(REV >= 10 or millis()>=st+1000)                  //  IT WILL UPDATE AFETR EVERY 10 READINGS or 1 second in idle
  4.   {         
  5.      if(flag==0)               
  6.        flag=1;                     
  7.      rpm = (60/2)*(1000/(millis() - time))*REV/bladesInFan;
  8.      time = millis();                           
  9.      REV = 0;
  10.      int x= rpm;               
  11.      while(x!=0)
  12.      {
  13.        x = x/10;
  14.        RPMlen++;
  15.      }      
  16.      Serial.println(rpm,DEC);
  17.      RPM=rpm;
  18.      delay(500);
  19.      st=millis();
  20.      flag1=1;
  21.    }
  22. }
复制代码

最后,是中断函数,负责测量对象的旋转。

  1. void RPMCount()                       
  2. {
  3.    REV++;                             
  4.   
  5.    if (led == LOW)
  6.    {
  7.      led = HIGH;                        
  8.    }
  9.   
  10.    else
  11.    {
  12.      led = LOW;
  13.    }
  14.    digitalWrite(ledPin, led);
  15. }
复制代码

这就是如何使用Arduino开发板简单地制作建模拟车速表。 这也可以使用霍尔传感器制作,速度可以显示在智能手机上。如果您在制作过程遇到任何问题,请在本帖下面回复,我会及时进行回复。


代码

本文使用的完整代码如下所示: main.txt (2.35 KB, 下载次数: 69)

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-19 14:29 , Processed in 0.210684 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表