電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>Arduino智能鞋墊來(lái)檢查你的壓力分布

Arduino智能鞋墊來(lái)檢查你的壓力分布

2022-10-26 | zip | 0.10 MB | 次下載 | 免費(fèi)

資料介紹

描述

壓力測(cè)量已經(jīng)在各種情況下使用。它提供有關(guān)步態(tài)力學(xué)的信息并具有廣泛的應(yīng)用,例如在臨床情況和運(yùn)動(dòng)中。在這個(gè)項(xiàng)目中,傳感器用于深入了解重量分布。還包含壓力映射的實(shí)時(shí)可視化,因?yàn)樗鼓菀桌斫饽臄?shù)據(jù)。

所需硬件

  • Arduino MKR1000 - 大多數(shù)帶有 Wi-Fi 的 3.3V 或 5V 板都可以完成這項(xiàng)工作,但我不鼓勵(lì)為此使用 ESP。由于某種原因,多個(gè) ESP 板在創(chuàng)建此項(xiàng)目時(shí)返回了不準(zhǔn)確的測(cè)量值。
  • 力敏電阻器 (3)。我使用了 Interlink 402 (100 N)。我還使用了更昂貴的 Interlink 406,但事后看來(lái),402 也可以。使用更多 FSR 以獲得更好的準(zhǔn)確性。
  • 10K 電阻。更改電阻器以將讀數(shù)縮放到您想要的范圍內(nèi)。電阻越高,增量越大。在此處查找更多信息。
  • 加速度計(jì),我用的是 16G ADXL345。使用它來(lái)測(cè)量腳的加速度和運(yùn)動(dòng)。
  • 一個(gè)烙鐵把它們放在一起。由于顯而易見(jiàn)的原因,鱷魚(yú)夾在鞋子中不能很好地工作。

接線

?
pYYBAGNYjcKAXNpPAAFYV9al5ao801.png
我們的硬件示意圖
?

關(guān)于電路的一些快速說(shuō)明:

FSR:在開(kāi)始焊接之前閱讀內(nèi)容:將電線焊接到 FSR 時(shí)要格外小心。如果您不確定自己是否具備技能,請(qǐng)不要嘗試這樣做。您需要非常快速地焊接它,否則塑料會(huì)熔化。相信我,我發(fā)現(xiàn)它很困難......

FSR 沒(méi)有正面或負(fù)面的一面,因此您不必?fù)?dān)心。

正如我之前提到的,您可以更改電阻以將讀數(shù)調(diào)整到您喜歡的范圍內(nèi)。

接地/5V:如您所見(jiàn),所有傳感器都焊接到 5V 線和公共端。

加速度計(jì):如果您的項(xiàng)目不需要加速度計(jì),您可以不使用它。如果您只是想測(cè)量壓力,則不必使用它,但如果您想測(cè)量加速度,或者需要分析步態(tài)周期,它可能會(huì)派上用場(chǎng)。然而,這對(duì)于本教程并不是絕對(duì)必要的。

將硬件連接到鞋墊

我建議先運(yùn)行代碼后執(zhí)行此操作,因?yàn)槿绻噶巳魏魏附渝e(cuò)誤,您會(huì)在那時(shí)發(fā)現(xiàn)它。如果您需要重新焊接任何東西,這可能會(huì)為您節(jié)省一些將硬件連接和重新連接到鞋墊的麻煩。

FSR 固定在鞋墊的三個(gè)點(diǎn)上。左上 FSR 測(cè)量外翻,右上 FSR 測(cè)量?jī)?nèi)翻,足跟處的 FSR 測(cè)量足跟壓力。為您的 FSR 找到合適的位置是一個(gè)嘗試的問(wèn)題。安裝它們的最佳位置是行走時(shí)模擬值變化最大的位置。

膠帶用于將電線固定到位。如果它們移動(dòng),可能會(huì)干擾 FSR 讀數(shù)。我還在鞋底底部和鞋內(nèi)側(cè)使用了魔術(shù)貼,以將鞋墊固定到位。

如果您使用加速度計(jì),請(qǐng)將加速度計(jì)連接到鞋跟的后部。為此,我使用了雙面膠帶。

?
poYBAGNYjciAdwajAAjIoNdYEqA017.jpg
FSR的位置
?

測(cè)量力

現(xiàn)在我們都準(zhǔn)備好測(cè)量力了。注意:在接下來(lái)的兩節(jié)中,我假設(shè)您熟悉 Thinger.io 庫(kù)。有關(guān)這方面的更多信息,請(qǐng)參閱標(biāo)題為“通過(guò) Thinger.io 發(fā)送數(shù)據(jù)”的部分。

該程序有相當(dāng)長(zhǎng)的標(biāo)題部分,包括設(shè)置所需的變量,如 WiFi 連接數(shù)據(jù)。這部分還包括程序中使用的全局變量,主要是數(shù)組。我做出的一個(gè)重要選擇是盡可能多地使用數(shù)組。這個(gè)想法是為每個(gè) FSR 傳感器使用單獨(dú)的陣列元素。所以在這種情況下,數(shù)組的長(zhǎng)度為 3。

不要養(yǎng)成使用太多全局變量的習(xí)慣,因?yàn)闀?huì)有不必要的副作用。我們之所以使用它們,是因?yàn)樵谀承┣闆r下,它們是通過(guò)Thinger.io發(fā)送數(shù)據(jù)所必需的。

代碼在評(píng)論中解釋。我們將逐步完成代碼。您可以下載下面的完整代碼。

#define _DEBUG_ //enables us to use the Serial Monitor
#include 
#include 
#include  //Accelerometer
#include  //Accelerometer
#include  //Accelerometer
#include 
#define USERNAME "yourUsername"
#define DEVICE_ID "yourDeviceID"
#define DEVICE_CREDENTIAL "yourDeviceCredential"
#define SSID "yourSSID"
#define SSID_PASSWORD "yourSSIDPassword"
//*FSR sensors*/
#define noFSRs 3 // Number of FSRs connected
#define FSR1 A1 
#define FSR2 A2 
#define FSR3 A3 
float fsrVoltageArray[3];       // The analog reading converted and scaled to voltage as a floating point number
float fsrForceArray[3];         // The force in Newton
float fsrWeightInGramsArray[3]; // Weight converted to grams
int   pinArray[3]       = {FSR1, FSR2, FSR3};    // The pin ID for the three devices
float forceMaxArray[3]  = {100.0, 100.0, 100.0}; // Maximum forces supported
float million = 1000000.0; // Unit for "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; // Maximum voltage set to 95% of Vcc. Set the force to the maximum beyond this value.
ThingerWifi101 thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL);

如果您還不了解所有內(nèi)容,請(qǐng)不要驚慌。一旦你看過(guò)其余的代碼,它就會(huì)更有意義。

我們想要可視化結(jié)果。為此,我們使用 Thinger.io Wi-Fi 庫(kù)。此連接通過(guò)以下行設(shè)置:

ThingerWifi101 thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL);

輸入參數(shù)是通過(guò)您在 Thinger.io 上的帳戶獲得的,因此您需要先進(jìn)行設(shè)置。

在 setup() 函數(shù)中,首先建立串行連接。隨后調(diào)用創(chuàng)建 WiFi 連接。

void setup(void) {
 Serial.begin(115200); //Start Serial Communication
 thing.add_wifi(SSID, SSID_PASSWORD); //call to set up WiFi function
}
void loop(void) {
 thing.handle();
}

接下來(lái),我們定義一個(gè)叫做“壓力”的“事物”。“事物”是Thinger.io庫(kù)中的一個(gè)關(guān)鍵概念。它的行為類似于函數(shù),但具有特殊的結(jié)構(gòu)。需要將結(jié)果數(shù)據(jù)發(fā)送到云端。有關(guān)此庫(kù)的更多詳細(xì)信息,請(qǐng)參閱“通過(guò) Thinger.io 發(fā)送數(shù)據(jù)”部分。

稱為“壓力”的“事物”讀取三個(gè) FSR 傳感器的值并將它們打印在串行控制臺(tái)上。相同的值也被發(fā)送到“out”通道。通過(guò)這種方式,我們可以很容易地驗(yàn)證原始輸入數(shù)據(jù)。

在名為“電壓”的“事物”中,讀取電壓值并將其存儲(chǔ)在名為“fsrReading”的局部變量中。使用“map”函數(shù),該值相對(duì)于支持的最小值和最大值進(jìn)行縮放,并返回到數(shù)組“fsrVoltageArray”中。通過(guò) for 循環(huán),我們確保每個(gè) FSR 在這個(gè)結(jié)果數(shù)組中都有自己的位置。

請(qǐng)注意,所有代碼都放在 setup 函數(shù)中。不要在循環(huán)中放任何東西(你可能已經(jīng)習(xí)慣了)。Thinger.io庫(kù)無(wú)法處理...

void setup(void) {
 Serial.begin(115200); //Start Serial Communication
 thing.add_wifi(SSID, SSID_PASSWORD); //call to set up WiFi function
  /*FSR sensors*/  
 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["voltage"] >> [](pson & out) {
   for (int FSR = 0; FSR < noFSRs; FSR++) {   
     fsrVoltageArray[FSR] = 0.0; // Reset values upon entry
     fsrForceArray[FSR]   = 0.0;
     int fsrPin   = pinArray[FSR];     
     int fsrReading = analogRead(fsrPin); 
     fsrVoltageArray[FSR] = (float) map(fsrReading, 0, 1023, 0, 5000); //change the 5000 to another value if you don't use a 5V device
   } //end of loop over FSR's
   out["FSR1voltage"] = fsrVoltageArray[0];
   out["FSR2voltage"] = fsrVoltageArray[1];
   out["FSR3voltage"] = fsrVoltageArray[2];
 };
void loop(void) {
 thing.handle();
  //Don't put any code here because Thinger.io won't like that.
}

在 for 循環(huán)完成后,這些值被發(fā)送到輸出通道“out”。每個(gè)傳感器都有一個(gè)唯一的字符串,例如“FSR1voltage”。

名為“newton”的“事物”是這個(gè)程序中最復(fù)雜的函數(shù)。它將電壓轉(zhuǎn)換為以牛頓為單位的力。再次使用 for 循環(huán)對(duì)每個(gè) FSR 執(zhí)行此操作。

計(jì)算相當(dāng)復(fù)雜,因?yàn)槲覀冃枰獏^(qū)分幾個(gè)極端情況。如果電壓值太小或太大,我們?yōu)榱Ψ峙湟粋€(gè)固定值。如果電壓在截止值之間,則使用對(duì)數(shù)函數(shù)來(lái)計(jì)算力。選擇此功能是為了減小曲線的斜率。

請(qǐng)注意,這些公式只是近似值。每個(gè)傳感器可能有(有些)不同的曲線,但為簡(jiǎn)單起見(jiàn),我們?cè)诖瞬患右詤^(qū)分。

計(jì)算的結(jié)果值存儲(chǔ)在數(shù)組“fsrForceArray”中。同樣,每個(gè) FSR 在此數(shù)組中都有自己的位置。三個(gè)最終值被發(fā)送到“out”輸出通道。

最后的“事物”函數(shù)稱為“權(quán)重”。應(yīng)用直接轉(zhuǎn)換以將力返回為以克為單位的重量。

thing["newton"] >> [](pson & out) {
   for (int FSR = 0; FSR < noFSRs; FSR++) {  
        // The value of the force F as a function of the voltage V is computed as: F(V) = (Fmax/Vmax) * V
        float force_value = (forceMaxArray[FSR]/voltageMax) * fsrVoltageArray[FSR];
        // Three situations are distinguished:
       //
        // 1. If V is too close to the maximum (as defined by voltageMax), the 
        //
        // 2. If the computed force F is too small, we set it to zero to avoidnoise effects.
        //
        // 3. In all other cases, we take the logarithmic value to reduce the sloop and
        if ( fsrVoltageArray[FSR] < voltageMax ) {
          // V is not too high in this branch
          if ( force_value <= 1.00 ) {
             fsrForceArray[FSR] = 0.0; // Force is too small, set it to zero
          } else {
            fsrForceArray[FSR] = log10(force_value); // Value is okay, take the log of this
          }
       } else {
          // Cap the force if the voltage is too close to Vcc (for Vcc it would be infinity)
          fsrForceArray[FSR] = log10(forceMaxArray[FSR]);
          Serial.print("Cut off activated for FSR = "); Serial.println(FSR);
       }
  } // End of loop over FSRs
     out["FSR1newton"] = fsrForceArray[0];
     out["FSR2newton"] = fsrForceArray[1];
     out["FSR3newton"] = fsrForceArray[2];
 }; //end of thing 
   thing["weight"] >> [](pson & out) {
   // Straightforward computation to convert the force in Newton to the weight in grams
   for (int FSR = 0; FSR < noFSRs; FSR++) {  
     fsrWeightInGramsArray[FSR] = fsrForceArray[FSR] * conversionToKgrams * 1000.0;
   }
     out["FSR1weight"] = fsrWeightInGramsArray[0];
     out["FSR2weight"] = fsrWeightInGramsArray[1];
     out["FSR3weight"] = fsrWeightInGramsArray[2];
 }; //end of thing

不要忘記在 Thinger.io 上設(shè)置儀表板。我假設(shè)你知道它是如何工作的。

提示:如果一切都按預(yù)期工作,您的儀表板應(yīng)該如下所示:

?
poYBAGNYjcyAYkaRAAQzd1Ek0tM184.png
Thinger.io 儀表板
?

測(cè)量加速度

這實(shí)際上比測(cè)量壓力要容易得多。我們需要先在標(biāo)題部分添加一些代碼。我們首先包括庫(kù)“Wire.h”(為了與 SDA 和 SDL 引腳通信)、“Adafruit_Sensor.h”和“Adafruit_ADXL345_U.h”。我們還需要三個(gè)新的全局變量,這樣我們就可以測(cè)量和傳輸 x、y 和 z 軸上的加速度

不要?jiǎng)h除您之前添加的庫(kù)。您將需要這些來(lái)連接到Thinger.io。

在下一個(gè)代碼塊中,我們檢查加速度計(jì)是否響應(yīng)。如果沒(méi)有,什么都不會(huì)發(fā)生。否則,定義范圍并執(zhí)行稱為“加速度計(jì)”的“事物”。這會(huì)查詢?cè)O(shè)備并將 x、y 和 z 方向的三個(gè)加速度值發(fā)送到輸出“out”通道。

這部分代碼類似于 Adafruit 包含的示例代碼(文件 > 示例 > Adafruit ADXL345),但我省略了一些部分,因?yàn)槲覀儾恍枰鼈儭?/font>

#include 
#include 
#include 
/* Assign a unique ID to this sensor at the same time */
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()) {   // Initialize the sensor
  Serial.println("No ADXL345 detected");
} else {
  // Range for this sensor - If you don't know the range run the
  // displayDataRate of the example code of the ADXL345 provided by Adafruit
  accel.setRange(ADXL345_RANGE_16_G);
 thing["accelerometer"] >> [](pson& out){ // A new "thing" function for Thinger.io
     sensors_event_t event;
     accel.getEvent(&event);  // Get a new sensor event
     out["x"] = event.acceleration.x;  // Display the results (acceleration is measured in 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 ");
 }; //end of thing
} //end of if/else statement
}

提示:運(yùn)行上面的代碼后,您的輸出應(yīng)該類似于下面顯示的示例

?
poYBAGNYjdCAISgDAALs38MwRBM534.png
Thinger.io 中加速度計(jì)的輸出
?

把它們放在一起

請(qǐng)?jiān)陧?yè)面底部找到完整代碼:)

通過(guò) Thinger.io 發(fā)送數(shù)據(jù)

這個(gè)庫(kù)在這里有很好的文檔,但這里有一些重要信息可以使“事物”(不是雙關(guān)語(yǔ))更容易編寫和使用。

Thinger.io是一個(gè)非常廣泛的庫(kù)。在本節(jié)中,我們只介紹我們的應(yīng)用程序中需要和使用的功能。結(jié)構(gòu)如下(注意右花括號(hào)“}”后面的分號(hào)“;”):

thing[] >> [](pson& out)
   {
       <your code>
   };

這在 C++ 中稱為 lambda 函數(shù)。開(kāi)始定義的強(qiáng)制性第一個(gè)詞是“事物”,整個(gè)功能也稱為“事物”。

字符串(例如 thing["myFirstThing"] )為函數(shù)命名。每個(gè)“事物”都需要有一個(gè)唯一的名稱。

“>>”符號(hào)表示這個(gè)“事物”只有輸出值。如果需要輸入,請(qǐng)將其更改為“<<”。如果需要輸入和輸出,則應(yīng)使用“=”符號(hào)。在我們的例子中,我們只有輸出值。

參數(shù)“pson &out”意味著我們的輸出值是通過(guò)一個(gè)名為“out”的數(shù)據(jù)結(jié)構(gòu)發(fā)送的。數(shù)據(jù)類型“pson”非常靈活,可以包含各種類型的變量,還支持JSON文檔。

在我們的代碼中,我們使用o 向與程序第一部分中的"out[] = value" t調(diào)用連接的可視化顯示發(fā)送值的形式。"ThingerWifi101 thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL)"

您可能已經(jīng)注意到,循環(huán)函數(shù)內(nèi)通常沒(méi)有太多代碼。你只需要調(diào)用“thing.handle()”。您也可以在循環(huán)部分調(diào)用端點(diǎn)和流資源。所有其他代碼都在您定義的“事物”中處理。

“事物”中的代碼不斷循環(huán)。如果您的數(shù)據(jù)定期更新,就像我們的例子一樣,將您的計(jì)算放在“事物”中很重要。

常問(wèn)問(wèn)題

什么都沒(méi)發(fā)生!

檢查你的電線。有可能在這個(gè)級(jí)別出現(xiàn)了問(wèn)題。如果串行監(jiān)視器中沒(méi)有出現(xiàn)任何內(nèi)容,請(qǐng)檢查“#define _DEBUG_”是否在代碼的第一行。TLS 也可能會(huì)產(chǎn)生干擾。您可以禁用它,但要小心。還要檢查您與Thinger.io的連接是否正常。

輸出不如預(yù)期

是否所有需要在“事物”中更新的代碼?如果它在“事物”之外,則不會(huì)更新。我還發(fā)現(xiàn) ESP 設(shè)備無(wú)緣無(wú)故無(wú)法與 FSR 傳感器很好地配合使用。

輸出沒(méi)有定期更新_ _

您是否在代碼中添加了任何延遲?刪除它們 :) 您可以在Thinger.io本身上設(shè)置刷新率。

我希望將所有輸??出都放在一張圖中

將所有代碼添加到單個(gè)“事物”中

做得好!

我希望本教程能幫助您了解 FSR 傳感器、加速度計(jì)和 Thinger.io 的基礎(chǔ)知識(shí)。我很樂(lè)意閱讀任何改進(jìn)此代碼的建議,請(qǐng)不要害羞并分享您的創(chuàng)作!


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊(cè)
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開(kāi)發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊(cè)
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)