Forum: Mikrocontroller und Digitale Elektronik Problem mit Arduino-Programm


von Alex (Gast)


Lesenswert?

Hallo,
ich bräuchte mal eure Hilfe da ich gerade anstehe:

Ich bin Modellbauer und benötige für mein aktuelles Projekt eine 
Steuerung welche 2 Servos steuern kann. Ich möchte das ganze mit einem 
Arduino Nano durchführen und habe hierfür schon alle Komponenten 
zusammen.

Die Servos sollen folgende Aufgabe erledigen:
https://www.youtube.com/watch?v=RhTMjVR0U00&feature=youtu.be

Ein Programm habe ich schon soweit geschrieben aber könntet ihr mir 
vielleicht sagen ob das so stimmt bzw. ob es anderes auch funktioniert.
Beim Funktionstest zeigte sich, dass ein Servo beim Start eine Position 
ein nimmt und der andere macht einfach irgendetwas.

Programm:
1
/**
2
3
***Funktionsbeschreibung Lukensteuerung***
4
5
Sobald am Input "CTI" eine Spannung von 5V anliegt soll sich
6
der Servo "Luke"  bewegen und sobald der Kontakt "SicherungLuke"
7
geschlossen ist, soll sich auch Servo "Fahrer" bewegen.
8
Wird nun der Input "CTI" auf 0V gesetzt so soll sich zuerst Servo "Fahrer"
9
bewegen und erst wenn Kontakt "Sicherung Fahrer" geschlossen ist, darf Servo
10
"Luke" wieder zurück in die Ursprungsposition gehen.
11
12
**/
13
14
15
int LED = 13;
16
int CTI = 2;
17
int SicherungLuke = 7;
18
int SicherungFahrer = 8;
19
#include <Servo.h> 
20
 
21
Servo Luke;  // create servo object to control a servo
22
Servo Fahrer;  // create servo object to control a servo
23
                // a maximum of eight servo objects can be created 
24
int posL = 0; // variable to store the servo position 
25
int posF = 0; // variable to store the servo position
26
 
27
void setup() {
28
  // initialize the LED pin as an output:
29
  pinMode(LED, OUTPUT);      
30
  // initialize the pushbutton pin as an input:
31
  pinMode(CTI, INPUT);    
32
  pinMode(SicherungLuke, INPUT);
33
  pinMode(SicherungFahrer, INPUT);  
34
  Luke.attach(9);  // attaches the servo on pin 9 to the servo object
35
  Fahrer.attach(6);  // attaches the servo on pin 10 to the servo object
36
}
37
38
void loop(){
39
  
40
  if (digitalRead(CTI) == HIGH) {     //prüft Signal von CTI-Modul
41
      digitalWrite(LED, HIGH);         // turn the LED on
42
      for(posL = 0; posL < 100; posL += 1)  // goes from X degrees to Y degrees 
43
                                    // in steps of 1 degree 
44
    Luke.write(posL);              // tell servo to go to position in variable 'posL' 
45
    delay(30);
46
47
       if (digitalRead(SicherungLuke) == HIGH) {
48
         for(posF = 0; posF < 100; posF += 1) // goes from X degrees to Y degrees
49
                                     // in steps of 1 degree 
50
         Fahrer.write(posF);
51
         delay(30);                  // tell servo to go to position in variable 'posF' 
52
        
53
       } 
54
    }
55
    else {
56
     digitalWrite(LED, LOW);         // turn the LED off
57
     for(posF = 100; posF >= 20; posF -= 1)     // goes from X degrees to Y degrees 
58
                                 
59
    Fahrer.write(posF);              // tell servo to go to position in variable 'posF' 
60
    delay(30);
61
62
       if (digitalRead(SicherungFahrer) == HIGH) {
63
         for(posL = 100; posL >= 20; posL -= 1) // goes from X degrees to Y degrees
64
                                     // in steps of 1 degree 
65
         Fahrer.write(posL);        // tell servo to go to position in variable 'posL'
66
         delay(30);              
67
    
68
       }
69
  }
70
}


Ich würde mich sehr über eure Hilfe freuen!
Lg,
Alex

von Karl H. (kbuchegg)


Lesenswert?

Alex schrieb:

> Beim Funktionstest zeigte sich, dass ein Servo beim Start eine Position
> ein nimmt und der andere macht einfach irgendetwas.

Dann würde ich halt das Servo hier
1
void setup() {
2
...
3
4
  Luke.attach(9);  // attaches the servo on pin 9 to the servo object
5
  Fahrer.attach(6);  // attaches the servo on pin 10 to the servo object
einfach mal in eine gesichere Position fahren. Dann gibt es das erst mal 
nicht, dass die Servos nach dem Einschalten irgendwas machen. Für 
sinnvolle Anfangsbedingungen zu sorgen hat noch nie geschadet. Vor allen 
Dingen dann nicht, wenn in deiner loop() die Servos nur unter bestimmten 
Bedingungen neue Positionen bekommen und deine Programmierung noch am 
Anfang steht, so dasss du nicht sicher weisst, ob die Servos jemals 
überhaupt angesprochen werden.


Dass Servos 'Schweine' sein können und dir die Stromversorgung soweit 
versauen können, dass dein µC einfach dauernd abschmiert, weisst du und 
hast entsprechende Vorkehrungen getroffen bzw. dich dagegen soweit 
abgesichert, dass du diesen Fall erkennen kannst?

Es schadet zumindest nichts, wenn man in setup() mal eine LED testweise 
einschaltet und 1 Sekunde danach wieder ausschaltet. Es geht nur darum, 
Abstürze des Arduino sicher erkennen zu können.

von Alex (Gast)


Lesenswert?

Hallo Karl Heinz,

danke für deine schnelle Antwort!
Wie würdest du den Servos die Position am Anfang am besten sagen?
Den Wert posF und posL habe ich schon berücksichtigt.

Die Servos werden im Testaufbau durch ein Netzgerät versorgt und GND 
wurde mit dem Arduino verbunden.

von Karl H. (kbuchegg)


Lesenswert?

Alex schrieb:
> Hallo Karl Heinz,
>
> danke für deine schnelle Antwort!
> Wie würdest du den Servos die Position am Anfang am besten sagen?

Na du bist ja lustig.

Was hindert dich denn zb an
1
void setup() {
2
...
3
4
  Luke.attach(9);  // attaches the servo on pin 9 to the servo object
5
  Fahrer.attach(6);  // attaches the servo on pin 10 to the servo object
6
7
  Luke.write( 0 );
8
  Fahrer.write( 0 );
9
}
(oder irgendein anderer, in deiner Aufgabenstellung sinnvoller Wert)

> Den Wert posF und posL habe ich schon berücksichtigt.

Abgesehen davon.
Ist dir klar, dass ein Digitaleingang nur entweder Low oder High sein 
kann. Und zwar statisch Low oder High! D.h. wenn der Eingang High ist, 
dann werden deine Servos immer wieder die programmierten Wege abfahren. 
Ständig. Weil eben zb 2 Stunden lang der Eingag auf High (oder Low) ist. 
Bist du sicher, dass das das ist, was du willst?
Denn normalerweise will man ja nur einmalig, nach dem Umschalten eines 
Schalters (oder Tasters) einmalig eine bestimmte Bewegung ausführen. Wie 
zb ein paar Lüftungsklappen auf oder zu fahren. Die sollen ja nicht 
dauernd die auf/zu Bewegung machen, wenn der Schalter in einer 
bestimmten Position steht.

> Die Servos werden im Testaufbau durch ein Netzgerät versorgt

Das muss nicht viel heissen.

Bei Servos würde ich mir IMMER in setup() was reinprogrammieren, so dass 
ich Abstürze des Arduino erkennen kann. Und sei es nur eine LED die 2 
mal blinkt.

von Karl H. (kbuchegg)


Lesenswert?

Auch noch gesehen..
Deine Loop bestehzt im wesentlichen aus 2 Teilen
1
void loop(){
2
  
3
  if (digitalRead(CTI) == HIGH) {     //prüft Signal von CTI-Modul
4
5
    ... Teil 1 ...
6
7
  }
8
9
  else {
10
    ... Teil 2 ...
11
  }
12
}

Was seltsam ist:
Im Teil 1 schickst du beide Servos, Luke und Fahrer an neue Positionen.
Im Teil 2 kommt aber das Servo 'Luke' überhaupt nicht mehr vor.

?
Ist das Absicht?


Abgesehen davon.
Das ist auch komisch
1
      for(posL = 0; posL < 100; posL += 1)  // goes from X degrees to Y degrees 
2
                                    // in steps of 1 degree 
3
    Luke.write(posL);              // tell servo to go to position in variable 'posL' 
4
    delay(30);

welchen Sinn soll es haben, ein Servo in Etappen an eine neue Position 
zu schicken. Das geht so schnell, dass das Servo die Bewegung sowieso 
nicht so schnell realisieren kann. Wenn du also anstelle der Schleife 
mit den Positionen ganz einfach

1
    Luke.write( 99 );
2
    delay(30);

schreibst, dann hat das effektiv genau den gleichen Effekt. Nur ist es 
viel simpler.

: Bearbeitet durch User
von Alex (Gast)


Lesenswert?

Ok,
ich glaueb ich habe mich da ein Bisschen von verschiedenen Programmen in 
die Irre führen lassen.
Ich werde mich morgen nochmal hin setzten und berichten. ;)
Danke fürs Erste!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.