Pages: [1]   Go Down
Author Topic: einfache Motorsteuerung  (Read 480 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Moin,
ich bin Neu mit dem umgang von Arduino.
Ich hab zwar schon ein paar schaltungen gebastelt....aber mit der programmierung scheitert es dann wenn ich abweichen will

kann mir einer sagen wie ich eine einfache motorsteuerung baue
drei taster : hoch, stop, runter
zwei relais für rechts/linkslauf polumschalter funktioniert
ein motor

ich komme nicht damit zurecht das jeder taster nur seine bestimmung erfüllt
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 269
Posts: 21836
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, das sind die "gefühlten" Probleme.  smiley-wink
Jetzt geht's ans Eingemachte.
Tiefenpsychologische Frage: 
Was ist Dein Problem, Was wiedersterbt sich Deinem Verständnis?   smiley-wink smiley-wink smiley-wink
Wie hast Du die Schaltung aufgebaut?

Wie Hast Du die Relais geschaltet? 1) eines ein-aus das andere in Reihe zum Motor rechts/links  oder 2) eins für rechts- und das andere für linkslauf?

Fall 1:
Taster links: Relais R/!L ein  dann Relais E/A ein
Taster Stop: Relais R/!L aus Relais E/A aus
Taster rechts: Relais R/!L aus  dann Relais E/A ein
Es sind immer beide Relais zu setzen da es nicht gesagt ist daß Du nicht von links nach rechst direkt ohne Stop wechselst.

Fall 2)
Taster links: Relais R aus  dann Relais L ein
Taster Stop: Relais R aus Relais L aus
Taster rechts: Relais L aus dann Relais R ein
Es ist besser die Relais elektrisch zu verriegeln: ein Öffner des Relais R im reihe zu Spule des Relasi L und umgekehrt. So verhindert man daß beide Relais gleichzeitig an sind und einen Kurzschluß der Spannungsversorgung machen. Im Industriellen Umfeld gibt es sogar mechanis verriegelte Relaispäärchen bzw Schütz-Päärchen ( ein angezogenes Relais/Schütz blockiert das Anziehen des anderen) damit sowas nicht passiert.

Zwischen den beiden Versionen ist fall 1 Vorzuziehen da bei verklebten Kontakten kein Kurzschluß entstehen kann..

grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

also ich hab noch nicht ganz viel ahnung vom programmieren
die grundsachen sind mir klar

ich hab bis jetzt nur das wenn ich auf button1 drücke der motor links läuft, klich ich noch mal drauf ist stop. klicke ich auf button2 ist es rechtslauf und nochmal drauf stop.

ich möchte erstmal das ich auf button3 zum stoppen klicken muss

nur wie mache ich das?

nicht über meine programmierung wundern, das ist bis jetzt meine größte.....und auch nur aus anderen sachen zusammengeklaut



Code:
int buttonPin1 = 2;         // the number of the button pin1
int buttonPin2 = 3;         // the number of the button pin2
int motorPin1 = 11;       // the number of the motor pin1
int motorPin2 = 12;       // the number of the motor pin2

int motorstate1 = HIGH;      // the current state of the motor pin1
int motorstate2 = HIGH;      // the current state of the motor pin2
int reading1;           // the current reading from the button pin1
int reading2;           // the current reading from the button pin2
int previous1 = LOW;    // the previous reading from the button pin1
int previous2 = LOW;    // the previous reading from the button pin2

// the follow variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long time1 = 0;         // the last time the motor pin1 was toggled
long time2 = 0;         // the last time the motor pin2 was toggled
long debounce1 = 200;   // the debounce time, increase if the motor1 flickers
long debounce2 = 200;   // the debounce time, increase if the motor2 flickers

void setup()
{
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
}

void loop()
{
  reading1 = digitalRead(buttonPin1);
  reading2 = digitalRead(buttonPin2);

  // if the input just went from LOW and HIGH and we've waited long enough
  // to ignore any noise on the circuit, toggle the output pin and remember
  // the time
  if (reading1 == HIGH && previous1 == LOW && millis() - time1 > debounce1) {
    if (motorstate1 == HIGH)
      motorstate1 = LOW;
    else
      motorstate1 = HIGH;

    time1 = millis();    
  }
  
  if (reading2 == HIGH && previous2 == LOW && millis() - time2 > debounce2) {
    if (motorstate2 == HIGH)
      motorstate2 = LOW;
    else
      motorstate2 = HIGH;

    time2 = millis();    
  }

  digitalWrite(motorPin1, motorstate1);
  digitalWrite(motorPin2, motorstate2);

  previous1 = reading1;
  previous2 = reading2;
}

« Last Edit: April 06, 2013, 12:53:24 pm by uwefed » Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 269
Posts: 21836
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vorschläge:
Die Variablen müssen "unsignad long" sein weil Millis() ein unsignad long gibt. So gibt es nach ca 25 tagen Fehlfunktionen.
long time1 = 0;         // the last time the motor pin1 was toggled
long time2 = 0;         // the last time the motor pin2 was toggled

Das Entprellen funktoniert so nicht. Du mußt nach dem ersten Tastendruck und der Verzögerungszeit schauen ob der taster noch gedrückt ist. Für solch zeitunkritischen Tastendrücke ist es einfacher ein Delay(10); als debounce einzufüggen.

Ok, der Sketch startet Motor1 wenn Du Taste1 drückst und beim zweiten mal Taste1 Drücjken stopt der Motor. Das gleiche bei Motor2.

Welche der 2 von mir aufgezeigten Möglichkeiten möchtest Du realisieren?

Grüße Uwe

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ich hab jetzt mal was mit Blockly gemacht
wilder code....aber es geht schon mal wie ich will

Code:
void setup()
{
  pinMode(2, INPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(4, INPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(3, INPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);
}


void loop()
{
  if (digitalRead(2)) {
    digitalWrite(11,HIGH);
    digitalWrite(12,LOW);

  }

  if (digitalRead(4)) {
    digitalWrite(11,LOW);
    digitalWrite(12,LOW);

  }

  if (digitalRead(3)) {
    digitalWrite(12,HIGH);
    digitalWrite(11,LOW);

  }

  if (digitalRead(5)) {
    delay(2000);
    digitalWrite(11,LOW);

  }

  if (digitalRead(6)) {
    delay(2000);
    digitalWrite(12,LOW);

  }

}

und hier noch der code und link zu blockly

http://www.gasolin.idv.tw/public/blockly/demos/blocklyduino/index.html

Code:
<xml xmlns="http://www.w3.org/1999/xhtml"><block type="controls_if" inline="true" x="-37" y="-388"><value name="IF0"><block type="grove_button"><title name="PIN">2</title></block></value><statement name="DO0"><block type="grove_relay"><title name="PIN">11</title><title name="STAT">HIGH</title><next><block type="grove_relay"><title name="PIN">12</title><title name="STAT">LOW</title></block></next></block></statement></block><block type="controls_if" inline="false" x="356" y="-386"><value name="IF0"><block type="grove_button"><title name="PIN">4</title></block></value><statement name="DO0"><block type="inout_digital_write"><title name="PIN">11</title><title name="STAT">LOW</title><next><block type="inout_digital_write"><title name="PIN">12</title><title name="STAT">LOW</title></block></next></block></statement></block><block type="controls_if" inline="false" x="698" y="-384"><value name="IF0"><block type="grove_button"><title name="PIN">3</title></block></value><statement name="DO0"><block type="grove_relay"><title name="PIN">12</title><title name="STAT">HIGH</title><next><block type="grove_relay"><title name="PIN">11</title><title name="STAT">LOW</title></block></next></block></statement></block><block type="controls_if" inline="false" x="698" y="-89"><value name="IF0"><block type="grove_button"><title name="PIN">6</title></block></value><statement name="DO0"><block type="base_delay" inline="true"><value name="DELAY_TIME"><block type="math_number"><title name="NUM">2000</title></block></value><next><block type="grove_relay"><title name="PIN">12</title><title name="STAT">LOW</title></block></next></block></statement></block><block type="controls_if" inline="false" x="-40" y="-112"><value name="IF0"><block type="grove_button"><title name="PIN">5</title></block></value><statement name="DO0"><block type="base_delay" inline="true"><value name="DELAY_TIME"><block type="math_number"><title name="NUM">2000</title></block></value><next><block type="grove_relay"><title name="PIN">11</title><title name="STAT">LOW</title></block></next></block></statement></block></xml>
« Last Edit: April 06, 2013, 01:53:28 pm by Kanga » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

So...
das ist der Code so wie es funktioniert..wie es soll
nur noch nicht ganz sauber....mach ich aber noch

Code:
void setup()
{
  pinMode(2, INPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  pinMode(4, INPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(3, INPUT);
}


void loop()
{
  if (digitalRead(2)) {
    digitalWrite(11,HIGH);
    digitalWrite(12,LOW);

  } else if (!digitalRead(5) && !digitalRead(6)) {
    delay(2000);
    digitalWrite(11,LOW);
  }

  if (digitalRead(4)) {
    digitalWrite(11,LOW);
    digitalWrite(12,LOW);

  }

  if (digitalRead(3)) {
    digitalWrite(12,HIGH);
    digitalWrite(11,LOW);

  } else if (digitalRead(5) && digitalRead(6)) {
    delay(2000);
    digitalWrite(12,LOW);
  }

}

oder nochmal n wenig verändert...aber so geht der auch..

ach ja...was bei beiden ist...ich muss länger auf die taster drücken...damit es schaltet...warum??

Code:
void setup()
{
  pinMode(2, INPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  pinMode(4, INPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(3, INPUT);
}


void loop()
{
  if (digitalRead(2)) {
    digitalWrite(11,HIGH);
    digitalWrite(12,LOW);

  }
  if (!digitalRead(5) && !digitalRead(6)) {
    delay(2000);
    digitalWrite(11,LOW);

  }

  if (digitalRead(4)) {
    digitalWrite(11,LOW);
    digitalWrite(12,LOW);

  }

  if (digitalRead(3)) {
    digitalWrite(12,HIGH);
    digitalWrite(11,LOW);

  }
  if (digitalRead(5) && digitalRead(6)) {
    delay(2000);
    digitalWrite(12,LOW);

  }

}
« Last Edit: April 07, 2013, 07:38:19 am by Kanga » Logged

Pages: [1]   Go Up
Jump to: