|
测量车辆或电动机的速度/转速一直是一个值得尝试的迷人项目。在本篇文章中,我们将使用Arduino开发板制作一个模拟车速表。我们将使用红外传感器模块来测量速度。还有其他方法/传感器,如霍尔传感器测量速度,但使用红外传感器很容易,因为红外传感器模块是非常常见的设备,我们可以很容易地从市场上购买到,并且它也可以用于任何类型的车辆或电动机。
在本篇文章中,我们将以模拟和数字形式显示速度。通过本文,我们还将提高学习Arduino和步进电机的技能,因为本文涉及使用中断和定时器。在本文结束时,您将能够计算任何旋转物体所覆盖的速度和距离,并以数字格式显示在液晶屏LCD1602和模拟仪表。让我们开始学习Arduino开发板制作的车速表和里程表吧!
所需的材料 ● Arduino开发板 ● 双极步进电机(4线) ● 步进电机驱动器(L298n模块) ● 红外传感器模块 ● LCD显示屏1602 ● 2.2k电阻 ● 连接导线 ● 面包板 ● 电源
计算速度并在模拟车速表上显示 IR传感器是一种可以检测其前方物体存在的设备。我们使用了两个叶片转子(风扇)并将IR传感器放置在它附近,使得每次风扇旋转时,IR传感器都会检测到它。然后我们使用Arduino中的定时器和中断来计算电机一次完整旋转所需的时间。
在本篇文章中,我们使用了最高优先级的中断来检测rpm,我们已经将它配置为上升沿模式。因此,只要传感器输出从低电平变为高电平,就会执行RPMCount()函数。由于我们使用了两个叶片转子,这意味着该函数将在一次旋转中被调用4次。
一旦知道所花费的时间,我们就可以使用下面的公式来计算RPM,其中1000 /时间将给出RPS(每秒转数)并进一步乘以60将得到RPM(每分钟转数) - rpm = (60/2)*(1000/(millis() - time))*REV/bladesInFan;
复制代码获得RPM后,速度可以通过给定公式计算: - Speed = rpm * (2 * Pi * radius) / 1000
复制代码我们知道Pi = 3.14,半径是4.7英寸
但首先我们需要将半径从英寸转换为米: - radius = ((radius * 2.54)/100.0) meters
- 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步。
现在我们必须在车速表上显示280 Kmh。因此要显示280 Kmh步进电机需要移动280度 所以我们有maxSpeed = 280 而maxSteps将是 - maxSteps = 280/1.8 = 155 steps
复制代码
现在我们在Arduino代码中有一个函数,即map函数,用于将速度映射到步数。 - Steps = map(speed,0,maxSpeed,0,maxSteps);
复制代码引入相关参数,于是公式变为:
- steps=map(speed,0,280,0,155);
复制代码
在计算步数后,我们可以直接在步进电机函数中应用这些步骤来移动步进电机。我们还需要通过使用给定的计算来处理步进电机的当前步数或角度。 - currSteps=Steps
- steps= currSteps-preSteps
- preSteps=currSteps
复制代码
这里currSteps是来自上次计算的当前步骤,preSteps是最后执行的步数。
电路图和连接方式 这款模拟速度表的电路图很简单,这里我们使用LCD液晶屏1602显示数字形式的速度,步进电机用于旋转模拟速度表。
LCD1602连接在Arduino的以下模拟引脚上。 RS - A5 RW - GND EN - A4 D4 - A3 D5 - A2 D6 - A1 D7 - A0
2.2k电阻用于设置LCD的亮度。红外传感器模块用于检测风扇的叶片以计算转速,它连接到中断0,也就是Arduino的D2引脚。
这里我们使用了步进电机驱动器即L293N模块。步进电机驱动器的IN1、IN2、IN3和IN4引脚直接连接到Arduino的D8、D9、D10和D11。其余的连接在Circuit Diagram中给出。
编程说明 在文章末尾处给出了Arduino车速表的完整代码,这里我们解释一些重要部分。
在编程部分,我们已经包含了所有必需的库,如步进电机库、LiquidCrystal LCD库,并且声明了它们使用的引脚。 - #include<LiquidCrystal.h>
- LiquidCrystal lcd(A5,A4,A3,A2,A1,A0);
- #include <Stepper.h>
- const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution
- Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
复制代码在此之后,我们定义了一些变量和宏来执行计算。
- volatile byte REV;
- unsigned long int rpm,RPM;
- unsigned long st=0;
- unsigned long time;
- int ledPin = 13;
- int led = 0,RPMlen , prevRPM;
- int flag = 0;
- int flag1=1;
- #define bladesInFan 2
- float radius=4.7; // inch
- int preSteps=0;
- float stepAngle= 360.0/(float)stepsPerRevolution;
- float minSpeed=0;
- float maxSpeed=280.0;
- float minSteps=0;
- float maxSteps=maxSpeed/stepAngle;
复制代码
在此之后,我们在setup函数中初始化LCD、串口、中断和步进电机 - void setup()
- {
- myStepper.setSpeed(60);
- Serial.begin(9600);
- pinMode(ledPin, OUTPUT);
- lcd.begin(16,2);
- lcd.print("Speedometer");
- delay(2000);
- attachInterrupt(0, RPMCount, RISING);
- }
复制代码
在此之后,我们在loop函数中读取rpm,执行计算以获得速度,并将其转换为步数以运行步进电机以模拟形式显示速度。 - void loop()
- {
- readRPM();
- radius=((radius * 2.54)/100.0); // convering in meter
- int Speed= ((float)RPM * 60.0 * (2.0 * 3.14 * radius)/1000.0);
- // RPM in 60 minute, diameter of tyre (2pi r) r is radius, 1000 to convert in km
- int Steps=map(Speed, minSpeed,maxSpeed,minSteps,maxSteps);
-
- if(flag1)
- {
- Serial.print(Speed);
- Serial.println("Kmh");
- lcd.setCursor(0,0);
- lcd.print("RPM: ");
- lcd.print(RPM);
- lcd.print(" ");
- lcd.setCursor(0,1);
- lcd.print("Speed: ");
- lcd.print(Speed);
- lcd.print(" Km/h ");
- flag1=0;
- }
- int currSteps=Steps;
- int steps= currSteps-preSteps;
- preSteps=currSteps;
- myStepper.step(steps);
- }
复制代码
下面的reapRPM()函数计算RPM。 - int readRPM()
- {
- if(REV >= 10 or millis()>=st+1000) // IT WILL UPDATE AFETR EVERY 10 READINGS or 1 second in idle
- {
- if(flag==0)
- flag=1;
- rpm = (60/2)*(1000/(millis() - time))*REV/bladesInFan;
- time = millis();
- REV = 0;
- int x= rpm;
- while(x!=0)
- {
- x = x/10;
- RPMlen++;
- }
- Serial.println(rpm,DEC);
- RPM=rpm;
- delay(500);
- st=millis();
- flag1=1;
- }
- }
复制代码最后,是中断函数,负责测量对象的旋转。 - void RPMCount()
- {
- REV++;
-
- if (led == LOW)
- {
- led = HIGH;
- }
-
- else
- {
- led = LOW;
- }
- digitalWrite(ledPin, led);
- }
复制代码
这就是如何使用Arduino开发板简单地制作建模拟车速表。 这也可以使用霍尔传感器制作,速度可以显示在智能手机上。如果您在制作过程遇到任何问题,请在本帖下面回复,我会及时进行回复。
代码 本文使用的完整代码如下所示:
main.txt
(2.35 KB, 下载次数: 78)
|