Snackautomat mit Servo Motoren

Hallo, ich und ein Freund haben in der Schule als Projekt einen Snackautomaten mit 4 360 Grad Servo Motoren, 4 Knöpfen und einen Bewegungsmelder. Wenn der Bewegungsmelder erkennt, dass eine Münze eingeworfen wurde und ein Knopf gedrückt wurde soll sich ein Servo um 180 grad drehen.
Wir haben dazu schon einige Programme geschrieben aber es ist immer so, dass die Motoren sich zufällig drehen und nicht auf Knopfdruck und die angegebene Zeit lang.

# include <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;

int taster1 = A0;
int taster2 = A1;
int taster3 = A2;
int taster4 = A3;
int tasterstatus1 = 0;
int tasterstatus2 = 0;
int tasterstatus3 = 0;
int tasterstatus4 = 0;

int bewegung = 2;
int bewegungsstatus = 0;

void setup() {
 pinMode(taster1, INPUT);
 pinMode(taster2, INPUT);
 pinMode(taster3, INPUT);
 pinMode(taster4, INPUT);
 pinMode(bewegung, INPUT);

 servo1.attach(3);
 servo1.write(90);
 servo2.attach(5);
 servo2.write(90);
 servo3.attach(6);
 servo3.write(90);
 servo4.attach(9);
 servo4.write(90);
}

void loop() {
 bewegungsstatus = digitalRead(bewegung);

 if (digitalRead(taster1) == HIGH && bewegungsstatus == HIGH) {
   servo1.write(180);
   delay(1000);
   servo1.write(90);
 }

 if (digitalRead(taster2) == HIGH && bewegungsstatus == HIGH) {
   servo2.write(180);
   delay(1000);
   servo2.write(90);
 }

 if (digitalRead(taster3) == HIGH && bewegungsstatus == HIGH) {
   servo3.write(180);
   delay(1000);
   servo3.write(90);
 }

 if (digitalRead(taster4) == HIGH && bewegungsstatus == HIGH) {
   servo4.write(180);
   delay(1000);
   servo4.write(90);
 }
}

Das ist ein Programm das so wie ich es verstanden habe Funktionieren sollte, das tut es aber nicht. Vielleicht kann uns ja jemand dabei helfen?

Liebe Grüße,
Tjelle

Wie sind denn die Taster angeschlossen?
Wo findet sich ein Widerstand fürs bezugspotential?

Also die Taster sind ganz normal am Arduino angeschlossen. Sie haben keinen Wiederstand aber der ist warscheinlich in den Tastern verbaut, weil sie bei anderen Gruppen auch funktioniert haben

Poste mal einen Schaltplan vom Snackautomaten.

Die haben anderen Code gehabt.

Mach mal bitte folgendes:
(JE)Der Taster kommt mit einem Bein an einen ArduinoPin, so wie bisher.
Mit dem anderen Bein an GND.

Im setup() änderst Du alle Taster:

void setup() {
 pinMode(taster1, INPUT_PULLUP);
 pinMode(taster2, INPUT_PULLUP);
 pinMode(taster3, INPUT_PULLUP);
 pinMode(taster4, INPUT_PULLUP);

Und tataaa! :wink:

Nix tataa, muss noch halben Sketch ändern :wink:

Stimmt.ach menno...
@tjelle2 Im sketch dann noch alle Taster (Nur die Taster!!) von ==HIGH ändern in == LOW

Und für Fony gibts mal einen zum nachschauen :wink:

# include <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;

struct SNACK
{
  const byte taster;
  Servo servo;
  const byte servoPin;
} snack[]
{
  {A0, servo1, 3,},
  {A1, servo2, 5,},
  {A2, servo3, 6,},
  {A3, servo4, 9,},
};

constexpr byte pirPin {2};
byte open;

void setup()
{
  for (byte b = 0; b < sizeof(snack) / sizeof(snack[0]); b++)
  {
    pinMode(snack[b].taster, INPUT_PULLUP);
    snack[b].servo.attach(snack[b].servoPin);
    snack[b].servo.write(90);
  }
  pinMode(pirPin, INPUT);
}

void loop()
{
  if (digitalRead(pirPin))
  {
    for (byte b = 0; b < sizeof(snack) / sizeof(snack[0]); b++)
    {
      if (!digitalRead(snack[b].taster))
      { open = b + 1; }
    }
  }
  if (open)
  {
    open--;
    snack[open].servo.write(180);
    delay(1000);
    snack[open].servo.write(90);
    open = 0;
  }
}

// edit: Im Code die Taster auf interne PULLUP gesetzt

2 Likes

Gut gemacht mein Herr :wink:
jetzt kommt
tataaa!
ob's funktioniert gute Frage habe kein Haufen an Servos.

1 Like

Hast du keine Servo-Simulatoren in der Schublade? :grinning:

360°Servos sind nicht Servos, die sich zum Unterschied von 180° Servos um 360° drehen, sondern solche die sich dauerhaft in eine oder andere Richtung drehen, solange sie die entsprechende Ansteuerung bekommen.

Wenn Du eine genauen Winkel brauchst dann nimm Schrittmotore mit einem Home Sensor.

Grüße Uwe

Hallo, danke schonmal für die Hilfe!
Wir haben jetzt eure Vorschläge ausprobiert aber leider drehen sich die servos immer noch zufällig. Jetzt drehen sie sich nicht einmal in der selben Geschwindigkeit. Habt ihr eine Idee woran das liegt oder sind die Motoren einfach kaputt?

Was habt ihr gemacht?
Wie sind die Taster angeschlossen?
Kannst Du ein Foto vom Aufbau machen?

Wir haben den code einfach hochgeladen.


das ist unser Schaltplan falls das weiterhilft

Ja.

Der Code aus #7 wurde von mir nachträglich verändert auf INPUT_PULLUP
Das war richtig, da Euer Plan auch darauf abzielt.
Jetzt Frage:
Habt Ihr den geänderten Code geladen oder den ursprünglichen, an dem die Taster nur INPUT definiert waren und auf HIGH geprüft wurden?
-> Unbedingt INPUT_PULLUP und !digitalRead(snack[b].taster)
!!!
Wenn das so ist, nächste Frage:
Die Verbindung zwischen GND auf der einen Seite des Steckbrett und der anderen Seite ist nicht zufällig in die 5V Schiene gerutscht?
Unbedingt noch einmal prüfen.
Und ich schau mal, ob ich im Code was vergessen habe.

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