Motor und Pumpe gleichzeitig betreiben

Hallo zusammen,

Ich möchte ein kleines Projekt realisieren, bei dem ich einen Schrittmotor und eine Minipumpe bei Tastendruck mit dem Arduino Uno betreiben möchte. Dabei habe ich ein paar Verständnisfragen zur Stromversorgung und hoffe hier Antwort zu finden. :slight_smile:

Zum Ansteuern des Schrittmotors möchte ich den Adafruit Motor Shield v2.3 nutzen und ein externes 12V Netzteil.

Der Schrittmotor ist ein Nema 17 (12V, 1.5A) und die Pumpe (Link, 12V, 0.4A).

Meine erste Frage ist, ob ich den Motor Shield zum Ansteuern beider Geräte nutzen kann, also z.B. die Pumpe über den 12V Anschluss für DC Motoren nutzen kann.

Die zweite Frage ist, ob ich die gesamte Konstruktion über ein DC Netzteil am Arduino Jack-Port mit z. B. 2.5A mit Strom versorgen kann oder ob ich mir dann alles durchbrutzel. Alternativ habe ich an eine extra Versorgung des Arduino mittels 9V Block gedacht.

Das Ziel ist im Grunde nur ein externes Netzteil zu verwenden und wenn nötig eine zusätzliche Batterie.

Vielen Dank im voraus :slight_smile:

Ich würde mir das mit dem Schrittmotor gut überlegen. So ein Ding zieht elendsmäßig Energie, wenn es sich bewegen soll (oder eben nicht). Das Haltemoment im energielosen Zustand ist lächerlich.

Ein DC-Getriebemotor mit Getriebe und Dreh-Encoder ist hinsichtlich Energiebedarf und Positioniergenauigkeit oft deutlich besser geeignet.

Gruß

Gregor

Meine erste Frage ist, ob ich den Motor Shield zum Ansteuern beider Geräte nutzen kann, also z.B. die Pumpe über den 12V Anschluss für DC Motoren nutzen kann.

Prinzipiell ja; im konkreten hab ich meine Zweifel.
Bitte gib uns das genaue Modell des Schrittmotors oder einen Link zum Angebot. Ich befürchte daß der Motor nicht für das Shield geeignet ist.

Die zweite Frage ist, ob ich die gesamte Konstruktion über ein DC Netzteil am Arduino Jack-Port mit z. B. 2.5A mit Strom versorgen kann oder ob ich mir dann alles durchbrutzel. Alternativ habe ich an eine extra Versorgung des Arduino mittels 9V Block gedacht.

Nein. Da ist eine 1A Diode drin, die Du kaputt machst. Du kannst den Strom für die Motoren nicht über den Arduino führen. Du kannst aber die 12 V sowohl für Arduino als auch für die Motoren verwenden (2 getrennte Anschlüsse. Oder das Shield mit 12V versorgen und den Power Jumper setzen und Arduino versorgen.


Grüße Uwe

Vielen Dank für die schnellen Antworten!

Als Motor hatte ich beispielsweise diesen angedacht.

Damit möchte ich eine Gewindestange drehen und ein Objekt von etwa 200g Gewicht gleichmäßig vorschieben. Ich hatte den Motor in Betracht gezogen, weil ich ihn in einigen Anleitungen für 3D Drucker gesehen hatte und dieser offensichtlich genug Power für meine Anwendung hat.

Den Motor möchte ich nur drehen lassen während ich einen Taster drücke und mit einem zweiten zurück fahren lassen.

@Uwe: meinst du den 2-Pol Anschluss am Shield für die Stromversorgung? Also könnte ich den Arduino mit gesetztem Jumper darüber betreiben?

Hi

von der Seite:
【Geräuscharm】: Der Innenrotor unseres Schrittmotors wurde in deutscher Handarbeit hergestellt und es gibt einen Rotorgummi, der den Rotor abdeckt, um das Geräusch effektiv zu reduzieren.

Also deutsche Handarbeit am Innenrotor ... da kommen in mir doch geringfügige Zweifen auf :o

Weiter ist Das ein stromgesteuerter Motor - zu der Nennspannung fand ich aber Nichts, die 1,5A deuten aber auch Strom hin.
Diesen wirst Du mit dem Motorshield, meinem Verständnis nach, NICHT steuern können, da das Shield sturr die 12V (oder was Du anlegst) an den Motor legt - dabei wird Der einen viel höheren Strom aufnehmen und schnell defekt sein.
Wenn das Shield 4 Motoren ansteuern kann, gehen auch 2 Stepper - dann kannst Du mit dem Shield sowohl DC-Motor und Stepper gleichzeitig betreiben - der Stepper und der DC-Motor muß dann aber zu der Spannung passen.

Was Du für den verlinkten Motor brauchst, ist aber unterhalb auch abgebildet, für diese Art von Motor brauchst Du Motortreiber, wie einen A4988 (Einen pro Motor).
Der lässt sich auf den Motorstrom einstellen und lässt dann auch nur so viel zum Motor durch.

Ob ein Stepper für Dich Sinn macht?
Eine Spindel kannst Du mit einem normalem DC-Motor ebenfalls 'bedienen' - und Dieser braucht im Stand keinen Strom (... sofern die Steigung der Spindel nicht zu steil ist, damit das Ganze selbst hemmend bleibt).

MfG

Das ist ein Motor für Stromsteuerung ( 1,5A bei 3,6V und 2,4Ohm) Den kannst Du nicht mit dem Motorshield benutzen Das ist für Spannungssteuerung. Für diesen Motor brauchst Du einen Stromtreiber wie den A4988 oder ähnliche.

@Uwe: meinst du den 2-Pol Anschluss am Shield für die Stromversorgung? Also könnte ich den Arduino mit gesetztem Jumper darüber betreiben?

Ja.Ja. aber mit einem anderen Schrittmotor.

Grüße Uwe

uwefed:
Für diesen Motor brauchst Du einen Stromtreiber wie den A4988 oder ähnliche.

"oder ähnliche" könnte der DRV8825 sein.

Frohes Neues :slight_smile:

Ok, wenn ich das Ganze richtig verstehe, dann verkompliziert ein Schrittmotor mein Vorhaben also unnötig. :o

Tut mir Leid, wenn ich dumme Fragen stellen sollte, ich komme eher aus der Software Ecke :wink:

Ich möchte definitiv den 12V Anschluss am Shield benutzen und über den gesetzten Jumper den Arduino mit 5V versorgen.

Ich hab jetzt mal einen DC Motor rausgesucht, der bei 12V und 0.7-0.8 A betrieben wird und von der Leistung für meine Anwendung durchaus ausreichen sollte.

Laut der Spezifikationen des Motor Shields soll er 1.2 A pro Channel ausgeben können mit einem Peak von 3 A.

Wenn ich für den Arduino etwa 250 mA annehme, könnte ich also mit einem Netzteil z.B. 12V/1.2A an den Shield anlegen und darüber direkt den Motor plus Arduino versorgen oder ist dieser Stromtreiber auch für den DC Motor notwendig? Ich hab mir die Anleitung vom Adafruit Motor Shield angeschaut und für die Beispiele mit DC Motor keinen Stromtreiber entdeckt.

Viele Grüße

Hi

Ein 12V DC Motor läuft bei 12V.
Ein 12V Stepper läuft ebenfalls bei 12V, hat aber dann auch einen recht hohen Spulenwiderstand.
Diese Art Stepper sind nicht sonderlich 'agil', sobald etwas Drehzahl kommt, bricht der Strom zusammen und damit die Kraft.

So wie ich Dich aber verstanden hatte, willst Du zwei Motoren betreiben - Da könnte Dein Netzteil schon etwas schwach sein.

Die H-Brücke auf den Motorshield kann 1,2A - mit der entsprechenden Kühlung auch dauerhaft!
Die 3A sind das absolute Maximum, Welches die Brücke 'gerade so' überleben wird.
Ohne (ausreichende) Kühlung wird Das aber dann auch nicht lange halten.
Dein Motor DARF NIE >3A ziehen, auch nicht im Anlauf!! Da sonst die Brücke defekt geht.

MfG

Genau darum geht es mir, ich bin mir nicht ganz sicher, ob ich meinen arduino rösten würde, wenn ich ein 12V/2A Netzteil an den Motor Shield packe.

Die Belastung durch Wärme sollte ok sein, da der Motor nur kurz für etwa 20 Sekunden betrieben werden soll und das auch nur 2-3 mal hintereinander.

Mir ist nicht klar, was eigentlich Deine Frage ist. Hast Du das Shield und suchst den passenden Motor oder hast Du den Motor und suchst die passende Elektronik?

  • Du hast das Shield: Verwende einen geeigneten Schrittmotor wie den Nema 17 (bipolar, 200 Schritte, 12 V DC, 0,4 A) für Spannungssteuerung.
  • Du hast den Motor: Kein Shield, dafür DRV8825 oder A4988; StepDown 12V auf 5V für den Arduino. Alternativ 24V Netzteil und zweiter StepDown auf 12V für den DC-Motor.

Den DC-Motor steuerst Du mittels Logic-Level-FET wie IRLZ44N, zwei Widerständen und einer Diode an.

Danke agmue für die Ausführung :slight_smile:

Im Grunde habe ich das folgende Szenario, welches ich umsetzen möchte:

Den Arduino Uno und den Shield, sowie das Netzteil habe ich hier.
Da die Membranpumpen in der Baugröße alle 12V nutzen, würde ich die 12V über die Powerbuchse des Shields zur Verfügung stellen wollen und über den gesetzten Jumper gleichzeitig den Arduino befeuern.

Die Pumpe würde während des gesamten Betriebs laufen (ca. 5 min maximal) und der Motor nur 3-4 Mal für 30 s.

Dazu sollte ich vielleicht sagen, dass die Appatur später in einem Labor unter eingeschränkten Bedingungen genutzt werden soll und dabei auch eine stark begrenzte Anzahl an Steckdosen zur Verfügung steht, weshalb ich das ganze, falls möglich, nur über eine realisieren möchte.

Viele Grüße :slight_smile:

Hi

Die Motoren werden im Anlauf, wenn Sie etwas arbeiten müssen, wenn Sie blockieren, wesentlich mehr als den Nenn-Strom ziehen.
Wenn Das die H-Brücke ab kann (3A Peak, 1.2A max), muß nur noch Dein Netzteil mitspielen - wobei es genügend 12V-Netzteile direkt mit 5,5mm Hohlstecker gibt, Die auch Mal ein Ampere mehr liefern können.

Akut sehe ich keine größeren Probleme.
Etwas umfangreicher wirst Du auf Dein Vorhaben aber wohl noch eingehen müssen, da sonst alle Restarbeiten bei Dir bleiben :wink:
(aber keine Angst: das Groh wollte ich Dir eh überlassen)

MfG

Da das Shield 2 Leistungsstufen besitzt ist es besser den einen Motor am einen Treiber (links) und den anderen Motor am anderen Treiber (rechts) anzuschließen. Dadurch wird die Verlustwärme der Endstufen auf 2 ICs verteilt werden.
Grüße Uwe

Danke für die hilfreichen Tipps :slight_smile:

Ich hab jetzt auch die Pumpe erhalten und das ganze mal jeweils nur mit einem "Motor" ausprobiert und es funktioniert mit dem Motor Shield einwandfrei. Die Pumpe lässt sich ebenfalls in ihrer Intensität regulieren.

Jetzt habe ich angefangen einen Sketch zu schreiben, bei dem zunächst nur der Motor gesteuert werden soll. Dabei sind die digitalen Ports 2 und 3 mit jeweils einem Taster verbunden und der Motor soll während die Taste gedrückt ist, jeweils in die entsprechende Richtung fahren und ansonsten ruhen.

#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
  AFMS.begin();
  myMotor->setSpeed(100);
  myMotor->run(RELEASE); 
}

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

  if ( sensorFWD or sensorRWD == LOW)
    {
      while (sensorFWD == LOW){
          myMotor->setSpeed(100);
          myMotor->run(FORWARD);
          }

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

Ist der Sketch so in Ordnung? Denn wenn ich das ganze auf meinen Uno hochlade und ausführe, dann passiert beim drücken der forward-taste gar nichts und bei der backward-taste fängt der Motor an und hört nicht mehr auf zu drehen bis ich dem Board den Saft nehme :wink:

Viele Grüße

Ä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

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.

#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?

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

Ja.
Alle Schleifen eliminieren!
Du brauchst sie nicht.

Wizard91:
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!

Wizard91:
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.

Danke für die Tipps :slight_smile:

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

#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 :slight_smile: