测量车辆或电动机的速度/ rpm一直是一个有趣的尝试。在这个项目中,我们将使用Arduino构建一个模拟车速表。我们将使用红外传感器模块来测量速度。还有其他方法/传感器,例如霍尔传感器来测量速度,但是使用IR传感器很容易,因为IR传感器模块是非常常见的设备,我们可以从市场上轻松获得它,并且可以在任何类型的传感器上使用摩托车。
在这个项目中,我们将以模拟和数字形式展示速度。通过执行该项目,由于该项目涉及中断和计时器的使用,因此我们还将增强学习Arduino和步进电机的技能。在该项目结束时,您将能够计算任何旋转物体所覆盖的速度和距离,并将它们显示在数字格式的16x2 LCD屏幕上以及模拟仪表上。因此,让我们从带有Arduino的车速表和里程表电路开始
所需材料
- Arduino的
- 双极步进电机(4线)
- 步进电机驱动器(L298n模块)
- 红外传感器模块
- 16 * 2 LCD显示屏
- 2.2k电阻
- 连接线
- 面包板。
- 电源供应
- 车速表图片打印输出
计算速度并将其显示在模拟速度表上
红外传感器是一种可以检测其前面是否存在物体的设备。我们已经使用了两个叶片转子(风扇),并将红外传感器放置在其附近,这样,每次叶片旋转时,红外传感器都会检测到它。然后,我们使用Arduino中的计时器和中断功能来计算电机完整旋转一圈所需的时间。
在此项目中,我们使用了最高优先级的中断来检测rpm,并将其配置为上升模式。这样,只要传感器输出从LOW变为High,函数 RPMCount() 就会执行。由于我们使用了两个叶片转子,因此该功能将在一转内被调用4次。
一旦知道了花费的时间,我们可以使用以下公式计算RPM,其中1000 /时间将为我们提供RPS(每秒转数),再将其乘以60将为您提供RPM(每分钟转数)
rpm =(60/2)*(1000 /(毫秒()-时间))* REV / bladesInFan;
获得RPM后,可以通过以下公式计算速度:
速度= rpm *(2 * Pi *半径)/ 1000
我们知道Pi = 3.14,半径是4.7英寸
但首先,我们需要将半径转换为英寸为单位的米:
半径=((半径* 2.54)/100.0)米 速度= rpm * 60.0 *(2.0 * 3.14 *半径)/ 1000.0),以千米/小时为单位
在这里,我们将rpm乘以60,将rpm转换为rph(每小时转数),然后除以1000,将米/小时转换为公里/小时。
以kmh为单位的速度后,我们可以直接在LCD上以数字形式显示这些值,但是要以模拟形式显示速度,我们需要再进行一次计算以找出否。步进时,步进电机应移动以在模拟仪表上显示速度。
在这里,我们为模拟仪表使用了4线制双极步进电机,该电机的1.8度表示每转200步。
现在我们必须在速度表上显示280 Khh。因此要显示280 Kmh步进电机需要移动280度
所以我们有maxSpeed = 280
而maxSteps将是
maxSteps = 280 / 1.8 = 155步
现在,我们在Arduino代码中有了一个函数,即 map 函数,该函数在此处用于将速度映射为步。
步数= map(speed,0,maxSpeed ,0,maxSteps);
所以现在我们有了
steps = map(speed,0,280,0,155);
计算完步骤后,我们可以将这些步骤直接应用到步进电机功能中来移动步进电机。我们还需要通过使用给定的计算来照顾当前的步进或步进电机的角度
currSteps =步骤 步骤= currSteps-preSteps preSteps = currSteps
这里 currSteps 是来自上一次计算的当前步骤,而 preSteps 是最后执行的步骤。
电路图和连接
该模拟速度表的电路图很简单,这里我们使用16x2 LCD以数字形式显示速度,并使用步进电机旋转模拟速度表针。
16x2 LCD连接到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。其余连接在电路图中给出。
编程说明
最后给出了Arduino Speedomete的完整代码,在这里我们解释其中的几个重要部分。
在编程部分,我们包括了所有必需的库,例如步进电机库,LiquidCrystal LCD库以及为其声明的引脚。
#包括
此后,我们采用了一些变量和宏来执行计算。计算已在上一节中说明。
易失性字节REV; unsigned long int rpm,RPM; unsigned long st = 0; 长期未签名; int ledPin = 13; int led = 0,RPMlen,prevRPM; int标志= 0; int flag1 = 1; #define bladesInFan 2 浮点半径= 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;
之后,我们在 设置 功能中初始化LCD,串行,中断和步进电机
void setup() { myStepper.setSpeed(60); Serial.begin(9600); pinMode(ledPin,输出); lcd.begin(16,2); lcd.print(“ Speedometer”); delay(2000); attachInterrupt(0,RPMCount,RISING); }
此后,我们在 循环 功能中读取rpm并执行计算以获取速度,然后将其转换为步数以运行步进电机以模拟形式显示速度。
void loop() { readRPM(); 半径=((半径* 2.54)/100.0); //转换为米 int Speed =((float)RPM * 60.0 *(2.0 * 3.14 *半径)/1000.0); // 60分钟内的RPM,轮胎直径(2pi r)r为半径,以1000换算为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(速度); 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或millis()> = st + 1000)// //它将在空闲状态每10读数或1秒更新一次更新 { if(flag == 0) flag = 1; rpm =(60/2)*(1000 /(millis()-time))* REV / bladesInFan; 时间= millis(); REV = 0; int x = rpm; while(x!= 0) { x = x / 10; RPMlen ++; } Serial.println(rpm,DEC); RPM = rpm; 延迟(500); st = millis(); flag1 = 1; } }
最后,我们有中断例程,该例程负责测量对象的旋转
无效RPMCount() { REV ++; if(led == LOW){ led = HIGH; }其他{ led = LOW; } digitalWrite(ledPin,led); }
这就是您可以使用Arduino轻松构建模拟车速表的方法。这也可以使用霍尔传感器构建,并且速度可以显示在智能手机上,请遵循此Arduino Speedometer教程进行操作。