Arduino Farbsortierung Projekt

Farbsortierung mit Arduino - Ein Schulprojekt zur Sortierung von Schokolinsen

Einleitung

Mit wenigen elektrischen Bauteilen ist es möglich, eine vollautomatische Sortieranlage für Schokobonbons wie Smarties, M&Ms oder günstigeren Schokolinsen herzustellen und zu programmieren. Der finanzielle Aufwand ist dabei sehr gering, um ein sehr anschauliches Projekt zum Thema Automatisierung in der Schule umzusetzen.

In diesem Projekt werden farbig unsortierte Schokolinsen in einen Behälter gegeben und dann der Reihe nach gescannt. Dabei wird noch nicht einmal ein Farbsensormodul benötigt. Die Analyse der Farbe erfolgt über die Stärke des reflektierten Lichts einer farbigen Leuchtdiode. Sobald die Farbe detektiert wurde, wird eine kleine Bonbonrutsche in die entsprechende Richtung der passenden Aufbewahrungsbox gedreht und so rutschen die Bonbons der Reihe nach, farbig sortiert, in ihre Fächer.

Projekt Farbsortiermaschine

Aufbau

Der Aufbau der Farbsortiermaschine besteht aus 3D-Druck Teilen, sowie einigen Teilen aus dem Bereich der Elektronik und Mikroelektronik

 

1) Abdeckplatte mit Bonbonbehälter

2) Drehrad für die
Bonbons

3) Bodenplatte mich
einzelnen Fächern

4) Grundträger für
Motoren und Sensorik

5) Bonbonrutsche

6) Servomotor für
das Drehrad

7) Servomotor für
die Bonbonrutsche

8) Sensorbereich mit

RGB-LED und Fotowiderstand

Benötigtes Material

1x Mikrocontroller, zum Beispiel Funduino UNO – Arduino kompatibel

1x Breadboard (klein)

20x Breadboardkabel Stecker/Fassung

20x Breadboardkabel Stecker/Stecker

1X RGB-LED

1x Fotowiderstand 1KOhm

1x Widerstand 1KOhm oder 10KOhm

2x Servomotor TowerPro SG90 oder besser (Kurzform: Servo)

1x 3D-Druck Bauteile für die Sortiermaschine

– Bodenplatte mich einzelnen Fächern

– Grundträger für Motoren und Sensorik

– Abdeckplatte mit Bonbonbehälter

– Bonbonrutsche

– Drehrad für die Bonbons

Funktionaler Ablauf

 Die Sortierung der Bonbons erfolgt in verschiedenen aufeinander folgenden Prozessen. Diese werden in chronologischer Reihenfolge beschrieben.


1. Das erste Bonbon fällt vom Bonbonbehälter in eine Vertiefung des Drehrads.

 2. Das Drehrad dreht das Bonbon mit Hilfe eines Servomotors vor den Scanbereich.

3. Das Bonbon wird mit Hilfe der farbigen LED (RGB-LED) mit den
Farben Rot, Grün und Blau beleuchtet. Gleichzeitig wird die Stärke
des vom Bonbon reflektierten Lichts für alle drei Farben gemessen. Ein rotes Bonbon

reflektiert rotes Licht sehr gut. Daher wird bei einem roten Bonbon der Messwert für die „Leuchtstärke“, also des reflektierten Lichts sehr hoch sein. Ein rotes Bonbon wird jedoch das grüne Licht der RGB-LED nur sehr schwach reflektieren und der Messwert der Leuchtstärke wird hier entsprechend klein sein.  

 

4. Nun erfolgt nach dem EVA- Prinzip der Datenverarbeitung (Informatik) die Verarbeitung der Messwerte. Mit Hilfe des Arduino Mikrocontrollers vergleicht man die ermittelten Messwerte und bestimmt, um welche Farbe es sich bei dem aktuell gescannten Bonbon handelt.

 

5. Die Bonbonrutsche dreht sich zum Lagerfach der entsprechenden Bonbonfarbe.

 

6. Das Drehrad mit der Vertiefung für das Bonbon dreht sich nach unten. Die Schokolinse fällt auf den Auffangtrichter der Bonbonrutsche und rutscht in das entsprechende Lagerfach.

 

 

7. Der Ablauf beginnt erneut, indem sich das Drehrad wieder in die Ausgangsposition zurückdreht und dort das nächste Bonbon in die Vertiefung rutscht.

Anleitung zum Aufbau

1. Der Grundträger wird mit dem Servomotor für das Drehrad, einer RGB-LED und einem Fotowiderstand bestückt. Der Fotowiderstand und die RGB LED sollten dabei mit einem Tröpfchen Kleber fixiert werden. Der Servomotor wird mit den beiliegenden Schrauben fixiert.

2. Die Bonbonrutsche wird an der Unterseite mit einem Servohorn (auch Servobracket, Servohebel oder Servoarm genannt) bestückt. Damit das Horn passt, wird es etwas eingekürzt. Die Rutsche wird nun auf den Servo aufgesteckt ohne diese fest zu verkleben oder zu verschrauben. Die Rutsche wird später mit Hilfe einer kleinen Schraube am Servo befestigt, sobald die richtige Position des Servos mit Hilfe der elektrischen Ansteuerung durch den Mikrocontroller gefunden wurde.

Der Servomotor wird zusammen mit der montierten Rutsche seitlich in den Grundträger geschoben und mit Schrauben von der Unterseite befestigt.

 3. Der vormontierte Grundträger wird nun in die Grundplatte eingesteckt.

4. Das Drehrad wird mit einem Servohorn bestückt. Auch hier muss das Horn ein wenig eingekürzt werden, zum Beispiel mit einer Zange. Das Drehrad wird dann auf den Servo im Grundträger aufgesteckt ohne es zu verkleben oder zu verschrauben. Das Drehrad wird später mit Hilfe einer kleinen Schraube am Servo befestigt, sobald die richtige Position des Servos mit Hilfe der elektrischen Ansteuerung durch den Mikrocontroller gefunden wurde.

5. Die Abdeckplatte mit Bonbonbehälter wird nun von oben auf die Konstruktion aufgesetzt. Die Abdeckplatte wird weder jetzt noch später fixiert, da diese im Rahmen der Programmierung immer wieder leicht zu entfernen sein muss.

Die Funktion der Abdeckplatte ist neben der Lagerung der Bonbons im oberen Bereich auch das Abdecken des Sensorbereichs, damit dort kein Fremdlicht (Zimmerbeleuchtung) in den Sensorbereich eintritt.

Anleitung zur Verkabelung

Die Verkabelung ergibt sich aus der folgenden Skizze. Dabei werden die folgenden Module angeschlossen:

 

2x Servomotor. Servomotoren haben zwei Leitungen für die Spannungsversorgung und eine Signalleitung.

 

 

1x RGB LED. Eine RGB LED hat vier Kontakte. Drei zur positiven Ansteuerung der drei Farben Rot, Grün, Blau, sowie eine gemeinsame Leitung für das elektrische Minus, welches im Bereich des Mikrocontrollings als GND bezeichnet wird.

 

1x Fotowiderstand und 1x 1KOhm (oder 10KOhm) Widerstand. 

Beide Bauteile ergeben zusammen einen Spannungsteiler. Zwischen den beiden Bauteilen wird die Spannung gemessen, die sich in Abhängigkeit der Leuchtstärke verändert.

Schaltpläne für zwei verschiendene Breadboards:

 Bildbeschreibung

 

1. Fotowiderstand

2. RGB-LED

3. Servomotor für die Rutsche (Schwenker)

4. Servomotor für das Drehrad

5. Widerstand 1KOhm oder 10KOhm

6. Breadboard

7. Mikrocontroller Funduino UNO – Arduino kompatibel

Anleitung zum Programmieren

Zunächst werden die beiden Servos für das Drehrad und für die Rutsche programmiert. Ziel ist es zunächst, die Ausgangsposition der beiden Module herzustellen.

 

Positionierung für das Drehrad

Das Drehrad wird zunächst vom Servomotor getrennt. Dann wird der Motor mit Hilfe des Mikrocontrollers in die Ausgangsposition gedreht.

 

 

#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.

}

 

 

Der Servomotor steht nun in der Ausgangslage und das Drehrad kann am Servo montiert und auch verschraubt werden, obwohl eine Fixierung per Schraube nicht zwingend notwendig ist.

 

Es folgt die Feineinstellung der drei Positionen des Drehrades. Es gibt die Position oben, in der das Bonbon in die Vertiefung des Drehrades fällt. Diese Position wird im Sketch „Load“ genannt. Es gibt eine zweite Position, in der sich das Bonbon genau vor dem Sensorbereich befindet. Diese Position wird im Sketch „Scan“ genannt. In der dritten und letzten Position dreht sich das Drehrad

nach unten und das Bonbon kann in den Trichter der Rutsche fallen. Diese Position wird im Sketch „Ext“ genannt.

 

 

#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.

}

 

Die drei Positionen werden im Sketch der Reihe nach angefahren. Nun sieht man sich die Positionen der Vertiefung für das Bonbon an und prüft ob die Positionen ok sind. Sollte das nicht der Fall sein, werden die folgenden Werte der Drehwinkel angepasst.

 

int Load=0; // Drehwinkel zum Laden des Bonbons

int Scan=55; // Drehwinkel zum Scannen des Bonbons

 

int Ext=120; // Drehwinkel zum Entfernen des Bonbons

Positionierung für die Rutsche

Die Rutsche wird zunächst vom Servomotor getrennt. Dann wird der Motor mit Hilfe des Mikrocontrollers in eine mittlere Ausgangsposition gedreht. Wir wählen dafür einen Drehwinkel von 90° Grad.

 

#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.

}

 

Der Servo hat nun eine mittlere Position eingenommen und die Rutsche wird nun ebenfalls in einer mittleren Postion (in der Mitte der Lagerfächer) auf den Servo aufgesteckt. Hier macht es nun Sinn, die Rutsche mit einer kleinen Schraube zu fixieren.

 

Im Anschluss wird mit dem nächsten Sketch geprüft, welche Drehwinkel eingestellt werden müssen, damit die Rutsche sich zu den sechs vorhandenen Fächern ausrichtet.

 

#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.

}

 

Die sechs Positionen werden im Sketch der Reihe nach angefahren. Nun sieht man sich die Positionen der Rutsche an und prüft ob die Positionen ok sind. Die Rutsche muss bei allen sechs Positionen so gedreht sein, dass das entsprechende Bonbon exakt in das entsprechende Fach fallen kann. Sollte das nicht der Fall sein, werden die folgenden Werte der Drehwinkel angepasst.

 

int Fach1=0;

int Fach2=45;

int Fach3=75;

int Fach4=105;

int Fach5=135;

int Fach6=180;

Anleitung Scanprozess

Mit Hilfe des folgenden Sketches wird die Farbe eines einzelnen Bonbons ermittelt. Dazu wird das Drehrad von der „Load“ Position zum Sensorbereich gedreht. Die Messung erfolgt und die Messwerte für alle drei Farben wird mit Hilfe des seriellen Monitors angezeigt. Anhand der Messwerte kann danach die Verarbeitung der Messwerte erfolgen.

 

 

// Servo hinzufügen

#include <Servo.h>

Servo servoDrehrad;

// Servo Positionen

int Load=0;

int Scan=55;

int m=0;

 

// RGB LED

int LEDrot = 5; // Farbe Rot an Pin 5

int LEDblau=6; // Farbe Blau an Pin 6

int LEDgruen = 7; // Farbe Grün an Pin 7

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 8 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=0; i <= 200; i++)

{

sensorWert =analogRead(eingang);

FarbwertBlau=FarbwertBlau+sensorWert;

delay(m); //Warte eine Millisekunde

}

DurchschnittFarbwertBlau=FarbwertBlau/200; //Hier werden die 100 addierten Messwerte durch 100 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=0; i <= 200; i++)

{

sensorWert =analogRead(eingang);

FarbwertGruen=FarbwertGruen+sensorWert;

delay(m); //Warte eine Millisekunde

}

DurchschnittFarbwertGruen=FarbwertGruen/200; //Hier werden die 100 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, LeuchtkraftGruen); // 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=0; i <= 200; i++)

{

sensorWert =analogRead(eingang);

FarbwertRot=FarbwertRot+sensorWert;

delay(m); //Warte eine Millisekunde

}

DurchschnittFarbwertRot=FarbwertRot/200; //Hier werden die 100 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 sehen im Seriellen Monitor so aus:

 Im letzten Schritt wird der Sketch so erweitert, dass eine Auswertung der Messwerte erfolgt und das Bonbon in das entsprechende Fach ausgeworfen wird.

 

In der IF-Bedingung werden die Messwerte für alle drei Farben ausgewertet. Damit leichte Farbabweichungen der Bonbons oder Abweichungen in der Messung nicht dazu führen, dass die Farbe nicht erkannt werden kann, wird für jeden Farbbereich ein gewisser Messwertbereich angegeben.

 

Dazu ein Beispiel. Nehmen wir an, es wurde ein rotes Bonbon gescannt und folgende Messwerte wurden ermittelt:

DurchschnittFarbwertBlau = 200

DurchschnittFarbwertGruen = 250

DurchschnittFarbwertRot= 750

 

Die Auswertung soll ergeben, dass rote Bonbons mit den folgenden Messbereichen erkannt werden:

 

DurchschnittFarbwertBlau = 180-220

DurchschnittFarbwertGruen = 230-270

DurchschnittFarbwertRot= 730-770

 

Daher wird nun für das rote Bonbon EINE IF-Bedingung geschrieben, die alle Bereiche enthält. Das sieht folgendermaßen aus:

 

// 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.

}

 

Erweitert wird der Code anschließend mit dem Auswerfen des Bonbons in das entsprechende Fach der zugehörigen Bonbonfarbe.

 

// 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.

}

 

Die tatsächlichen Messwertbereiche sind bei jedem Projektaufbau individuell und hängen von vielen Faktoren ab, wie produktionsbedingten Abweichungen bei den Widerständen, der Art der Verkabelung und auch von den gewählten Bonbons.  

Vollständiges Beispielprogramm

 Sketch zur Sortierung von drei verschiedenfarbigen Bonbons

(auf Funktion geprüft):

 

// Servo hinzufügen

 #include <Servo.h>

 Servo servoSchwenker;

 Servo servoDrehrad;

// Servo Positionen

int Load=0;

int Scan=55;

int ext=120;

int m=0;

// RGB LED

int LEDrot = 5; // Farbe Rot an Pin 5

int LEDblau=6; // Farbe Blau an Pin 6

int LEDgruen = 7; // Farbe Grün an Pin 7

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. 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

int messungen =50;

 

 

// 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

servoSchwenker.attach(3); //Das Setup enthält die Information, dass das Servo an der Steuerleitung (gelb) mit Pin 8 verbunden wird. Hier ist natürlich auch ein anderer Pin möglich.

servoDrehrad.attach(4); //Das Setup enthält die Information, dass das Servo an der Steuerleitung (gelb) mit Pin 8 verbunden wird. Hier ist natürlich auch ein anderer Pin möglich.

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); //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=0; i <= messungen; i++)

  {

    sensorWert =analogRead(eingang);

    FarbwertBlau=FarbwertBlau+sensorWert;

    delay(m); //Warte eine Millisekunde

  }

DurchschnittFarbwertBlau=FarbwertBlau/messungen; //Hier werden die 100 addierten Messwerte durch 100 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=0; i <= messungen; i++)

  {

    sensorWert =analogRead(eingang);

    FarbwertGruen=FarbwertGruen+sensorWert;

    delay(m); //Warte eine Millisekunde

  }

DurchschnittFarbwertGruen=FarbwertGruen/messungen; //Hier werden die 100 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, LeuchtkraftGruen); // 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=0; i <= messungen; i++)

  {

    sensorWert =analogRead(eingang);

    FarbwertRot=FarbwertRot+sensorWert;

    delay(m); //Warte eine Millisekunde

  }

DurchschnittFarbwertRot=FarbwertRot/messungen;  //Hier werden die 100 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.

 

// 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:

if (DurchschnittFarbwertBlau > 260 && DurchschnittFarbwertBlau < 340 && DurchschnittFarbwertGruen > 290 && DurchschnittFarbwertGruen < 430 && DurchschnittFarbwertRot > 260 && DurchschnittFarbwertRot < 320) //1. Fall: Rotes Bonbon

{

servoSchwenker.write (30); // 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 blau:

if (DurchschnittFarbwertBlau > 450 && DurchschnittFarbwertBlau < 490 && DurchschnittFarbwertGruen > 300 && DurchschnittFarbwertGruen < 360 && DurchschnittFarbwertRot > 140 && DurchschnittFarbwertRot < 245) //1. Fall: Rotes Bonbon

{

servoSchwenker.write (60); // 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);

}

 

else

{

servoSchwenker.write (180); // 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);

}

 

}