给Phyphox增加位移传感器(1)
给Phyphox增加位移传感器(1)
做些准备工作,给Phyphox增加位移传感器,以便有多种方法实现运动学中的、离开实验室的实验。
VL6180X是一款TOF飞行时间传感器,测量原理是通过芯片上的一个光孔发出850nm的红外光,然后用时钟记下光从发出到从物体表面反射反射回来的时间,就测算出来了距离。VL6810X也能测量环境光和姿势。其量程为20cm左右,误差1mm。
VL6180X引脚说明:
(1)VIN即电源正,接Arduino/ESP32的5V或3V3,GND即电源负,接Arduino/ESP32的GND。
(2)2V8是从VL6810上输出的稳压2.8V,加在VL6810X电源输入3V3或5V时,VL6810X都会把它分出一个稳定的2.8V从这个引脚输出出来,以便他用。
(3) SDA和SCL,I2C通信引脚,ESP32板上分别接IO21和IO22,Arduino UNO上是A4和A5。
(4)GPIO用于告知VL6810X是否已就绪。就绪输出2.8V高电平,否则输出低电平。一般悬空不用,因为2.8V高电平ESP32和Arduino都不认识。
(5)SHDN用来控制VL6810X工作状态,平常时候VL6810X都是正常工作的,给SHDN低电平,VL6810X停止工作,给高电平,开始工作。一般悬空不用。
接线:
直接修改ADA水果库里的例子:
#include <phyphoxBle.h>
//使用VL6180X
#include <Wire.h>
#include "Adafruit_VL6180X.h"
Adafruit_VL6180X vl = Adafruit_VL6180X();
float fV = 0.00;
void setup()
{
PhyphoxBLE::start("MxxBLE");
PhyphoxBleExperiment plotVoltage;
plotVoltage.setTitle("高精度位移传感器测距");
plotVoltage.setCategory("阿璇实验创作集");
plotVoltage.setDescription("北京市和平街第一中学,梅晓璇,使用VL6180X测微小距离,量程不大于20cm,精度1mm。");
//View
PhyphoxBleExperiment::View firstView;
firstView.setLabel("MyView"); //Create a "view"
//Graph
PhyphoxBleExperiment::Graph firstGraph;
firstGraph.setLabel("displacemet-time curve");
firstGraph.setUnitX("s");
firstGraph.setUnitY("mm");
firstGraph.setLabelX("time");
firstGraph.setLabelY("displacemet");
firstGraph.setChannel(0, 1);
firstView.addElement(firstGraph);
plotVoltage.addView(firstView);
PhyphoxBLE::addExperiment(plotVoltage);
//以下可离开Phyphox使用串口调试
Serial.begin(115200);
// wait for serial port to open on native usb devices
while (!Serial) {
delay(1);
}
Serial.println("Adafruit VL6180x test!");
if (! vl.begin()) {
Serial.println("Failed to find sensor");
while (1);
}
Serial.println("Sensor found!");
}
void loop()
{
float lux = vl.readLux(VL6180X_ALS_GAIN_5);
//Serial.print("Lux: "); Serial.println(lux);
uint8_t range = vl.readRange();
uint8_t status = vl.readRangeStatus();
if (status == VL6180X_ERROR_NONE) {
Serial.print("Range: "); Serial.println(range);
fV = float(range);
}
else {
fV = -1.00;
}
// Some error occurred, print it out!
if ((status >= VL6180X_ERROR_SYSERR_1) && (status <= VL6180X_ERROR_SYSERR_5)) {
Serial.println("System error");
}
else if (status == VL6180X_ERROR_ECEFAIL) {
Serial.println("ECE failure");
}
else if (status == VL6180X_ERROR_NOCONVERGE) {
Serial.println("No convergence");
}
else if (status == VL6180X_ERROR_RANGEIGNORE) {
Serial.println("Ignoring range");
}
else if (status == VL6180X_ERROR_SNR) {
Serial.println("Signal/Noise error");
}
else if (status == VL6180X_ERROR_RAWUFLOW) {
Serial.println("Raw reading underflow");
}
else if (status == VL6180X_ERROR_RAWOFLOW) {
Serial.println("Raw reading overflow");
}
else if (status == VL6180X_ERROR_RANGEUFLOW) {
Serial.println("Range reading underflow");
}
else if (status == VL6180X_ERROR_RANGEOFLOW) {
Serial.println("Range reading overflow");
}
PhyphoxBLE::write(fV);
delay(10);
PhyphoxBLE::poll();
}
编译,通过蓝牙BLE上传到ESP32,开始实验。竖直的小板子即VL6810X。
被测物体,是一个小盒子:
通过细线悬挂两张卡片和一袋LED:
Phyphox捕获数据曲线。当超出20cm量程后,强行返回负的1mm,意思是该数据已无效。
把数据传入Excel,画图线、拟合函数曲线:
得加速度0.75米每二次方秒,挺象的。然额。。。为什么每一个时刻或极邻近某一个时刻,会同时返回3个测量值呢?????若是把这极相邻的3个时刻打掉两个,只留1个,看起来R方增大了,但凭什么这么做呢?????
------心存DREAM喜欢琢磨实验并自娱自乐的MIRACLE------
实验教学值得学习的去处:
2.学生自主创新实验