前提
就像人類一樣,植物也可能染病,比如植物的葉子可能會因真菌或其他病原體而發(fā)黃或出現(xiàn)斑點。因此,通過機器學習的力量,可以掃描顏色,然后將其用于訓練一個模型,該模型可以檢測葉子的顏色并對其健康狀態(tài)作出判斷。
這個項目主要用Arduino Nano 33 BLE Sense,它之所以被選中主要是它具有一組功能強大的傳感器,包括9DoF IMU,APDS-9960(顏色,手勢,接近度和亮度),麥克風以及溫度/濕度/壓力傳感器組合。為了使電路板圍繞植物的葉子移動并進行測量,將一對步進電機與一對DRV8825驅(qū)動器板配合使用。
設置TinyML
對于此項目,列出的針對Arduino Nano 33 BLE Sense on Edge Impulse的內(nèi)置傳感器將不起作用,這意味著將我們必須使用data forwarder而不是serial daemon。
首先,創(chuàng)建一個新項目并將其命名。接下來需要通過Node.js以及NPM來安裝EdgeImpulse CLI。然后運行:
npm install -g edge-impulse-cli
如果找不到安裝路徑,則可能需要將其安裝路徑添加到PATH環(huán)境變量中。接下來,運行
edge-impulse-data-forwarder
并確保其有效,然后按Ctrl + C退出。
顏色識別
APDS-9960的工作原理是:通過物體表面所反射的光線波長來讀取顏色。為了與傳感器通信,最好安裝Arduino APDS9960庫,該庫可以訪問一些有用的功能。
在代碼中,首先初始化APDS-9960,然后程序進入循環(huán)功能,等待直到有顏色數(shù)據(jù)出現(xiàn)。如果有讀數(shù),則使用
APDS.readColor()
以及與表面的接近程度來讀取顏色。每個RGB分量都從0-2 ^ 16-1數(shù)轉(zhuǎn)換為其值與總和的比率。
掃描儀
掃描葉子的顏色是通過在兩個軸上移動裝備以使葉子在車載APDS-9960下方經(jīng)過的各個位置進行的。通過沿順時針或逆時針方向旋轉(zhuǎn)絲杠來移動每個軸,以使程序段沿任一方向平移。整個系統(tǒng)是在Fusion 360中設計的,下面是這些設計的一些渲染圖:
X軸位于Y軸的頂部,從而使頂部程序段在兩個軸上移動。Y軸上有一個附加的V輪,以支撐步進電機的重量。零件是使用PLA打印的,填充量約為45%。
收集數(shù)據(jù)
當系統(tǒng)首次啟動時,步進電機是不知道它的初始位置的,因此我們必須進行原點復位,(可通過限位開關實現(xiàn))。接下來初始化APDS-9960。有一個定義為兩個元素的數(shù)組的邊界框,它們包含一個框的相對角。在這兩個位置之間選擇一個隨機點,然后將步進器運行到該位置,同時讀取它們之間的顏色。
處理和發(fā)送顏色信息
如前所述,使用
APDS.readColor()
來讀取顏色。計算總和后,將計算百分比,然后通過調(diào)用
Serial.printf()
的方法通過USB發(fā)送百分比。值用逗號分隔,每個讀數(shù)用換行符分隔。數(shù)據(jù)轉(zhuǎn)發(fā)器程序接收到數(shù)據(jù)后,會將其作為帶有給定標簽(健康或不健康)的訓練數(shù)據(jù)發(fā)送到Edge Impulse云端。
訓練模型
收集完所有訓練數(shù)據(jù)后,就該建立一個可以區(qū)分健康葉子和不健康葉子的模型了。我使用了由三軸時間序列,頻譜分析模塊和Keras模塊組成的脈沖。查看以下屏幕截圖可以了解我如何從數(shù)據(jù)中生成這些功能:
測驗
為了測試新模型,這次我收集了一些新的測試數(shù)據(jù),這是不健康的。該模型的準確性約為63%,并且在通過一些測試功能后,能夠在大多數(shù)時間正確地對葉子進行分類。
可以通過添加更多訓練數(shù)據(jù)并減慢訓練速度來提高此準確性。
代碼
#include 《Arduino_APDS9960.h》#include 《AccelStepper.h》#include 《MultiStepper.h》#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;// a random location will be chosen within the bounding box
const long boundingBox[2][2] = { {0,0}, {40,40}};
void setup(){ Serial.begin(115200); while(!Serial);
if(!APDS.begin()) { Serial.println(“Could not init 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); sum = 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
”, rr, gr, br); } } }}
void homeMotors(){ // home x //Serial.println(“Now homing x”); while(digitalRead(X_AXIS_HOMING_SW))
xStepper.move(-1);
// home y //Serial.println(“Now homing y”); while(digitalRead(Y_AXIS_HOMING_SW)) yStepper.move(-1); xStepper.setCurrentPosition(0); yStepper.setCurrentPosition(0);}
原理圖
原文標題:Arduino使用TinyML掃描植物的葉子確定植物的健康
文章出處:【微信公眾號:FPGA入門到精通】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
責任編輯:haq
-
傳感器
+關注
關注
2546文章
50482瀏覽量
751178 -
驅(qū)動器
+關注
關注
52文章
8107瀏覽量
145840 -
機器學習
+關注
關注
66文章
8355瀏覽量
132324
原文標題:Arduino使用TinyML掃描植物的葉子確定植物的健康
文章出處:【微信號:xiaojiaoyafpga,微信公眾號:電子森林】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論