Snack Automat Mit Mega

Ich möchte einen Snack Automat mit 4 Servos, 1 LCD Display, 4 Tastern und eine Bewegungssensor für die Münze einbauen. Das Ziel ist es die Münze einzuwerfen, welcher der Sensor erkennt und den Taster drücken und anschliessend soll der Servo das gewünschte Produkt rausdrehen. Nun habe ich ein Problem beim Programmieren. Beiliegend meinen Code der leider nocht nicht wunschgemäss funktioniert. Wäre froh um eine Antwort. Vielen Dank.


#include <Servo.h> //Servo Datei von Arduino hinzugefügt
#include <LiquidCrystal.h> //Display Datei von Arduino hinzugefügt

const int rs = 11, en = 12, d4 = 2, d5 = 3, d6 = 4, d7 = 5; //Pin Beschriftung Display
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

Servo Servo1; //1.Servo Servo1 gennant
Servo Servo2; //2.Servo Servo2 gennant
Servo Servo3; //3.Servo Servo3 gennant
Servo Servo4; //4.Servo Servo4 gennant


int T1 = 52; //Position Taster 1 festgelegt Pin 52
int T2 = 50; //Position Taster 2 festgelegt Pin 50
int T3 = 48; //Position Taster 3 festgelegt Pin 48
int T4 = 46; //Position Taster 4 festgelegt Pin 46


int pirPin = 9; //bewegungssensor Pin an Pin 9 verbunden



void setup() {
 pinMode(T1, INPUT); //Taster 1 als Input festgelegt
 pinMode(T2, INPUT); //Taster 2 als Input festgelegt
 pinMode(T3, INPUT); //Taster 3 als Input festgelegt
 pinMode(T4, INPUT); //Taster 4 als Input festgelegt
 
 lcd.print("Snack Auswählen"); //Display schreibt Snack Auswählen
 lcd.begin(16,2); //Zeile 2 anfangen schreiben

pinMode(pirPin, OUTPUT);

}


void loop() {
  if((digitalRead(T1) == HIGH) ||  digitalRead(pirPin) == HIGH);
    Servo1.attach(22);    //Servo Befestigt an PIN  22
    Servo1.write(0);      //Servo bewegt sich
    delay(1000);          //Verzögerung 1000 Millisekunden         
    Servo1.detach();      //Servo ist nicht mehr verbunden



  if((digitalRead(T2) == HIGH) || digitalRead(pirPin) == HIGH);
    Servo2.attach(24);
    Servo2.write(0);
    delay(1000);
    Servo2.detach();



  if((digitalRead(T3) == HIGH) || digitalRead(pirPin) == HIGH);
    Servo3.attach(26);
    Servo3.write(0);
    delay(1000);
    Servo3.detach();



  if((digitalRead(T4) == HIGH) || digitalRead(pirPin) == HIGH);
    Servo4.attach(28);
    Servo4.write(0);
    delay(1000);
    Servo4.detach();
  
  
}

Hallo
Herzlich Willkommen im Forum.
Was ist der Wunsch ?

Hallo
Ich habe ein Änderungen eingebaut. Es fehlten ein paar {} eingebaut damit die Logik stimmt und die Bedienung der Servos angepasst. Was noch fehlt ist der PIR Sensor. Aber so kannst du erstmal weitermachen.

#include <Servo.h> //Servo Datei von Arduino hinzugefügt
#include <LiquidCrystal.h> //Display Datei von Arduino hinzugefügt
const int rs = 11, en = 12, d4 = 2, d5 = 3, d6 = 4, d7 = 5; //Pin Beschriftung Display
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
Servo Servo1; //1.Servo Servo1 gennant
Servo Servo2; //2.Servo Servo2 gennant
Servo Servo3; //3.Servo Servo3 gennant
Servo Servo4; //4.Servo Servo4 gennant
int T1 = 52; //Position Taster 1 festgelegt Pin 52
int T2 = 50; //Position Taster 2 festgelegt Pin 50
int T3 = 48; //Position Taster 3 festgelegt Pin 48
int T4 = 46; //Position Taster 4 festgelegt Pin 46
int pirPin = 9; //bewegungssensor Pin an Pin 9 verbunden
void setup() {
  pinMode(T1, INPUT); //Taster 1 als Input festgelegt
  pinMode(T2, INPUT); //Taster 2 als Input festgelegt
  pinMode(T3, INPUT); //Taster 3 als Input festgelegt
  pinMode(T4, INPUT); //Taster 4 als Input festgelegt
  Servo1.attach(22);    //Servo Befestigt an PIN  22
  Servo2.attach(24);
  Servo3.attach(26);
  Servo4.attach(28);
  lcd.begin(16, 2); //Zeile 2 anfangen schreiben
  lcd.print("Snack Auswählen"); //Display schreibt Snack Auswählen
  pinMode(pirPin, OUTPUT);
}
void loop() {
  if ((digitalRead(T1) == HIGH) ||  digitalRead(pirPin) == HIGH) {
    Servo1.write(0);      //Servo bewegt sich
    delay(1000);          //Verzögerung 1000 Millisekunden
    Servo1.write(180);
  }
  if ((digitalRead(T2) == HIGH) || digitalRead(pirPin) == HIGH) {
    Servo2.write(0);
    delay(1000);
    Servo2.write(180);
  }
  if ((digitalRead(T3) == HIGH) || digitalRead(pirPin) == HIGH) {
    Servo3.write(0);
    delay(1000);
    Servo3.write(180);
  }
  if ((digitalRead(T4) == HIGH) || digitalRead(pirPin) == HIGH) {
    Servo4.write(0);
    delay(1000);
    Servo4.write(180);
  }
}

Der Sketch ist ungetestet.
Ich wünsche einen geschmeidigen Abend und viel Spass beim Programmieren in C++.

Vielen Dank. Es funktioniert leider noch nicht ganz. Wenn ich den Push Button drücke und der Bewegungssensor aktiv ist dreht der Servo 180 Grad. Anschliessend dreht der Servo wieder unendlich in die entgegengesetzte Richtung. ( Es ist ein 360 Grad Servo) Dass Ziel wäre es nun : Wenn der Taster 1 gedrückt wird und zudem der Bewegungssensor aktiv ist soll der Servo sich drehen so das die Süssigkeit im Snackautomat hinausfällt. Wenn die Süssigkeit hinunter gefallen ist soll der Servo aufhören zu drehen ( Ich werde es mit der Grad anzeige ändern bis es passt mit der Drehung). Danach soll der Servo nicht mehr drehen . ( Da wenn eine Münze eingeworfen wird (Bewegungssensor Signal) soll der Servo einmal drehen weil es ja ein Snackautomat ist und nicht jeder unbeliebig Süssigkeiten hinauslassen soll. Ich wünsche euch einen schönen Abend und vielen Dank für die Antwort(en).

Ein PIR erkennt keine Münzen sondern ein bewegtes gegenüber dem Hintergrund wärmeren Körper, also einen Menschen oder ein Tier.

Du könntest zB so ein Münzerkennungsmodul nehmen: https://www.amazon.de/Denash-Multifunktionsautomat-Arcade-Spiel-Münztelefon-Münzwaschmaschine-default/dp/B07T2PBF4H Den gibts auch billiger, hab die Erste Anzeige genommen die ich gefunden habe. Da können auch mehrere Münzen kleineren Wertes eingeworfen werden.

Wenn Du Dauerdrehservo hast, mußt Du andere Sensoren (optische, magnetische oder Endschalter) einbauen die die Drehbewegung zu stoppen. Bei einem Dauerdrehservo weißt Du nie in welcher Position er sich befindet.

Grüße Uwe

Bei meinem Sensor handelt es sich um einen Infrarot Sensor welcher auch Objekte erkennen kann. Es ist ein Schulprojekt und ich werde den Automaten in mein Zimmer stellen.

Ist es mit diesem Sensor und Taster ( Infrarot Sensor TCRT5000 Näherungsschalter Breakout Modul - Bastelgarage Elektronik Online Shop, https://www.bastelgarage.ch/taster-modul-schwarz?search=taster) möglich den Servo um Beispielsweise 180 Grad drehen zu lassen wenn der Taster und der Sensor aktiviert ist ? Und wenn ja wie ? Vielen Dank für die Antwort.

Ok, Der Sensor ist kein PIR sondern eine Infrarot Reflektionslichtschranke. Ein Infrarotled beleuchtete und wenn ein Gegenstand in einigen mm Abstand da steuert das reflektierte Infrarotlicht den Fototransistor durch. Der Opimale Abstand ist 2,5mm.

Mit dem Servo wirst Du was bewegen. Du kannst die Position des bewegten Teiles kontrollieren.
Wenn Du nur 180° brauchst dann wäre ein normales 180° Servo die bessere Wahl.

Hast Du schon die Mechanik fertig oder Ideen zur Mechanik?

Grüße Uwe

Ich habe schon eine Idee zur Mechanik. Ich werde mit einem Mettaldraht eine Spirale formen und diese am Servo befestigen. So kann ich die Snacks hinein legen und sie sollen den rausgedreht werden. (Venduino, Arduino Vending Machine - YouTube) wie bei dem Video abgebildet etwa bei 6:20 Minuten habe ich mir das vorgestellt. Den Code habe ich nochmals selber versucht zu verändern. Ich habe in der IF schlaufe am Schluss ein Servo1.detach(); eingebaut damit der Servo nicht unendlich dreht. Nun ist das Problem das wenn ich den Taster und den Bewegungssensor aktiviere, dass der Servo zwar die anzahl grad dreht aber wenn ich es nochmals drücken möchte passiert leider nichts. (Servo dreht nicht) Könnte mir da jemand weiterhelfen ?

Gruss Lorin

#include <Servo.h> //Servo Datei von Arduino hinzugefügt
#include <LiquidCrystal.h> //Display Datei von Arduino hinzugefügt
const int rs = 11, en = 12, d4 = 2, d5 = 3, d6 = 4, d7 = 5; //Pin Beschriftung Display
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

Servo Servo1; //1.Servo Servo1 gennant
Servo Servo2; //2.Servo Servo2 gennant
Servo Servo3; //3.Servo Servo3 gennant
Servo Servo4; //4.Servo Servo4 gennant

int T1 = 52; //Position Taster 1 festgelegt Pin 52
int T2 = 50; //Position Taster 2 festgelegt Pin 50
int T3 = 48; //Position Taster 3 festgelegt Pin 48
int T4 = 46; //Position Taster 4 festgelegt Pin 46
int pirPin = 9; //bewegungssensor Pin an Pin 9 verbunden
void setup() {
  pinMode(T1, INPUT); //Taster 1 als Input festgelegt
  pinMode(T2, INPUT); //Taster 2 als Input festgelegt
  pinMode(T3, INPUT); //Taster 3 als Input festgelegt
  pinMode(T4, INPUT); //Taster 4 als Input festgelegt
  Servo1.attach(22);    //Servo Befestigt an PIN  22
  Servo2.attach(24);
  Servo3.attach(26);
  Servo4.attach(28);
  lcd.begin(16, 2); //Zeile 2 anfangen schreiben
  lcd.print("Snack Auswählen"); //Display schreibt Snack Auswählen
  pinMode(pirPin, OUTPUT);
}
void loop() {
  if ((digitalRead(T1) == HIGH) ||  digitalRead(pirPin) == HIGH) {
    Servo1.write(0);      //Servo bewegt sich
    delay(1000);          //Verzögerung 1000 Millisekunden
    Servo1.write(360);
    Servo1.detach();
  }
  if ((digitalRead(T2) == HIGH) || digitalRead(pirPin) == HIGH) {
    Servo2.write(0);
    delay(1000);
    Servo2.write(360);
    Servo2.detach();
  }
  if ((digitalRead(T3) == HIGH) || digitalRead(pirPin) == HIGH) {
    Servo3.write(0);
    delay(1000);
    Servo3.write(360);
    Servo3.detach();
  }
  if ((digitalRead(T4) == HIGH) || digitalRead(pirPin) == HIGH) {
    Servo4.write(0);
    delay(1000);
    Servo4.write(360);
    Servo4.detach();
  }
}

Jetzt hab ich's verstanden wie die Mechanik funktioniert.

Am Teller wo die Spirale befestigt ist baust Du eine Nase für einen Endschalter oder eine Fahne oder ein Loch für eine Gabellichtschranke oder auf der Rückseite Bemalst Du sie halb schwarz und halb weis für einen Reflektionslichtschranke.
So kannst Du eine bestimmte Position erkennen und den Servo stoppen. Im Video wird der Servo s meiner Ansicht nach nur für eine bestimmte Zeit gedreht. Das ist ungenau.

Wenn ich richtig verstanden habe hast Du ein Dauerrotationsservo. Da ist der Winkel nicht mehr von der Ansteuerung bestimmt sondern die Ansteuerung beeinflußt die Drehrichtung und je nach Servo vieleicht die Drehgeschwindigkeit. .
Servo1.write(360); ist falsch. Die Funktion akzeptiert Werte zwischen 0 und 180. 90 müßte der Servo still stehen
Servo1.detach();
Da trennst Du den servo vom Pin. Er kann ohne
Servo1.attach(22);
nie mehr angesteuert werden.
besser Du nimmst
Servo1.write(90);

Du solltest die linke Vorderseite des Automaten als Tür zum Aufmachen realisieren damit Du den Automaten leicht beschicken kannst. Die rechte Seite mit der Elektronik kann fest verschraubt bleiben.

Grüße Uwe

Hallo ich habe kurz den ungefähren Aufbau des Automaten in ein Word gezeichnet damit du vielleicht eine bessere Vorstellungen davon bekommts wie ich es mir überlegt habe. Der Sensor soll nur erkennen ob eine Münze vorne durch geht. Wenn ja soll der Servo drehen wenn der Taster auch gedrückt wird. Wenn nur der Taster gedrückt ist soll nichts passieren. Wie du es beschrieben hast im untersten Abschnitt hatte ich es so auch vor.

Leider verstehe ich noch nicht ganz in welcher Reihenfolge unter dem
if ((digitalRead(T1) == HIGH) || digitalRead(pirPin) == HIGH) { Abschnitt ich welche Befehle einbauen soll (wie Servo1.attach oder Servo1.write(90) und was ich sonst noch im Code einbauen soll. Ich habe noch keine grosse Erfahrungen von Arduino und deshalb verstehe ich es noch nicht ganz aber danke für deine bisherige Hilfe.

Grüsse Lorin und einen schönen Silvester !!!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.