首页
关于物理猫
Geogebra在线
Vpython在线
物理猫公益ChatGPT
Search
1
GGB课件制作工具使用说明
3,140 阅读
2
分压电路为什么要用小电阻
1,629 阅读
3
凸透镜成像演示
1,386 阅读
4
天体简谐运动
1,280 阅读
5
斜面上的板块模型例题
933 阅读
物理可视化
Geogebra
Vpython
GGB教程
DIS与硬件编程
物理猫
工具分享
物理可视化工具
登录
/
注册
Search
标签搜索
高中物理
物理模型
GeoGebra
磁场
DIS
vpython
静电场
实验仪表
仪器仪表
电路
传感器
esp32
物理游戏
物理仪器
有趣的小程序
几何光学
力与运动
动态平衡问题
恒定电流
物理疑难问题
徐继龙
累计撰写
93
篇文章
累计收到
37
条评论
首页
栏目
物理可视化
Geogebra
Vpython
GGB教程
DIS与硬件编程
物理猫
工具分享
物理可视化工具
页面
关于物理猫
推荐
Geogebra在线
Vpython在线
物理猫公益ChatGPT
用户登录
登录
注册
搜索到
3
篇与
的结果
2022-12-19
自制DIS实验-力传感器
DIS开发-自制力传感器教程,本文介绍了制作力传感器的教程,附带源代码
2022年12月19日
108 阅读
0 评论
0 点赞
2022-11-07
自制DIS实验-验证牛顿第三定律实验
前言 关于这个验证牛顿第三定律这个实验,前前后后已经做了很长时间了;从硬件和软件方面都进行了比较大的更新。软件方面主要加了著名的卡曼滤波程序,硬件方面则从最初的面包板接线更新到了PCB设计和3D打印的外壳。这个实验目前任然在改进中,没有最完美的实验,只有更完美的实验。我们来学习一下牛顿第三定律的内容: 牛顿第三定律表明,当两个物体相互作用时,彼此施加于对方的力,其大小相等、方向相反。根据第三定律,力是物体与物体之间的相互作用,力必会成双结对地出现,其中一个力称为“作用力”,而另一个力则称为“反作用力”。这两个力的大小相等、方向相反。在这两个力之间,任何一个力都可以被称为作用力,而其对应的力自然成为伴随的反作用力。这成对的作用力与反作用力称为“配对力”。第三定律又称为“作用与反作用定律”。 第三定律以方程表达为:$${\displaystyle \sum \mathbf {F} _{A,B}=-\sum \mathbf {F} _{B,A}}$$ 其中,${\displaystyle \mathbf {F} _{A,B}}$是物体B施加于物体A的力,${\displaystyle \mathbf {F} _{B,A}}$ 是物体A施加于物体B的力。视频操作过程:{bilibili bvid="BV1qK411S7Sd" page=""/}{bilibili bvid="BV11V4y1L7Zs" page=""/}实验内容:组装器材 esp32,3.2V电池,hx711和oled屏幕插入到我设计的PCB板上,再连接到3D打印的外壳上面。通过PhyPhox建立蓝牙通讯启动程序开始实验 作用力和反作用力镜像图像: 作用力和反作用力重合在同一图像上面:
2022年11月07日
214 阅读
0 评论
3 点赞
2022-11-06
自制DIS实验-高精度测距传感器
前言 笔者之前一直使用超声波来测量距离,超声波的精度有点感人,3mm误差。超声波模块受环境的温度湿度影响较大,用来精确测量不是很友好。今天终于找到了精度更高的模块——VL6180x。误差1mm。也勉强够用了,只是频率和量程有点低。超声波模块可以测量4M以内的距离,激光模块只能测量20cm以内的距离,真是鱼和熊掌不可兼得,提高了精度却损失了量程。有没有一种高精度大量程高频率的模块呢? 首先阅读一下激光模块的文档吧,一看竟然有几百页,还是全英文的,对于笔者这样的学渣来说实属困难。好在看到了重要的内容:Typical ranging performance of the VL6180X is shown in Figure 6. This demonstrates the reflectance independence and range accuracy of the VL6180X from 0 to 100 mm for 3%,5%, 17% and 88% reflective targets. The example shown here is with ST cover glass and a 1.0 mm air gap. 理论上来讲,激光测距模块的输出值应该与目标物体之间的距离呈线性关系,但实际上并不是这样。在黑暗环境中,测试激光测距模块与不同反射率的物体之间的距离,真实距离与实际测量距离的输出对比关系如上图所示。大概意思就是激光测距模块和反射物体的光反射率存在一定的关系,而且测量数据和真实值之间会存在数据抖动,也就是数据偏移。其他原理就不介绍了(主要是笔者也没看懂),下面直接上arduino代码吧!不带phyphox的代码:#include <Wire.h> #include "Adafruit_VL6180X.h" Adafruit_VL6180X vl = Adafruit_VL6180X(); void setup() { 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); } // 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"); } delay(50); } 带phyphox的代码:#include <phyphoxBle.h> //使用VL6180X #include <Wire.h> #include "Adafruit_VL6180X.h" Adafruit_VL6180X vl = Adafruit_VL6180X(); float fV = 0.00; void setup() { PhyphoxBLE::start("激光测距仪"); PhyphoxBleExperiment plotVoltage; plotVoltage.setTitle("高精度激光传感器测距"); plotVoltage.setCategory("arduino"); plotVoltage.setDescription("使用VL6180X测微小距离,量程不大于20cm,精度1mm。"); //View PhyphoxBleExperiment::View firstView; firstView.setLabel("MyView"); //Create a "view" //Graph PhyphoxBleExperiment::Graph firstGraph; firstGraph.setLabel("位置-时间 图像"); firstGraph.setUnitX("s"); firstGraph.setUnitY("mm"); firstGraph.setLabelX("time"); firstGraph.setLabelY("displacemet"); //Value PhyphoxBleExperiment::Value firstValue; //Creates a value-box. firstValue.setLabel("距离值:"); //Sets the label firstValue.setPrecision(3); //The amount of digits shown after the decimal point. firstValue.setUnit("mm"); //The physical unit associated with the displayed value. firstValue.setColor("FFFFFF"); //Sets font color. Uses a 6 digit hexadecimal value in "quotation marks". firstValue.setChannel(2); firstValue.setXMLAttribute("size=\"2\""); firstGraph.setChannel(0, 1); firstView.addElement(firstGraph); firstView.addElement(firstValue); //attach value to view 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,fV); delay(10); PhyphoxBLE::poll(); }所有用到的文件我已经放百度网盘了,大家自行下载即可:{cloud title="arduino源文件下载" type="bd" url="https://pan.baidu.com/s/1iJvtCYAtiO3w7ILH91VG_w?pwd=xjp7 " password="xjp7"/}准确性验证: 将esp32和激光模块接入我设计的扩展板,接线很简单,scl接P21,sda接P22即可。 确定物体垂直于桌面, 将直尺0刻度线放在物体初始位置: 传感器读数,初步判断数据可靠:
2022年11月06日
125 阅读
0 评论
0 点赞