基于ESP32的足压测量设备 原创 精华

ITACMI
发布于 2022-4-15 19:12
浏览
4收藏

基于ESP32的足压测量设备

介绍

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

所需设备

  • ESP32-WROOM-32联网上传数据
    基于ESP32的足压测量设备-鸿蒙开发者社区

  • CD74HC4067扩展引脚
    基于ESP32的足压测量设备-鸿蒙开发者社区

  • RX-ES-48P鞋垫式压力传感器
    基于ESP32的足压测量设备-鸿蒙开发者社区

  • MPU6050加速度传感器
    基于ESP32的足压测量设备-鸿蒙开发者社区

资料

  • RX-ES-48P
    基于ESP32的足压测量设备-鸿蒙开发者社区

建模

  • 初版
    基于ESP32的足压测量设备-鸿蒙开发者社区

实现流程

  • 开发环境Arduino IDE
  • 代码层面

使用到了三个Arduino库实现WIFI连接,MQTT订阅、以及JSON数据打包

#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
  • 矩阵式压力传感器的数据读取

传感器的48个点位数据并不是同时测量的,而是采用逐行扫描的方式,可以参考矩阵式键盘

为了方便大家了解矩阵式传感器的读取原理,我在Thinkcad上创建了一个演示Demo

基于ESP32的足压测量设备-鸿蒙开发者社区

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就会发现,上面的那个玩意并不完美,你可以考虑对它进行一些改进,改变他的数据输出值让它更加的直观

基于ESP32的足压测量设备-鸿蒙开发者社区

比如像这样

基于ESP32的足压测量设备-鸿蒙开发者社区

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]);
     }
   }
 }

演示视频

关于作者

  • 本项目归属于Maker Studio
  • 本项目由快乐星球团队参与开发

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
已于2022-4-15 19:22:33修改
4
收藏 4
回复
举报
2条回复
按时间正序
/
按时间倒序
Sherry辛巳
Sherry辛巳

作者牛呀,看了这个顿时顿悟了!

1
回复
2022-4-16 23:06:40
wx628b4c8dcbc42
wx628b4c8dcbc42

这个鞋垫传感器的模拟信号采集是直接使用的串联电阻分压吗?串联的电阻阻值大概是多少啊

回复
2022-5-23 16:58:50
回复
    相关推荐