Go Down

Topic: Motor und Pumpe gleichzeitig betreiben (Read 737 times) previous topic - next topic

Tommy56

Ändere bitte die quote-Tags in code-tags. Das kannst Du auch nachträglich noch tun.
Dann ist Dein Sketch für alle besser lesbar.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Wizard91

Ok, ich hab das Problem mit den Tastern selbst lösen können, allerdings bräuchte ich nochmal kompetente Hilfe bezüglich dem Ausführen von mehreren Tätigkeiten gleichzeitig.

Ich habe wie empfohlen den den Motor an M1 gesetzt und die Pumpe an M4 und wenn ich diese lediglich einzeln in einer while-schleife abfrage, dann funktioniert alles wunderbar.

In meiner Anwendung will ich per Schalter die Pumpe anmachen und anschließend nur bei Tastendruck den Motor in die  eine oder andere Richtung drehen lassen. An sich funktioniert das auch, wenn ich zuerst die Pumpentaste und anschließend die Taste für eine Motorbewegung drücke.

Allerdings reagiert der Motor nicht, wenn ich den Taster loslasse und das ganze stoppt erst, wenn ich auch die Pumpentaste loslasse.

Ich gehe mal davon aus, dass es daran liegt, dass der Arduino in der verschachtelten While-Schleife feststeckt, allerdings weiß ich nicht, wie ich das sonst lösen könnte.


Code: [Select]

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"

Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_DCMotor *myMotor = AFMS.getMotor(1); // Motor
Adafruit_DCMotor *myPump = AFMS.getMotor(4); // Membrane Pump

void setup() {
  // put your setup code here, to run once:
  pinMode(2, INPUT_PULLUP); // Motor forwards
  pinMode(3, INPUT_PULLUP); // Motor backwards
  pinMode(4, INPUT_PULLUP); // Motor backwards
  AFMS.begin();
  myMotor->setSpeed(100);
  myMotor->run(RELEASE);
  myPump->setSpeed(100);
  myPump->run(RELEASE); 
}

void loop() {
  // put your main code here, to run repeatedly:
  int sensorFWD = digitalRead(2);
  int sensorRWD = digitalRead(3);
  int sensorPump = digitalRead(4);

 // rotate while buttons are pressed
      while (sensorFWD == LOW){
          myMotor->setSpeed(100);
          myMotor->run(FORWARD);
          sensorFWD = digitalRead(2);
          }

      while (sensorRWD == LOW){
          myMotor->setSpeed(50);
          myMotor->run(BACKWARD);
          sensorRWD = digitalRead(3);
          }

      while (sensorPump == LOW){
          myPump->setSpeed(100);
          myPump->run(FORWARD);
     
              while (sensorFWD == LOW){
                  myMotor->setSpeed(100);
                  myMotor->run(FORWARD);
                  sensorFWD = digitalRead(2);
                }

              while (sensorRWD == LOW){
                  myMotor->setSpeed(50);
                  myMotor->run(BACKWARD);
                  sensorRWD = digitalRead(3);
                }

          sensorFWD = digitalRead(2);     
          sensorRWD = digitalRead(3); 
          sensorPump = digitalRead(4);
          }
         
 // Stop motor in the end
  myMotor->run(RELEASE);
  myPump->run(RELEASE);
}



Hat jemand eine Idee, wie man das lösen könnte?

combie

Quote
Hat jemand eine Idee, wie man das lösen könnte?
Ja.
Alle Schleifen eliminieren!
Du brauchst sie nicht.
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

agmue

Ich gehe mal davon aus, dass es daran liegt, dass der Arduino in der verschachtelten While-Schleife feststeckt,
Da bist Du auf dem richtigen Weg!

Hat jemand eine Idee, wie man das lösen könnte?
Stelle Dein Denken auf den Kopf.

Vergiß "while", nutze stattdessen "if" und als die einzige Schleife "loop".

Die gute Nachricht: Dein Programm wird dadurch einfacher werden.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Wizard91

Danke für die Tipps :)

Ich pack hier den funktionierenden Code mal hin, falls die Nachwelt mal auf dasselbe Problem stoßen sollte:

Code: [Select]

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"

Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_DCMotor *myMotor = AFMS.getMotor(1); // Motor
Adafruit_DCMotor *myPump = AFMS.getMotor(4); // Membrane Pump

void setup() {
  // put your setup code here, to run once:
  pinMode(2, INPUT_PULLUP); // Motor forwards
  pinMode(3, INPUT_PULLUP); // Motor backwards
  pinMode(4, INPUT_PULLUP); // Motor backwards
  AFMS.begin();
  myMotor->setSpeed(100);
  myMotor->run(RELEASE);
  myPump->setSpeed(100);
  myPump->run(RELEASE); 
}

void loop() {
  // put your main code here, to run repeatedly:
  int sensorFWD = digitalRead(2);
  int sensorRWD = digitalRead(3);
  int sensorPump = digitalRead(4);

 // rotate while buttons are pressed
      if (sensorFWD == LOW and sensorRWD == HIGH){
          myMotor->setSpeed(100);
          myMotor->run(FORWARD);
          }

      if (sensorRWD == LOW and sensorFWD == HIGH){
          myMotor->setSpeed(50);
          myMotor->run(BACKWARD);
          }
      if (sensorRWD == HIGH and sensorFWD == HIGH){
        myMotor->run(RELEASE);
      }

      if (sensorPump == LOW){
          myPump->setSpeed(100);
          myPump->run(FORWARD);
          }
      else {
          myPump->run(RELEASE);
          }
         
          sensorFWD = digitalRead(2);
          sensorRWD = digitalRead(3);       
          sensorPump = digitalRead(4);         

}


Möglicherweise kann man den Code noch vereinfachen, aber zumindest funktioniert er so wie von mir beabsichtigt :)

agmue

Möglicherweise kann man den Code noch vereinfachen, aber zumindest funktioniert er so wie von mir beabsichtigt :)
Steile Lernkurve, das hatte ich nicht erwartet!

Etwas Kosmetik (ungetestet):

Code: [Select]
#include <Wire.h>
#include <Adafruit_MotorShield.h>
// #include "utility/Adafruit_MS_PWMServoDriver.h" // diese Zeile scheint mir überflüssig

Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_DCMotor *myMotor = AFMS.getMotor(1); // Motor
Adafruit_DCMotor *myPump = AFMS.getMotor(4); // Membrane Pump

void setup() {
  // put your setup code here, to run once:
  pinMode(2, INPUT_PULLUP); // Motor forwards
  pinMode(3, INPUT_PULLUP); // Motor backwards
  pinMode(4, INPUT_PULLUP); // Pumpe ein
  AFMS.begin();
  myMotor->setSpeed(100);
  myMotor->run(RELEASE);
  myPump->setSpeed(100);
  myPump->run(RELEASE);
}

void loop() {
  // put your main code here, to run repeatedly:
  bool sensorFWD = digitalRead(2);
  bool sensorRWD = digitalRead(3);
  bool sensorPump = digitalRead(4);

  // rotate while buttons are pressed
  if (sensorRWD != sensorFWD) {
    if (!sensorFWD) {
      myMotor->setSpeed(100);
      myMotor->run(FORWARD);
    }
    if (!sensorRWD) {
      myMotor->setSpeed(50);
      myMotor->run(BACKWARD);
    }
  } else {
    myMotor->run(RELEASE);
  }

  if (sensorPump == LOW) {
    myPump->setSpeed(100);
    myPump->run(FORWARD);
  } else {
    myPump->run(RELEASE);
  }
}
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Go Up