
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
本仓库主要涉及硬件部分代码,步态测量设备依靠RX-ES-48P矩阵式压力传感器采集足底压力数据,以及MPU6050监测三轴加速度、角度数据,通过ESP32开发板基于MQTT协议上传数据至物联网平台。通过实时采集压力以及加速度数据推算出支撑项、COP压力中心变化曲线、步长等重要步态信息,有助于后续步态分析。
ESP32-WROOM-32联网上传数据
CD74HC4067扩展引脚
RX-ES-48P鞋垫式压力传感器
MPU6050加速度传感器
使用到了三个Arduino库实现WIFI连接,MQTT订阅、以及JSON数据打包
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
传感器的48个点位数据并不是同时测量的,而是采用逐行扫描的方式,可以参考矩阵式键盘
为了方便大家了解矩阵式传感器的读取原理,我在Thinkcad上创建了一个演示Demo
Demo使用Arduino 2650实现,但原理一致,你也可以使用小熊派或者STM32实现
//Third order matrix
int c1 = A3;
int c2 = A4;
int c3 = A5;
int r1 = 7;
int r2 = 6;
int r3 = 5;
int SIG_pin[] = {c1,c2,c3};
void setup(){
pinMode(r1, OUTPUT);
pinMode(r2, OUTPUT);
pinMode(r3, OUTPUT);
digitalWrite(r1, LOW);
digitalWrite(r2, LOW);
digitalWrite(r3, LOW);
Serial.begin(9600);
}
void loop(){
double v;
for(int i=0; i < 3; i++){
readMux(i);
}
Serial.println(" ");
delay(200);
}
int readMux(int channel){
int controlPin[] = {r1,r2,r3};
int muxChannel[3][3] = {
{1,0,0}, //R1
{0,1,0}, //R2
{0,0,1}, //R3
};
//loop through the 4 sig
for(int i=0; i < 3 ; i++){
digitalWrite(controlPin[i], muxChannel[channel][i]);
}
for(int i=0;i<3;i++){
int val = analogRead(SIG_pin[i]);
Serial.print(val);
Serial.print(" ");
}
Serial.println();
}
如果你运行了上面的demo就会发现,上面的那个玩意并不完美,你可以考虑对它进行一些改进,改变他的数据输出值让它更加的直观
比如像这样
import processing.serial.*;
import java.awt.event.KeyEvent;
import java.io.IOException;
Serial myPort;
String data="";
float roll, pitch,yaw;
PShape rocket;
void setup() {
size (800, 600, P3D);
rocket = loadShape("D://OBJ_Model//Man_v1.obj");
myPort = new Serial(this, "COM3", 115200);//need to modify
myPort.bufferUntil('\n');
}
void draw() {
background(200);
translate(width/2, height/2 -100, -3000);
text("Roll: " + int(roll) + " Pitch: " + int(pitch), -100, 265);
rotateX(radians(pitch));
rotateZ(radians(roll));
shape(rocket);
textSize(30);
fill(243, 23, 40);
textSize(25);
fill(200, 250, 250);
}
void serialEvent (Serial myPort) {
data = myPort.readStringUntil('\n');
if (data != null) {
data = trim(data);
String items[] = split(data, '/');
if (items.length > 1) {
roll = float(items[0]);
pitch = float(items[1]);
}
}
}