Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Menentukan Kesehatan Tanaman dengan TinyML

Komponen dan persediaan

Arduino Nano 33 BLE Sense
× 1
Motor Stepper Rajin
× 1
Driver Theremino DRV8825 untuk Motor Stepper untuk Sistem Theremino
× 1

Alat dan mesin yang diperlukan

Printer 3D (generik)
Besi solder (generik)

Aplikasi dan layanan online

Kode Microsoft VS
Arduino IDE
Edge Impulse Studio

Tentang proyek ini

Premis

Sama seperti manusia, tanaman juga bisa terkena penyakit. Dan seperti bagaimana Anda dapat mengembangkan ruam akibat infeksi kulit, daun tanaman mungkin menjadi menguning dan/atau bernoda karena jamur atau patogen lainnya. Jadi, dengan memanfaatkan kekuatan pembelajaran mesin, warna dapat dipindai dan kemudian digunakan untuk melatih model yang dapat mendeteksi saat warna daun mati.

Perangkat Keras

Otak dari proyek ini adalah Arduino Nano 33 BLE Sense, dan dipilih karena beberapa alasan. Pertama, ia memiliki serangkaian sensor kuat yang kaya, termasuk IMU 9DoF, APDS-9960 (warna, gerakan, kedekatan, dan kecerahan), mikrofon, dan kombo sensor suhu/kelembaban/tekanan. Untuk menggerakkan papan di sekitar daun tanaman dan melakukan pengukuran, sepasang motor stepper digunakan bersama dengan sepasang papan driver DRV8825.

Menyiapkan TinyML

Untuk proyek ini, sensor bawaan yang terdaftar untuk Arduino Nano 33 BLE Sense on Edge Impulse tidak akan berfungsi, karena hanya akselerator dan mikrofon yang terdaftar. Ini berarti penerus data harus digunakan sebagai ganti daemon serial. Untuk memulai, saya membuat proyek baru dan menamainya. Selanjutnya, saya menginstal Edge Impulse CLI dengan menginstal Node.js dan NPM, dan kemudian menjalankan npm install -g edge-impulse-cli . Anda mungkin perlu menambahkan jalur pemasangannya ke variabel lingkungan PATH Anda jika tidak dapat ditemukan. Selanjutnya, jalankan edge-impulse-data-forwarder dan pastikan berhasil, lalu gunakan Ctrl+C untuk keluar.

Membaca Warna

APDS-9960 membaca warna dengan memantulkan cahaya inframerah dari permukaan dan membaca panjang gelombang yang tidak diserap oleh material. Untuk berkomunikasi dengan sensor, yang terbaik adalah menginstal perpustakaan Arduino APDS9960, yang memberikan akses ke beberapa fungsi yang berguna. Dalam kode, APDS-9960 pertama kali diinisialisasi dan kemudian program memasuki fungsi loop. Di sana, menunggu sampai ada data warna. Jika pembacaan tersedia, warna dibaca dengan APDS.readColor() seiring dengan kedekatannya dengan permukaan. Setiap komponen RGB diubah dari angka 0-2^16-1 menjadi rasio nilainya terhadap jumlah.

Rig Pemindaian

Pemindaian warna daun dilakukan dengan menggerakkan rig dalam dua sumbu untuk melewati berbagai lokasi daun di bawah APDS-9960 onboard. Setiap sumbu digerakkan dengan memutar sekrup timah baik searah jarum jam atau berlawanan arah jarum jam untuk menerjemahkan blok di kedua arah. Seluruh sistem dirancang di Fusion 360, dan berikut adalah beberapa render dari desain di bawah ini:

Sumbu X terletak di atas sumbu Y, membiarkan balok atas bergerak di kedua sumbu. Terdapat tambahan V-wheel pada sumbu Y untuk menopang bobot motor stepper. Bagian dicetak menggunakan plastik PLA dengan isi sekitar 45%.

Mengumpulkan Data

Ketika sistem pertama kali dinyalakan, motor stepper tidak tahu di mana mereka berada, jadi kedua sumbu pulang dengan pindah ke titik asal selangkah demi selangkah hingga menekan sakelar batas. Selanjutnya, APDS-9960 diinisialisasi. Ada kotak pembatas yang didefinisikan sebagai dua array dua elemen yang berisi sudut berlawanan dari sebuah kotak. Sebuah titik acak dipilih di antara dua lokasi ini, dan kemudian stepper dijalankan ke posisi itu sambil membaca warna di antaranya.

Memproses dan Mengirim Informasi Warna

Warna dibaca dengan APDS.readColor() , seperti yang telah disebutkan sebelumnya. Setelah jumlah dihitung, persentase dihitung dan kemudian dikirim melalui USB dengan memanggil Serial.printf() metode. Nilai dipisahkan dengan koma, dan setiap bacaan dipisahkan oleh karakter baris baru. Saat data diterima oleh program penerusan data, data tersebut dikirim ke proyek cloud Edge Impulse sebagai data pelatihan dengan label yang diberikan (baik sebagai sehat atau tidak sehat).

Melatih Model

Setelah semua data pelatihan terkumpul, saatnya membuat model yang dapat membedakan antara daun sehat dan tidak sehat. Saya menggunakan impuls yang terdiri dari deret waktu tiga sumbu, blok analisis spektral, dan blok Keras. Anda dapat melihat tangkapan layar di bawah untuk mengetahui cara saya membuat fitur dari data:

Pengujian

Untuk menguji model baru saya, saya mengumpulkan beberapa data uji baru, kali ini dari daun yang tidak sehat. Keakuratan model sekitar 63%, dan setelah mengirimkan beberapa fitur pengujian, model ini dapat mengklasifikasikan daun dengan benar hampir sepanjang waktu.

Akurasi ini dapat ditingkatkan dengan menambahkan lebih banyak data pelatihan dan memperlambat kecepatan pelatihan.

Kode

  • leafReader.ino
  • pinDefs.h
leafReader.inoC/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 stepper;// lokasi acak akan dipilih dalam kotak pembatas dengan kotak pembatas panjang[2][2] ={ {0, 0 }, {40, 40}};pengaturan batal(){ Serial.begin(115200); while(!Serial); if(!APDS.begin()) { Serial.println("Tidak dapat menjalankan APDS9960"); sementara(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); jumlah =r + g + b; p =APDS.readProximity(); if(!p &&c> 10 &&jumlah>=0) { float rr =r / jumlah, gr =g / jumlah, br =b / jumlah; Serial.printf("%1.3f,%1.3f,%1.3f\n", rr, gr, br); } } }}void homeMotors(){ // home x //Serial.println("Sekarang homing x"); while(digitalRead(X_AXIS_HOMING_SW)) xStepper.move(-1); // rumah y //Serial.println("Sekarang pulang y"); while(digitalRead(Y_AXIS_HOMING_SW)) yStepper.move(-1); xStepper.setCurrentPosition(0); yStepper.setCurrentPosition(0);}
pinDefs.hC/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 inverted#define X_AXIS_DIR_PSdefine LANGKAH_DIRUS___salah_#define AXIS_DIR_ROSS 

Suku cadang dan penutup khusus

Bagian untuk Cetak 3D
File CAD di thingiverse.com

Skema


Proses manufaktur

  1. Pemantauan CO2 dengan Sensor K30
  2. Komunikasi Tunarungu dengan 1Sheeld/Arduino
  3. Kontrol Penerima Koin dengan Arduino
  4. Arduino dengan Bluetooth untuk Mengontrol LED!
  5. Sensor Sidik Jari Kapasitif dengan Arduino atau ESP8266
  6. Bermain Dengan Tampilan Berikutnya
  7. Lengan Robot Terkendali Nunchuk (dengan Arduino)
  8. Arduino Nano:Kontrol 2 Motor Stepper Dengan Joystick
  9. Mengukur Radiasi Matahari dengan Arduino
  10. Radar Mini dengan Arduino