Projet de tri de couleurs Arduino
FunduinoDernière mise à jour le
Schokolinsen automatisch nach Farbe sortieren
So arbeitet die Sortiermaschine
1 / 3
Benötigtes Material
Aufbau: den Grundträger bestücken
1 / 2
Aufbau: Rutsche und Servo montieren
1 / 3
Aufbau: Drehrad und Abdeckplatte
1 / 2
Verkabelung
1 / 2
Das Drehrad positionieren
Drehrad in die Ausgangsposition drehen
#include <Servo.h>
Servo Drehrad; // Der Servo wird Drehrad gennannt.
// Servo Positionen
int Load=0; // Die Position mit der Bezeichnung „Load“ hat den Drehwinkel 0.
void setup()
{
Drehrad.attach(4); // Servo an Pin4 anschließen.
}
void loop()
{
Drehrad.write(Load); // Position laden.
delay(1000); // Warten, bis die Position erreicht ist.
}Die drei Positionen des Drehrades anfahren
#include <Servo.h>
Servo Drehrad; // Das Servo wird Drehrad genannt.
// Servo Positionen
int Load=0; // Drehwinkel zum Laden des Bonbons
int Scan=55; // Drehwinkel zum Scannen des Bonbons
int Ext=120; // Drehwinkel zum Entfernen des Bonbons
void setup()
{
Drehrad.attach(4); // Servo an Pin4 anschließen
}
void loop()
{
Drehrad.write(Load); // Position laden.
delay(1000); // Warten, bis die Position erreicht ist.
Drehrad.write(Scan); // Position zum Scannen des Bonbons.
delay(2000); // Warten, bis die Position erreicht ist.
Drehrad.write(Ext); // Position zum Auswerfen des Bonbons.
delay(3000); // Warten, bis die Position erreicht ist.
}Diese drei Drehwinkel anpassen
int Load=0; // Drehwinkel zum Laden des Bonbons int Scan=55; // Drehwinkel zum Scannen des Bonbons int Ext=120; // Drehwinkel zum Entfernen des Bonbons
Die Rutsche positionieren
Rutsche in die Mittelposition drehen
#include <Servo.h>
Servo servoSchwenker; // Das Servo wird servoSchwenker genannt.
void setup()
{
servoSchwenker.attach(3); // Servo an Pin3 anschließen
}
void loop()
{
servoSchwenker.write(90); // Mittlere Position einstellen
delay(1000); // Warten, bis die Position erreicht ist.
}Die sechs Fachpositionen anfahren
#include <Servo.h>
Servo servoSchwenker; // Das Servo wird servoSchwenker genannt.
// Servo Positionen
int Fach1=0;
int Fach2=45;
int Fach3=75;
int Fach4=105;
int Fach5=135;
int Fach6=180;
void setup()
{
servoSchwenker.attach(3); // Servo an Pin3 anschließen
}
void loop()
{
servoSchwenker.write(Fach1); // Servo dreht sich zu Position 1 (Fach1)
delay(1000); // Warten, bis die Position erreicht ist.
servoSchwenker.write(Fach2); // Servo dreht sich zu Position 2 (Fach2)
delay(1000); // Warten, bis die Position erreicht ist.
servoSchwenker.write(Fach3); // Servo dreht sich zu Position 3 (Fach3)
delay(1000); // Warten, bis die Position erreicht ist.
servoSchwenker.write(Fach4); // Servo dreht sich zu Position 4 (Fach4)
delay(1000); // Warten, bis die Position erreicht ist.
servoSchwenker.write(Fach5); // Servo dreht sich zu Position 5 (Fach5)
delay(1000); // Warten, bis die Position erreicht ist.
servoSchwenker.write(Fach6); // Servo dreht sich zu Position 6 (Fach6)
delay(1000); // Warten, bis die Position erreicht ist.
}Diese sechs Drehwinkel anpassen
int Fach1=0; int Fach2=45; int Fach3=75; int Fach4=105; int Fach5=135; int Fach6=180;
Der Scanprozess: Farbwerte messen
Scanprozess: Farbwerte messen und ausgeben
// Servo hinzufügen
#include <Servo.h>
Servo servoDrehrad;
// Servo Positionen
int Load=0;
int Scan=55;
int m=1;
// RGB LED
int LEDrot = 5; // Farbe Rot an Pin 5
int LEDblau=6; // Farbe Blau an Pin 6
int LEDgruen = 9; // Farbe Grün an Pin 9
int p=300; // p ist die Variable für eine Pause
int LeuchtkraftBlau = 200; // Leuchtstärke der einzelnen LED-Farben. Die Werte sind so gewählt, dass bei schwarzem Hintergrund bei allen Farben die gleiche Leuchtkraft gemessen wird.
int LeuchtkraftRot = 200; // Leuchtstärke der einzelnen LED-Farben. Die Werte sind so gewählt, dass bei schwarzem Hintergrund bei allen Farben die gleiche Leuchtkraft gemessen wird.
int LeuchtkraftGruen = 200; // Leuchtstärke der einzelnen LED-Farben. Die Werte sind so gewählt, dass bei schwarzem Hintergrund bei allen Farben die gleiche Leuchtkraft gemessen wird.
int dunkel = 0; // Zahlenwert 0 bedeutet Spannung 0V – also LED aus.
long FarbwertRot=0; // Variable für Messwerte mit dem Startwert 0
long FarbwertGruen=0; // Variable für Messwerte mit dem Startwert 0
long FarbwertBlau=0; // Variable für Messwerte mit dem Startwert 0
int DurchschnittFarbwertRot=0; // Variable für Messwerte mit dem Startwert 0
int DurchschnittFarbwertGruen=0; // Variable für Messwerte mit dem Startwert 0
int DurchschnittFarbwertBlau=0; // Variable für Messwerte mit dem Startwert 0
// Fotowiderstand
int eingang= A0; //Das Wort „eingang“ steht jetzt für den Wert „A0“ (Bezeichnung vom Analogport 0)
int sensorWert = 0; //Variable für den Sensorwert mit 0 als Startwert
void setup()
{
//Servo hinzufügen und mittig ausrichten
servoDrehrad.attach(4); //Das Setup enthält die Information, dass das Servo an der Steuerleitung (gelb) mit Pin 4 verbunden wird. Hier ist natürlich auch ein anderer Pin möglich.
Serial.begin(9600); //Die Kommunikation mit dem seriellen Port wird gestartet. Das benötigt man, um sich den tatsächlich ausgelesenen Wert später im serial monitor anzeigen zu lassen.
pinMode(LEDblau, OUTPUT); // LED-Farbe als Output definieren
pinMode(LEDgruen, OUTPUT); // LED-Farbe als Output definieren
pinMode(LEDrot, OUTPUT); // LED-Farbe als Output definieren
}
void loop()
{
// Alle Variablen aus vorherigen Messungen löschen
FarbwertRot=0;
FarbwertGruen=0;
FarbwertBlau=0;
//Jetzt müssen die Bonbons eingelegt werden, die gemessen werden sollen. Dabei müssen die Daten im Seriellen Monitor beachtet werden.
servoDrehrad.write (Load); // Neues Bonbon laden. Wenn die Bonbons schlecht geladen werden, kann hier mit dem Servo eine kurzzeitige Hin- und Herbewegung programmiert werden.
delay(1000);
servoDrehrad.write (Scan); // Für die Messung wird die Bonbon-Mulde zum Sensor gedreht
delay(1000);
// Scanprozess Blau beginnt.
analogWrite(LEDblau, LeuchtkraftBlau); // Blau einschalten
delay(p); // pause
// Wiederhole 200 Mal, damit für die Messung ein guter Mittelwert gebildet werden kann, um falsche Messwerte zu minimieren.
for (int i=1; i <= 200; i++)
{
sensorWert =analogRead(eingang);
FarbwertBlau=FarbwertBlau+sensorWert;
delay(m); //Warte eine Millisekunde
}
DurchschnittFarbwertBlau=FarbwertBlau/200; //Hier werden die 200 addierten Messwerte durch 200 geteilt. Dadurch wird ein Durchschnittswert ermittelt.
//Ausgabe Farbe Blau
Serial.print("Durchschnitt FarbwertBlau= " ); //Ausgabe am Serial-Monitor: Der Text "Durchschnitt FarbwertBlau= "
Serial.print(DurchschnittFarbwertBlau); //Ausgabe am Serial-Monitor. Mit dem Befehl Serial.print wird der ermittelte Farbwert an den serial monitor gesendet.
analogWrite(LEDblau, dunkel); // Blaue LED ausschalten
// Scanprozess Grün beginnt.
analogWrite(LEDgruen, LeuchtkraftGruen); // Grün einschalten
delay(p); // pause
// Wiederhole 200 Mal, damit für die Messung ein guter Mittelwert gebildet werden kann, um falsche Messwerte zu minimieren.
for (int i=1; i <= 200; i++)
{
sensorWert =analogRead(eingang);
FarbwertGruen=FarbwertGruen+sensorWert;
delay(m); //Warte eine Millisekunde
}
DurchschnittFarbwertGruen=FarbwertGruen/200; //Hier werden die 200 addierten Messwerte durch 100 geteilt. Dadurch wird ein Durchschnittswert ermittelt.
//Ausgabe Farbe Grün
Serial.print("Durchschnitt FarbwertGruen= " ); //Ausgabe am Serial-Monitor: Der Text „Durchschnitt FarbwertGruen= „
Serial.print(DurchschnittFarbwertGruen); //Ausgabe am Serial-Monitor. Mit dem Befehl Serial.print wird der ermittelte Farbwert an den serial monitor gesendet.
analogWrite(LEDgruen, dunkel); // Grüne LED ausschalten
// Scanprozess Rot beginnt.
analogWrite(LEDrot, LeuchtkraftRot); // Rot einschalten
delay(p); // pause
// Wiederhole 200 Mal, damit für die Messung ein guter Mittelwert gebildet werden kann, um falsche Messwerte zu minimieren.
for (int i=1; i <= 200; i++)
{
sensorWert =analogRead(eingang);
FarbwertRot=FarbwertRot+sensorWert;
delay(m); //Warte eine Millisekunde
}
DurchschnittFarbwertRot=FarbwertRot/200; //Hier werden die 200 addierten Messwerte durch 100 geteilt. Dadurch wird ein Durchschnittswert ermittelt.
//Ausgabe Farbe Rot
Serial.print("Durchschnitt FarbwertRot= " ); //Ausgabe am Serial-Monitor: Der Text „Durchschnitt FarbwertRot= „
Serial.println(DurchschnittFarbwertRot); //Ausgabe am Serial-Monitor. Mit dem Befehl Serial.print wird der ermittelte Farbwert an den serial monitor gesendet.
analogWrite(LEDrot, dunkel); // Rote LED ausschalten
// Die gemessenen Werte für die einzelnen Farben wurden im Seriellen Monitor angezeigt. Nun kommt der wichtige Part der Auswertung. Hier muss entschieden werden, welcher Bonbonfarbe welche Messwerte gegenüberstehen.
}Die Messwerte auswerten
Schema: eine IF-Bedingung für das rote Bonbon
// Für den Fall, dass ein Rotes Bonbon vorhanden ist.
if (DurchschnittFarbwertBlau > 180 && DurchschnittFarbwertBlau < 220 && DurchschnittFarbwertGruen > 230 && DurchschnittFarbwertGruen < 270 && DurchschnittFarbwertRot > 730 && DurchschnittFarbwertRot < 770)
{
//In dieser geschweiften Klammer wird später ergänzt, was passiert, wenn die oben genannte Bedingung erfüllt ist.
}Erweiterung: Bonbon in das passende Fach auswerfen
// Für den Fall, dass ein rotes Bonbon vorhanden ist.
if (DurchschnittFarbwertBlau > 180 && DurchschnittFarbwertBlau < 220 && DurchschnittFarbwertGruen > 230 && DurchschnittFarbwertGruen < 270 && DurchschnittFarbwertRot > 730 && DurchschnittFarbwertRot < 770)
{
servoSchwenker.write (0); // Position des Schwenkers geht zu Fach1
delay(1000); // Pause, bis die Drehung der Rutsche zum richtigen Fach abgeschlossen ist.
servoDrehrad.write (ext); //Das Drehrad dreht sich und das Bonbon fällt unten in den Trichter der Rutsche.
delay(1000); // Pause, bis die Drehung erfolgt ist und das Bonbon in den Trichter gefallen ist.
}Das vollständige Beispielprogramm
Vollständiges Beispielprogramm für drei Bonbonfarben
// Servo hinzufügen
#include <Servo.h>
Servo servoSchwenker;
Servo servoDrehrad;
// Servo Positionen
int Load=0;
int Scan=55;
int ext=120;
int m=1;
// RGB LED
int LEDrot = 5; // Farbe Rot an Pin 5
int LEDblau=6; // Farbe Blau an Pin 6
int LEDgruen = 9; // Farbe Grün an Pin 9
int p=50; // p ist die Variable für eine Pause
int LeuchtkraftBlau = 200; // Leuchtstärke der einzelnen LED-Farben. Die Werte sind so gewählt, dass bei schwarzem Hintergrund bei allen Farben die gleiche Leuchtkraft gemessen wird.
int LeuchtkraftRot = 200; // Leuchtstärke der einzelnen LED-Farben.
int LeuchtkraftGruen = 200; // Leuchtstärke der einzelnen LED-Farben.
int dunkel = 0; // Zahlenwert 0 bedeutet Spannung 0V – also LED aus.
long FarbwertRot=0; // Variable für Messwerte mit dem Startwert 0
long FarbwertGruen=0;
long FarbwertBlau=0;
int DurchschnittFarbwertRot=0;
int DurchschnittFarbwertGruen=0;
int DurchschnittFarbwertBlau=0;
int messungen =200;
// Fotowiderstand
int eingang= A0; //Das Wort „eingang“ steht jetzt für den Wert „A0“
int sensorWert = 0; //Variable für den Sensorwert mit 0 als Startwert
void setup()
{
//Servo hinzufügen und mittig ausrichten
servoSchwenker.attach(3); //Servo an der Steuerleitung (gelb) mit Pin 3 verbunden.
servoDrehrad.attach(4); //Servo an der Steuerleitung (gelb) mit Pin 4 verbunden.
servoSchwenker.write (90); // Der Schwenker wird in eine mittlere Position bewegt.
delay(2000); //Warten bis die Servos stehen. Ansonsten könnten die Messwerte durch die schwankende Spannung beeinflusst werden.
Serial.begin(9600);
pinMode(LEDblau, OUTPUT); // LED-Farbe als Output definieren
pinMode(LEDgruen, OUTPUT); // LED-Farbe als Output definieren
pinMode(LEDrot, OUTPUT); // LED-Farbe als Output definieren
}
void loop()
{
// Alle Variablen aus vorherigen Messungen löschen
FarbwertRot=0;
FarbwertGruen=0;
FarbwertBlau=0;
servoDrehrad.write (Load); // Neues Bonbon laden.
delay(1000);
servoDrehrad.write (Scan); // Für die Messung wird die Bonbon-Mulde zum Sensor gedreht
delay(1000);
// Scanprozess Blau beginnt.
analogWrite(LEDblau, LeuchtkraftBlau); // blau einschalten
delay(p); // pause
for (int i=1; i <= messungen; i++)
{
sensorWert =analogRead(eingang);
FarbwertBlau=FarbwertBlau+sensorWert;
delay(m); //Warte eine Millisekunde
}
DurchschnittFarbwertBlau=FarbwertBlau/messungen;
//Ausgabe Farbe Blau
Serial.print("Durchschnitt FarbwertBlau= " );
Serial.print(DurchschnittFarbwertBlau);
analogWrite(LEDblau, dunkel); // Blaue LED ausschalten
// Scanprozess Grün beginnt.
analogWrite(LEDgruen, LeuchtkraftGruen); // grün einschalten
delay(p); // pause
for (int i=1; i <= messungen; i++)
{
sensorWert =analogRead(eingang);
FarbwertGruen=FarbwertGruen+sensorWert;
delay(m); //Warte eine Millisekunde
}
DurchschnittFarbwertGruen=FarbwertGruen/messungen;
//Ausgabe Farbe Grün
Serial.print("Durchschnitt FarbwertGruen= " );
Serial.print(DurchschnittFarbwertGruen);
analogWrite(LEDgruen, dunkel); // Grüne LED ausschalten
// Scanprozess Rot beginnt.
analogWrite(LEDrot, LeuchtkraftRot); // Rot einschalten
delay(p); // pause
for (int i=1; i <= messungen; i++)
{
sensorWert =analogRead(eingang);
FarbwertRot=FarbwertRot+sensorWert;
delay(m); //Warte eine Millisekunde
}
DurchschnittFarbwertRot=FarbwertRot/messungen;
//Ausgabe Farbe Rot
Serial.print("Durchschnitt FarbwertRot= " );
Serial.println(DurchschnittFarbwertRot);
analogWrite(LEDrot, dunkel); // Rote LED ausschalten
// Auswertung und Verarbeitung
// Wenn rot:
if (DurchschnittFarbwertBlau > 140 && DurchschnittFarbwertBlau < 230 && DurchschnittFarbwertGruen > 140 && DurchschnittFarbwertGruen < 220 && DurchschnittFarbwertRot > 550 && DurchschnittFarbwertRot < 750) //1. Fall: Rotes Bonbon
{
servoSchwenker.write (0); // Position des Schwenkers geht zu Position1
delay(500);
servoDrehrad.write (ext); //Das Drehrad dreht sich und das Bonbon fällt unten in den Trichter
delay(700);
}
// Wenn grün:
else if (DurchschnittFarbwertBlau > 260 && DurchschnittFarbwertBlau < 340 && DurchschnittFarbwertGruen > 290 && DurchschnittFarbwertGruen < 430 && DurchschnittFarbwertRot > 260 && DurchschnittFarbwertRot < 320) //2. Fall: Grünes Bonbon
{
servoSchwenker.write (30); // Position des Schwenkers geht zu Position1
delay(500);
servoDrehrad.write (ext);
delay(700);
}
// Wenn blau:
else if (DurchschnittFarbwertBlau > 450 && DurchschnittFarbwertBlau < 490 && DurchschnittFarbwertGruen > 300 && DurchschnittFarbwertGruen < 360 && DurchschnittFarbwertRot > 140 && DurchschnittFarbwertRot < 245) //3. Fall: Blaues Bonbon
{
servoSchwenker.write (60); // Position des Schwenkers geht zu Position1
delay(500);
servoDrehrad.write (ext);
delay(700);
}
else
{
servoSchwenker.write (180); // Position des Schwenkers geht zu Position1
delay(500);
servoDrehrad.write (ext);
delay(700);
}
}Évaluer le guide