工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

圧力分布をチェックするDIYスマートインソール

コンポーネントと消耗品

>
Arduino MKR1000
× 1
力に敏感な抵抗器
Interlinkモデル402を使用しました
× 3
OpenBuildsワイヤーケーブル-足元
× 1
抵抗10kオーム
× 3
パワーバンク
× 1
SparkFun3軸加速度計ブレイクアウト-ADXL345
× 1

必要なツールとマシン

>
はんだごて(汎用)
はんだ、熱収縮、その他の該当する付属品をお持ちでない場合は、忘れずに購入してください。

アプリとオンラインサービス

>
Thinger.ioプラットフォーム
Arduino IDE

このプロジェクトについて

圧力測定は、すでにさまざまな状況で使用されています。歩行力学に関する情報を提供し、臨床状況やスポーツなど、幅広い用途があります。このプロジェクトでは、センサーを使用して重量分布に関する洞察を取得します。データの理解がはるかに容易になるため、圧力マッピングのリアルタイムの視覚化も組み込まれています。

必要なハードウェア

  • Arduino MKR1000-Wi-Fiを備えたほとんどの3.3Vまたは5Vボードで十分ですが、ESPを使用することはお勧めしません。何らかの理由で、このプロジェクトの作成中に複数のESPボードが不正確な測定値を返しました。
  • 力に敏感な抵抗器(3)。 Interlink 402(100 N)を使用しました。また、もう1つ高価なInterlink 406を使用しましたが、後から考えると402も機能します。精度を上げるには、より多くのFSRを使用します。
  • 10K抵抗。抵抗を変更して、読み取り値が必要な範囲になるようにスケーリングします。抵抗が高いほど、増分は大きくなります。詳細については、こちらをご覧ください。
  • 加速度計、16GADXL345を使用しました。これを使用して、足の加速度と動きを測定します。
  • すべてをまとめるためのはんだごて。ワニ口クリップは、明らかな理由で靴ではうまく機能しません。

配線

<図>

回路に関する簡単なメモ:

FSR: 読む これ あなた 開始 はんだ付け: ワイヤをFSRにはんだ付けするときは、非常に注意してください。スキルがあるかどうかわからない場合は、これを試みないでください。あなたはそれをはんだ付けする必要があります非常に すぐにまたはプラスチックが溶ける。私を信じてください、私はそれを難し​​い方法で見つけました...

FSRにはプラス面もマイナス面もないので、心配する必要はありません。

先に述べたように、抵抗を変更して、読み取り値を好みの範囲に収めることができます。

Ground / 5V: ご覧のとおり、すべてのセンサーは5Vラインとコモンにはんだ付けされています。

加速度計: プロジェクトで加速度計が必要ない場合は、加速度計を省略できます。圧力を測定するだけの場合は使用する必要はありませんが、加速度を測定する場合や歩行周期を分析する場合に便利です。ただし、このチュートリアルでは必ずしも必要ではありません。

ハードウェアをインソールに取り付ける

最初にコードを実行した後にこれを行うことをお勧めします。はんだ付けを間違えた場合は、その時点でそれがわかるからです。これにより、何かを再はんだ付けする必要がある場合に備えて、ハードウェアをインソールに取り付けたり、再取り付けしたりする手間を省くことができます。

FSRはインソールの3点に取り付けられています。左上のFSRは反転を測定し、右上のFSRは反転を測定し、かかとのFSRはかかとの圧力を測定します。 FSRに適した場所を見つけることは、試行錯誤の問題です。それらを取り付けるのに最適な位置は、歩行中にアナログ値が最も変化する場所です。

テープは、ワイヤーを所定の位置に保持するために使用されます。それらが動くと、FSRの読み取りに干渉する可能性があります。また、インソールを所定の位置に保持するために、ソールの下部と靴の内側にベルクロテープを使用しました。

加速度計を使用する場合は、靴のかかとの後ろに加速度計を取り付けます。そのために両面テープを使用しました。

<図>

力の測定

これで、力を測定する準備が整いました。注:次の2つのセクションでは、Thinger.ioライブラリに精通していることを前提としています。詳細については、「Thinger.ioを介してデータを送信する」というタイトルのセクションを参照してください。

プログラムには、WiFi接続データなど、設定に必要な変数を含む、非常に長いヘッダー部分があります。この部分には、プログラムで使用されるグローバル変数(主に配列)も含まれます。私が行った重要な選択の1つは、可能な限り配列を使用することでした。アイデアは、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}; // 3つのデバイスのピンID
float forceMaxArray [3] ={100.0、100.0、100.0}; //サポートされる最大の力
float million =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
フロート電圧Max =0.98 * Vcc; //最大電圧をVccの95%に設定。力をこの値を超える最大値に設定します。
ThingerWifi101thing(USERNAME、DEVICE_ID、DEVICE_CREDENTIAL);

まだすべてを理解していなくても、慌てないでください。残りのコードを見たら、もっと意味があります。

結果を視覚化したい。このために、Thinger.ioWi-Fiライブラリを使用します。この接続は、次の回線を介して設定されます。

  ThingerWifi101thing(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){
things.handle();
}

次に、「圧力」と呼ばれる「もの」を定義します。 「モノ」は、Thinger.ioライブラリの重要な概念です。関数のように動作しますが、特別な構造を持っています。結果データをクラウドに送信する必要があります。このライブラリの詳細については、「Thinger.ioを介してデータを送信する」セクションを参照してください。

「圧力」と呼ばれる「もの」は、3つのFSRセンサーの値を読み取り、シリアルコンソールに出力します。同じ値が「out」チャネルにも送信されます。このようにして、生の入力データを簡単に検証できます。

「電圧」という名前の「もの」では、電圧値が読み取られ、「fsrReading」と呼ばれるローカル変数に格納されます。 「map」関数を使用すると、サポートされている最小値と最大値を基準にして値がスケーリングされ、配列「fsrVoltageArray」に返されます。 forループを介して、各FSRがこの結果配列内に独自の場所を持つようにします。

すべてのコードがセットアップ関数内に配置されていることに注意してください。ループ内には何も入れないでください(おそらく慣れているように)。 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 ["FSR2voltage"] =fsrVoltageArray [1];
out ["FSR3voltage"] =fsrVoltageArray [2];
};
void loop(void){
things.handle ();
// Thinger.ioはそれを好まないので、ここにコードを入れないでください。
}

forループが完了すると、値は出力チャネル「out」に送信されます。各センサーには、「FSR1電圧」のような固有の文字列があります。

「ニュートン」と呼ばれる「もの」は、このプログラムで最も複雑な関数です。電圧をニュートン単位の力に変換します。ここでも、各FSRに対してこれを行うためにforループが使用されます。

いくつかのコーナーケースを区別する必要があるため、計算はかなり複雑です。電圧値が小さすぎるか大きすぎる場合は、力に固定値を割り当てます。電圧がカットオフ値の間にある場合は、対数関数を使用して力を計算します。この関数は、曲線の傾きを減らすために選択されています。

式は概算にすぎないことに注意してください。各センサーには(多少)異なる曲線がある場合がありますが、簡単にするために、ここではこれを区別しません。

計算の結果の値は、配列「fsrForceArray」に格納されます。この場合も、各FSRにはこのアレイ内で独自の位置があります。最終的な3つの値は、「出力」出力チャネルに送信されます。

最後の「もの」関数は「重み」と呼ばれます。力をグラム単位の重量として返すために、単純な変換が適用されます。

  things ["newton"]>> [](pson&out){
for(int FSR =0; FSR //の値電圧Vの関数としての力Fは、次のように計算されます。 //次の3つの状況が区別されます。
//
// 1. Vが最大値(voltesMaxで定義)に近すぎる場合、
//
// 2 。計算された力Fが小さすぎる場合は、ノイズの影響を避けるためにゼロに設定します。
//
// 3.他のすべての場合、対数値を使用してスループを減らし、
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);
}
} // FSRのループの終了
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」を含めます。また、3つの新しいグローバル変数が必要になるため、x、y、z軸の加速度を測定して転送できます

以前に追加したライブラリを削除しないでください。 Thinger.ioへの接続にはこれらが必要です。

次のコードブロックでは、加速度計が応答するかどうかを確認します。そうでなければ、何も起こりません。それ以外の場合は、範囲が定義され、「加速度計」と呼ばれる「もの」が実行されます。これにより、デバイスがクエリされ、x、y、z方向の3つの加速度値が出力の「出力」チャネルに送信されます。

コードのこの部分は、含まれているAdafruitのサンプルコード([ファイル]> [例]> [Adafruit ADXL345])に似ていますが、必要ないため、一部を省略しました。

  #include  
#include
#include
/ *でこのセンサーに一意のIDを割り当てます同時に* /
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);
things ["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は非常に広範なライブラリです。このセクションでは、アプリケーションで必要かつ使用される機能についてのみ説明します。構造は次のとおりです(閉じ中括弧「}」の後のセミコロン「;」に注意してください):

  things []>> [](pson&out)
{
<あなたのコード>
};

これは、C ++ではラムダ関数と呼ばれます。定義を開始するために必須の最初の単語は「thing」であり、関数全体は「thing」とも呼ばれます。

文字列(たとえば、thing ["myFirstThing"])は、関数に名前を付けます。それぞれの「もの」には一意の名前を付ける必要があります。

「>>」記号は、この「もの」に出力値のみがあることを示します。入力が必要な場合は、「<<」に変更してください。入力と出力の両方が必要な場合は、「=」記号を使用する必要があります。この場合、出力値のみがあります。

引数「pson&out」は、出力値が「out」と呼ばれるデータ構造を介して送信されることを意味します。データ型「pson」は非常に柔軟性があり、さまざまな種類の変数を含めることができ、JSONドキュメントもサポートします。

このコードでは、 "out [] =value" t の形式を使用します。 o呼び出しに接続された視覚化ディスプレイに値を送信します "ThingerWifi101thing(USERNAME、DEVICE_ID、DEVICE_CREDENTIAL)" プログラムの最初の部分で。

お気づきかもしれませんが、通常、ループ関数内にはあまりコードがありません。 「thing.handle()」を呼び出すだけで済みます。ループ部分でエンドポイントを呼び出し、リソースをストリーミングすることもできます。他のすべてのコードは、定義した「もの」で処理されます。

「things」内のコードは継続的にループされます。私たちの場合のように、データが定期的に更新される場合は、計算を「モノ」の中に入れることが重要です。

FAQ

何も起こりません!

ワイヤーを確認してください。このレベルで何かが壊れた可能性があります。シリアルモニター内に何も表示されない場合は、コードの最初の行に「#define_DEBUG_」が含まれているかどうかを確認してください。 TLSも干渉している可能性があります。これを無効にすることはできますが、注意してください。また、Thinger.ioへの接続が正常に機能しているかどうかを確認してください。

出力が期待どおりではありません

更新する必要のあるすべてのコードは「モノ」の中にありますか?それが「もの」の外にある場合、それは更新されません。また、明らかな理由もなく、ESPデバイスがFSRセンサーでうまく機能しないこともわかりました。

出力 ない 更新 定期的に

コードに遅延を追加しましたか?それらを削除してください:)Thinger.io自体でリフレッシュレートを設定できます。

すべての出力を1つのグラフにまとめたい

1つの「もの」内にすべてのコードを追加します

よくできました!

このチュートリアルが、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(12345);を定義します。 // Accelerometerint x =0; // 0にリセットinty =0; int z =0; // * FSRセンサー* /#definenoFSRs 3 //接続されているFSRの数#defineFSR1 A1 //アナログポート#defineFSR2 A2 #define FSR3 A3 float fsrVoltageArray [3]; //アナログ読み取り値は変換され、//浮動小数点として電圧にスケーリングされます// numberfloat fsrForceArray [3]; // Newtonfloat fsrWeightInGramsArray [3]の力; //グラムに変換された重みpinArray [3] ={FSR1、FSR2、FSR3}; /// 3つのデバイスのピンIDfloat forceMaxArray [3] ={100.0、100.0、100.0}; //最大力// supportedfloat million =1000000.0; //「1 /マイクロフロート変換の単位ToKgrams =1.0 / 9.80665; long K =1000; long R =10 * K; // R in K Ohmlong Vcc =5000; // 5V =5000mV、3.3V =3300mVフロート電圧Max =0.98 * Vcc; //最大電圧をVccの95%に設定します。//力を//この値を超える最大値に設定します。ThingerWifi101thing(USERNAME、DEVICE_ID、DEVICE_CREDENTIAL); //呼び出してWiFi関数を設定しますvoidsetup(void) {Serial.begin(115200); things.add_wifi(SSID、SSID_PASSWORD); if(!accel.begin()){//センサーを初期化しますSerial.println( "ADXL345が検出されませんでした。");} else {accel.setRange (ADXL345_RANGE_16_G); //このセンサーの範囲["accelerometer"]>> [](pson&out){sensor_event_t event; accel.getEvent(&event); out ["x"] =event.acceleration.x; out [ "y"] =event.acceleration.y; out ["z"] =event.acceleration.z;};} / * FSRセンサー* / things ["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)); }; things ["電圧"]>> [](pson&out){for(int FSR =0; FSR > [](pson&out){for(int FSR =0; FSR > [](pson&out){//ニュートンの力をグラム単位の重量に変換する簡単な計算for(int FSR =0; FSR  

回路図

3つのFSR(分圧器付き)と加速度計。

製造プロセス

  1. スマートバーテンダー
  2. ABBはベアリングの状態をチェックするためのスマートセンサーを導入しました
  3. スマートに:あなたの家の未来
  4. IoTドルを賢く使いましょう
  5. ビル管理システム:スマートシティへのチケット
  6. Python オブジェクトのメモリ使用量を確認する
  7. サプライチェーンの四半期ごとのチェック
  8. Nokia 5110LCDのDIYシンプル20kHzArduinoオシロスコープ
  9. 反応時間を測定する
  10. 不思議な水圧ポンプは、あなたの家で最も大変な労働者になる可能性があります
  11. 圧縮空気システムの圧力損失を減らす