在最后两篇文章中,我们谈到了基于ESP32自带电压传感器和外部制造商常用的超声波测距模块。实验本身没有创意,只是用自制的传感器来实现普通的DIS所有设备都可以实现的功能。但在这篇文章中,我们将自制DIS在实验中引入创新的想法,开发的实验也很常见DIS不能完成设备. 当使用传感器测量物理量时,位移是一个难以测量的量。例如,上一篇文章中的超声波测距仪精度只有厘米级。虽然改进后几乎达不到毫米级,但仍然不够;当然,激光测距模块也有。虽然精度提高了(实际上还不够高),但采样率很低,例如VL6180等,采样率只能达到10Hz左右,或许有更快更准的位移传感器,但是这价格不是我们普通老师所能承受的了。 既然位移很难测,我们能反过来吗?(注意,这是创造力诞生前的那一刻!)单片机测量位移很弱,但测量时间是大师!所以我们不能先确定位移,然后测量物体通过特定位置的时间,也不能得到位移-时间图像啊!那怎样做呢?答案很简单:使用光电门,只需要在车上安装光电门,然后在轨道上安装一列挡光板,所有挡光板的位置提前测量,然后光电门可以测量每个挡光板的时间,当然,不是挡光时间间隔,而是测量一瞬间!这样,位移-时间图像是否自动出来!当然,今天我们只是直接绘制速度-时间图像。 怎么样?挺简单的,但是简单包含创意!这在我最喜欢的作品中排名第二,我感觉很好! 好吧,就像以前一样,让我们先看一段视频: 你迫不及待地想自己做一个吗!跟着下面的教程,一起做吧!
自制光电门
这个实验首先需要一个光电门。为了写这篇文章,我从一个宝藏买了一个。事实上,我以前是自己做的,但考虑到你刚开始学习,我想省略自制光电门的步骤,直接买一个。出乎意料的是,…直接看图片,这个货居然要17元一个,我还买了两个,心痛死我,直接进垃圾桶。里面只有两个5mm红外二极管,而且通光孔开得很大,而且最重要的是没有电压比较器等芯片啊,不到1元就卖给我17元!!! 当然,你也可以从学校现有的设备中拆除一些来玩,但要注意不同DIS例如,我校最早的光电门在实验设备中是不同的GQY的DIS在设备中,它是最简单的,可以直接用于我们,但后来的朗威不能直接用于,当然Pascal也可以直接使用,但是因为这个产品太贵,我舍不得玩。 嗯,事实上,做一个光电门也很简单,红外发光二极管和红外接收二极管加几个电阻就足够了,当然,最重要的是设计一对面孔,孔径越小越好,但当孔径太小时,需要三极管或电压比较器等芯片来帮助。这篇文章先简单一点,不加芯片。我用激光切割的薄板设计了一个光电门。首先,我发现当接收管的电阻不挡光时,电阻变大了很多。所以就可以设计个简单的电路,将这种电阻变化转换成电压的变化,我们设计了不挡光时电压为低,挡光时电压为高,具体电路问物理老师:)。具体制作请看视频:
2、ESP32连接和对应光电门的程序
只有一条连线,直接在光电门输出端ESP32上的P14端口。以下是发送速度和时间的程序,注意程序中双蓝牙通道的设置。
#include <phyphoxBle.h> //加载phyphoxble.h库函数 int IN_PIN = 14; // ESP作为电压输入端的25号端口 int i=0; float tpi,tmb,tm0,tm,v; void setup() {
Serial.begin(115200); pinMode(14,INPUT); PhyphoxBLE::start("速度传感器"); /////蓝牙搜索时出现的名称 PhyphoxBleExperiment Voltmeter; Voltmeter.setTitle("速度传感器实验"); //app界面中实验的名称 Voltmeter.setCategory("宁中物理创新实验室"); //app界面中的实验分类名称 Voltmeter.setDescription("这个实验速度-时间图像."); //在app中会显示的提示语 PhyphoxBleExperiment::View firstView;
firstView.setLabel("Rawdata"); //创建一个视图
//绘图
PhyphoxBleExperiment::Graph firstGraph; //开始绘制一个图像
firstGraph.setLabel("速度-时间图像"); //图像名字
firstGraph.setUnitX("s"); //x轴的单位
firstGraph.setUnitY("m/s"); //y轴的单位
firstGraph.setLabelX("时间"); //x轴的物理量名称
firstGraph.setLabelY("速度"); //y轴的物理量名称
firstGraph.setChannel(1, 2); //打开双蓝牙通道
firstView.addElement(firstGraph); //将图像加载到视图中
Voltmeter.addView(firstView); //将视图显示出来
PhyphoxBLE::addExperiment(Voltmeter); //添加电压变量通过蓝牙输出
}
void loop() {
tpi=pulseIn(IN_PIN, HIGH);//pulseIn函数用来测量挡光的时间间隔
if(tpi>50)//如果tpi读到了时间
{
if(i==0)//经过第一个挡光片时
{
v = 5000/tpi;//计算速度
tmb=(millis()-tpi/2000)/1000;//计算了挡光片中点时刻时的系统时间
tm=0;//此时时刻为0
delay(1);
PhyphoxBLE::write(v,tm); //发送速度和时间给phyphox
i=1;
}
else if(i>0&&i<10)//经过第二个一直到第十个挡光片时
{
v = 5000/tpi;
tm0=(millis()-tpi/2000)/1000; //计算了挡光片中点时刻时的系统时间
tm=tm0-tmb;//计算此刻的时刻
delay(1);
PhyphoxBLE::write(v,tm);
i++;
}
else //超过了10个挡光片后不再测量,主要是为了第二次绘制V-t图时时间可以从0开始,
{
delay(1000);
i=0;
}
}
}
3、ESP32的供电
由于整个设备都要安装在小车上,用充电宝供电就太大了,所以我直接使用了3.2V(注意不要买3.7V的普通锂电池哦!!)磷酸铁锂电池对ESP32进行供电,电池的正极接ESP32的3V3端口,负极接ESP32的GND端口即可,这里需要注意的是由于是非标准电压供电,所以此时的ADC(模数转换)误差较大,需要校准后使用,但是对于本篇的光电门计时影响不大。 将所有的设备固定在激光切割的木板上,然后再将设备安装到小车上,在轨道上安装一列5mm的挡光片就可以进行实验了。 速度传感器可以很方便的绘制出速度时间图像,也可以很快得出匀变速直线运动的加速度,在之后牛二定律实验中我们会继续用到。