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

TinyMLで植物の健康状態を判断する

コンポーネントと消耗品

>
Arduino Nano 33 BLE Sense
× 1
ディジレントステッピングモーター
× 1
テレミノシステム用ステッピングモーター用テレミノドライバーDRV8825
× 1

必要なツールとマシン

>
3Dプリンター(汎用)
はんだごて(汎用)

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

>
MicrosoftVSコード
Arduino IDE
Edge Impulse Studio

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

前提

人間と同じように、植物も病気になる可能性があります。そして、皮膚感染症から発疹を発症するのと同じように、植物の葉は、真菌や他の病原体によって黄変したり、しみができたりする可能性があります。したがって、機械学習の力を活用することで、色をスキャンして、葉の色が消えたことを検出できるモデルをトレーニングするために使用できます。

ハードウェア

このプロジェクトの頭脳はArduinoNano 33 BLE Senseであり、いくつかの理由で選ばれました。まず、9DoF IMU、APDS-9960(色、ジェスチャー、近接、明るさ)、マイク、温度/湿度/圧力センサーの組み合わせなど、強力なセンサーの豊富なセットがあります。植物の葉の周りでボードを動かして測定を行うために、1対のステッピングモーターが1対のDRV8825ドライバーボードと組み合わせて使用​​されます。

<図> <図>

TinyMLの設定

このプロジェクトでは、Arduino Nano 33 BLE Sense on Edge Impulseにリストされている組み込みセンサーは、アクセラレータとマイクのみがリストされているため、機能しません。これは、シリアルデーモンの代わりにデータフォワーダーを使用する必要があることを意味します。まず、新しいプロジェクトを作成して名前を付けました。次に、Node.jsとNPMをインストールしてEdge Impulse CLIをインストールし、 npm install -g edge-impulse-cli を実行しました。 。インストールパスが見つからない場合は、PATH環境変数にインストールパスを追加する必要がある場合があります。次に、 edge-impulse-data-forwarder を実行します 動作することを確認してから、Ctrl + Cを使用して終了します。

<図>

読書の色

APDS-9960は、表面で赤外線を反射し、材料に吸収されない波長を読み取ることで色を読み取ります。センサーと通信するには、Arduino APDS9960ライブラリをインストールすることをお勧めします。これにより、いくつかの便利な機能にアクセスできます。コードでは、APDS-9960が最初に初期化され、次にプログラムがループ関数に入ります。そこでは、カラーデータが出るまで待ちます。読み取りが可能な場合は、 APDS.readColor()を使用して色を読み取ります。 表面への近さとともに。各RGBコンポーネントは、0-2 ^ 16-1の数値から、合計に対するその値の比率に変換されます。

スキャンリグ

葉の色をスキャンするには、リグを2軸で動かして、オンボードAPDS-9960の下にある葉のさまざまな場所を通過させます。各軸は、親ねじを時計回りまたは反時計回りに回転させて、ブロックをいずれかの方向に移動させることによって移動します。システム全体はFusion360で設計されており、以下に設計の一部を示します。

<図> <図> <図>

X軸はY軸の上にあり、上部のブロックが両方の軸で移動できるようにします。ステッピングモーターの重量を支えるために、Y軸に追加のVホイールがあります。パーツは、約45%のインフィルを備えたPLAプラスチックを使用して印刷されました。

<図>

データの収集

システムが最初に起動したとき、ステッピングモーターはそれらがどこにあるかを知らないので、2つの軸は、リミットスイッチに達するまで、原点に段階的に移動してホームに戻ります。次に、APDS-9960が初期化されます。ボックスの反対側の角を含む2つの2要素配列として定義されるバウンディングボックスがあります。これらの2つの場所からランダムなポイントが選択され、その間の色を読み取りながら、ステッパーがその位置まで実行されます。

色情報の処理と送信

色は APDS.readColor()で読み取られます 、前述のように。合計が計算された後、パーセンテージが計算され、 Serial.printf()を呼び出してUSB経由で送信されます 方法。値はコンマで区切られ、各読み取り値は改行文字で区切られます。データがデータフォワーダープログラムによって受信されると、指定されたラベル(正常または不正常)のトレーニングデータとしてEdgeImpulseクラウドプロジェクトに送信されます。

<図> <図>

モデルのトレーニング

すべてのトレーニングデータが収集されたら、健康な葉と不健康な葉を区別できるモデルを作成します。 3軸時系列、スペクトル分析ブロック、Kerasブロックで構成されるインパルスを使用しました。データから機能を生成した方法については、以下のスクリーンショットをご覧ください。

<図> <図>

テスト

新しいモデルをテストするために、今回は不健康な葉の新しいテストデータを収集しました。モデルの精度は約63%であり、いくつかのテスト機能を送信した後、ほとんどの場合、葉を正しく分類することができました。

<図>

この精度は、トレーニングデータを追加し、トレーニング速度を遅くすることで改善できます。

コード

  • leafReader.ino
  • pinDefs.h
leafReader.ino C / C ++
 #include  #include  #include  #include "pinDefs.h" int r、g、b、c、p; float sum; AccelStepper xStepper(AccelStepper: :DRIVER、STEPPER_1_STEP、STEPPER_1_DIR); AccelStepper yStepper(AccelStepper ::DRIVER、STEPPER_2_STEP、STEPPER_2_DIR); MultiStepper steppers; //バウンディングボックス内でランダムな場所が選択されますconstlong boundingBox [2] [2] ={{0、0 }、{40、40}}; void setup(){Serial.begin(115200); while(!Serial); if(!APDS.begin()){Serial.println( "APDS9960"を初期化できませんでした); while(1); } pinMode(X_AXIS_HOMING_SW、INPUT_PULLUP); pinMode(Y_AXIS_HOMING_SW、INPUT_PULLUP); //Serial.println(digitalRead(X_AXIS_HOMING_SW)+ digitalRead(Y_AXIS_HOMING_SW)); xStepper.setPinsInverted(X_AXIS_DIR); yStepper.setPinsInverted(Y_AXIS_DIR); xStepper.setMaxSpeed(150); yStepper.setMaxSpeed(150); steppers.addStepper(xStepper); steppers.addStepper(yStepper); homeMotors();} void loop(){long randomPos [2]; randomPos [0] =random(boundingBox [0] [0]、boundingBox [1] [0])* STEPS_PER_MM; randomPos [1] =random(boundingBox [0] [1]、boundingBox [1] [1])* STEPS_PER_MM; steppers.moveTo(randomPos); while(steppers.run()){if(!APDS.colorAvailable()||!APDS.proximityAvailable()){} else {APDS.readColor(r、g、b、c);合計=r + g + b; p =APDS.readProximity(); if(!p &&c> 10 &&sum> =0){float rr =r / sum、gr =g / sum、br =b / sum; Serial.printf( "%1.3f、%1.3f、%1.3f \ n"、rr、gr、br); }}}} void homeMotors(){// home x //Serial.println("Now homing x "); while(digitalRead(X_AXIS_HOMING_SW))xStepper.move(-1); //ホームy // Serial.println( "Now homing y"); while(digitalRead(Y_AXIS_HOMING_SW))yStepper.move(-1); xStepper.setCurrentPosition(0); yStepper.setCurrentPosition(0);} 
pinDefs.h C / C ++
 #define STEPPER_1_STEP 2#define STEPPER_1_DIR 3#define STEPPER_2_STEP 4#define STEPPER_2_DIR 5#define X_AXIS_HOMING_SW 6#define Y_AXIS_HOMING_SW 7 // true if reverse#define X_AXIS_DIR false#define Y_AXIS_DIR 

カスタムパーツとエンクロージャー

パーツから3Dプリントへ
thingsiverse.comのCADファイル

回路図


製造プロセス

  1. K30センサーによるCO2モニタリング
  2. 1Sheeld / Arduinoとの盲ろう者のコミュニケーション
  3. Arduinoでコインアクセプターを制御する
  4. LEDを制御するBluetoothを搭載したArduino!
  5. ArduinoまたはESP8266を搭載した静電容量式指紋センサー
  6. Nextionディスプレイで遊ぶ
  7. Nunchuk制御ロボットアーム(Arduino付き)
  8. Arduino Nano:ジョイスティックで2つのステッピングモーターを制御
  9. Arduinoで日射量を測定する
  10. Arduinoを搭載したミニレーダー
  11. Arduinoで音楽を作る方法