Arduino Uno / Motor Shield Motorsteuerung

Moin Leute,

wir haben vor einigen Tagen angefangen uns mit Arduino zu beschäftigen und sitzen gerade an einem Problem fest. Bei unserem Projekt wollen wir mithilfe eines Arduino Uno + Motor Shields einen 12v DC Linearaktuator bewegen.

Datenblatt : http://www.produktinfo.conrad.com/datenblaetter/1300000-1399999/001386432-da-01-en-ELEKTR_ZYL__DSZY1_12_10_A_100_POT_IP65.pdf

Von den Werten dürfte es unserer Meinung passen, aber wir schaffen es nicht den Aktuator zu bewegen. Den Motor vom Aktuator haben wir an + und - vom Shield angeschlossen und über ein externes Netzteil (12v) versorgen wir den Shield. Reicht das so überhaupt für den Motor oder müssen wir diesen direkt ans Netzteil hängen, reicht diese einfache Schaltung schon oder übersehen wir hier etwas? Wir sind uns auch nicht sicher ob der Code funktioniert, er sollte eigentlich nur vor- und zurückfahren tut er aber nicht, außer piepsen kommt da leider nichts bei rum.

void setup() { pinMode(12, OUTPUT); pinMode(9, OUTPUT); pinMode(3, OUTPUT);

}

void loop() { digitalWrite(12, HIGH); digitalWrite(9, LOW); analogWrite(3, 255);

delay(2000);

digitalWrite(9, HIGH);

delay(500);

digitalWrite(12, LOW); digitalWrite(9, LOW); analogWrite(3, 255);

delay(2000);

digitalWrite(9, HIGH);

delay(500);

}

Muss man vielleicht auch direkt etwas an die Pins anschließen oder reicht + und - von dem Shield. Über Antworten und Hilfe würden wir uns sehr freuen.

Mit freundlichen Grüßen

Dennis

Welchen Motorshield genau nutzt ihr?

Bewegt sich denn der Motor wenn Du Ihn direkt mit Spannung versorgst? Also ganz ohne Ardunio.

MotorShield: https://www.conrad.de/de/arduino-motor-shield-r3-65189-323477.html

Wir haben eine andere Steuerung, welche eigentlich zum ausrichten von Sattelitenschüsseln gedacht ist, mit dieser können wir den Aktuator bewegen, aber nur in sehr kleinen Schritten, was uns nichts bringt. Aber generell bewegt sich der Aktuator. Der Arduino müsste eig auch einwandfrei funktionieren, da wir diesen mit LEDs getestet haben und alles gut geklappt hat.

für einen Loopdurchlauf braucht ihr 5 Sekunden, macht die delay's mal kleiner, außerdem, wenn der Motor vorwärts dreht, dreht er sofort danach wieder zurück. Lasst ihn erstmal nur in eine Richtung laufen.

Funktioniert immernoch nicht. Glaube aber unser Problem ist, dass unser Netzteil nur 300mA liefert, der Motor aber 3,2 A braucht.

Wir haben hier noch ein paar Transistoren rumliegen,

https://www.conrad.de/de/darlington-leistungstransistor-stmicroelectronics-tip121-npn-gehaeuseart-to-220-i-c-5-a-emitter-sperrspannung-u-ceo-80-v-151057.html

wäre es möglich mit diesen eine Schaltung aufzubauen, welche uns den Strom verstärkt?

der Motor zieht ca. 3A.

wäre es möglich mit diesen eine Schaltung aufzubauen, welche uns den Strom verstärkt?

Nein, Wenn das Netzteil nur 0,3A liefert, ist da Schluß.

DevelopmentTiger: Funktioniert immernoch nicht. Glaube aber unser Problem ist, dass unser Netzteil nur 300mA liefert, der Motor aber 3,2 A braucht.

Der Treiber ist ungeeignet dür diesen Motor. Ihr braucht einen für mindestens 10A. Gleiches gilt für das Netzteil.

Nein. mit Transistoren könnt Ihr nicht mehr Strom steuern.

Grüße Uwe

Danke für die Antworten.

Haben jetzt noch ein Netzteil gefunden welches uns 4A liefert bei 12V und den Motor ohne den Arduino zum laufen bringt. Können wir dieses Netzteil direkt mit dem Shield verbinden oder nur sollten wir es nur für den Motor benutzen und das Shield über ein anderes versorgen?

Motor auf + und - am Shield, 12V an Vin und GND am Shield und aufpassen. daß der Strom nicht über 2A steigt. Vin auf der Schraubklemme bezeichnet die Versorgungsspannung des Motors. Eine angeschlossene externe Spannungsversorgung versorgt eben- falls das Arduino-Board mit Spannung. Durch Trennung des Vin Connect“-” Jumpers wird die Spannungsversorgung ausschliesslich für den Motor verwendet.

ardubu: Motor auf + und - am Shield, 12V an Vin und GND am Shield und aufpassen. daß der Strom nicht über 2A steigt.

Was Du schreibst ist falsch. Einen Motor mit Nennstrom 3,2A an einen Treiber anschließen und dann aufpassen daß der Strom nicht zu groß wird??? Da ist Knaus-Ogino noch sicherer. ;) ;) ;)

Grüße Uwe

Im Leerlauf wird der Motor keine 3,2A ziehen und damit können sie ihren Sketch testen, außerdem können sie mit dem Shield den Motorstrom messen und beim Überschreiten von 2A das Duty des PWM Signals verkleinern.

Morgen,

danke für die ganzen Vorschläge. Hätte uns vielleicht jemand einen Link zu einem 10A Motor Shield von einem deutschen Händler? Bis jetzt haben nur welche auf amerikanischen Seiten gefunden. Der Aktuator fährt zwar jetzt, aber die Power fehlt doch eindeutig. Über Tipps wären wir sehr dankbar.

Grüße Dennis

Hier gibt es eine H-Brücke in Karlsruhe BTS7960-H-Brucke-H-Bridge-motor-driver-max-43A-high-current-Arduino-/172060883295?hash=item280fa0b95f:g:~DUAAOSwoydWpxWN aber nich als steckbares Shield

Haben jetzt den Motor Shield hier im Blick

http://www.robotshop.com/en/10a-dc-motor-driver-arduino-shield.html

taugt der was? Kennt jemand ein passendes Netzteil dafür, welches nicht zu viel kosten sollte? Vielen Dank im voraus.

Grüße Dennis

Hallo,

wir wollen unseren Aktuator jetzt per Tasterdruck starten, also soll er einfach warten bis der Taster gedrückt wird und sein Programm durchlaufen und dann wieder auf den nächsten Tasterdruck warten usw.
Jetzt haben wir aber auch noch zwei LEDs dabei, Rot und Blau, die Rote soll leuchten während der Aktuator fährt, die Blaue soll dann leuchten wenn der Aktuator auf den Tasterdruck wartet. Bis jetzt klappt es den Aktuator über den Taster zu starten, aber die LEDs machen nicht das was sie sollen.

// Inkludierung der Bibliotheken

#include <Servo.h>

// Initialisierung der Pins

const int MotorPinDirection = 12;
const int MotorPinSpeed = 3;
const  int MotorPinBrake = 9;
const int LEDblau = 7;
const int LEDrot = 10;
const int Taster = 4;
int TasterState;

// Arbeitsweise der Pins

void setup()  
{
  pinMode (MotorPinDirection, OUTPUT);
  pinMode (MotorPinSpeed, OUTPUT);
  pinMode (MotorPinBrake, OUTPUT);
  pinMode (LEDblau, OUTPUT);
  pinMode (LEDrot, OUTPUT);
  pinMode (Taster, INPUT);
  digitalWrite(Taster, HIGH);
}


// Programm

void loop()
{
    
    TasterState = digitalRead(Taster);      // Auslesen des Tasterwertes
   
    if (TasterState == HIGH)                // Signal zum Programmstart
    {
    
    // Programmablauf                       // LEDrot permanent an während des Programms

    // 1. Vorwärts für 2 Sekunde (Vmax)
    digitalWrite(LEDblau, LOW);
    digitalWrite(LEDrot, HIGH);
    digitalWrite(MotorPinDirection, HIGH);
    analogWrite(MotorPinSpeed, 255);  
    delay(2000);
   
    // 2. Bremsen 
    digitalWrite(LEDblau, LOW);
    digitalWrite(LEDrot, HIGH);
    digitalWrite(MotorPinBrake, HIGH);
    delay(2500);
    digitalWrite(MotorPinBrake, LOW);
   
    // 3. Rückwärts für 2,26 Sekunde (Vmax)
    digitalWrite(LEDblau, LOW);
    digitalWrite(LEDrot, HIGH);
    digitalWrite(MotorPinDirection, LOW);
    analogWrite(MotorPinSpeed, 255);
    delay(2260); 
   
    // 4. Bremsen
    digitalWrite(LEDblau, HIGH);
    digitalWrite(LEDrot, LOW);
    digitalWrite(MotorPinBrake, HIGH);
    delay(5000);
    digitalWrite(MotorPinBrake, LOW);
    
                                         // Programmende
    
    }
    else
    
    digitalWrite(LEDblau, HIGH);           // Standby Mode, LEDblau leuchtet
    digitalWrite(LEDrot, LOW);
    digitalWrite(MotorPinBrake, HIGH);
    
}

Wie gesagt der Aktuator fährt auf Tasterdruck sein Programm einmal durch und wartet dann, die LEDs wiederholen die Schleife aber immer weiter und ignorieren den “else” Teil.
Falls jemand den Fehler erkennt oder uns einen Vorschlag hätte fänden wir das super.

Grüsse
Dennis

Euer Taster ist immer HIGH

pinMode (Taster, INPUT); digitalWrite(Taster, HIGH);

ihr solltet auf LOW abfragen und den Taster an GND und pin 4 anschließen. Außerdem noch ein kleines delay zum Entprellen des Tasters

    TasterState = digitalRead(Taster);      // Auslesen des Tasterwertes
   
    if (TasterState == LOW)                // Signal zum Programmstart
    {
      delay(30);
    // Programmablauf