前两年买过一片Arduino UNO,以及一些便宜的传感器。当时是想用来打发一下业余时间的。没料想,几年过去了,也没发现有什么业余时间可以用来打发一下。
最近时间突然多了,又想起压箱底的这点宝物。以陪孩子玩为借口,也给自己找点乐子吧。
现实场景
自行车码表是怎么测速的?
自行车码表
码表感应部件的安装
从图中可以看到,普通的廉价码表是靠固定在车轮和前叉上的磁性感应头感应骑行时轮子单位时间内转动的圈数,根据在码表上已经设置好的轮子的尺寸,这样用单位时间内的转数乘以轮子周长就能算出自行车的行进速度。
背景知识
-
干簧管传感器
干簧管为机械式的磁敏开关,无源器件。其工作原理是磁场磁化其簧片,使其开启与关断度达到开关的效果。但由于是接触式的开关,其工作寿命有限制,而且运输、安装过程中易损坏。
磁簧开关的工作原理非常简单,两片端点处重叠的可磁化的簧片(通常由铁和镍这两种金属所组成的)密封于一玻璃管中,两簧片呈交迭状且间隔有一小段空隙(仅约几个微米),这两片簧片上的触点上镀有层很硬的金属,通常都是铑和钌,这层硬金属大大提升了切换次数及产品寿命。玻璃管中装填有高纯度的惰性气体(如氮气),部份干簧开关为了提升其高压性能,更会把内部做成真空状态。
Form A ( 常开 ) 磁簧开关的基本结构与组件
Form C (单刀双掷 )三簧片磁簧开关结构
簧片的作用相当与一个磁通导体。在尚未操作时,两片簧片并未接触;在通过永久磁铁或电磁线圈产生的磁场时,外加的磁场使两片簧片端点位置附近产生不同的极性, 当磁力超过簧片本身的弹力时,这两片簧片会吸合导通电路;当磁场减弱或消失后,干簧片由于本身的弹性而释放,触面就会分开从而打开电路。
干簧管原理 -
霍尔传感器
霍尔元件为电子式的磁敏器件,有源器件。其输出形式有开关型和线性。利用磁场和霍尔效应达到无接触式控制的目的。由于霍尔元件本身是一颗芯片,其工作寿命理论上无限制。
百度 一下:
霍尔传感器是根据霍尔效应制作的一种磁场传感器。霍尔效应是磁电效应的一种,这一现象是霍尔(A.H.Hall,1855—1938)于1879年在研究金属的导电机构时发现的。后来发现半导体、导电流体等也有这种效应,而半导体的霍尔效应比金属强得多,利用这现象制成的各种霍尔元件,广泛地应用于工业自动化技术、检测技术及信息处理等方面。霍尔效应是研究半导体材料性能的基本方法。通过霍尔效应实验测定的霍尔系数,能够判断半导体材料的导电类型、载流子浓度及载流子迁移率等重要参数。
1-霍尔半导体元件 2-永久磁铁 3-挡隔磁力线的叶片
哦听起来好深奥。
总而言之霍尔传感器就是根据霍尔效应,人们用半导体材料制成的传感器元件。它具有对磁场敏感、结构简单、体积小、频率响应宽、输出电压变化大和使用寿命长等优点,因此,在测量、自动化、计算机和信息技术等领域得到广泛的应用。例如我手头的这个:
学习套件中的霍尔传感器 - Arduino中断
什么是中断
CPU执行时原本是按程序指令一条一条向下顺序执行的。 但如果此时发生了某一事件B请求CPU迅速去处理(中断发生),CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务). 待CPU将事件B处理完毕后, 再回到原来被中断的地方继续执行程序(中断返回),这一过程称为中断 。
arduino中断~详解arduino的所有中断类型(附图及代码)-少儿编程网
中断
打个比方:假如你正在读书,这时电话响了。你放下手中的书,去接电话。接完电话后,再继续回来读书,并从原来读的地方继续往下读。
Arduino UNO中断
内部中断
内部中断主要为定时中断,定时中断是指主程序在运行一段程序过后自动进行的中断服务程序。
外部中断
一般由外设发出中断请求,如:键盘中断、打印机中断、外部中断需外部中断源发出中断请求才能发中断。
函数列表
attachInterrupt()
detachInterrupt()
interrupts()
-
noInterrupts()
attachInterrupt()
函数说明
void attachInterrupt (uint8_t interruptNum, void(*)(void)userFunc, int mode)
设置中断
指定中断函数. 外部中断有0和1两种, 一般对应2号和3号数字引脚.
参数:
interrupt
中断类型, 0或1
fun
对应函数
mode
触发方式. 有以下几种: -
LOW
低电平触发中断 -
CHANGE
变化时触发中断 -
RISING
低电平变为高电平触发中断 -
FALLING
高电平变为低电平触发中断
注解:
在中断函数中delay
函数不能使用,millis
始终返回进入中断前的值. 读串口数据的话, 可能会丢失. 中断函数中使用的变量需要定义为volatile
类型.
实验材料和电路连线
实验中使用硬纸板制作一圆盘模拟车轮;圆盘边缘安装一片小磁钢;使用霍尔传感器检测圆盘转动;用LCD1602液晶显示测出的速度;使用一个发光二极管在霍尔传感器检测到磁钢从侧面经过。
电路部分的连接如下图:
电路连接图
制作过程
- 用硬纸板剪一个圆盘,以及一个U字型的支架。
- 用一根圆的一次筷子作为轴,确保圆盘能够自由转动(必要时在筷子穿过位置套一段硬塑料管,起到加强纸板强度和减少摩擦力的作用。
- 在圆盘一头合适位置固定霍尔传感器,在圆盘边缘固定一片小磁钢,使圆盘转动时探头尽量接近磁钢,但又不影响圆盘转动为宜。
-
按连接图进行连线。
所有硬件制作并连接完成的样子就是这样了:
IMG_20200517_153247.jpg
程序代码
接下来在Arduino IDE里写好程序,上传。为确保圆盘每转动一圈都正常计数,使用了Arduino的0号中断。中断处理函数中只对计数变量进行自增。
loop()函数中每秒进行一次计算和显示,将此次取得的圈数减去上次取得的圈数,得到最近一秒内所转的圈数,乘以周长,计算出速度。
程序:
#include <LiquidCrystal.h>
#define ledPin 13 //LED灯接口
#define hallPin 10 //霍尔传感器接口
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);//LCD显示模块设置接口
int c1=0;
int c2=0;
int c=0;
long unsigned int t1=0;
long unsigned int t2=0;
float t=0.0;
float r=3.14*150*2/1000; //圆盘半径150mm
float v=0.0;
void setup() {
lcd.begin(16,2);
lcd.clear(); //清屏
delay(1000); //延时1000ms
Serial.begin(9600);
pinMode(ledPin,OUTPUT); //设定LED接口为输出状态
attachInterrupt(0, count, FALLING);
}
void loop()
{
c=c1-c2;
c2=c1;
v=c;
Serial.println("当前速度:"+String(v)+"圈/秒,即:"+String(v*r*3600.0)+"米/小时");
digitalWrite(ledPin,LOW);
lcd.setCursor(0, 0) ; //设置光标位置为第1行第1个位置
lcd.print("Speed:"+String(v*r*3600.0/1000)+"km/h"); //使屏幕显示文字
lcd.setCursor(0, 1) ; //第2行第1个位置
lcd.print("("+String(v)+"r/s)"); //使屏幕显示文字
delay(1000);
}
void count() //中断处理
{
digitalWrite(ledPin,HIGH);
c1+=1;
}
运行
用手转动圆盘,每转一圈磁钢从霍尔传感器旁边经过一次,LED灯闪亮一次。每秒钟LCD显示刷新一次,显示最近1秒内测得的速度值。OK,大功告成!
image.png
网友评论