INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Tastung mit begrenzter Zeit
25.06.2014, 19:42
Beitrag #1
Tastung mit begrenzter Zeit
Hallo Gemeinde,

für unseren RC-Parcours habe ich eine Sketch für die Ansteuerung eines Servos geschrieben. Der Servo dreht in einem Winkel von 90° und wird mit zwei Tastern gesteuert. Ein Taster ist für die Drehung entgegen dem Uhrzeigersinn, die andere für die Drehung im Uhrzeigersinn.

Der Nachteil des nachfolgend gelisteten Sketch ist der, dass zum Fahren des Servos die ganze Zeit die jeweilige Taste gedrückt werden muss.

Meine Vorstellung ist dahingehend geplant dass ein kurzer Druck auf den Taster den Servo bis in die jeweilige Stellung fährt.

Meine bisherigen (zahlreichen) Lösungsansätze sind bisher gescheitert, daher meine Bitte um Hilfe.

Das Listing für die Ansteuerung des Servos:

/* Steuerung für Zugangsschranke zum Bauhof*/


// Servoparameter vorgeben
int servoPin = 2; // Servo Pin
int minPulse = 630; // minimum servo position vertikal
int maxPulse = 1600; // maximum servo position horizontal
int turnRate = 1; // Geschwindigkeit desto größer desto schneller!
int refreshTime = 20; // Aktuallisierungs Rate 50Hz = 20ms 1/f
int centerServo; // Mittelstellung
int pulseWidth; // Pulsweite
long lastPulse = 0; // Zeit des letzen Impulses speichern

// Taster für die Drehrichtung festlegen
int SW1 = 7; // Taster 1 links
int SW2 = 6; // Taster 2 rechts




void setup()
{
pinMode(servoPin, OUTPUT);
pinMode(SW1,INPUT);
digitalWrite(SW1,HIGH);
pinMode(SW2,INPUT);
digitalWrite(SW2,HIGH);
centerServo = maxPulse - (((maxPulse - minPulse)/2)-485);
pulseWidth = centerServo;
}

void loop()
{

// Wurde ein Taster gedrückt?
if(!digitalRead(SW1)||!digitalRead(SW2))
{
if(!digitalRead(SW1)) {pulseWidth = pulseWidth - turnRate;}
if(!digitalRead(SW2)) {pulseWidth = pulseWidth + turnRate;}

// Begrenzung
if(pulseWidth > maxPulse) {pulseWidth = maxPulse;}
if(pulseWidth < minPulse) {pulseWidth = minPulse;}
delay(2);
}

// Servo ansteuern
if (millis() - lastPulse >= refreshTime)
{
digitalWrite(servoPin, HIGH);
delayMicroseconds(pulseWidth);
digitalWrite(servoPin, LOW);
lastPulse = millis();
}
}

Danke im voraus für Eure Hilfe
Armin de DO1XXY
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.06.2014, 20:06
Beitrag #2
RE: Tastung mit begrenzter Zeit
In etwa so?
Code:
/* Steuerung für Zugangsschranke zum Bauhof*/

// Servoparameter vorgeben
int servoPin     =  2;     // Servo Pin
int minPulse     =  630;   // minimum servo position vertikal
int maxPulse     =  1600;  // maximum servo position horizontal
int turnRate     =  1;     // Geschwindigkeit desto größer desto schneller!
int refreshTime  =  20;    // Aktuallisierungs Rate 50Hz = 20ms 1/f
int centerServo;           // Mittelstellung
int pulseWidth;            // Pulsweite
long lastPulse   = 0;      // Zeit des letzen Impulses speichern

// Taster für die Drehrichtung festlegen
int SW1          =  7;     // Taster 1 links
int SW2          =  6;     // Taster 2 rechts

void setup()
{
  pinMode(servoPin, OUTPUT);  
  pinMode(SW1,INPUT);
  digitalWrite(SW1,HIGH);
  pinMode(SW2,INPUT);
  digitalWrite(SW2,HIGH);
  centerServo = maxPulse - (((maxPulse - minPulse)/2)-485);
  pulseWidth = centerServo;  
}

void loop()
{

  static boolean goLeft = false;
  static boolean goRight = false;
  static long lastSW1 = 0;
  static long lastSW2 = 0;

  long now = millis();

  // Taster entprellen und links/rechts setzen
  if(!digitalRead(SW1)) {
    if(now - lastSW1 > 50) goLeft = true;
  }else{
     lastSW1 = now;
  };
  if(!digitalRead(SW2)) {
    if(now - lastSW2 > 50) goRight = true;
  }else{
     lastSW2 = now;
  };

  // beide Tasten? dann lieber gar nicht
  // das muesste auch bewirken, dass man die Schranke mit
  // der "anderen" Taste anhalten kann
  if(goLeft && goRight) {
    goLeft = false;
    goRight = false;
  };

    // langsam drehen
    if(goLeft) {pulseWidth = pulseWidth - turnRate;}
    if(goRight) {pulseWidth = pulseWidth + turnRate;}

    // Begrenzung
    if(pulseWidth > maxPulse) {pulseWidth = maxPulse;}
    if(pulseWidth < minPulse) {pulseWidth = minPulse;}
    delay(2);
  
  // Servo ansteuern
  if (millis() - lastPulse >= refreshTime)
  {
    digitalWrite(servoPin, HIGH);  
    delayMicroseconds(pulseWidth);  
    digitalWrite(servoPin, LOW);    
    lastPulse = millis();          
  }
}

...ohne Gewähr.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.06.2014, 20:47
Beitrag #3
RE: Tastung mit begrenzter Zeit
Hallo Torsten,

perfekt, genau so habe ich mir vorgestellt. Danke für Deine Unterstützung und die Erweiterung meines Arduino-Horizontes. Will heißen: ich muss noch viel lernen.

Armin de DO1XXY
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.06.2014, 20:48
Beitrag #4
RE: Tastung mit begrenzter Zeit
Hat das etwa auf Anhieb funktioniert?
Erstaunlich...

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.06.2014, 06:13
Beitrag #5
RE: Tastung mit begrenzter Zeit
Hallo Thorsten,

hat es, und zwar ohne Probleme. Traust Du Deinen Fähigkeiten nicht Wink

Gruß aus Lbg.
Armin de DO1XXY
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Drei Servomotoren gleichzeitig verfahren in vorgebender Zeit Kristian 0 1.369 11.12.2013 10:50
Letzter Beitrag: Kristian

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste