Motoransteuerung mit Servo-Bibliothek

OP #2956988
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ß
OP #2957043
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.
#2957077
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.
OP #2960263
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.
#2960325
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'.
OP #2960395
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren