5151+ beoordelingen
Bestel voor 16:00 voor dezelfde dag verzending
14 dagen retour
NL
Particulier
Zakelijk
In dit project maken we gebruik van de kleur en nabijheid sensor op de Arduino Nano 33 BLE Sense. Ook hebben we de nieuwe Arduino_KNN bibliotheek nodig. Deze bibliotheek maakt gebruik van Tiny Machine Learning. In dit project gaan we objecten onderscheiden op basis van kleur.
Dit project is gebaseerd op het project van Arduino.
Simple machine learning with Arduino KNN
Aan het begin van het programma geef je aan hoeveel objecten je wilt herkennen en hoe deze heten. Van elk object worden 30 ”sample readings” genomen. Als dit proces klaar is en jouw Arduino objecten gaat herkennen worden deze waardes toegevoegd aan de database van dat object. We hebben het project zo geschreven dat alle instellingen worden geconfigureerd in de seriële monitor.
In dit project gaan we wat dieper in op hoe het allemaal precies werkt. In principe kun je de code gewoon gebruiken, maar omdat we een geavanceerdere code en een nieuwe (beta) library gebruiken leggen we wat dit uitgebreid uit.
Als eerste importeren we natuurlijk de nodige bibliotheken. De bibliotheek voor de nabijheid/licht sensor van de Arduino Nano 33 BLE Sense (Arduino_APDS9960.h) en de nieuwe machine learning library (Arduino_KNN.h).
Vervolgens creëren we een aantal variabelen. Eentje om aan te geven uit hoeveel variabelen een kleur bestaat. In dit geval gebruiken we RGB kleuren dus hebben we er drie. Eentje gaat over de hoeveelheid objecten. Deze wordt in de void setup aangepast naar een waarde naar keuze. Vervolgens is er een variabele die aangeeft hoeveel kleur lezingen er in de database moeten staan voordat we beginnen. Dit is bij ons project 30. Ook is er een String() array die de objectnamen bijhoudt en variabelen voor hoe de kleur wordt opgeslagen en hoe helder de kleur minimaal moet zijn.
Na het definiëren van de variabelen zetten we deze in een database. Nu is het tijd voor de setup.
In de void setup starten we de seriële poort en sturen we een beginbericht. Vervolgens vragen we hoeveel objecten je van elkaar wilt onderscheiden. Nu kun je een getal typen en deze naar de Arduino versturen. Deze leest het uit, past de variabele die gaat over de hoeveelheid objecten aan. Vervolgens gaan we naar het definiëren van de objecten. Dit doen we door voorbeeld kleuren boven de sensor te houden. Het maximum is 3000 objecten. Houd er rekening mee dat er op basis van kleur wordt onderscheiden.
Voor elk object wordt er gevraagd naar een naam voor dit object. De naam type je in de seriële monitor en verstuur je naar de Arduino. Het label van jouw object wordt nu aangepast naar de naam die je hebt ingevoerd. Plaats nu jouw object boven de sensor van de Arduino 33 BLE Sense en beweeg het object voor het beste effect. Er worden snel 30 metingen uitgevoerd en opgeslagen. Herhaal dit proces voor elk object.
Nu je al jouw objecten hebt gedefinieerd kun je aan de gang met het herkennen. Er wordt gevraagd of je een object boven de sensor wilt houden en vervolgens wordt er één meting uitgevoerd. Er wordt geen nieuwe meting uitgevoerd totdat het object weer boven de sensor is weggehaald. Dit voorkomt een spam van metingen. Elke meting die je maakt in de ”loop” wordt toegevoegd aan de database die je in de ”void setup” hebt gemaakt waardoor de Arduino steeds beter weet welk object welke kleur is.
Op dit moment merken we wel dat er wat problemen zijn met het onderscheiden van rood, oranje en geel. Dit kan natuurlijk afhankelijk zijn van jouw verlichting.
/*
In deze schets gaan we met de Arduino BLE Sense op basis van kleur objecten detecteren.
In deze schets kan je zelf de hoeveelheid objecten aanpassen
en zelf de hoeveelheid voorbeelden de arduino moet zien voordat je objecten kan detecteren.
*/
//Bibliotheken:
#include <Arduino_KNN.h>
#include <Arduino_APDS9960.h>
//Variabelen:
const int INPUTS = 3; //Hier definiëren we hoeveel kleur inputs we willen. In dit geval 3, RGB (Red, Green, Blue).
int OBJECTEN = 0; //Aantal objecten wat we gaan definiëren.
const int VOORBEELDEN = 30; //Hoeveelheid voorbeelden er worden geregistreerd per object voor referentiemateriaal.
const int K = 5;
String label[3000]; //Hier worden de objectlabels gedefinieert
float color[INPUTS]; //In deze array worden de kleuren opgeslagen.
const int DREMPEL = 5; //Drempel voor de kleur helderheid.
//Creëer een KNN classifier.
KNNClassifier myKNN(INPUTS);
void setup() {
pinMode(LED_BUILTIN,OUTPUT);
digitalWrite(LED_BUILTIN,HIGH);
//Initieer seriële monitor
Serial.begin(9600);
while (!Serial);
//initieer APDS (Lichtsensor)
if (!APDS.begin()) {
Serial.println("Failled to initialized APDS!");
while (1);
}
//Begin Seriele commando's
Serial.println("Welkom bij de object detectie schets!");
Serial.println();
//Definieer de hoeveelheid objecten
Serial.println("Hoeveel objecten wil jij detecteren?");
Serial.println();
while(!Serial.available()){}
delay(100);
String readstring = Serial.readString();
OBJECTEN = readstring.toInt();
Serial.flush();
Serial.print("Jij hebt ");
Serial.print(OBJECTEN);
Serial.println(" objecten!");
digitalWrite(LED_BUILTIN,LOW);
//Definiëer de objecten
for(int HuidigObject = 0; HuidigObject < OBJECTEN; HuidigObject++){
Serial.print("Benoem object ");
Serial.print(HuidigObject);
Serial.println(":");
while(!Serial.available()){}
delay(100);
label[HuidigObject] = Serial.readString();
Serial.flush();
Serial.print("Object ");
Serial.print(HuidigObject);
Serial.print(" = ");
Serial.println(label[HuidigObject]);
//Vraag voor voorbeelden van het object
for (int HuidigVoorbeeld = 0; HuidigVoorbeeld < VOORBEELDEN; HuidigVoorbeeld++) {
Serial.print("Laat een voorbeeld zien van: ");
Serial.println(label[HuidigObject]);
//Wacht voor een object en lees de RGB
readColor(color);
//Voeg kleur toe aan het k-NN model
myKNN.addExample(color, HuidigObject);
}
Serial.println();
Serial.print("Object ");
Serial.print(HuidigObject);
Serial.print(": ");
Serial.print(label[HuidigObject]);
Serial.println(" klaar!");
Serial.println();
//Wacht totdat het object weer weg is.
while (!APDS.proximityAvailable() || APDS.readProximity() == 0) {}
}
Serial.println("Initieer process klaar!");
Serial.println();
}
void loop() {
//Variabelen:
int classificatie;
//Wacht totdat het object weer weg is voordat een volgende lezing word uitgevoerd.
while (!APDS.proximityAvailable() || APDS.readProximity() == 0) {}
Serial.println();
Serial.println("Laat mij je object raden!");
Serial.println();
//Wacht voor een object en lees de kleur.
readColor(color);
//Classificeer het object
classificatie = myKNN.classify(color, K);
// Print the classification
Serial.println();
Serial.print("Jij hebt me een ");
Serial.print(label[classificatie]);
Serial.println(" laten zien!");
Serial.println();
}
void readColor(float color[]) {
int red, green, blue, proximity, colorTotal = 0;
//Wacht totdat het object dichtbij komt.
while (!APDS.proximityAvailable() || APDS.readProximity() > 0){}
//Wacht totdat de kleur helder genoeg is.
while (colorTotal < DREMPEL) {
//Lees als object dichtbij is en helderheid hoog genoeg is.
if (APDS.colorAvailable()) {
//Lees kleur en afstand
APDS.readColor(red, green, blue);
colorTotal = (red + green + blue);
}
}
//Definieer de kleur in de color array
color[0] = (float)red / colorTotal;
color[1] = (float)green / colorTotal;
color[2] = (float)blue / colorTotal;
//Print de color array
Serial.print(color[0]);
Serial.print(",");
Serial.print(color[1]);
Serial.print(",");
Serial.println(color[2]);
}