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
Servo spring zw. SOLL-Position und 180° hin und her
09.02.2015, 19:35 (Dieser Beitrag wurde zuletzt bearbeitet: 09.02.2015 19:40 von Aznagro.)
Beitrag #1
Servo spring zw. SOLL-Position und 180° hin und her
Hallo zusammen.

Ich hab an mein bereits üppig mit Komponenten bestücktes Board (Funduino Uno) ein Servo angeschlossen. Er soll auf Befehl in 90° Position fahren und dort verharren, bis ein anderer Befehl kommt. Nun fährt der Servo aber zwischen meiner Wunschposition und der 180°-Position hin und her, ohne zu pausieren. Hab gelesen, dass es an nem Spannungsabbruch aufgrund der anderen Verbraucher (LCD, GPS) liegen könnte, aber das board geht zwischendurch nicht aus, sondern spult das Programm brav bis zum Ende ab, auch wenn sich das Display bei der Servo-Fahrt immer kurzfristig etwas abdunkelt. Habe den Servo mittlerweile aber auch schon an ner 9V Batterie (bzw. 6 AA 1,5V in Reihe) laufen lassen (geerdet am µC) und das Board parallel dazu an USB gehängt, sodass ich das als Ursache eigentlich ausschließe..

Weiterhin wurden im Code vorhandene Delays (brauch ich für Display-Anzeige) als Fehlerquelle diagnostiziert, weil sie die PWM (hab den Servo am PIN 9, aber auch schon versch. andere probiert) behindern sollen. Kann ich aber nicht 100% nachvollziehen, da sämtliche Tutorien zum Thema Servo auch mit delay arbeiten, um die Position zu halten..

Habe die Code-Elemente des Servos wie ich sie verwendet habe in einen Blanko-Sketch getestet (mit der gesamten hardware angeschlossen)-> funktioniert tadellos.

Ich tingel mit dem problem schon seit ner Weile durch die Foren, aber bisher konnte mir noch niemand helfen.. vllt. habt ihr ne Idee worans liegen könnte?

Code: Zeile 6, 13, 30 und 34 sind die Servo-Elemente

Code:
#include <LiquidCrystal.h>
#include <Math.h>
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include <EEPROM.h>
#include <Servo.h>

//EEPROM: 0=Zielkoordinate1, 4=Zielkoordinate2, 8=Anzahl Versuche, 9=Rätsel gelöst j/n

LiquidCrystal lcd(12, 11, 7, 6, 5, 4);       //LCD-Objekt PINs zuordnen
SoftwareSerial gpsSerial(2, 3);         //create gps sensor connection
TinyGPS gps;
Servo servoschloss;                    

float lat,lon;                     // Latitude und Longitude des aktuellen Standorts -> Var-Typ long v. Libary vorgegeben
float latdest, londest;                                   // Latitude und Longitude des Ziels            
float dist = 0;                    // Distanz zur Zielkoordinate
int versuch;
int done;
int i=0;


void setup() {

   pinMode(8, OUTPUT);
   digitalWrite(8,LOW);
lcd.begin(16, 2);
Serial.begin(4800);                 //Serielle Verbindung starten
gpsSerial.begin(4800);                 //GPS seriell verbinden
servoschloss.attach(9);
}

void loop() {
  servoschloss.write(0);
delay(5000);
  done=EEPROM.read(9);
versuch=EEPROM.read(8);
if(versuch>=200){
     lcd.clear();
      lcd.setCursor(0, 0);                
      lcd.print("Too much");
      lcd.setCursor(0, 1);
      lcd.print("attempts.");
      delay(5000);
      lcd.clear();
      lcd.setCursor(0, 0);                
      lcd.print("System is");
      lcd.setCursor(0, 1);
      lcd.print("shutting down...");
      delay(5000);
      digitalWrite(8,HIGH);
    }
      
      
  if(done==0){
                                      //SERVO ZU
    versuch=versuch+1;
    EEPROM.write(8,versuch);
    
    lcd.clear();
    lcd.setCursor(0, 0);                
    lcd.print("Attempt ");
    lcd.print(versuch);
    lcd.print(" of 20");
    delay(5000);
    
    
  
      
    getgps();          
    
    //latdest=EEPROMReadlong(0);  
    //londest=EEPROMReadlong(4);

    dist=acos(sin(latdest*PI/180)*sin(lat*PI/180)+cos(latdest*PI/180)*cos(lat*PI/180)*cos(lon*PI/180-londest*PI/180))*6378.137;
    
    Serial.println();
    Serial.print("latdest: " ); Serial.println(latdest);
    Serial.print("londest: "); Serial.println(londest);
    Serial.print("lat: "); Serial.println(lat,100);
    Serial.print("lon: "); Serial.println(lon,100);
    Serial.print("dist: "); Serial.println(dist);
    Serial.print("versuch: "); Serial.println(versuch);
    Serial.print("done: ");Serial.println(done);
  
    if(dist>0.5){  
      lcd.clear();                                
      lcd.setCursor(0, 0);
      lcd.print("Entfernung zum");
      lcd.setCursor(0, 1);
      lcd.print("Ziel: " );
      lcd.print(dist);
      lcd.print("km" );
    
      delay(10000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Access denied.");
      delay(5000);
      Serial.print("ungelöster Pfad, Rätsel nicht gelöst");
      lcd.clear();
      lcd.setCursor(0, 0);                                
      lcd.print("System is");
      lcd.setCursor(0, 1);
      lcd.print("shutting down...");
      delay(5000);
      digitalWrite(8,HIGH);
    }
    
    done=1;      
    EEPROM.write(9,done);
    lcd.clear();                                  
    lcd.setCursor(0, 0);
    lcd.print("Objective");
    lcd.setCursor(0, 1);
    lcd.print("accomplished! n1" );
    delay(10000);
                                                //SERVO AUF
    Serial.print("ungelöster Pfad, Rätsel gelöst");
    lcd.clear();                                  
    lcd.setCursor(0,0);
        lcd.print("System is");
      lcd.setCursor(0, 1);
      lcd.print("shutting down...");
      delay(5000);
      digitalWrite(8,HIGH);
    
    
  
  delay(50000);
  }
    //----gelöster Pfad
  //SERVO AUF
  getgps();
      Serial.println();
    Serial.print("latdest: " ); Serial.println(latdest);
    Serial.print("londest: "); Serial.println(londest);
    Serial.print("lat: "); Serial.println(lat,100);
    Serial.print("lon: "); Serial.println(lon,100);
    Serial.print("dist: "); Serial.println(dist);
    Serial.print("versuch: "); Serial.println(versuch);
    Serial.print("done: ");Serial.println(done);
  lcd.clear();                                
    lcd.setCursor(0,0);
    lcd.print("neues Ziel?" );                   // Text neues Ziel -> Knopf drücken
    delay(10000);
  
  //wenn knopf gedrückt, dann neues ziel festlegen
  //alle daten zurücksetzen
  lcd.clear();                                  
    lcd.setCursor(0,0);
        lcd.print("System is");
      lcd.setCursor(0, 1);
      lcd.print("shutting down...");
      delay(5000);
      digitalWrite(8,HIGH);
  
  
  

delay(50000);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void EEPROMWritelong(int address, long value)
      {
      //Decomposition from a long to 4 bytes by using bitshift.
      //One = Most significant -> Four = Least significant byte
      byte four = (value & 0xFF);
      byte three = ((value >> 8) & 0xFF);
      byte two = ((value >> 16) & 0xFF);
      byte one = ((value >> 24) & 0xFF);

      //Write the 4 bytes into the eeprom memory.
      EEPROM.write(address, four);
      EEPROM.write(address + 1, three);
      EEPROM.write(address + 2, two);
      EEPROM.write(address + 3, one);
      }

//This function will return a 4 byte (32bit) long from the eeprom
//at the specified address to adress + 3.

long EEPROMReadlong(long address)
      {
      long four = EEPROM.read(address);
      long three = EEPROM.read(address + 1);
      long two = EEPROM.read(address + 2);
      long one = EEPROM.read(address + 3);

      return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);
      
      }
      
void getgps(){
  lcd.clear();
  lcd.setCursor(0, 0);                // LCD "Searching for signal.."
  lcd.print("Searching");
  lcd.setCursor(0, 1);
  lcd.print("for signal..");

  do{
  while(gpsSerial.available()){             // check for gps data
    if(gps.encode(gpsSerial.read())){         // encode gps data
    gps.f_get_position(&lat,&lon);         // get latitude and longitude
    }}
   // lat=554433221;                                  //Behelf: Zuweisung akt. Koordinaten
   // lon=123456789;
    Serial.print(".");
    i=i++;
     Serial.println(digitalRead(10));   //!!!!!!!!
    if(i>=20000){
      lcd.clear();                                  
    lcd.setCursor(0,0);
        lcd.print("Cannot find");
      lcd.setCursor(0, 1);
      lcd.print("signal...");
      delay(5000);
      lcd.clear();                                  
    lcd.setCursor(0,0);
        lcd.print("System is");
      lcd.setCursor(0, 1);
      lcd.print("shutting down...");
      delay(5000);
      digitalWrite(8,HIGH);
    }
      
} while(lat==0);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.02.2015, 22:50
Beitrag #2
RE: Servo spring zw. SOLL-Position und 180° hin und her
Hi,
also ich finde in Deinem Sketch nur ein servo-Befehl und der müsste das Ding auf Nullposition fahren. Was macht denn Pin 8 genau?
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
09.02.2015, 22:59
Beitrag #3
RE: Servo spring zw. SOLL-Position und 180° hin und her
(09.02.2015 19:35)Aznagro schrieb:  Hallo zusammen.

Ich hab an mein bereits üppig mit Komponenten bestücktes Board (Funduino Uno) ein Servo angeschlossen. Er soll auf Befehl in 90° Position fahren und dort verharren, bis ein anderer Befehl kommt. Nun fährt der Servo aber zwischen meiner Wunschposition und der 180°-Position hin und her, ohne zu pausieren. Hab gelesen, dass es an nem Spannungsabbruch aufgrund der anderen Verbraucher (LCD, GPS) liegen könnte, aber das board geht zwischendurch nicht aus, sondern spult das Programm brav bis zum Ende ab, auch wenn sich das Display bei der Servo-Fahrt immer kurzfristig etwas abdunkelt. Habe den Servo mittlerweile aber auch schon an ner 9V Batterie (bzw. 6 AA 1,5V in Reihe) laufen lassen (geerdet am µC) und das Board parallel dazu an USB gehängt, sodass ich das als Ursache eigentlich ausschließe..

Weiterhin wurden im Code vorhandene Delays (brauch ich für Display-Anzeige) als Fehlerquelle diagnostiziert, weil sie die PWM (hab den Servo am PIN 9, aber auch schon versch. andere probiert) behindern sollen. Kann ich aber nicht 100% nachvollziehen, da sämtliche Tutorien zum Thema Servo auch mit delay arbeiten, um die Position zu halten..

Habe die Code-Elemente des Servos wie ich sie verwendet habe in einen Blanko-Sketch getestet (mit der gesamten hardware angeschlossen)-> funktioniert tadellos.

Ich tingel mit dem problem schon seit ner Weile durch die Foren, aber bisher konnte mir noch niemand helfen.. vllt. habt ihr ne Idee worans liegen könnte?

Code: Zeile 6, 13, 30 und 34 sind die Servo-Elemente

Hi,
also erst mal ist es Pflicht die Servoversorgung von dem Arduino zu trennen weil beim Anlaufstrom des Servos geht jeder 5V Regler in die Knie. Andererseits ist dein Versuch das Servo mit 9V zu speisen auch leicht daneben da die üblichen Servos eine Nennspannung von 4 - 6 V haben. Nur neuere High-Power Servos vertragen z.B. 7,2V (2 LiPo-Zellen).
Zu den Delays, delay ist nicht gleich delay...weil da steht noch ein Wert drin der z.B. in diesem Tutorial eben nur 15mS ist. In deinem Code sind delays im mehrere Sekunden Bereich enthalten. Die Ansteuerung eines Servos besteht aus einem Impuls von 1 - 2mS Länge und einer Pause von 15 - ~25 mS. Wenn man diese Bedingungen nicht einhält kommt es zu solch anscheinend unerklärlichen Symptomen.
Teste doch mal einfach mit dem obigen Tutorial eines deiner Servo's aus. Dann verlängerst du mal das delay auf 100, 500, 1000, 5000mS und schaust was passiert.
Denke mal dann weist was zu tun ist....nämlich dafür sorgen das die Servoimpulse alle 20mS (typischer Wert) wiederholt werden....separate Stromversorgung vorausgesetzt. GND muß natürlich miteinander verbunden sein.
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.02.2015, 23:47
Beitrag #4
RE: Servo spring zw. SOLL-Position und 180° hin und her
Hä? Die Servo-Lib arbeitet per Timer-Interrupt. Die Länge der Delays ist da egal.
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
10.02.2015, 19:51
Beitrag #5
RE: Servo spring zw. SOLL-Position und 180° hin und her
(09.02.2015 23:47)Thorsten Pferdekämper schrieb:  Hä? Die Servo-Lib arbeitet per Timer-Interrupt. Die Länge der Delays ist da egal.
Gruß,
Thorsten

Hi Thorsten,
also die Servo Lib habe ich mal auf einem Tiny einsetzen wollen...da kam nur Müll raus. Dann habe ich die Servoausgabe auf microseconds() und auf delay ohne delay umgebaut und dann lief das zuverlässig. Auf dem UNO hatte ich noch keinen Anwendungsfall.
lg
blk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.02.2015, 21:09
Beitrag #6
RE: Servo spring zw. SOLL-Position und 180° hin und her
Danke für den ausführlichen Input! Hab heute nen kumpel hier gehabt und der hat mir geraten, mal nach und nach alle code-blöcke zu entfernen.. hab nicht dran geglaubt, aber siehe da:

die zeile "gpsSerial.begin(4800)" beeinflusst anscheinend den servo (bzw. PIN 9) negativ. Hab die Zeile versuchsweise rausgenommen und jetzt klappt es. Wo da allerdings der zusammenhang besteht ist für mich fraglich.

ich werd jetzt mal gucken, ob ich die serial-ausgabe überhaupt brauche, sonst lass ich sie raus...

beste grüße Smile

(ps: PIN 8 schaltet über ein HIGH-Signal per power-switch den arduino aus)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.02.2015, 10:24
Beitrag #7
RE: Servo spring zw. SOLL-Position und 180° hin und her
Hi,
anscheinend verhindert die SofwareSerial Library alle Interrupts, wenn sie ein byte sendet. Das ist wahrscheinlich so, um das Timing sicherzustellen. Bei 4800 Baud duerften das 2ms sein. Wenn Dir das zwischen den Servo-Impuls kommt, wird der natuerlich zu lang.
Da koennte helfen, auf Hardware-Serial umzusteigen oder die Servo-Lib mit der SoftwareSerial-Lib zu synchronisieren, so dass die Software-Serial Lib nur in den Servo-Pausen etwas sendet.
Gruss,
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
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Servo zu wenig Leistung eddykett 9 1.464 25.08.2015 21:08
Letzter Beitrag: diode1990
  Arduino soll sich selbst stromlos schalten Home38 9 1.669 21.08.2015 20:17
Letzter Beitrag: Home38
  Shild-Wahl für Servo-Steuerung SkyFox 9 1.118 23.07.2015 12:49
Letzter Beitrag: SkyFox
  Spannung wo keine sein soll ! bergfrei 30 4.178 28.05.2015 09:25
Letzter Beitrag: Scherheinz
  Arduino wie LCD, Keypad und Servo anschließen AlexGPS 30 6.295 04.10.2014 19:57
Letzter Beitrag: Thorsten Pferdekämper
  Arduino & ext. Spannung steuert Servo torsten_156 4 1.853 27.09.2014 22:55
Letzter Beitrag: Bitklopfer
  TV mit Servo drehen knightrider 0 723 07.04.2014 12:26
Letzter Beitrag: knightrider

Gehe zu:


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