Go Down

Topic: Probleme mit Servomotorsteuerung (Read 220 times) previous topic - next topic

martink87

Hallo, kann mir einer verraten was ich falsch mache?
Im Prinzip habe ich einen Ein/Aus Schalter und 3 Poti´s, eins für die Geschwindigkeit, und die anderen beiden sind jeweils für den maximal Anschlag links und rechts, dazwischen soll das ganze hin und her pendeln.

Code: [Select]
#include <Servo.h>
Servo wiperServo;


int pos; int lastPos;
int leftServo; int rightServo;
int servoSpeed = 2;

int startAngle = 70;

const byte interruptPin = 2;

volatile byte flag = LOW;       


void setup() {
pinMode(8, OUTPUT); pinMode(9, OUTPUT);

for (int flash = 0; flash < 3; flash++)
{
digitalWrite(8, HIGH); delay(200); digitalWrite(8, LOW); delay(200);
}

wiperServo.attach(10);       
                                             
attachInterrupt(digitalPinToInterrupt(interruptPin), onOff, FALLING);   
 
rightServo = map(analogRead(A0), 0, 1023, 90, 0);

rightServo = constrain(rightServo, 0, 90);

wiperServo.write(rightServo); delay(2000);

leftServo = map(analogRead(A1), 0, 1023, 90, 180);

leftServo = constrain(leftServo, 90, 180);

wiperServo.write(leftServo); delay(2000);

for (int flash = 0; flash < 3; flash++)
{
digitalWrite(8, HIGH); delay(200); digitalWrite(8, LOW); delay(200);
}
lastPos = leftServo;

}


void loop() {

servoSpeed = map(analogRead(A2), 0, 1023, 0, 20);
       
servoSpeed = constrain(servoSpeed, 2, 18);               

if (analogRead(A1) < 25)
{
leftServo = 90;
digitalWrite(8, HIGH);
    delay(25);
      }
  else
    {
        leftServo = map(analogRead(A1), 26, 1023, 90 + startAngle, 180);
        leftServo = constrain(leftServo, 90, 180);

        if (leftServo >= 175) digitalWrite(9, HIGH);
        else digitalWrite(9, LOW);
    }

 if (analogRead(A0) < 25)
    {
        rightServo = 90;
        digitalWrite(8, HIGH);
        delay(25);
      }
else
    {
        rightServo = map(analogRead(A0), 26, 1023, 90 - startAngle, 0);
      rightServo = constrain(rightServo, 0, 90);

      if (rightServo <= 5) digitalWrite(9, HIGH);
        else digitalWrite(9, LOW);
      }

if (flag)                                                 
{
        if (lastPos > rightServo)

          for (pos = lastPos; pos >= rightServo; pos--)
{
 
if (!flag) break;                                   

 runServo(servoSpeed);                               
      }

if (lastPos < leftServo)

for (pos = lastPos; pos <= leftServo; pos++)
            {
             if (!flag) break;                                   
              runServo(servoSpeed);                               
       }
}

if (!flag)                                             
{
        if (lastPos >= 90)
        {
wiperServo.write(leftServo);
                     
pos = leftServo;
    }
 else
    {
wiperServo.write(rightServo);
                           
    pos = rightServo;
}
         }
}

uwefed

Quote
Hallo, kann mir einer verraten was ich falsch mache?
Du könntest erklähren was der Sketch nicht macht.
Grüße Uwe

HotSystems

Und ich sehe keine Kommentare im Sketch.
Wie sollen wir Wissen, was an welcher Stelle passieren soll.

Auch könntest du den Sketch zum besseren Lesen richtig formatieren. Dazu "STRG + T" in der IDE drücken, sowie die nutzlosen Leerzeilen entfernen.
Nur dann macht es Spass den Sketch auch zu lesen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

postmaster-ino

Hi

Würde auch nicht schaden, wenn der Sketch kompilieren würde - die ISR fehlt - wofür soll Die überhaupt sein?

MfG

PS: Wurde ja schon angesprochen - der Sketch liest sich grauenhaft, die Leerzeilen machen's nicht besser und so ganz ohne Kommentare, Was Du Dir Da gedacht hattest ...
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

martink87

Code: [Select]
#include <Servo.h>          //Include the Arduino servo library
Servo wiperServo;         //Create a name for the servo

int pos; int lastPos;           //Current position variables
int leftServo; int rightServo;        //Desired position variables
int servoSpeed = 2;         //Set the initial servo speed

/* startAngle variable - The left and right limit potentiometers can be adjusted to add/subtract an adjustable number of degrees between zero and 90 minus the startAngle variable. With the startAngle variable set at 70, the servo will travel 70 degrees from center before the pot adjustment has any effect. If the pot is set to zero, the servo will travel 70 degrees and then reverse direction. If the pot is set to its maximum, the servo will travel the full 90 degrees and then reverse direction. If the startAngle variable is set to 50 as another example, the limit potentiometers will have 40 degrees of adjustment. The higher the variable value, the finer the potentiometer control.
*/
int startAngle = 70;

//Designate pin 2 as an interrupt for ON/OFF control using the tactile switch
const byte interruptPin = 2;

//Set the system status flag. Also used for ON/OFF control
volatile byte flag = LOW;



void setup() {
  pinMode(8, OUTPUT); pinMode(9, OUTPUT); //Set digital pins 8 and 9 as outputs

  //Flash red LED 3 times to indicate uC has entered setup mode.
  for (int flash = 0; flash < 3; flash++)
  {
    digitalWrite(8, HIGH); delay(200); digitalWrite(8, LOW); delay(200);
  }

  //Identify the servo signal digital pin
  wiperServo.attach(10);

  //Identify interrupt pin, function to run on interrupt, HIGH to LOW detection
  attachInterrupt(digitalPinToInterrupt(interruptPin), onOff, FALLING);

  //Read the analog level of uC pin A0, convert the 12bit value to a degree range (0-90),
  rightServo = map(analogRead(A0), 0, 1023, 90, 0);

  //Confine the range of servo travel to the right of center to 0-90.
  rightServo = constrain(rightServo, 0, 90);

  //Run the servo. The delay gives the servo time to reach its destination.
  wiperServo.write(rightServo); delay(2000);

  //Read the analog level of uC pin A1, convert the 12bit value to a degree range (90-180),
  leftServo = map(analogRead(A1), 0, 1023, 90, 180);

  //Confine the range of servo travel to the left of center to 90-180.
  leftServo = constrain(leftServo, 90, 180);

  //Run the servo. The delay gives the servo time to reach its destination.
  wiperServo.write(leftServo); delay(2000);

  //Flash an LED 3 times to indicate end of servo test.
  for (int flash = 0; flash < 3; flash++)
  {
    digitalWrite(8, HIGH); delay(200); digitalWrite(8, LOW); delay(200);
  }
  //Remember the servo position as a starting point in the main program
  lastPos = leftServo;

}


void loop() {

  servoSpeed = map(analogRead(A2), 0, 1023, 0, 20);

  //Set range limits for speed - less than 2 will cause servo chatter
  servoSpeed = constrain(servoSpeed, 2, 18);

  //Turn on the green LED if leftServo value is at the center position.
  if (analogRead(A1) < 25)
  {
    leftServo = 90;
    digitalWrite(8, HIGH);
    delay(25);
  }
  else
  {
    leftServo = map(analogRead(A1), 26, 1023, 90 + startAngle, 180);
    leftServo = constrain(leftServo, 90, 180);

    //Turn on the Red LED if leftServo is approaching the maximum position.
    if (leftServo >= 175) digitalWrite(9, HIGH);
    else digitalWrite(9, LOW);
  }

  //Turn on the green LED if rightServo value is at the center position.
  if (analogRead(A0) < 25)
  {
    rightServo = 90;
    digitalWrite(8, HIGH);
    delay(25);
  }
  else
  {
    rightServo = map(analogRead(A0), 26, 1023, 90 - startAngle, 0);
    rightServo = constrain(rightServo, 0, 90);

    //Turn on the Red LED if rightServo is approaching the maximum position.
    if (rightServo <= 5) digitalWrite(9, HIGH);
    else digitalWrite(9, LOW);
  }

  //The following responds to a tactile button press (High to Low transition).
  if (flag)
  {
    if (lastPos > rightServo)

      //Continuous motion loop - from right limit to left limit
      for (pos = lastPos; pos >= rightServo; pos--)
      {

        //If the flag changes state (turned OFF), jump out of the loop
        if (!flag) break;

        //Run the servo motion and LED indication function
        runServo(servoSpeed);
      }

    if (lastPos < leftServo)

      //Continuous motion loop - from left limit to right limit
      for (pos = lastPos; pos <= leftServo; pos++)
      {
        if (!flag) break;
        runServo(servoSpeed);
      }
  }

  //If the flag, set by the switch, is false (OFF) enter this loop
  if (!flag)
  {
    if (lastPos >= 90)
    {
      //If the last position is left of center, go to the left limit
      wiperServo.write(leftServo);

      //Remember the current position.
      pos = leftServo;
    }
    else
    {
      //If the last position is right of center, go to the right limit
      wiperServo.write(rightServo);

      //Remember the current position
      pos = rightServo;
    }
  }
}

postmaster-ino

Hi

Du darfst ganz knapp vorm Kopieren den Sketch auch kompilieren - Das tut Der nämlich immer noch nicht.
Besteht Der ggf. aus mehreren Tabs?

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

martink87

#6
May 24, 2020, 01:35 am Last Edit: May 24, 2020, 01:44 am by martink87
ja genau da ist das problem,
er sagt ab der zeile
Code: [Select]
attachInterrupt(digitalPinToInterrupt(interruptPin), onOff, FALLING);
C:\Users\Martin\Documents\Arduino\sketch_may23a\sketch_may23a.ino: In function 'void setup()':

sketch_may23a:34:56: error: 'onOff' was not declared in this scope
  attachInterrupt(digitalPinToInterrupt(interruptPin), onOff, FALLING);

C:\Users\Martin\Documents\Arduino\sketch_may23a\sketch_may23a.ino: In function 'void loop()':

sketch_may23a:119:9: error: 'runServo' was not declared in this scope
  runServo(servoSpeed);


C:\Users\Martin\Documents\Arduino\sketch_may23a\sketch_may23a.ino:119:9: note: suggested alternative: 'Servo'
  runServo(servoSpeed);


sketch_may23a:128:9: error: 'runServo' was not declared in this scope
  runServo(servoSpeed);

C:\Users\Martin\Documents\Arduino\sketch_may23a\sketch_may23a.ino:128:9: note: suggested alternative: 'Servo'
  runServo(servoSpeed);

 

Was meinst du mit ISR Fehlt? Muss ich diesen Interrupt Pin noch irgendwo benennen?
Sorry ich bin in der C Programmierung noch ganz am Anfang :D



gregorss

Sorry ich bin in der C Programmierung noch ganz am Anfang :D
Willst Du das Programmieren etwa lernen, indem Du Code kopierst ...?!

Gruß

Gregor
Mir wird übel. (Uwe)

postmaster-ino

Hi

Von irgendwo muß der Sketch ja gekommen sein.
Wenn von Dir, solltest Du die Idee dahinter von irgendwo her haben.
Dort wird dann auch die Sache mit der ISR Erwähnung finden (davon ab: Du WILLST - zumindest für einen vom Menschen bedienbaren Taster keinen Interrupt verwenden).
Was zum Anklicken wäre toll!

Eine ISR ist die Funktion zu einem Interrupt
InteruptServiceRoutiene
Hiermit wird binnen weniger Takte auf ein externes Signal reagiert oder auf interne Timer-Werte.
Beides brauchst Du hier bestimmt nicht.
Ob der Knopf Jetzt, oder in 0,5 Sekunden (von Dir) gedrückt wird, ist völlig belanglos - somit ist Das auch nicht sonderlich zeitkritisch, kann also in loop() ganz einfach gepollt werden.

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

uwefed

attachInterrupt(digitalPinToInterrupt(interruptPin), onOff, FALLING);

onOff ist die Funktion, die bei eintreten der Interruptbedingung am interruptPin aufgerufen wird. Diese Fehlt in Deinem Sketch

ISR heißt Interrupt Service Routine.

Grüße Uwe

postmaster-ino

Hi

Warum Du das Wenige in Englisch kommentierst, Dir aber deutsche Hilfe suchst, erschließt sich mir nicht.
Auch sollte nicht das Offensichtliche kommentiert werden - macht x zum Output - DAS können wir schon am Sketch sehen - was der Ausgang später Mal machen soll, wäre toll.
So sind die Ausgänge momentan nur Zahlen - 8 und 9 - wenn man dafür Namen benutzt
(const byte superduperrelaispin=8; )  (das 'const' lässt den Kompiler Optimierungsspielraum - Nutze Es, wo Du kannst (ALLES, was sich nicht ändern wird/darf, als const deklarieren) )
wird über den Namen 'superduperrelaispin' ersichtlich, daß hier wohl ein Relais dran hängt - statt superduper könnte das Relais spezieller erwähnt werden.

8/9 wohl LEDs
10 der Servo-Ausgang
A0/A1 Poti zur Wert-Eingabe
A2 Verstellgeschwindigkeit - schaue Dir die MoBaTools an - Die machen 'Geschwindigkeit' von Haus aus

Auch sind die ADC-Kommentare falsch - die ADC liefern 10bit (was auch 1023 als Maximalwert entspricht), keine 12bit (4095).

MfG

PS: runServo(Speed) finde ich gerade auch nicht - scheint noch mehr zu fehlen.
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

Go Up