亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

用于检查压力分布的 DIY 智能鞋垫

组件和用品

Arduino MKR1000
× 1
力敏电阻
我使用过 Interlink 模型 402
× 3
OpenBuilds 线缆 - 脚下
× 1
电阻 10k ohm
× 3
移动电源
× 1
SparkFun 三轴加速度计突破 - ADXL345
× 1

必要的工具和机器

烙铁(通用)
如果你没有这些,不要忘记购买焊锡、热缩和其他适用的配件

应用和在线服务

Thinger.io 平台
Arduino IDE

关于这个项目

压力测量已经用于各种情况。它提供有关步态力学的信息,并具有广泛的应用,即在临床情况和运动中。在这个项目中,传感器用于了解重量分布。还包含压力映射的实时可视化,因为它可以更轻松地理解您的数据。

所需硬件

  • Arduino MKR1000 - 大多数带有 Wi-Fi 的 3.3V 或 5V 板都可以完成这项工作,但我不鼓励为此使用 ESP。出于某种原因,多个 ESP 板在创建此项目时返回了不准确的测量值。
  • 力敏电阻器 (3)。我使用了 Interlink 402 (100 N)。我还使用了一种更昂贵的 Interlink 406,但事后看来 402 也可以。使用更多 FSR 以提高准确性。
  • 10K 电阻器。更改电阻器以将您的读数缩放到您想要的范围内。电阻越高,增量越大。在此处查找更多信息。
  • 加速度计,我使用了 16G ADXL345。用它来测量脚的加速度和运动。
  • 将它们组合在一起的烙铁。出于显而易见的原因,鳄鱼夹在鞋子中效果不佳。

接线

关于电路的一些快速说明:

FSR: 阅读 这个 之前 开始 焊接: 将电线焊接到 FSR 时要格外小心。如果您不确定自己是否具备相关技能,请不要尝试这样做。你需要焊接它非常 很快或塑料熔化。相信我,我是通过艰难的方式发现的...

FSR 没有正面或负面之分,因此您不必担心。

正如我之前提到的,您可以更改电阻器以将读数调整到您喜欢的范围内。

接地/5V: 如您所见,所有传感器都焊接到 5V 线和公共端。

加速度计: 如果您的项目不需要加速度计,您可以不使用它。如果您只是想测量压力,则没有必要使用它,但如果您喜欢测量加速度,或者您需要分析步态周期,它可能会派上用场。然而,对于本教程来说,这并不是绝对必要的。

将硬件连接到鞋垫

我建议先运行代码后执行此操作,因为如果您犯了任何焊接错误,您会在那时发现它。如果您需要重新焊接任何东西,这可能会为您省去将硬件连接和重新连接到鞋垫的麻烦。

FSR 附着在鞋垫的三个点上。左上角 FSR 测量外翻,右上 FSR 测量内翻,脚后跟处的 FSR 测量脚后跟压力。为您的 FSR 找到合适的位置是一个尝试的问题。最佳贴附位置是行走时模拟值变化最大的位置。

胶带用于将电线固定到位。如果它们移动,可能会干扰 FSR 读数。我还在鞋底底部和鞋子内侧使用了魔术贴胶带,以便将鞋垫固定到位。

如果您使用加速度计,请将加速度计连接到鞋跟的背面。我为此使用了双面胶带。

测量力

现在我们都准备好测量力了。注意:在接下来的两节中,我假设您熟悉 Thinger.io 库。有关这方面的更多信息,请参阅标题为“通过 Thinger.io 发送数据”的部分。

该程序具有相当长的标题部分,包括设置所需的变量,例如 WiFi 连接数据。这部分还包括程序中用到的全局变量,主要是数组。我做出的一个重要选择是尽可能多地使用数组。这个想法是为每个 FSR 传感器使用单独的阵列元素。所以在这种情况下,数组的长度为 3。

不要因为不必要的副作用而养成使用过多全局变量的习惯。我们使用它们是因为在某些情况下,它们是通过 Thinger.io 发送数据所必需的。

代码在注释中进行了解释。我们将逐步完成代码。您可以在下方下载完整代码。

#define _DEBUG_ //使我们能够使用串行监视器
#include
#include
#include //加速度计
#include //加速度计
#include //加速度计
#include
#define USERNAME "yourUsername"
#define DEVICE_ID "yourDeviceID"
#define DEVICE_CREDENTIAL "yourDeviceCredential"
#define SSID "yourSSID"
#define SSID_PASSWORD "yourSSIDPassword"
///* FSR 传感器*/
#define noFSRs 3 // FSR 连接的数量
#define FSR1 A1
#define FSR2 A2
#define FSR3 A3
float fsrVoltageArray[3 ]; // 将模拟读数转换并缩放为浮点数的电压
float fsrForceArray[3]; // 牛顿力
float fsrWeightInGramsArray[3]; // 重量转换为克
int pinArray[3] ={FSR1, FSR2, FSR3}; // 三个设备的引脚 ID
float forceMaxArray[3] ={100.0, 100.0, 100.0}; // 支持的最大力量
floatmillion =1000000.0; // "1/micro
float conversionToKgrams =1.0/9.80665;
long K =1000;
long R =10*K; // R in K Ohm
long Vcc =5000; // 5V=5000mV, 3.3V =3300 mV
float voltageMax =0.98 * Vcc; // 最大电压设置为 Vcc 的 95%。将力设置为超过此值的最大值。
ThingerWifi101 东西(用户名、DEVICE_ID、DEVICE_CREDENTIAL);

如果您还不了解所有内容,请不要惊慌。一旦你看过其余的代码,它就会更有意义。

我们希望将结果可视化。为此,我们使用 Thinger.io Wi-Fi 库。此连接是通过以下行建立的:

ThingerWifi101 thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL); 

输入参数是通过您在 Thinger.io 上的帐户获得的,因此您需要先进行设置。

在 setup() 函数中,首先建立串行连接。随后调用创建 WiFi 连接。

void setup(void) {
Serial.begin(115200); //开始串口通信
thing.add_wifi(SSID, SSID_PASSWORD); //调用设置WiFi功能
}
void loop(void) {
thing.handle();
}

接下来,我们定义一个叫做“压力”的“东西”。 “事物”是 Thinger.io 库中的一个关键概念。它的行为类似于函数,但具有特殊的结构。需要将结果数据发送到云端。有关此库的更多详细信息,请参见“通过 Thinger.io 发送数据”部分。

称为“压力”的“东西”读取三个 FSR 传感器的值并将它们打印在串行控制台上。相同的值也被发送到“输出”通道。这样,我们就可以轻松验证原始输入数据。

在名为“电压”的“事物”中,电压值被读取并存储在名为“fsrReading”的局部变量中。使用“map”函数,该值相对于支持的最小值和最大值进行缩放,并返回到数组“fsrVoltageArray”中。通过for循环,我们确保每个FSR在这个结果数组中都有自己的位置。

请注意,所有代码都放在 setup 函数中。不要在循环中放入任何东西(你可能已经习惯了)。 Thinger.io 库无法处理...

void setup(void) {
Serial.begin(115200); //开始串口通信
thing.add_wifi(SSID, SSID_PASSWORD); //调用设置WiFi功能
/*FSR传感器*/
thing["pressure"]>> [](pson &out) {
out["FSR1"] =analogRead (FSR1);
Serial.print("FSR1:");
Serial.println(analogRead(FSR1));
out["FSR2"] =analogRead(FSR2);
/> Serial.print("FSR2:");
Serial.println(analogRead(FSR2));
out["FSR3"] =analogRead(FSR3);
Serial.print( "FSR3:");
Serial.println(analogRead(FSR3));
};
thing["电压"]>> [](pson &out) {
for (int FSR =0; FSR fsrVoltageArray[ FSR] =0.0; // 进入时重置值
fsrForceArray[FSR] =0.0;
int fsrPin =pinArray[FSR];
int fsrReading =analogRead(fsrPin);
fsrVoltageArray[FSR] =(float) map(fsrReading, 0, 1023, 0, 5000); //如果您不使用 5V 设备,请将 5000 更改为另一个值
} // FSR 的循环结束
out["FSR1voltage"] =fsrVoltageArray[0];
out ["FSR2电压"] =fsrVoltageArray[1];
out["FSR3voltage"] =fsrVoltageArray[2];
};
void loop(void) {
thing.handle ();
//这里不要放任何代码,因为Thinger.io不会喜欢那样的。
}

在 for 循环完成后,值被发送到输出通道“out”。每个传感器都有一个唯一的字符串,如“FSR1电压”。

名为“牛顿”的“东西”是这个程序中最复杂的函数。它将电压转换为以牛顿为单位的力。再次使用 for 循环为每个 FSR 执行此操作。

计算相当复杂,因为我们需要区分几个极端情况。如果电压值太小或太大,我们为力分配一个固定值。如果电压在截止值之间,则使用对数函数来计算力。选择该函数是为了减小曲线的斜率。

请注意,这些公式只是近似值。每个传感器可能有一条(有些)不同的曲线,但为简单起见,我们在此不做区分。

计算的结果值存储在数组“fsrForceArray”中。同样,每个 FSR 在这个数组中都有自己的位置。三个最终值被发送到“out”输出通道。

最后的“事物”函数称为“权重”。应用简单的转换将力返回为以克为单位的重量。

thing["newton"]>> [](pson &out) {
for (int FSR =0; FSR // 的值力 F 作为电压 V 的函数计算如下: F(V) =(Fmax/Vmax) * V
float force_value =(forceMaxArray[FSR]/voltageMax) * fsrVoltageArray[FSR];
// 区分三种情况:
//
// 1. 如果 V 太接近最大值(由 voltageMax 定义),则
//
// 2 . 如果计算出的力 F 太小,我们将其设置为零以避免噪声影响。
//
// 3. 在所有其他情况下,我们取对数值以减少 sloop 和
if ( fsrVoltageArray[FSR] // V 在这个分支中不会太高
if ( force_value <=1.00 ) {
fsrForceArray[FSR] =0.0; // 力太小,设置为零
} else {
fsrForceArray[FSR] =log10(force_value); // 值没问题,取这个的日志
}
} else {
// 如果电压太接近 Vcc,则限制力(对于 Vcc 它将是无穷大)
fsrForceArray[FSR] =log10(forceMaxArray[FSR]);
Serial.print("为 FSR ="切断激活"); Serial.println(FSR);
}
} // FSRs 循环结束
out["FSR1newton"] =fsrForceArray[0];
out["FSR2newton"] =fsrForceArray[1];
out["FSR3newton"] =fsrForceArray[2];
}; // 事物结束
thing["weight"]>> [](pson &out) {
// 将牛顿的力转换为克的重量的简单计算
for ( int FSR =0; FSR fsrWeightInGramsArray[FSR] =fsrForceArray[FSR] * conversionToKgrams * 1000.0;
}
out["FSR1weight"] =fsrWeightInGramsArray[0];
out["FSR2weight"] =fsrWeightInGramsArray[1];
out["FSR3weight"] =fsrWeightInGramsArray[2];
}; //事情结束

不要忘记在 Thinger.io 上设置仪表板。我想你知道它是如何工作的。

提示 :如果一切正常,您的仪表板应如下所示:

测量加速度

这实际上比测量压力要容易得多。我们需要先在头部部分添加一些代码。我们从包括库“Wire.h”(为了与 SDA 和 SDL 引脚通信)、“Adafruit_Sensor.h”和“Adafruit_ADXL345_U.h”开始。我们还需要三个新的全局变量,以便我们可以测量和传递 x、y 和 z 轴上的加速度

不要删除您之前添加的库。您将需要这些来连接到 Thinger.io。

在下一个代码块中,我们检查加速度计是否做出响应。如果没有,什么都不会发生。否则,定义范围并执行称为“加速度计”的“事物”。这会查询设备并将 x、y 和 z 方向的三个加速度值发送到输出“out”通道。

这部分代码类似于Adafruit包含的示例代码(文件>示例>Adafruit ADXL345),但我省略了一些部分,因为我们不需要它们。

#include 
#include
#include
/* 在同时*/
Adafruit_ADXL345_Unified accel =Adafruit_ADXL345_Unified(12345);
int x =0;
int y =0;
int z =0;
void setup(void) {
Serial.begin(115200);
if(!accel.begin()) { // 初始化传感器
Serial.println("No检测到 ADXL345");
} else {
// 此传感器的范围 - 如果您不知道范围,请运行
// Adafruit 提供的 ADXL345 示​​例代码的 displayDataRate
accel.setRange(ADXL345_RANGE_16_G);
thing["accelerometer"]>> [](pson&out){ // Thinger.io的新“thing”函数
sensors_event_t event;
accel.getEvent(&event); // 获取一个新的传感器事件
out["x"] =event.acceleration.x; // 显示结果(加速度单位为 m/s^2)
out["y"] =event.acceleration.y;
out["z"] =event.acceleration.z;
Serial.print("X:"); Serial.print(event.acceleration.x); Serial.print(" ");
Serial.print("Y:"); Serial.print(event.acceleration.y); Serial.print(" ");
Serial.print("Z:"); Serial.print(event.acceleration.z); Serial.print(" ");Serial.println("m/s^2");
}; //事物结束
} //if/else 语句结束
}

提示: 运行上面的代码后,您的输出应该类似于下面显示的示例

把它们放在一起

请在页面底部找到完整代码:)

通过 Thinger.io 发送数据

这个库在这里有很好的文档记录,但这里有一些重要的信息,可以让“事物”(没有双关语)更容易编写和使用。

Thinger.io 是一个非常广泛的库。在本节中,我们仅涵盖我们的应用程序中所需和使用的功能。结构如下(注意大括号“}”后面的分号“;”):

thing[]>> [](pson&out)
{
<你的代码>
};

这在 C++ 中称为 lambda 函数。定义开头的强制第一个词是“thing”,整个功能也称为“thing”。

字符串(例如 thing["myFirstThing"] )为函数命名。每个“事物”都需要有一个唯一的名称。

“>>”符号表示这个“事物”只有输出值。如果需要输入,请将其更改为“<<”。如果需要输入和输出,则应使用“=”符号。在我们的例子中,我们只有输出值。

参数“pson &out”意味着我们的输出值是通过名为“out”的数据结构发送的。数据类型“pson”非常灵活,可以包含各种类型的变量,也支持JSON文档。

在我们的代码中,我们使用形式 "out[] =value" t o 将值发送到与调用连接的可视化显示 "ThingerWifi101 thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL)" 在程序的第一部分。

您可能已经注意到,循环函数中通常没有太多代码。你只需要调用“thing.handle()”。您也可以在循环部分调用端点和流资源。所有其他代码都在您定义的“事物”中处理。

“事物”中的代码不断循环。如果您的数据定期更新,那么将您的计算放在“事物”中很重要,就像我们的例子一样。

常见问题

什么都没发生!

检查你的电线。有可能在这个级别出现问题。如果串行监视器中没有任何内容,请检查“#define _DEBUG_”是否在代码的第一行。 TLS 也可能会产生干扰。您可以禁用它,但要小心。还要检查您与 Thinger.io 的连接是否运行良好。

输出不符合预期

所有需要更新的代码都在一个“事物”中吗?如果它在“事物”之外,则不会更新。我还发现 ESP 设备无缘无故地无法与 FSR 传感器很好地配合使用。

输出 不是 更新 定期

您是否在代码中添加了任何延迟?删除它们 :) 您可以在 Thinger.io 本身上设置刷新率。

我更喜欢将所有输出放在一张图中

将所有代码添加到一个“事物”中

干得好!

我希望本教程能帮助您了解 FSR 传感器、加速度计和 Thinger.io 的基础知识。我很乐意阅读任何改进此代码的建议,请不要害羞并分享您的创作!

代码

  • 智能鞋垫教程
智能鞋垫教程Arduino
本教程的完整代码
#define _DEBUG_ //确保这在任何其他包含之前出现,否则您的开发板可能会崩溃/*请在此处找到教程:https://www.hackster.io/projects/a5ceae*/# include  //Thinger#include  //Thinger#include  //Accelerometer#include  //Accelerometer#include  //Accelerometer#定义 USERNAME "yourUsername"#define DEVICE_ID "yourDevice"#define DEVICE_CREDENTIAL "yourCredential"#define SSID "yourSSID"#define SSID_PASSWORD "yourSSIDPassword"Adafruit_ADXL345_Unified accel =Adafruit_ADXL345_Unified(12) //加速度计int x =0; //重置为0 int y =0;int z =0; //*FSR 传感器*/#define noFSRs 3 // FSR 连接的数量#define FSR1 A1 //模拟端口#define FSR2 A2 #define FSR3 A3 float fsrVoltageArray[3]; // 模拟读数转换并 // 缩放为电压作为浮点 //numberfloat fsrForceArray[3]; // Newtonfloat 中的力 fsrWeightInGramsArray[3]; // 权重转换为gramsint pinArray[3] ={FSR1, FSR2, FSR3}; // 三个设备的引脚 IDfloat forceMaxArray[3] ={100.0, 100.0, 100.0}; // 最大力量 //supportedfloatmillion =1000000.0; //单位为“1/microfloat conversionToKgrams =1.0/9.80665;long K =1000;long R =10*K; // R in K Ohmlong Vcc =5000; // 5V=5000mV, 3.3V =3300 mVfloat voltageMax =0.98 * Vcc; // 最大电压设置为 Vcc 的 95%。设置 // 超出此值的最大力 //value.ThingerWifi101 thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL); //调用设置 WiFi 函数void setup(void) { Serial.begin(115200); thing.add_wifi(SSID, SSID_PASSWORD); if(!accel.begin()) { //初始化传感器Serial.println("No ADXL345 detection."); } else { accel.setRange (ADXL345_RANGE_16_G); //这个传感器的范围["加速度计"]>> [](pson&out){sensors_event_t event; accel.getEvent(&event); out["x"] =event.acceleration.x; out[ "y"] =event.acceleration.y; out["z"] =event.acceleration.z; }; } /*FSR 传感器*/ thing["pressure"]>> [](pson &out) { out ["FSR1"] =analogRead(FSR1); // Serial.print("FSR1:"); // Serial.println(analogRead(FSR1)); out["FSR2"] =analogRead(FSR2); // Serial .print("FSR2:"); // S erial.println(analogRead(FSR2));出[“FSR3”] =模拟读取(FSR3); // Serial.print("FSR3:"); // Serial.println(analogRead(FSR3)); };东西[“电压”]>> [](pson &out) { for (int FSR =0; FSR > [](pson &out) { for (int FSR =0; FSR > [](pson &out) { //将牛顿的力转换为以克为单位的重量的直接计算 for (int FSR =0; FSR  

示意图

三个 FSR(带分压器)和一个加速度计。

制造工艺

  1. Smart Bartender
  2. ABB 推出智能传感器来检查轴承状况
  3. 变得聪明:你家的未来
  4. 明智地使用您的物联网美元
  5. 建筑管理系统:通往智慧城市的门票
  6. 检查 Python 对象的内存使用情况
  7. 每季度检查您的供应链
  8. 诺基亚 5110 LCD 上的 DIY 简单 20 kHz Arduino 示波器
  9. DIY 灵敏 ADXL335 地震探测器
  10. 测量你的反应时间
  11. 神秘的水压泵可能是您家中最辛苦的工人
  12. 减少压缩空气系统中的压降