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ß
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?
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.
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.
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.
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'.
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.
|