Go Down

Topic: Code um einen Takt auszugeben (Read 1 time) previous topic - next topic

alphatierchen

Hallo,
ich will mit dem Ardunio Uni einen Schrittmotor ansteuern.
Der Motortreiber (L297) ist schon fertig vorhanden. Das heißt ich brauch nur noch einen Befehl der an einem Ausgang z.B. 1000 mal alle 2 Sekunden ein High Signal anlegt.

Ich habe an folgenden Code gedacht, allerdings fehlt mir der Befehl wie ich eben so einen Takt machen kann.
Hoffe ihr könnt mir da Helfen.

Code: [Select]
int Motor = 13;
int Taster1 = 10;
int Taster2 = 9;
int Taster3 = 8;
int Zeit1 = 1000;
int Zeit2 = 2000;

void setup(){
  pinMode(Motor, OUTPUT);
  pinMode(Taster1, INPUT);
  pinMode(Taster2, INPUT);
  pinMode(Taster3, INPUT);
}
 
void loop (){
  if (digitalRead(Taster1)==HIGH) {
    Hier soll dann 100mal HIGH Signale mit einer verzögerung von Zeit 1 an den Ausgang Motor kommen.
   
  if (digitalRead(Taster2)==HIGH) {
    Das gleiche dann aber mit der "Zeit2"
   
    Mit dem Taster3 soll man das ganze Stoppen können und zum loop zurückkehren. Denke das kann man mit einem Interrupt machen oder?

 

Dasichbinich

http://arduino.cc/en/Tutorial/BlinkWithoutDelay
Da steht, wie man das mit einer Led macht. musst du ein bisschen abändern, damit die Frequenz stimmt. Ich würde es allerdings so machen, dass du den dritten Schalter weglässt, dann kannst du es mit
if (digitalRead(Taster1) == HIGH)
machen. Denn dann wird das ganze nur ausgeführt, wenn du einen der beiden Taster drückst. Wenn du aber willst, dass man einmal einen Taster drückt, und dann immer weiter gedreht wird, bis der dritte Taster gedrückt wird, dann würde ich eine while-Schleife nehmen:
void loop(){
  if (digitalRead(Taster1) == HIGH){
    while (Taster3 != HIGH){
      hier dein an aus machen vom pin (also der Takt)
    }
  } else if (digitalRead(Taster2) == HIGH){
    wieder eine while Schleife
  } else {
    vllt. fällt dir irgendetwas ein, was du sonst machen willst. Zum beispiel auf einem Display "warten" anzeigen, oder so was...
Arduino Liebhaber

Serenifly

#2
Jun 16, 2013, 09:08 pm Last Edit: Jun 16, 2013, 09:26 pm by Serenifly Reason: 1
Also die billig Version ist das hier:

1.) Ausgang HIGH
2.) Zeit warten
3.) Ausgang LOW
4.) Zeit warten

Kannst halt dann sonst nichts machen. Du hättest dann die Möglichkeit die Taster per Interrupt abzufragen. Die beste Lösung, ist wie oben beschrieben wahrscheinlich "BlinkWithoutDelay". Dann kannst du während der Zeit noch andere Sachen machen.

Da du zweimal das gleiche tun willst schreib vielleicht deine Takterzeugung in einer eigene Methode, der du die Zeit als Parameter übergibst.

Interrupt für den dritten Taster ist das sauberste. Wenn du den jedesmal in der Schleife per Hand abfrägst bekommst du das Ereignis eventuell nicht mit. Du kannst dann z.B. in der IRS einen bool auf true setzen und dann sowas machen:

Code: [Select]

while(1)
{
   (if buttonPressed == true)
       break;
}


Das beendet die while-schleife

oder einfach
Quote

while(buttonPressed == false)
{
}

Und dann nicht vergessen die Variable zurückzusetzen

Serenifly

#3
Jun 16, 2013, 09:36 pm Last Edit: Jun 16, 2013, 11:32 pm by Serenifly Reason: 1
Du kannst auch mal schauen ob dir die PWM Frequenz passt:

http://arduino.cc/en/Tutorial/PWM

Duty Cycle von 50% ist was du willst und die PWM Frequenz ist fest eingestellt 500 Hz laut der Seite. Das wären "1000 mal alle zwei Sekunden", wenn ich da nichts falsch verstehe. Normalerweise rechnet man da mit "Schritten/Takte pro 1 Sekunde" aka Hertz. Damit müsstet du nur einmal den PWM-Ausgang einschalten und dann nichts mehr manuell setzten bis du ihn abschaltest und das kann in der ISR passieren.

Das geht aber nur für eine deiner Zeiten, da die Frequenz nicht variabel ist.

alphatierchen

Soo danke für eure Antworten, ich habe mir das Beispiel der LED genommen und bissel umgeschrieben.
Der Motor ist für eine Sonnenachführung. Darum wollte ich das der Motor sich 180° dreht und wenn er die 180° erreicht hat, sich wieder zurück dreht.
Mit den beiden Tastern steuert man die Geschwindigkeit (falls man was sehen will und nicht 24h warten will^^)

Hier der Code, vllt hat ja jemand Verbesserungsvorschläge.

Code: [Select]
int Motor = 13;
int Taster1 = 10;
int Taster2 = 9;
int Taster3 = 8;
int Winkel = 0;
int Winkel180 = 450;
int Winkel360 = 900;
int Drehung = 12;
long Zeit = 500;
int MotorState = LOW;
int DrehungState = LOW;
long previousMillis = 0;

void setup(){
  pinMode(Motor, OUTPUT);
  pinMode(Taster1, INPUT);
  pinMode(Taster2, INPUT);
  pinMode(Taster3, INPUT);
  pinMode(Drehung, OUTPUT);
}

void loop(){
  if (digitalRead(Taster1) == HIGH){
    Zeit= 1000;
  }
  if (digitalRead(Taster2) == HIGH){
    Zeit= 100;
  }
 
  // Schaltet den Takt     
      unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > Zeit) {
    previousMillis = currentMillis;
   
   
   if (MotorState == LOW)
       MotorState = HIGH;
       else
       MotorState = LOW;
       Winkel+=1;
   
     digitalWrite(Motor, MotorState); }
  if (Winkel >= Winkel180){
    Winkel = 0;
     if (DrehungState == LOW)
     DrehungState = HIGH;
    else
     DrehungState = LOW;
    digitalWrite(Drehung, DrehungState);
  }
}



Go Up