如何使用Arduino简单地构建模拟速度表

测量车辆或电机的速度/转速一直是一个值得尝试的迷人项目。在这个项目中,我们将使用 arduino 构建一个模拟速度表。我们将使用红外传感器模块来测量速度。还有其他方法/传感器,例如霍尔传感器来测量速度,但使用红外传感器很容易,因为红外传感器模块是非常常见的设备,我们可以轻松地从市场上获得它,也可以用于任何类型的电机/车辆。
在这个项目中,我们将以模拟和数字形式展示速度。通过做这个项目,我们还将提高我们学习arduino和步进电机的技能,因为这个项目涉及使用中断和定时器。在该项目结束时,您将能够计算任何旋转物体所覆盖的速度和距离,并将它们以数字格式显示在 16x2 lcd 屏幕上以及模拟仪表上。因此,让我们从带有arduino的速度表和里程表电路开始
所需材料
阿杜伊诺
双极步进电机(4线)
步进电机驱动器(l298n模块)
红外传感器模块
16*2液晶显示屏
2.2k 电阻
连接线
面包板。
电源
车速表图片打印输出
计算速度并将其显示在模拟速度表上
红外传感器是一种可以检测其前方物体存在的设备。我们使用了两个叶片转子(风扇),并将红外传感器放置在其附近,以便每次叶片旋转时,红外传感器都会检测到它。然后,我们使用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 公里/小时。所以要显示280 kmh步进电机需要移动280度
所以我们有 maxspeed = 280
最大步数将是
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 是上次执行的步骤。
电路图和连接
这个模拟车速表的电路图很简单,这里我们使用 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 r的完整代码在最后给出,在这里我们解释了其中的一些重要部分。
在编程部分,我们包含了所有必需的库,如步进电机库、液晶 lcd 库和它们的声明引脚。
#include
liquidcrystal lcd(a5,a4,a3,a2,a1,a0);
#include
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;
之后,我们在设置功能中初始化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);
}
在此之后,我们读取循环函数中的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;
}
}
finally, we have interrupt routine which is responsible to measure revolution of object
void rpmcount()                       
{
rev++;                             
if (led == low)
{
led = high;                        
}
else
{
led = low;
}
digitalwrite(ledpin, led);
}

全球机器视觉市场有什么新的成就
中性点接地电阻柜产品都有哪些技术含量
智能座舱HMI自动化测试之语音交互专项测试
荷兰瓦赫宁根大学发起的温室挑战赛──AI种黄瓜比赛
LCD哪几种主要参数决定了LCD的好坏?双锁相环邻频调制器应该如何制作?
如何使用Arduino简单地构建模拟速度表
基于区块链技术的算法交易平台Tradingene介绍
雷军官宣小米11将搭载有史以来最顶级屏幕
吉利汽车:9月销量为17.05万部,同比增长约31%
指令发生器RAS-1200TRM-SW不开机维修
基于PID控制算法的智能小车设计方案
智能卡口监控补光灯主要作用是什么?有哪些特点?
浅谈易用性测试及GUI常见的测试要求
智云股份再获TPK8827万元大单 得行业人士认可
OpenHarmony基于润和Hi3516开发套件
明基笔记本保修条例
iphone8即将开卖:为新品让路,iphone7无奈跌至历史最低价!买不买?
【世说芯品】科技与乐趣碰撞,芯讯通解锁运动新玩法
机器人FOLGE程序是如何被调用激活的呢?
TPM 2.0如何在加固型边缘计算机中实现基础安全性