基于ESP32的足压测量设备
介绍
本仓库主要涉及硬件部分代码,步态测量设备依靠RX-ES-48P矩阵式压力传感器采集足底压力数据,以及MPU6050监测三轴加速度、角度数据,通过ESP32开发板基于MQTT协议上传数据至物联网平台。通过实时采集压力以及加速度数据推算出支撑项、COP压力中心变化曲线、步长等重要步态信息,有助于后续步态分析。
所需设备
-  
ESP32-WROOM-32联网上传数据

 -  
CD74HC4067扩展引脚

 -  
RX-ES-48P鞋垫式压力传感器

 -  
MPU6050加速度传感器

 
资料
- RX-ES-48P

 
建模
- 初版

 
实现流程
- 开发环境Arduino IDE
 - 代码层面
 
使用到了三个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就会发现,上面的那个玩意并不完美,你可以考虑对它进行一些改进,改变他的数据输出值让它更加的直观

比如像这样

MPU6050的数据可视化demo
- 基于processing
 - 首先你需要一个脚部的扫描模型(obj格式)
 - 然后在程序中加载这个模型,并在串口读取MPU6050的角度数据,并实时的更新在脚部模型
 - 这是一个十分简陋的Demo,如果你想实现一些复杂效果,可以尝试Unity、虚幻等功能强大的引擎
 
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]);
     }
   }
 }
 
演示视频
- 阿里云盘:
https://www.aliyundrive.com/s/4QuL32egWNK 
关于作者
- 本项目归属于Maker Studio
 - 本项目由快乐星球团队参与开发
 










