- 2024-10-13
-
发表了主题帖:
【2024 DigiKey创意大赛】+ 用于车速估算的空速表制作
用于车速估算的空速表制作
作者:顺竿爬
一、作品简介
2SMPP03是一款气压计,这款气压计在外接空速管的基础上,可以作为空速计来使用。一般此类应用都会被应用在航模上,而我想到这种用法其实在汽车工业上也可以大有作为。
汽车在隧道等GPS信号不佳的地方行驶时,对于里程和位置的估计,只能依靠转速表,陀螺仪,加速度计等传感器进行测量。这些传感器都有一个共同的问题,就是测不准,会受到其他因素干扰:比如里程表会受到胎压影响,惯性传感器会受到路面情况干扰等。因此需要多个传感器参与,使用不同的方法来测量,并将数据通过算法进行融合,以此减少误差。增加空速计,可以增加另一个观测速度及速度变化的途径,因此我们可以在极低成本的情况下,增加速度及位置估计的准确度。
整个项目的硬件部分展示:
二、系统框图
整个项目我使用购买的2SMPP03模组与自己设计的电路板制作出空速计模块,用ESP32-C6-DEVKITC-1-N8上的ADC外设读取空速计读数,并经过计算转换为车速,最后再通过串口输出至使用树莓派zero2w制作的车载电脑,完成车速的图形化显示。
三、各部分功能说明
首先是硬件制作。2SMPP03空速计由于是最基础的电阻网络结构,因此还需要不少模拟电路外设才可以正常工作。
外设电路设计一共需要三个运放。首先是仪表放大器,需要把2SMPP03输出的差分电压进行放大:
电阻R8的作用是用来调节放大倍数。
另外还需要一个电压跟随器,用来给仪表放大器提供参考电压。参考电压我设置为1/2*vcc,这样可以做到正负压双向测量。
最后一个运放是用来做一个恒流源,给2SMPP03提供恒流供电。这两个运放我使用一个双运放来完成。
在2SMPP03电源回路上也接一个变阻器,用来调整恒流值大小:
这样电路原理图部分设计就完成了,绘制成电路板如下:
下面开始写ESP32-C6-DEVKITC-1-N8上的代码。代码读取ADC数据,进行计算后通过串口发送出去。这里主要需要注意的是计算方法。
首先根据2SMPP03规格书,可以找到电阻与气压的关系:
通过调整横流电阻,把电流调整到100uA,就可以得到上面的线性关系。
接着再通过调整仪表放大器的放大倍率,来使得输出电压匹配ESP32-C6-DEVKITC-1-N8的ADC量程范围。
最后我们找到风压与风速的关系:
wp = 0.5*r*(v^2)*1000/g
其中wp是风压,r是空气重度,g是重力加速度,v是风速。调整一下公式,就可以得到风速的计算公式:
v = (wp / 1000 / (0.5 * r / g))^0.5
使用这个公式,就可以完成代码编写:
void setup() {
Serial.begin(115200);
}
void loop() {
unsigned int sensorValue = analogRead(4);
if (sensorValue < 920) {
sensorValue = 920;
} else if (sensorValue > 1500) {
sensorValue = 1500;
}
unsigned int pressure = map(sensorValue, 920, 1500, 0, 390);
float volecity = sqrt((float)pressure / 1000 / (0.5 * 0.01225 / 9.8));
// print the results to the Serial Monitor:
// Serial.print("sensor = ");
Serial.println(volecity);
// wait 2 milliseconds before the next loop for the analog-to-digital
// converter to settle after the last reading:
delay(100);
}
按照设计焊接好电路板:
我使用的是4号引脚,属于ADC1外设。因此接线时注意把信号线接到4号脚上
最后是树莓派上位机的图形化显示源码。使用python自带的库就可以完成全部设计。
import tkinter as tk
from tkinter import Canvas
import serial
import math
root = tk.Tk()
root.title("SPEED")
ser = serial.Serial("/dev/ttyUSB0", 115200, timeout=1)
canvas = Canvas(root, width=400, height=400)
canvas.pack()
canvas.create_arc(
50, 50, 350, 350, start=225, extent=-270, outline="lightgrey", width=10
)
for i in range(0, 26, 5):
angle = 225 - (i / 25) * 270
x = 200 + 140 * math.cos(math.radians(angle))
y = 200 - 140 * math.sin(math.radians(angle))
canvas.create_text(x, y, text=str(i), font=("Arial", 10))
needle_length = 100
needle = canvas.create_line(200, 200, 200, 100, fill="red", width=3)
def update_gauge(speed):
angle = 225 - (speed / 25) * 270
x = 200 + needle_length * math.cos(math.radians(angle))
y = 200 - needle_length * math.sin(math.radians(angle))
canvas.coords(needle, 200, 200, x, y)
def read_serial():
try:
line = ser.readline().decode("utf-8").strip()
if line:
speed = float(line)
if 0 <= speed <= 25:
update_gauge(speed)
except Exception as e:
print(f"Error reading serial: {e}")
root.after(50, read_serial)
read_serial()
root.mainloop()
将C6和树莓派的TX/RX交叉连接,并连接地线后,在树莓派上运行程序,最终显示效果如下:
四、作品源码
PCB设计文件:
ESP32-C6-DEVKITC-1-N8代码:
树莓派zero2W代码:
五、作品功能演示视频
[localvideo]d61646c707991c0dc81986c572f8ac1a[/localvideo]
六、项目总结
项目的所有代码及设计文件均已在上面上传,所有的细节都写在本文中,下面附上word版的项目报告。
- 2024-09-04
-
加入了学习《【Follow me第二季第1期】使用Makecode图形化完成任务》,观看 【Follow me第二季第1期】使用Makecode图形化完成任务
- 2024-08-20
-
发表了主题帖:
【2024 DigiKey 创意大赛】ESP32-C6-DEVKITC-1-N8和2SMPP03 开箱贴
由于物流耽误,这次的快递过了非常久才到货。到货后拆开,包装还是一如既往的好,其中C3开发板还贴了防拆贴纸。
旁边小袋子装的是2SMPP03气压传感器,这是个非常精密且脆弱的传感器,原理差不多是在一张非常薄以至于有弹性的硅片上装了四个非常薄的压敏电阻,当膜两侧有气压差发生形变时,就会牵引电阻发生形变,从而使阻值发生轻微改变。从原理上看要想使用,免不了各种运放外围电路的设计,又到了头疼的模拟电路环节。
把所有的东西拆出来,可以看到传感器全貌,以及精致的乐鑫原厂开发板。
- 2024-08-07
-
上传了资料:
【Follow me第二季第1期】使用Makecode图形化完成任务
-
发表了主题帖:
【Follow me第二季第1期】使用Makecode图形化完成任务
本帖最后由 顺竿爬 于 2024-9-4 01:35 编辑
项目介绍
先看一下视频:
本次项目使用到了Adafruit Circuit Playground Express和树莓派zero2w。
由于使用的是图形化编程,每个任务的软件流程图即为图形化程序本身,因此在这不再单独列出。
入门任务:开发环境搭建,板载LED点亮
这个任务我们仅需使用到Adafruit Circuit Playground Express就可以完成。Makecode开发环境是部署在云端的,因此无需搭建可以直接使用。
这次的项目我计划使用树莓派zero作为上位机使用,先下载官方镜像烧录器,打开后,选择烧录设备,操作系统,以及准备安装树莓派系统的储存卡,点击下一步烧录即可。
烧录完成后,把储存卡插进树莓派中,安装散热器,再接上显示器,并通过otg线接上我们的Adafruit Circuit Playground Express,就算大功告成,直接上电即可。注意电源最好使用充电器,这样确保供电能力充足。
编写代码是在网页端进行的,因此我们需要使用浏览器。但是需要注意的是,在linux系统下每个账户和应用都有严格的权限管理,而由于我们需要在浏览器中连接Adafruit Circuit Playground Express,但这个硬件级别的操作需要用到root权限,因此我们不能直接点击浏览器图表启动,而应该使用终端用sudo方式启动。
打开终端后,输入以下命令启动root权限的浏览器:
sudo chromium-browser -no-sandbox
只需要打开官方网站Adafruit Circuit Playground Express - Blocks / Javascript editor,然后点击New Project新建一个项目:
就可以进入编程页面,我们先什么都不做,直接点击左下角的下载,下载一个基础固件,然后按一下板载的reset按钮,进入刷机模式,将下载好的固件拖进去就完成了基础固件的刷写。
有了基础固件后,点击右上角的齿轮,配对设备,成功后就可以开始创作。
点灯我们可以通过LIGHT选项中的第一个选择得到,将它拖动到on start中,并下载固件,就可以在程序运行把所有LED设置成红色。
点击页面上的JAVASCRIPT,可以看到刚刚图形化的程序原始脚本的样子。我们可以把它复制出来保存一下。这样以后再需要这个程序时,直接复制这个脚本放入JAVASCRIPT就可以。所有任务的脚本我会在文章末尾作为源代码添加进附件中供大家下载使用。
基础任务一:控制板载炫彩LED,跑马灯点亮和颜色变换
这个任务因为我们希望跑马灯可以一直持续,因此需要把on start换成forever,然后选择LIGHT下的show animation拖进去就可以了。
基础任务二(必做):监测环境温度和光线,通过板载LED展示舒适程度
利用板载的光线和温度传感器,同时点亮两个指示灯。先通过点击左边的show console device来查看串口数据。据此来设置合适的温度强度阈值,然后完成程序,当温度适宜,光强不刺眼时两个指示灯都显示为绿,如果哪个传感器条件不再适宜,则对应指示灯变为红色。
可以看到,我用手指来加热温度传感器,若有强光出现或温度上升,对应的舒适度指示灯会变成红色。
基础任务三:接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警
板子上并没有测距模块可以试用。但是我们看到板上既有LED,又有光纤传感器。如果让LED全亮,那么在光线不强的环境里,如果板子面前有物体,这个物体越亮,代表反射的光越多,也就代表离板子越近。通过这个思路,我们可以利用光线传感器来测量距离。
我们在这个程序中同样使用的控制台输出的功能,因此可以通过点击左边的show console device来查看串口数据。据此来设置合适的光线强度阈值。
进阶任务:制作不倒翁——展示不倒翁运动过程中的不同灯光效果
可以通过加速度计的Z轴读数,来表示Adafruit Circuit Playground Express的倾斜程度。当倾斜程度过大时,让红色报警指示灯亮起。同样的倾斜阈值由串口数据得到。
可以看到板子平放时没有灯亮起,而当板子倾斜时则指示灯亮起。
创意任务一:有创意的可穿戴装饰——可结合多种传感器和灯光效果展示
我用Adafruit Circuit Playground Express做了个创意小挂坠,正常情况下,它会显示各种各样的光效,如果点击两个按钮,会发出相应的声音。同时,板载还有一个开关,推动开关,可以把它变成一个手电筒使用。
心得体会
这次活动选的板子非常适合新手入门,官方准备了非常直观的工具,可以让0基础的同学也立马体验到电子开发的乐趣。同时,板子上也集成了足够多的外设,可玩性非常高。
每个任务的脚本代码: https://download.eeworld.com.cn/detail/%E9%A1%BA%E7%AB%BF%E7%88%AC/633948
- 2024-05-17
-
发表了主题帖:
【2023 DigiKey大赛参与奖】开箱帖 树莓派5
感谢得捷,感谢EEWORLD。300报销奖金,看了一圈还是树莓派5最香,自己补一点直接上。
- 2024-03-03
-
加入了学习《【得捷电子Follow me第4期】全部任务合集》,观看 【得捷电子Follow me第4期】全部任务合集