Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

DIY-Verkaufsautomat – Arduino-basiertes Mechatronik-Projekt

In diesem Projekt lernen wir, wie man einen Arduino-basierten DIY-Verkaufsautomaten herstellt. Ich zeige Ihnen den gesamten Bauprozess, angefangen vom Schneiden und Zusammenbauen der MDF-Platten bis hin zum Verbinden aller elektronischen Teile und dem Schreiben des Arduino-Codes.

Sie können sich das folgende Video ansehen oder das schriftliche Tutorial unten lesen.

Übersicht

Der Verkaufsautomat verfügt über vier Ausgabeeinheiten, die über vier Servomotoren mit kontinuierlicher Rotation gesteuert werden, ein Trägersystem, das über Schrittmotoren gesteuert wird, ein LCD, vier Tasten zur Auswahl eines Artikels und einen Münzprüfer.

Sie denken jetzt vielleicht, dass der Warenträger für diesen Automaten nicht so sinnvoll ist, und ja, Sie haben wahrscheinlich Recht. Aber meine Idee hier war, dieses Projekt interessanter oder etwas komplexer zu machen, damit Sie mehr neue Sachen lernen können. Ich denke, diese Projektidee kann großartig für Elektronik- oder Mechatronikstudenten sein, die erwägen, eines als Abschlussprojekt zu bauen, sowie für alle Arduino-Enthusiasten.

Bau des Verkaufsautomaten

Ich begann mit dem Zuschneiden der 8 mm dicken MDF-Platte.

Ich habe zuvor ein 3D-Modell der Maschine erstellt, von dem ich alle Maße habe.

Sie können dieses 3D-Modell finden und herunterladen sowie es in Ihrem Browser auf Thangs erkunden.

Zum Schneiden der MDF habe ich eine Kreissäge verwendet. Eigentlich ist dies eine selbstgebaute Werkbank mit einer Kreissäge, einer Oberfräse und einer Stichsäge, die von meiner Partnerin Marija hergestellt wurde, und auf ihrem YouTube-Kanal Creativity Hero gibt es ein DIY-Video dazu.

Nachdem ich alle Paneele mit der Kreissäge geschnitten hatte, fuhr ich fort, die Öffnungen in einigen der Paneele mit der umgedrehten Stichsäge zu machen.

Eigentlich kann sogar eine Stichsäge für den vorherigen Schritt verwendet werden, falls Sie keine Kreissäge haben. Ich benutzte auch die Stichsäge zum Schneiden der kleineren Teile, die mehrere Schnitte hatten. Beachten Sie jedoch, dass es sich um gefährliche Maschinen handelt, daher müssen Sie bei der Verwendung sehr vorsichtig sein.

Sobald ich alle MDF-Teile fertig hatte, begann ich, sie mit etwas Holzleim und Schrauben zusammenzubauen. Zur Befestigung der Paneele habe ich 90 Grad Winkelklemmen verwendet. Mit einem Akku-Bohrschrauber habe ich zuerst Pilotlöcher gemacht, dann Senkungen gemacht und die 3-mm-Schrauben festgeschraubt. Ich habe die gleiche Methode für die Montage aller Paneele verwendet und für einige von ihnen habe ich auch einige F-Klemmen verwendet.

Schienensystem

An diesem Punkt der Montage werde ich mit der Herstellung des Schienensystems fortfahren. Dazu verwende ich Aluminiumrohre, die ich mit einer Metallhandsäge zurechtschneide. Der Durchmesser des Rohrs für die horizontale Schiene beträgt 16 mm, während der Durchmesser für die vertikale Schiene 20 mm beträgt. Auf einem massiven 18 mm Holzbrett habe ich mit Forstnerbohrern Schlitze für die Rohre gemacht und dann die Rohre daran befestigt.

Die horizontale Schiene besteht aus zwei 27 cm langen Rohren, während die vertikale Schiene aus drei 45 cm langen Rohren besteht.

Als nächstes kommen die Schieberegler und so habe ich sie gemacht. Ich habe ein 21 x 21 cm großes Holzbrett verwendet, auf dem ich 8 mm große Löcher gemacht habe.

Dann steckte ich 8 mm Gewindestangen durch diese Löcher und befestigte mit Unterlegscheiben und Muttern die 22 mm Lager. Wie für den horizontalen Schieber habe ich die gleiche Methode verwendet, aber mit kleineren Lagern von 16 mm Außendurchmesser.

Nachdem ich den Schieber zwischen die Rohrschienen eingesetzt hatte, bemerkte ich, dass er etwas locker war. Um dieses Problem zu lösen, musste ich den Abstand zwischen den beiden Schienen verringern. Also habe ich zuerst die Rohrschlitze erweitert, dann senkrechte Schlitze durch die Rohre gemacht und schließlich mit einer Gewindestange die beiden Rohrschienen näher aneinander befestigt. Danach waren die Schieber nicht mehr locker und funktionierten einwandfrei.

An dieser Stelle musste ich jedoch die Schienen zerlegen, um die anderen Elemente hinzuzufügen. Zuerst fügte ich eine 5-mm-Schraube auf der linken Seite der Schienen hinzu, an der ich eine Riemenscheibe für den horizontalen Zahnriemen befestigen werde, sowie zwei weitere Lager, die auf der linken vertikalen Schiene gleiten werden.

Auf der anderen rechten Seite der Schiene musste ich den Schrittmotor für die horizontale Bewegung anbringen. Zuerst habe ich den Motor auf einer 8 mm MDF-Platte befestigt, dann ein tragendes Holzstück darauf gelegt und auch das Schlitzteil daran befestigt. Schließlich befestigte ich diese ganze Baugruppe mit einem Holzleim und zwei Schrauben auf dem vertikalen Schieber.

Als nächstes fuhr ich mit dem Hinzufügen des Containers auf dem horizontalen Schieberegler fort. Zu diesem Zweck habe ich einige kleine Holzstücke verwendet, die ich mit einem Holzleim zusammengefügt habe. Sobald ich damit fertig war, war ich bereit, das Schienensystem zusammenzubauen. Ich habe etwas Epoxid in den Schienenschlitzen verwendet und eine zusätzliche Holzplatte an der Seite der Schienen hinzugefügt, um das gesamte Schienensystem steifer zu machen.

Im nächsten Schritt fügte ich die Baugruppe zwischen die vertikalen Schienen ein und befestigte sie ebenfalls. Das Endergebnis der Schieberegler und des Schienensystems funktionierte hervorragend.

Weiter ging es mit der Installation des horizontalen Zahnriemens. Ich habe die benötigte Länge gemessen, zugeschnitten und mit einem Kabelbinder am Schieber befestigt. Wie für den vertikalen Schieber befestigte ich den Schrittmotor auf der Oberseite der Maschine mit einem Stück MDF und einigen Schrauben. Unten habe ich die Riemenscheibe befestigt und auf ähnliche Weise den Zahnriemen montiert.

Entladeeinheiten

Als nächstes ging es weiter zur Artikelaustragseinheit. Ich habe eine spiralförmige Spule aus 3 mm dickem Metalldraht gemacht, indem ich sie um eine Sprühdose mit 7 cm Durchmesser gewickelt habe.

Danach befestigte ich es mit einer Klebepistole an einem Servomotor mit kontinuierlicher Rotation.

Vorderseite

Als nächstes kommt die Fronttürverkleidung, die ich mit einfachen Scharnieren am Automaten befestigt habe, und zum Verriegeln habe ich einen magnetischen Türfänger verwendet. Dann habe ich ein 5 mm dickes Acryl verwendet, um die große vordere Öffnung abzudecken, während ich für die kleinere Öffnung auf der rechten Seite eine sehr dünne Aluminiumplatte verwendet habe. Hier habe ich 4 Löcher für die Knöpfe gemacht, sowie Öffnungen für die Münzen und das LCD-Display. Ich benutzte einen Bohrer und eine Metallsäge, um sie herzustellen. Nachdem ich die Elektronikteile an der Aluminiumplatte befestigt hatte, befestigte ich sie dann mit 5-mm-Schrauben an der vorderen Türverkleidung.

Um den Träger in seine Ausgangsposition zu bringen, habe ich zwei Mikroschalter installiert und für die Münzen habe ich eine Führung geklebt, die die Münze zum Boden der Maschine gleiten lässt.

Der Münzprüfer ist ein einfacher Infrarot-Näherungssensor. Wenn also eine Münze in seine Nähe kommt, gibt der Sensor uns ein positives Feedback.

Schaltplan

Als nächstes kommt der lustige Teil, der Anschluss aller elektronischen Komponenten an das Arduino-Board. Hier ist der vollständige Schaltplan für dieses DIY-Verkaufsautomatenprojekt.

Wir brauchen also eine 12-V-Stromversorgung mit mindestens 2 Ampere. Wir brauchen die 12V für die beiden Schrittmotoren, sowie die LED-Lichtbänder, die ich später an der Haustür anbringen werde. Für alle anderen Komponenten benötigen wir jedoch 5 V, daher habe ich einen Abwärtswandler verwendet, um die 12 V auf 5 V herunterzuwandeln. Die DS04-NFC-Servomotoren mit kontinuierlicher Rotation werden mit 5 V versorgt und über PWM-Signale gesteuert, die von der Arduino-Platine kommen, während die Schrittmotoren über die A4988-Treiber gesteuert werden. Die vier Tasten und die beiden Mikroschalter sind mit Masse und den digitalen Arduino-Pins verbunden, sodass wir mit den internen Pull-up-Widerständen des Arduino-Boards leicht erkennen können, wann sie gedrückt werden.

Die für dieses Arduino-Tutorial benötigten Komponenten erhalten Sie über die folgenden Links:

  • DC-DC-Abwärtswandler LM2596 …………..
  • 16×2 LCD …………………………………………………..
  • 360 Grad kontinuierlicher Servomotor …
  • Schrittmotor NEMA 17 ……………………….
  • A4988 Schrittmotortreiber ……………….
  • IR-Näherungssensor ………………………………..
  • Schaltflächen …………………………………………………….
  • Mikro-Endschalter ………………………………….
  • Arduino-Board …………………………………………

Ich verband die elektronischen Komponenten mit einigen Schaltdrähten. Es wurde ein wenig chaotisch mit so vielen Drähten, aber alles funktionierte einwandfrei. Am Ende habe ich zwei LED-Lichtleisten an der Türverkleidung angebracht, um das Innere des Automaten zu beleuchten.

Arduino-Code

Was jetzt übrig bleibt, ist das Arduino zu programmieren und hier ist der Code, den ich für dieses Projekt gemacht habe. Darunter befindet sich eine Beschreibung des Codes.

/* DIY Vending Machine - Arduino based Mechatronics Project by Dejan Nedelkovski, www.HowToMechatronics.com */ #include <LiquidCrystal.h> // includes the LiquidCrystal Library #include <Servo.h> LiquidCrystal lcd(27, 26, 25, 24, 23, 22); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7) Servo servo1, servo2, servo3, servo4; // DS04-NFC motors // Stepper motors pins #define dirPinVertical 0 #define stepPinVertical 1 #define dirPinHorizontal 2 #define stepPinHorizontal 3 #define coinDetector 9 #define button1 13 #define button2 12 #define button3 11 #define button4 10 #define microSwitchV 15 #define microSwitchH 14 int buttonPressed; void setup() { lcd.begin(16, 2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display servo1.attach(4); servo2.attach(5); servo3.attach(6); servo4.attach(7); pinMode(dirPinVertical, OUTPUT); pinMode(stepPinVertical, OUTPUT); pinMode(dirPinHorizontal, OUTPUT); pinMode(stepPinHorizontal, OUTPUT); pinMode(coinDetector, INPUT); // Activating the digital pins pull up resistors pinMode(button1, INPUT_PULLUP); pinMode(button2, INPUT_PULLUP); pinMode(button3, INPUT_PULLUP); pinMode(button4, INPUT_PULLUP); pinMode(microSwitchV, INPUT_PULLUP); pinMode(microSwitchH, INPUT_PULLUP); // Vertical starting position digitalWrite(dirPinVertical, HIGH); // Set the stepper to move in a particular direction while (true) { if (digitalRead(microSwitchV) == LOW) { // If the micro switch is pressed, move the platfor a little bit up and exit the while loop moveUp(70); break; } // Move the carrier up until the micro switch is pressed digitalWrite(stepPinVertical, HIGH); delayMicroseconds(300); digitalWrite(stepPinVertical, LOW); delayMicroseconds(300); } // Horizontal starting position digitalWrite(dirPinHorizontal, LOW); while (true) { if (digitalRead(microSwitchH) == LOW) { moveLeft(350); break; } digitalWrite(stepPinHorizontal, HIGH); delayMicroseconds(300); digitalWrite(stepPinHorizontal, LOW); delayMicroseconds(300); } } void loop() { // Print "Insert a coin!" on the LCD lcd.clear(); lcd.setCursor(0, 0); lcd.print("Insert a coin!"); // Wait until a coin is detected while (true) { if (digitalRead(coinDetector) == LOW) { // If a coin is detected, exit the from the while loop break; } } delay(10); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Select your item"); lcd.setCursor(0, 1); lcd.print(" 1, 2, 3 or 4?"); // Wait until a button is pressed while (true) { if (digitalRead(button1) == LOW) { buttonPressed = 1; break; } if (digitalRead(button2) == LOW) { buttonPressed = 2; break; } if (digitalRead(button3) == LOW) { buttonPressed = 3; break; } if (digitalRead(button4) == LOW) { buttonPressed = 4; break; } } // Print "Delivering..." lcd.clear(); lcd.setCursor(0, 0); lcd.print("Delivering..."); // Depending on the pressed button, move the carrier to that position and discharge the selected item switch (buttonPressed) { case 1: // Move the container to location 1 moveUp(4900); // Move up 4900 steps (Note: the stepper motor is set in Quarter set resolution) delay(200); moveLeft(1700); // Move left 1700 steps delay(300); // Rotate the helical coil, discharge the selected item servo1.writeMicroseconds(2000); // rotate delay(950); servo1.writeMicroseconds(1500); // stop delay(500); // Move the container back to starting position moveRight(1700); delay(200); moveDown(4900); break; case 2: // Move the container to location 2 moveUp(4900); delay(200); // Rotate the helix, push the selected item servo2.writeMicroseconds(2000); // rotate delay(950); servo2.writeMicroseconds(1500); // stop delay(500); moveDown(4900); break; case 3: // Move the container to location 3 moveUp(2200); delay(200); moveLeft(1700); delay(300); // Rotate the helix, push the selected item servo3.writeMicroseconds(2000); // rotate delay(950); servo3.writeMicroseconds(1500); // stop delay(500); // Move the container back to starting position moveRight(1700); delay(200); moveDown(2200); break; case 4: // Move the container to location 4 moveUp(2200); // Move verticaly 4800 steps delay(200); // Rotate the helix, push the selected item servo4.writeMicroseconds(2000); // rotate delay(950); servo4.writeMicroseconds(1500); // stop delay(500); moveDown(2200); break; } lcd.clear(); // Clears the display lcd.setCursor(0, 0); lcd.print("Item delivered!"); // Prints on the LCD delay(2000); } // == Custom functions == void moveUp (int steps) { digitalWrite(dirPinVertical, LOW); for (int x = 0; x < steps; x++) { digitalWrite(stepPinVertical, HIGH); delayMicroseconds(300); digitalWrite(stepPinVertical, LOW); delayMicroseconds(300); } } void moveDown (int steps) { digitalWrite(dirPinVertical, HIGH); for (int x = 0; x < steps; x++) { digitalWrite(stepPinVertical, HIGH); delayMicroseconds(300); digitalWrite(stepPinVertical, LOW); delayMicroseconds(300); } } void moveLeft (int steps) { digitalWrite(dirPinHorizontal, HIGH); for (int x = 0; x < steps; x++) { digitalWrite(stepPinHorizontal, HIGH); delayMicroseconds(300); digitalWrite(stepPinHorizontal, LOW); delayMicroseconds(300); } } void moveRight (int steps) { digitalWrite(dirPinHorizontal, LOW); for (int x = 0; x < steps; x++) { digitalWrite(stepPinHorizontal, HIGH); delayMicroseconds(300); digitalWrite(stepPinHorizontal, LOW); delayMicroseconds(300); } } Codesprache:Arduino (arduino)

Quellcode-Erklärung

Zuerst müssen wir die Servo- und die LiquidCrystal-Bibliothek einbinden, die LCD-Pins, die vier Servomotoren, die Schrittmotor-Pins, den Münzprüfer sowie die vier Tasten und die zwei Mikroschalter definieren.

Im Setup-Bereich stellen wir die Pin-Modi für jeden der oben genannten Pins ein. Wir können feststellen, dass wir für die Tasten und die Mikroschalterstifte die internen Pull-up-Widerstände aktiviert haben. Das bedeutet, dass der Logikpegel an diesen Pins die ganze Zeit HIGH ist, und sobald wir sie drücken, fällt der Logikpegel auf LOW.

Bevor wir in die Hauptschleife einfahren, bringen wir auch den Träger in seine Startposition, die durch die beiden Mikroschalter definiert wird. Mit der While-Schleife bewegen wir den Träger also weiter in seine Startposition und sobald die beiden Mikroschalter gedrückt werden, stoppen die Motoren und bewegen sich in die gewünschte Startposition.

// Vertical starting position
  digitalWrite(dirPinVertical, HIGH); // Set the stepper to move in a particular direction
  while (true) {
    if (digitalRead(microSwitchV) == LOW) { // If the micro switch is pressed, move the platfor a little bit up and exit the while loop
      moveUp(70);
      break;
    }
    // Move the carrier up until the micro switch is pressed
    digitalWrite(stepPinVertical, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinVertical, LOW);
    delayMicroseconds(300);
  }
  // Horizontal starting position
  digitalWrite(dirPinHorizontal, LOW);
  while (true) {
    if (digitalRead(microSwitchH) == LOW) {
      moveLeft(350);
      break;
    }
    digitalWrite(stepPinHorizontal, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinHorizontal, LOW);
    delayMicroseconds(300);
  } Codesprache:Arduino (arduino) 

Im Hauptprogramm mit Start durch Drucken auf dem LCD die Meldung „Münze einwerfen“. Dann bleiben wir in der While-Schleife hängen. Sobald eine Münze eingeworfen und in der Nähe des Näherungssensors vorbeigeführt wird, fällt der logische Zustand am Münzdetektor-Pin auf LOW und in diesem Fall verlassen wir die while-Schleife mit der break-Anweisung.

// Wait until a coin is detected
  while (true) {
    if (digitalRead(coinDetector) == LOW) { // If a coin is detected, exit the from the while loop
      break;
    }
  } Codesprache:Arduino (arduino) 

Dann geben wir die Meldung „Wählen Sie Ihren Artikel aus“ aus und bleiben in einer weiteren While-Schleife hängen.

// Wait until a button is pressed
  while (true) {
    if (digitalRead(button1) == LOW) {
      buttonPressed = 1;
      break;
    }
    if (digitalRead(button2) == LOW) {
      buttonPressed = 2;
      break;
    }
    if (digitalRead(button3) == LOW) {
      buttonPressed = 3;
      break;
    }
    if (digitalRead(button4) == LOW) {
      buttonPressed = 4;
      break;
    }
  } Codesprache:Arduino (arduino) 

Diese While-Schleife wartet darauf, dass wir eine der vier Tasten drücken, und sobald wir das getan haben, verlassen wir sie und geben die Nachricht „Delivering“ aus.

Nun führen wir je nach gedrückter Taste einen der Fälle in der switch-Anweisung aus. Falls wir die erste Schaltfläche gedrückt haben, beginnt der Träger mit der benutzerdefinierten „moveUp()“-Funktion, sich nach oben zu bewegen.

switch (buttonPressed) {
    case 1:
      // Move the container to location 1
      moveUp(4900); // Move up 4900 steps (Note: the stepper motor is set in Quarter set resolution)
      delay(200);
      moveLeft(1700); // Move left 1700 steps
      delay(300);
      // Rotate the helical coil, discharge the selected item
      servo1.writeMicroseconds(2000); // rotate
      delay(950);
      servo1.writeMicroseconds(1500);  // stop
      delay(500);
      // Move the container back to starting position
      moveRight(1700);
      delay(200);
      moveDown(4900);
      break;
} Codesprache:Arduino (arduino) 

Wenn wir uns diese Funktion ansehen, können wir sehen, dass sie den Schrittmotor einfach so einstellt, dass er sich in eine bestimmte Richtung bewegt, und die Anzahl der Schritte ausführt, die wir als Argument eingegeben haben.

void moveUp (int steps) {
  digitalWrite(dirPinVertical, LOW);
  for (int x = 0; x < steps; x++) {
    digitalWrite(stepPinVertical, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinVertical, LOW);
    delayMicroseconds(300);
  }
} Codesprache:Arduino (arduino) 

Wir können hier feststellen, dass ich den A4988-Stepper-Treiber so eingestellt habe, dass er in Viertelschrittauflösung arbeitet, und mit einigen Verkostungen bin ich zu dem Schluss gekommen, dass ich 4900 Schritte brauche, um den Träger in die obere Position zu bringen. Auf ähnliche Weise bewegen wir den Träger nach links, bis er die Standortnummer 1 erreicht.

Unmittelbar danach drehen wir den kontinuierlichen Rotationsmotor für 950 Millisekunden, damit die spiralförmige Spule einen vollen Zyklus macht.

// Rotate the helical coil, discharge the selected item
      servo1.writeMicroseconds(2000); // rotate
      delay(950);
      servo1.writeMicroseconds(1500);  // stop Codesprache:Arduino (arduino) 

Beachten Sie hierbei, dass diese Werte teilweise variieren können und vom Motor selbst abhängen. Mit den benutzerdefinierten Funktionen moveRight() und moveDown() bringen wir den Träger zurück in die Ausgangsposition. Auf die gleiche Weise können wir alle vier Gegenstände entladen.

Am Ende drucken wir einfach die Nachricht „Artikel geliefert“.

So einfach ist das, und ich hoffe, Ihnen hat dieses Video gefallen und Sie haben etwas Neues gelernt. Fühlen Sie sich frei, Fragen in den Kommentaren unten zu stellen und sehen Sie sich meine Arduino-Projektsammlung an.


Herstellungsprozess

  1. Automaten
  2. Machen Sie eine DIY-Hausaufgaben-Schreibmaschine zu Hause
  3. DIY Photoshop-Bearbeitungskonsole mit Arduino Nano RP 2040
  4. Erstellen von Monitor-Ambilight mit Arduino
  5. ULTRASCHALLLEVITATION-Maschine mit ARDUINO
  6. DIY-Voltmeter mit Arduino und Smartphone
  7. DIY Infrarot-Herzschlagsensor mit Arduino
  8. Tech-TicTacToe
  9. DIY Voltmeter mit Arduino und einem Nokia 5110 Display
  10. Digitaluhr auf Arduino mit einer Finite-State-Maschine