Farbsortiermaschine: Unterschied zwischen den Versionen
Zeile 156: | Zeile 156: | ||
== Komponententest == | == Komponententest == | ||
<div style="width:950px; height:500px; overflow:auto; border: 1px solid #000"> | |||
Positionen des Servos für die Behälter | |||
<pre> | |||
//=========================================================================================== | |||
// Florian Leben, Franziska Troja | |||
//------------------------------------------------------------------------------------------- | |||
// Title: Positionen_Servo | |||
// Funktion: Einstellung der Positionen des Servos für die Behälter der Farben | |||
// benötigte Bibliothek | |||
#include <Servo.h> | |||
Servo servo; | |||
void setup() | |||
{ | |||
servo.attach(10); // Pin 10 für Servo | |||
} | |||
void loop() | |||
{ | |||
servo.write(155); //Position 155 ansteuern | |||
} | |||
</pre> | |||
Darstellung von Texten auf dem Display: | |||
<pre> | |||
//================================================================================== | |||
// Florian Leben; Franziska Troja | |||
//---------------------------------------------------------------------------------- | |||
// Title: LCD_Display | |||
// Funktion: Ausprobieren des LCD-Displays in der Ansteuerung der beiden Zeilen | |||
// benötigte Bibliothek | |||
#include <LiquidCrystal.h> | |||
// Initialisierung des Displays | |||
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); | |||
void setup() | |||
{ | |||
lcd.begin(16, 2); | |||
} | |||
void loop() | |||
{ | |||
lcd.setCursor(0, 0); // Position des Cursors, beginnt beim ersten Zeichen in der oberen Zeile | |||
lcd.print("Oben"); // beschreibt ab der Position 0,0 das Wort "Oben" | |||
delay (2000); // zwei Sekunden warten | |||
lcd.clear(); // Display wird gelöscht | |||
lcd.setCursor(5, 1); // Position des Cursors, beginnt beim fünften Zeichen in der unteren Zeile | |||
lcd.print("Unten"); // beschreibt ab der Position 5,1 das Wort "Unten" | |||
delay (2000); //Zwei Sekunden warten | |||
lcd.clear(); //Display wird gelöscht | |||
} | |||
</pre> | |||
Farbsensor TCS34725 ausprobieren | |||
<pre> | |||
//============================================================================================== | |||
// Florian Leben; Franziska Troja | |||
//---------------------------------------------------------------------------------------------- | |||
// Title: Test_Farbsensor | |||
// Funktion: Testen des Farbsensors mit Ausgabe der gemessenen Farbe auf dem seriellen Monitor | |||
// benötigte Bibliotheken | |||
#include "Adafruit_TCS34725.h" | |||
#include <Wire.h> | |||
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_1X); | |||
void setup() | |||
{ | |||
Serial.begin(9600); | |||
if (tcs.begin()) | |||
{ | |||
// Alles OK, Sensor wurde gefunden | |||
Serial.println("Sensor gefunden"); | |||
} | |||
else | |||
{ | |||
// Kein Sensor gefunden | |||
Serial.println("TCS34725 nicht gefunden ... Ablauf gestoppt!"); | |||
while (1); // Halt! | |||
} | |||
} | |||
void loop() | |||
{ | |||
// Der Sensor liefert Werte für R, G, B und einen Clear-Wert zurück | |||
uint16_t clearcol, red, green, blue; | |||
float average, r, g, b; | |||
delay(100); // Farbmessung dauert c. 50ms | |||
tcs.getRawData(&rot, &gruen, &blau, &clearcol); | |||
// Durchschnitt von RGB ermitteln | |||
durchschnitt = (rot + gruen + blau)/3; | |||
// Farbwerte durch Durchschnitt | |||
r = rot / durchschnitt; | |||
g = gruen / durchschnitt; | |||
b = blau / durchschnitt; | |||
Serial.print("Wellenlänge: " + String(clearcol)); | |||
Serial.print(", Rot: " + String(r)); | |||
Serial.print(", Grün: " + String(g)); | |||
Serial.print(", Blau: " + String(b)); | |||
//Farberkennung | |||
// Orange | |||
if ((clearcol > 40) && (r > 1.4) && (g < 0.9) && (b < 0.7)) | |||
{ | |||
Serial.print("\tORANGE"); | |||
} | |||
// Rot | |||
else if ((r > 1.4) && (g < 0.9) && (b < 0.9)) | |||
{ | |||
Serial.print("\tROT"); | |||
} | |||
// Grün | |||
else if ((r < 0.95) && (g > 1.4) && (b < 0.9)) | |||
{ | |||
Serial.print("\tGRUEN"); | |||
} | |||
// Lila | |||
else if ((r > 1.1) && (g < 1.1) && (b < 1.1)) | |||
{ | |||
Serial.print("\tLILA"); | |||
} | |||
// Gelb | |||
else if ((r > 1.15) && (g > 1.15) && (b < 0.7)) | |||
{ | |||
Serial.print("\tGELB"); | |||
} | |||
// Ausschuss | |||
else | |||
{ | |||
Serial.print("\tNICHT ERKANNT"); | |||
} | |||
Serial.println(""); | |||
delay(100); | |||
} | |||
</pre> | |||
</div> | |||
== Ergebnis == | == Ergebnis == |
Version vom 11. Januar 2021, 15:29 Uhr
Autoren: Franziska Troja, Florian Leben
Gruppe: 2.6
Betreuer: Prof. Dr. Mirek Göbel
→ zurück zur Übersicht: WS 20/21: Fachpraktikum Elektrotechnik (MTR)
Einleitung
Dieser Artikel beschreibt die Realisierung einer Farbsortiermaschine mit der Steuerung über einen Arduino. Dieser soll Schüttgut nach Farbe sortieren, sowie nicht definierbares Gut ausschleusen. Zudem erfolgt eine Zählung der verschiedenen Farben, sowie das Anzeigen der mit dem Farbsensor bestimmten Farbe über eine RGB LED.
Ziel des Projektes im GET-Fachpraktikum im 5. Semester des Studiengangs Mechatronik ist es, ein mechatronisches System zu bauen und in Betrieb zu nehmen. Abschließend wird das Projekt im Rahmen einer digitalen Messe vorgestellt. In dem Projekt werden alle drei wesentlichen Disziplinen des Studiengangs benötigt: die mechanische Konstruktion der Anlage, die elektrische Funktionsfähigkeit, sowie die Programmierung eines Mikrocontrollers.
Anforderungen
Für das Projektes wurden die folgenden Anforderungen ausgearbeitet:
- Zuverlässige Vereinzelung des Schüttguts.
- Definieren des Farbspektrums und der Toleranzbereiche.
- Zuverlässige und wiederholbare Genauigkeit bei den Messungen.
- Abschirmung von Fremdlicht für eine genauere Messung.
- Zählung der gesamten Anzahl des Schüttguts.
- Zählung der Anzahl jeder Farbe.
- Ausschleusung von Schüttgut, welches außerhalb des Toleranzbereiches fällt.
- Automatische Abschaltung, wenn Schüttgut leer.
Funktionaler Systementwurf/Technischer Systementwurf
Das System besteht aus verschiedenen Komponenten. Das Schüttgut, welches sich in einem Vorratsbehälter befindet, wird vereinzelt und dann der Farberkennung übergeben. Zur Erfassung der Farbe wird ein Farbsensor des Typs TCS34725 eingesetzt. Die dadurch ermittelten Daten werden von einem Mikrocontroller verarbeitet. Anschließend wird das Gut mit einer Sortieranlage dem passenden Behälter der jeweiligen Farbe zugeführt. Der Sortiervorgang soll automatisch beendet werden, sobald ein Sensor am Vorratsbehälter meldet, dass der Behälter leer ist. Optional kann das System durch eine RGB LED, welche die gemessene Farbe anzeigt, sowie durch einen RFID-Sensor erweitert werden, der eine Freischaltung der Farbsortiermaschine nur mit einer passenden Chipkarte ermöglicht.
Komponentenspezifikation
- Arduino UNO R3
In diesem Projekt werden zwei Arduino UNO Boards verwendet, die auf einem Atmel-AVR-Mikrocontroller basieren. Die Boards sind mit der SMD-Bauweise realisiert und können entweder über eine USB-Schnittstelle (5V) oder eine externe Spannungsquelle (7-12V) versorgt werden. Sie takten zudem mit einer Frequenz von 16 MHz. Der Arduino verfügt über 14 digitale I/Os und über sechs analoge Eingänge. An den Arduino können an die zur Verfügung gestellten I/O Pins verschiedene Aktoren und Sensoren angeschlossen werden. Es kann außerdem mit einem I2C-Bus kommuniziert werden.
- Micro-Servomotor SG90
Der Servomotor besteht aus einem Elektromotor und einem Rotationssensor. Der Motor kann mit einer Spannung zwischen 4,8V bis 6V betrieben werden. Durch den Arduino wird er mit einer Spannung von ungefähr 5V betrieben, so dass er sich mit der Geschwindigkeit von 0,3sec pro 60° bewegt.
- Schrittmotor ULN2003 5V
Als einen weiteren Antrieb werden zwei Schrittmotoren verwendet. Der Motor verfügt über vier Spulen, die einpolig mit den 5V des Arduinos betrieben werden. Der Schrittmotor kann nicht direkt mit dem Arduino verbunden werden, da die Pins zu wenig Strom liefern. Dem Schrittmotor muss deswegen eine Treiberplatine vorgeschaltet werden. Er kann 2048 Schritte mit hoher Präzision anfahren.
- Farbsensor TCS34725 RGB-Sensor
Der RGB-Farbsensor der Firma Adafruit verfügt über einen Infrarotfilter und eine LED, die auch per Schaltung ausgeschaltet werden kann. Der Farbsensor besteht aus vier einzelnen Sensoren, die einen Rot-, Grün-, Blau- und Lichtstärkenwert zurückgeben. Der IR-Filter sorgt dafür, dass das IR-Spektrum minimiert wird und somit eine genauere Farbmessung durchgeführt werden kann. Der Farbsensor kommuniziert über den I2C-Bus.
- RGB-LED
Die RGB-LED besteht aus vier Leitungen. Eine Leitung ist jeweils für eine der Farben (Rot, Grün und Blau) und die längste Leitung für die gemeinsame Kathode, dementsprechend werden die anderen Leitungen über die Spannung versorgt. Im Inneren besteht die LED aus drei einzeln ansteuerbaren LEDs. Die RGB-LED kann verschiedene Farben darstellen, indem die drei Grundfarben Rot, Grün und Blau gemischt werden. Es kann zudem die Intensität der Farbstärke variiert werden. Die Farbwerte können Werte zwischen 0 und 255 annehmen. Diese LED wird dazu verwendet, um den Betriebszustand der Farbsortiermaschine anzuzeigen.
- LCD-Display
Als Anzeige wird ein LCD-Display mit blauer Hintergrundbeleuchtung verwendet. Dieses kann 16 Zeichen auf jeweils zwei Zeilen anzeigen.
Umsetzung (HW/SW)
Hardware
Die Farbsortiermaschine ist in drei Bereiche unterteilt: die Zuführung des Schüttguts, in diesem Fall Skittles, der Farbmessung und der Sortierung.
Der Aufbau der Maschine erfolgte zu Testzwecken vorläufig mittels einfacher 3D gedruckter Standbeine und einem einfachen Trichter als Zuführung. Nach den erfolgreichen Testversuchen wurde mit der Realisierung der Zuführung begonnen.
Da das Prinzip mit dem vorhandenen Drehteller für die Farbmessung gut funktionierte, wurde diese für die Zuführung erneut verwendet und den neuen Anforderungen entsprechend angepasst. Die Zuführung der Skittles erfolgt als Schüttgut über eine Öffnung an der Oberseite der Maschine. Darunter befindet eine Art Trichter, an dem eine schräg angeordnete Scheibe mit 12 Löchern montiert ist. Diese rotierende Scheibe wird mit Hilfe eines Schrittmotors betrieben und führt die Skittles nacheinander einem Auswurfloch zu.
Zur Verbindung der beiden Maschinenabschnitte wurde ein Rohr mit Sichtfenster zu konstruiert, welches zeitgleich als Pufferspeicher zwischen der Zuführung und der nachfolgenden Farbmessung dient.
Das Rohr endet auf einem Drehteller, einer weiteren Scheibe mit 12 Löchern. Diese Scheibe wird wie auch die Zuführung durch einen Schrittmotor angetrieben und nimmt immer ein Skittle aus dem Pufferspeicher auf. Das Skittle wird dann mit der Scheibe Schrittweise weiter getaktet, bis es unter dem Farbsensor positioniert ist. Der Farbsensor ist mit einer Halterung an dem Drehteller befestigt und über dem Skittle positioniert. Die Scheibe taktet anschließend weiter zur nächsten Position. Bei dieser Position befindet sich ein Loch unter dem Drehteller, wodurch das Skittle dann ausgeschleust wird.
Das Skittle fällt dann durch das Loch direkt in den Trichterförmigen Schwenkarm. Dieser Arm kann sechs unterschiedlichen Positionen mithilfe eines Servomotors anfahren. Das Skittle wird dann über eine Schiene zu dem jeweiligen Behälter weitergeleitet. Diese Behälter sind einzeln zu entnehmen und können so sehr einfach entleert werden. Der sechste Behälter ist für den Ausschuss gedacht und die anderen fünf für die jeweilige Farbe (rot, orange, gelb, grün, lila).
Die Anzahl der Sortierten Skittles, sowie die aktuell gemessene Farbe wird auf dem Display angezeigt. Der Betriebszustand der Farbsortiermaschine wird über die RGB-LED angezeigt.
Da beim erste Arduino Uno für die Farbmessung und Sortierung der Skittles nicht mehr genügend freie Anschlüsse vorhanden waren, wurde eine zweiter Arduino Uno für die Zuführung verwendet, um diese anzusteuern.
Nachdem die Abmaße durch die vorhandenen Kernelemente der Maschine feststanden, wurde das Gehäuse der Maschine geplant. Der Korpus der Farbsortiermaschine wurde aus Holzplatten zugeschnitten, welche anschließend mit Dekorfolie beklebt wurden, um ein einheitliches Maschinendesign zu erhalten. Anschließend wurde mit der Montage der einzelnen Komponenten begonnen. Nachdem die Maschine mechanisch fertig gestellt war, wurde die Elektronik eingebaut und angeschlossen. Danach wurden die Komponenten der Maschine noch einmal einzeln angesteuert, um den richtigen Anschluss und die Funktionsfähigkeit der Komponenten sicherzustellen.
Software
Komponententest
Positionen des Servos für die Behälter
//=========================================================================================== // Florian Leben, Franziska Troja //------------------------------------------------------------------------------------------- // Title: Positionen_Servo // Funktion: Einstellung der Positionen des Servos für die Behälter der Farben // benötigte Bibliothek #include <Servo.h> Servo servo; void setup() { servo.attach(10); // Pin 10 für Servo } void loop() { servo.write(155); //Position 155 ansteuern }
Darstellung von Texten auf dem Display:
//================================================================================== // Florian Leben; Franziska Troja //---------------------------------------------------------------------------------- // Title: LCD_Display // Funktion: Ausprobieren des LCD-Displays in der Ansteuerung der beiden Zeilen // benötigte Bibliothek #include <LiquidCrystal.h> // Initialisierung des Displays LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); } void loop() { lcd.setCursor(0, 0); // Position des Cursors, beginnt beim ersten Zeichen in der oberen Zeile lcd.print("Oben"); // beschreibt ab der Position 0,0 das Wort "Oben" delay (2000); // zwei Sekunden warten lcd.clear(); // Display wird gelöscht lcd.setCursor(5, 1); // Position des Cursors, beginnt beim fünften Zeichen in der unteren Zeile lcd.print("Unten"); // beschreibt ab der Position 5,1 das Wort "Unten" delay (2000); //Zwei Sekunden warten lcd.clear(); //Display wird gelöscht }
Farbsensor TCS34725 ausprobieren
//============================================================================================== // Florian Leben; Franziska Troja //---------------------------------------------------------------------------------------------- // Title: Test_Farbsensor // Funktion: Testen des Farbsensors mit Ausgabe der gemessenen Farbe auf dem seriellen Monitor // benötigte Bibliotheken #include "Adafruit_TCS34725.h" #include <Wire.h> Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_1X); void setup() { Serial.begin(9600); if (tcs.begin()) { // Alles OK, Sensor wurde gefunden Serial.println("Sensor gefunden"); } else { // Kein Sensor gefunden Serial.println("TCS34725 nicht gefunden ... Ablauf gestoppt!"); while (1); // Halt! } } void loop() { // Der Sensor liefert Werte für R, G, B und einen Clear-Wert zurück uint16_t clearcol, red, green, blue; float average, r, g, b; delay(100); // Farbmessung dauert c. 50ms tcs.getRawData(&rot, &gruen, &blau, &clearcol); // Durchschnitt von RGB ermitteln durchschnitt = (rot + gruen + blau)/3; // Farbwerte durch Durchschnitt r = rot / durchschnitt; g = gruen / durchschnitt; b = blau / durchschnitt; Serial.print("Wellenlänge: " + String(clearcol)); Serial.print(", Rot: " + String(r)); Serial.print(", Grün: " + String(g)); Serial.print(", Blau: " + String(b)); //Farberkennung // Orange if ((clearcol > 40) && (r > 1.4) && (g < 0.9) && (b < 0.7)) { Serial.print("\tORANGE"); } // Rot else if ((r > 1.4) && (g < 0.9) && (b < 0.9)) { Serial.print("\tROT"); } // Grün else if ((r < 0.95) && (g > 1.4) && (b < 0.9)) { Serial.print("\tGRUEN"); } // Lila else if ((r > 1.1) && (g < 1.1) && (b < 1.1)) { Serial.print("\tLILA"); } // Gelb else if ((r > 1.15) && (g > 1.15) && (b < 0.7)) { Serial.print("\tGELB"); } // Ausschuss else { Serial.print("\tNICHT ERKANNT"); } Serial.println(""); delay(100); }
Ergebnis
Zusammenfassung
Lessons Learned
Projektunterlagen
Projektplan
Projektdurchführung
YouTube Video
Weblinks
Literatur
→ zurück zur Übersicht: WS 20/21: Fachpraktikum Elektrotechnik (MTR)