Forum: Mikrocontroller und Digitale Elektronik Motoransteuerung mit Servo-Bibliothek


von Carsten L. (weweriza)


Lesenswert?

Hallo zusammen, ich arbeite noch nicht lange mit dem Arduino, wollte 
aber folgendes bewerkstelligen:

Es sollen vier Motoren je nach Stellung von Potentiometern links/rechts 
drehen, oder anhalten. Zur Steuerung der Motoren nutze ich die 
Servo-Bibliothek, die Sensoren lese ich mit analogRead() ein.
Da ich die Motoren einen nach dem anderen ansteuern will, habe ich mit 
überlegt mit Variablen zu arbeiten, die je nach Stellung geändert 
werden. Hierfür mal ein kleiner Auszug:
1
//Motor 2 hin und zurück
2
  if (spg[6] < uswB6 && test2O == 0) {
3
    links(2);
4
5
  } else {
6
    halt(2);
7
    test2O = 1;
8
9
  }
10
  if (spg[6] > oswB6 && test2O == 1 && test2U == 0) {
11
    rechts(2);
12
  } else {
13
    halt(2);
14
    test2U = 1;
15
  }
16
17
  //Motor 1 hin und zurück
18
  if (spg[5] < uswB5 && test2U == 1 && test1O == 0) {
19
    links(1);
20
  } else {
21
    halt(1);
22
    test1O = 1;
23
  }
24
  if (spg[5] > oswB5 && test1O == 1 && test1U == 0) {
25
    rechts(1);
26
  } else {
27
    halt(1);
28
    test1U = 1;
29
  }

Hinter rechts(), links() und halt() sind die Bewegungen hinterlegt, die 
im Normalfall auch funktionieren. In den spg-Vektoren befinden sich die 
Potiwerte, in uswB/oswB die Schwellwerte bei denen der Motor nicht 
weiterdrehen soll. Die Testvariablen sollen dafür da sein, das sich ein 
Motor nach dem anderen bewegt, allerdings läuft das so nicht.
Wenn ich das Programm so lade, bewegt sich gar nichts. Sobald ich hinter 
dem links() und rechts() ein delay einfüge, bewegen sich die Motoren in 
diesen Schritten. Ich verstehe aber gar nicht warum es ein delay 
benötigt, normalerweise sollte er doch im ersten Schritt nach links 
laufen, und sobald der Spannungswert erreicht wird erst anhalten.
Oder ist dies mit den Variablen so gar nicht möglich?

Gruß

von Wusel D. (stefanfrings_de)


Lesenswert?

Dieses Stück Code sagt mir gar nichts. Daran kann ich nicht erkennen, 
wie die Variablen definiert sind, wie sie gesetzt werden und wozu sie 
gedacht sind.

Warum probierst Du es nicht einfach aus?

von Carsten L. (weweriza)


Lesenswert?

Habe ich doch probiert, wie gesagt funktioniert es so nicht.
Die test-variablen sind int und am Anfang alle 0. Sie sollen sich ja 
erst ändern wenn bestimmte Poti-Werte erreicht sind. Im ersten Block zum 
Beispiel sobald der Poti-Wert erreicht ist, wird test2O = 1 gesetzt, 
damit der Motor sich nicht weiter links dreht. Deswegen ja das if 
(test2O == 0). Nach dem Anhalten des Motors wird diese auf 1 gesetzt. 
Die Variablen sollen lediglich dazu dienen, das ein Motor nach dem 
anderen vor- und zurückgedreht wird.

von Karl H. (kbuchegg)


Lesenswert?

Carsten L. schrieb:
> Habe ich doch probiert, wie gesagt funktioniert es so nicht.

Dann musst du rauskriegen warum.
Mit dem Codeausschnitt und dem Nichtwissen, was genau sich hinter 
rechts(), links(), halt() verbirgt, kann man dir hier nicht wirklich 
weiterhelfen.

Aber deine ganzen test2O, test2U und wie so noch alle heissen, kommen 
mir nicht koscher vor.

Mach dir eine Struktur für jeden Motor, in der du festhältst, welches 
der anzufahrende Wert ist, welches der aktuelle Wert vom Poti ist und 
dann mach dir eine Funktion, die aufgrund dessen bestimmt, ob der Motor 
nach rechts, nach links oder stoppen soll. Dazu brauchst du diese ganze 
testXXX Variablen nicht.

Und darüber kommt dann die nächste Software-Schicht, die ganz einfach 
deiner Motorsteuerung Zielvorgaben für die anzufahrende Position macht.

Software wird in Schichten aufgebaut. Vermanscht man die einzelnen 
Schichten, dann erleidet man gerade als Neuling schnell Schiffbruch.

von Carsten L. (weweriza)


Lesenswert?

Hinter links(), rechts() und halt() verbergen sich lediglich die 
Ansteuerungsbefehle für die Motoren aus der Servo-Bibliothek. Da es 4 
Motoren sind, wird mit dem Übergabewert von 0-3 jeweils einer der 
Motoren angesteuert. Die Motorauswahl wird in einer kleinen Switch-Case 
Anweisung realisiert.
Das ist aber auch nicht weiter relevant, das funktioniert ja alles 
soweit. Ich habe einzelene Funktionen zum Anfahren der Motoren und 
Auslesen der Spannungswerte, diese versuche ich bestmöglich zu 
verbinden.
Mit dem anzufahrenden Wert ist das so ein Problem, da ich zwar die 
Servo-Bibliothek nutze, es aber BLDC Motoren sind. Ich stelle also 
lediglich die Geschwindigkeit ein, bzw ob ein Links- oder Rechtslauf 
durchgeführt wird. Ist zwar kein wirkliches Problem, aber da hinter den 
Motoren eine Mechanik hängt, die beim Übersteuern kaputt gehen kann, ist 
es besser die Werte richtig auszulesen.
Das funktioniert aber auch, das Problem ist ja eher das die Motoren ohne 
ein Delay gar nicht erst anlaufen.

Danke aber schonmal für die Tipps. Ich werde versuchen die Ansteuerung 
nun noch einmal anders zu realisieren, das mit den Testvariablen werde 
ich da außen vorlassen.

von Karl H. (kbuchegg)


Lesenswert?

Carsten L. schrieb:

Fang damit an, diesen Unsinn ....

> //Motor 2 hin und zurück
>   if (spg[6] < uswB6 && test2O == 0) {
>     links(2);
>
>   } else {
>     halt(2);
>     test2O = 1;
>
>   }
>   if (spg[6] > oswB6 && test2O == 1 && test2U == 0) {
>     rechts(2);
>   } else {
>     halt(2);
>     test2U = 1;
>   }

... aufzulösen.
Und gewöhn dich daran, dass es ein else gibt.


   if( spg[6] < uswB6 )
     links( 2 );
   else if( spg[6] > oswB6 )
     rechts( 2 );
   else
     halt( 2 );


Und was immer deine test2U, test2O eigentlichg machen sollen (das ist 
nämlich ziemlich unverständlich in deinem Code), das machst du losgelöst 
von dieser 'Regelung'.

von Carsten L. (weweriza)


Lesenswert?

Das mit dem else if funktioniert aber auch nur, wenn man die Variablen 
ignoriert, was ich zu diesem Zeitpunkt ja noch nicht gemacht habe. Mir 
ist schon bewusst das es else if gibt, benutze es auch an anderen 
Stellen, aber hier war es aufgrund der Variablen losgelöst nicht so 
einfach möglich.

Ihr habt aber schon recht, das mit den Variablen schmeiss ich raus. Ich 
versuche aber trotzdem nochmal kurz den Sinn zu erklären, den ich da gut 
hinter versteckt habe.
Es geht darum das die Motoren etwas bewegen, diese Bewegungen wollte ich 
nur dann möglich machen, wenn bestimmte Bewegungen schon durchgeführt 
wurden. Deswegen wurden, sobald eine Bewegung fertig war, eine Variable 
gesetzt. Dies sollte dazu dienen, dass die nächste Bewegung ausgeführt 
werden kann/darf, und die derzeitige nicht nocheinmal ausgeführt wird. 
Deswegen in der if-Abfrage das Abfragen der Variablen.
Das kam mir vor dem Wochenende noch ziemlich sinnig vor, mittlerweile 
habe ich das aber auch verworfen.

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.