Hey! Sie scheinen aus United States zu kommen, möchten Sie auf die Englisch Webseite wechseln?
Switch to Englisch site
Skip to main content

Mit Arduino entwickelte mechatronische Farbsortiermaschine

Wenn Sie wie ich nur die roten oder gelben Skittles mögen, könnte dieses lustige Arduino-Projekt genau richtig sein für Sie. Sie werden lernen, wie Sie die Herausforderungen der Steuerung von Schrittmotoren und Servomotoren meistern und Objekte klassifizieren, in diesem Fall durch Erkennen ihrer Farbe mithilfe von Arduino. Diese grundlegenden Prinzipien bilden die Basis für Ihre nächste Mechatronik- oder Roboteranwendung.   

Vollständige Codebeispiele und die Dokumentation für das Projekt finden Sie aufGithub

Aufteilung in Einzelprojekte

arduino-stepper-test2_460193af5bacd5d7e5565d60932a4347105899cc.jpg

Die Sortiermaschine ist in der Lage, farbige Zählobjekte (in diesem Fall Skittles) in fünf verschiedene Farben zu sortieren. Die Zählobjekte werden von einem Trichter in einen rotierenden Führungsarm geladen, der von einem Servomotor angetrieben wird. Der Arm hat eine kreisförmige Halteöffnung, mit der das Zählobjekt zu einer Position unter einem RGB-Farbsensor bewegt wird. Sobald die Farbe durch den Sensor bestimmt wurde, wird eine rotierende Platte, die durch einen Schrittmotor angetrieben wird, in die richtige Position für diese Farbe unter den Sammelpunkt bewegt. Der Arm bewegt dann das Zählobjekt über die Auswurföffnung, wo es in einen Behälter fällt. Zu diesem Zeitpunkt kehrt der Arm in seine Ausgangsposition zurück und der Zyklus wiederholt sich. Eine Arduino Uno (715-4081) Mikrocontroller-Platine koordiniert die Funktionen der verschiedenen Komponenten.

Es gibt eine Reihe von zu überwindenden Designherausforderungen, um eine solche Maschine zu bauen. Ich ging das Problem an, indem ich das Projekt in drei separate Komponenten aufgeteilt haben, die individuell erstellt und getestet werden konnten. Dies ermöglichte mir, den Schwerpunkt auf einen kleineren Designbereich zu legen, bevor die einzelnen Lösungen in der fertigen Maschine kombiniert wurden.

Antrieb

Zuerst habe ich die rotierende Platte entwickelt, gebaut und kodiert. Es wurde ein RSPro Schrittmotor (535-0489) verwendet. Dabei handelt es sich um einen bipolaren Allzweckmotor mit vier Anschlüssen und 200 Schritten pro Umdrehung. Er hat mehr als genug Drehmoment für dieses Projekt und viele Anwendungsmöglichkeiten für zukünftige Maschinen.

Bipolare Schrittmotoren verfügen über zwei Spulen, die unter Spannung den Motor in beide Richtungen drehen, sehr genau, jeweils einen Schritt. Die Motorspezifikation bestimmt die Anzahl der möglichen Schritte für jede Umdrehung. Um den Motor mit Arduino zu steuern, ist eine H-Bridge erforderlich. Um die Sache aber zu vereinfachen, habe ich eine EasyDriver-Platine mit Open Source-Design und hochwertiger Dokumentation verwendet.

Die EasyDriver-Platine benötigt nur drei der digitalen Arduino I/O-Pins für die Steuerung. Ein Pin sendet einen eine Millisekunde langen Impuls, der den Motor einen Schritt bewegt. Ein anderer Pin bestimmt die Drehrichtung. Ein dritter Pin gibt den Motor frei, wodurch Strom reduziert wird, wenn sich der Motor im Stillstand befindet. Die Standardeinstellung für EasyDriver ermöglicht ⅛ Mikroschritte für eine ruhigere Rotation.

StepTest.ino enthält ein Array. Jeder Array-Index repräsentiert eine von fünf zu sortierenden Farben. Die Array-Werte sind die nullbasierte Position und müssen zum Ursprung oder Sammelpunkt für die Platte zurückzukehren.

int indexArray[] = {0, 4, 3, 2, 1};

Array-Werte werden jedes Mal aktualisiert, wenn die Platte eine Position bewegt wird. Um also einen bestimmten Index zum Ursprung zu bewegen, kann die Anzahl der Positionen zusammen mit der optimalen Richtung berechnet werden. Dies geschieht mit der Funktion setPosition().

Die Funktion move() verwendet die Anzahl der Positionen, die die Platte bewegt wird, und die Richtung. Für eine Bewegung um eine Position bewegt sich der Motor also mit 200 Schritten pro Umdrehung bei 8 Mikroschritten pro Schritt für fünf Positionen, d. h. 320 Schritte (200 * 8 / 5) sind erforderlich. Hier ist das wichtige Codesegment, mit dem dies erreicht wird.

for (int i = 0; i < steps; i++)   // Move the number of micro-steps
 {
   digitalWrite(stp, HIGH); //Trigger one step forward
   delay(1);
   digitalWrite(stp, LOW); // Pull step pin low so it can be triggered again
   delay(1);
 }

Diese einfache Technik kann in allen Arten von Schrittmotorprojekten eingesetzt werden.

Nächste Schritte

arduino-servo-test_5f54ae61c869b941060dd66d68a25ae183a6ab70.jpg

Als nächstes stehen die Konstruktion und Codierung der Farbsortierplattform und des Arms an, um die farbigen Zählobjekte zu bewegen. Dafür wurde eine 3-mm-Hartplatte verwendet, mit der sich einfach arbeiten lässt. Ein Parallax Standard Servo-Motor (781-3058) wurde zur Steuerung des Arms verwendet, der unter der Plattform montiert ist. Servomotoren kehren automatisch in ihre Startposition zurück, sodass sie sich ideal für die Steuerung des Arms eignen. Die Arduino Servo-Bibliothek verwendet einen einzelnen Steuerpin, um die Anzahl der Grad der Drehung des Servomotors vom Ursprung festzulegen.

ServoTest.ino enthält die folgenden separaten Funktionen für die drei benötigten Positionen des Servomotors: moveToOrigin(), moveToSensor() und moveToEjector().

Hier ist der Code für die Bewegung um eine bestimmte Anzahl von Grad. Das Schleifenintervall kann erhöht werden, um die Bewegung auf Kosten der Laufruhe zu beschleunigen. Eine kleine Verzögerung wird benötigt, damit jede Position erreicht werden kann.

for (pos = 0; pos <= 30; pos += 1) { // goes from 0 degrees to 30 degrees in steps of 1 degree
   myservo.write(pos);              // tell servo to go to position in variable 'pos'
   delay(15);                       // waits 15ms for the servo to reach the position
 }

Auch diese Technik kann in den meisten Projekten mit Servomotor eingesetzt werden.

Sortierung

Die letzte Komponente des Puzzles war die Farberkennung, für die eine TCS34725-Platine von Adafruit verwendet wurde. Die Farberkennung ist ein komplexes Thema und diese Platine wird mit ausgereiften Bibliotheken geliefert, die die Farbtemperatur berechnen können. Damit wurde die Farbe der einzelnen Zählobjekte bestimmt.

SensorTest.ino ermittelt Kalibrierungswerte für jede Farbe und testet den Sensor. Stellen Sie sicher, dass Sie unter gleichbleibenden Bedingungen im Hintergrund arbeiten, da der Sensor sehr empfindlich auf Änderungen der Beleuchtung reagiert. Das Erreichen einer zuverlässigen Zuordnung von Farbtemperaturen zu einer bestimmten Farbe war der schwierigste Teil des Projekts und vermittelt Ihnen ein Verständnis dafür, warum einige Menschen unter Farbenblindheit leiden.

Der Testcode gibt die Min.- und Max.-Farbtemperaturen für jede Farbe an den seriellen Arduino-Monitor aus. Diese Zuordnung wird im endgültigen Code zur Indizierung der korrekten Position der Platte verwendet.

Zusammenbau

arduino-colour-sorter-circuit_a050b6a37075207e58435727b666f92d6435716a.jpg

Nachdem nun alle Teile des Projekts entwickelt und getestet wurden, werden sie in ColorSorter.ino zusammengeführt.

Ich habe mein Tischnetzteil mit 7 V verwendet. Das liegt etwas über der Spezifikation für den Servomotor, aber es gab keine Probleme. Dies bedeutete, dass keine zusätzliche Elektronik erforderlich war.

Die Funktion getIndex() ist hier die wichtige Ergänzung. Sie enthält eine Reihe von if-Anweisungen, die Grenzwerte für jede Farbtemperatur festlegen, die mit der Sensorkalibrierung ermittelt wurden. Der Rückgabewert der Funktion ist die Indexposition der Platte für diese Farbe, die für den Antrieb des Schrittmotors verwendet wird.

if (colour > 3878 && colour <= 4183) {
   Serial.println("Yellow");
   return index = 1;
 }

Zurück in die Zukunft

arduino-colour-sorter_7af330ca60c70c7cf8357d20207363e52254d070.jpg

Das Erstellen dieses Projekts war eine tolle Sache, um mehr über die Steuerung von Schritt- und Servomotoren sowie über die Klassifizierung von farbigen Objekten zu erfahren. Alle Bausteine eignen sich sehr gut für andere Mechatronik- und Roboterprojekte.

Die schwierigste Herausforderung für diese Konstruktion bestand darin, genaue und konsistente Farbwerte zu erzielen, und wenn ich weiter daran arbeiten würde, würde ich eine zusätzliche Schalenposition hinzufügen, um „Ausschuss“ zu erfassen. Auf diese Weise kann es möglich sein, Lücken in der Farbtemperaturzuordnung zu schaffen, um eine engere Toleranz für die Farbe zu erzielen. So könnten alle nicht klassifizierten Objekte abgelehnt und dann neu sortiert werden.

Davon abgesehen erzielt die Arduino-Sortiermaschine eine Genauigkeit von 98 bis 99 %. Wenn Sie Vorschläge für Alternativen zur Farbklassifizierung haben, geben Sie bitte unten einen Kommentar ein.

Oh, und essen Sie nicht zu viele Skittles, wenn Sie diese Maschine bauen!

I'm an engineer and Linux advocate with probably more SBCs than a Chandrayaan-3 moon lander