一、前言
最近有人说要靠压力传感器判断站立的位置,然后就有了这篇博客。按理说我们只需要获得xy两个轴的坐标(x,y)就能进行准确的定位。那我们如何通过压力传感器得到重心的坐标呢?
在做一个复杂问题前我们应该先进行分解,找到入手的点。首先只需要测量两个压力传感器反馈力就可以得到一个x轴上的坐标,之后只要加上另外两个就能得到y轴坐标。理论成立开始实验。
(如果不想动脑看公式的可以直接看代码,代码更容易理解)
二、计算步骤:
-
数据采集:
读取每个传感器的电压值。 -
转换为压力值:
假设传感器的输出电压与压力成正比,转换公式为pressure = voltage * sensitivity
,其中sensitivity
是传感器的标定系数。 -
转换为质量:
使用mass = pressure * surface_area / gravity
,其中pressure
是传感器测得的压力,surface_area
是传感器的接触面积,gravity
是重力加速度(通常为 9.81 m/s²)。 -
计算重心:
使用以下公式计算重心坐标(cx, cy)
:
cx = (mass1 * x1 + mass2 * x2) / (mass1 + mass2) cy = (mass1 * y1 + mass2 * y2) / (mass1 + mass2)
三、程序代码
#include <Wire.h> // 如果使用的是I2C接口的压力传感器
// 假设传感器连接到A0和A1
const int sensorPin1 = A0;
const int sensorPin2 = A1;
// 假定传感器的位置
const float x1 = 0.0;
const float y1 = 0.0;
const float x2 = 10.0; // 假设传感器间隔10cm
const float y2 = 0.0;
// 假设传感器的接触面积
const float surfaceArea = 1.0; // 例如1 cm²,根据实际传感器尺寸调整
const float gravity = 9.81; // 重力加速度
void setup() {
Serial.begin(9600);
}
void loop() {
// 读取传感器值
int sensorValue1 = analogRead(sensorPin1);
int sensorValue2 = analogRead(sensorPin2);
// 转换为电压值
float voltage1 = sensorValue1 / 1023.0 * 5.0;
float voltage2 = sensorValue2 / 1023.0 * 5.0;
// 假设电压与压力成正比
float pressure1 = voltage1;
float pressure2 = voltage2;
// 转换为质量
float mass1 = pressure1 * surfaceArea / gravity;
float mass2 = pressure2 * surfaceArea / gravity;
// 计算重心
float cx = (mass1 * x1 + mass2 * x2) / (mass1 + mass2);
float cy = (mass1 * y1 + mass2 * y2) / (mass1 + mass2);
// 输出结果
Serial.print("Center of Mass: ");
Serial.print("X: ");
Serial.print(cx);
Serial.print(", Y: ");
Serial.println(cy);
// 等待一段时间再读取
delay(1000);
}
四、电路图与测试结果:
和以前一样,信号黄线,正极红线,负极黑线。
测量结果:这里用电位器替代了压力传感器的读数,获得x轴的重心坐标,是根据两个传感器读数的差值来判断坐标,当两个传感器压力平衡时重心坐标为5。根据设置两端分别是0和10。(便于理解说是传感器差值,大佬别打我)
另外的Y轴坐标用加上另外两个压力传感器就能获得,复制粘贴一下,改下IO口就可以了,我就不写出来了,祝各位好运~
另外,可以多看看我的其他文章,给我这个免费分享的作者点点赞,谢谢各位了(✪ω✪)(✪ω✪)。