PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : sainsmart-car mit omni wheels



inka
26.01.2020, 12:53
hallo allerseits,

ich war nicht sicher ob ich ein neues thema aufmachen soll, aber es passt eigentlich nirgends zu den momentan laufenden themen dazu. Ich habe (schon 2017) dieses hier gekauft:

sainsmart-car (https://www.sainsmart.com/products/sainsmart-mobile-car-kit-sensor-shield-v5-4wd-mobile-platform-dual-h-bridge-stepper-motor-driver) und den motor-treiber V1 (https://www.sainsmart.com/products/l293d-motor-drive-shield-for-arduino).

Zunächst waren die TT-motoren drin, die habe ich dann durch diese schrittmotoren (https://www.ebay.de/itm/Schrittmotor-Stepper-Motor-28BYJ-48-5V-Treiberplatine-ULN2003-Arduino-/172486314109) ersetzt. Es lief ganz gut, irgendwann mal habe ich die TT-motoren wieder eingebaut, war aber mit der geschichte nicht so ganz zufrieden...

Jetzt habe ich das gerät aus dem selbstgedruckten frischaltebeutel (hallo Moppi :-) ) - nach dem ich die staubschicht enfernt habe - wieder reaktiviert. Der wesentlicher grund dafür war eine falschlieferung. Die chinesen haben mir statt der omniwheels 100mm auf die ich händereibend für den outdoor warte, die mit 60mm durchmesser geliefert. Darf ich behalten, geld wird zurückgezahlt. Kulant sind die, auch wenn teilweise seehhhr langsam...

Vier adapter für die räder gedruckt (herrlich dass man sowas machen kann) und so sieht das gerät nun aus:

34764 34765 34766 34767

jetzt bin ich aber wieder so weit wie schon 2017. Die ansteuerung der motoren über die sainsmart lib lässt zu wünschen übrig. Mit solchen funktionen:

void zehn_ms_links_schieben(void)
{
currentMillis = millis();

if (currentMillis - previousMillis > dauer_fahrt)
{

// Serial.println("10ms links schieben");
motor_hl->setSpeed(s_speed);
motor_hr->setSpeed(s_speed);
motor_vr->setSpeed(s_speed);
motor_vl->setSpeed(s_speed);

motor_hl->run(FORWARD);
motor_hr->run(BACKWARD);
motor_vr->run(FORWARD);
motor_vl->run(BACKWARD);

dauer_fahrt = 10;

}
}
kann man zwar kurze sequenzen machen, einen gleichmässigen lauf bekomme ich z.b. nicht hin...

@Rabenauge @Moppi: wie mach ihr das? Mit lib? Ohne Lib? Mit sonst noch was?

EDIT: ich habe jetzt den motortreiber V2 (https://learn.adafruit.com/adafruit-motor-shield-v2-for-arduino/overview) eingebaut

Moppi
26.01.2020, 14:07
Hallo Inka,

schön, dass Du wieder da bist! :)
Das mit dem selbstgedruckten Frischhaltebeutel, finde ich noch immer sehr originell ;)

Wegen der Frage:
Ich nehme nie Bibliotheken, wenn ich die nicht brauche. Also im Grunde für alles Einfache keine Lib.

Aber trotzdem noch mal nachgefragt, hast Du jetzt wieder die TT-Motoren (also Getriebe) eingebaut?
Und warum läuft das nicht gleichmäßig?

Was ich herausgefunden habe ist, die beste Variante, wie ich finde:

1. Die Motorspannung für die TT-Getriebemotoren auf ein Maximum einstellen (Max. Geschwindigkeit), das können 6V sein oder 4.5V, je nach Gewicht.
2. Das PWM-Signal möglichst hoch im Wert zu verwenden. Also eben dann 1023 für MAX-Speed. Dann liegt die volle Spannung an (unzerhackt) und die Motoren haben genug Drehmoment, um das Gefährt anzuschieben.
3. Zum Fahren dann das PWM-Signal herunterregeln, je nachdem, welcher Motor zu schnell läuft. S. Gabelleichtschranke + Lochscheibe an den TT-Getrieben.

Weiter bin ich damit noch nicht.
Wir waren aber schon so weit, dass klar war, dass diese TT-Getriebe nicht gleichmäßig drehen und eben nachgeregelt werden müssen.
Bei den DC-Motoren geht die Geschwindigkeit eben mit steigender Spannung einher. So muss für langsame Fahrt die Spannung herunter geregelt werden. Dann wird so ein Motor aber schwächer. Es kann also passieren, dass ein Motor viel langsamer dreht, als der andere Motor. Also müssen die immer kontrolliert werden und die Spannung nachgeregelt, dass die wieder gleich schnell drehen. Bei vier Motoren ist es nicht anders. Wenn man das ordentlich hinbekommt, funktioniert das auch gut.


MfG

inka
26.01.2020, 15:20
Aber trotzdem noch mal nachgefragt, hast Du jetzt wieder die TT-Motoren (also Getriebe) eingebaut?
ja


Und warum läuft das nicht gleichmäßig?
wenn ich das wüsste...

hier der sehr einfacher:


#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"


Adafruit_MotorShield AFMS = Adafruit_MotorShield();

Adafruit_DCMotor *motor_hl = AFMS.getMotor(1);
Adafruit_DCMotor *motor_hr = AFMS.getMotor(2);
Adafruit_DCMotor *motor_vr = AFMS.getMotor(3);
Adafruit_DCMotor *motor_vl = AFMS.getMotor(4);


void setup()
{
Serial.begin(115200);

AFMS.begin();

// turn on motor
motor_hl->run(RELEASE);
motor_hr->run(RELEASE);
motor_vr->run(RELEASE);
motor_vl->run(RELEASE);

}

void loop()
{

alle_motoren_vorwaerts();

}

void alle_motoren_vorwaerts (void)
{

motor_hl->setSpeed(150);
motor_hr->setSpeed(150);
motor_vr->setSpeed(150);
motor_vl->setSpeed(150);

motor_hl->run(FORWARD);
motor_hr->run(FORWARD);
motor_vr->run(FORWARD);
motor_vl->run(FORWARD);

}



die ersten 5 sekunden ist alles ok, dann fangen - ohne einen erkennbaren grund - die beiden hinteren motoren zu "stottern". Habe dazu ein video (https://youtu.be/W77aWdGt9sQ) gedreht

Moppi
26.01.2020, 15:43
Könnte an dem Treiberboard liegen. Vielleicht ist das überlastet? Oder hat einen Defekt.
Mehr kann ich dazu nicht sagen, weil ich nicht weiß, wie die Treiber genau angesteuert werden. Das passiert alles in dieser Lib.
Genügend Leistung hat das Board jedenfalls, daran sollte es nicht liegen.

Auf dem Board sind/ist L293D drauf. Kannst ja mal fühlen, ob die warm/heiß werden, wenn die Motoren aussetzen.
Die L293D steuern ja wiederum TB6612 MOSFETs an, wenn ich das richtig gelesen habe.


MfG

inka
26.01.2020, 16:58
Auf dem Board sind/ist L293D drauf. Kannst ja mal fühlen, ob die warm/heiß werden, wenn die Motoren aussetzen.
Die L293D steuern ja wiederum TB6612 MOSFETs an, wenn ich das richtig gelesen habe.
die TB6612 werden beide warm, der einer zu den vorderen motoren, da kann man den finger drauf lassen, auf dem anderen nicht. Also defekt...

Moppi
26.01.2020, 17:26
Lt. Datenblatt schalten die ab, wenn die zu heiß werden. Das könnte das Aussetzen erklären. Defekt vielleicht noch nicht. Aber einer von den ICs wird sehr heiß. Ich würde die Verkabelung prüfen, ob irgendwo ein Kabel - aus Versehen - quer hängt und Kurzschluss verursacht (Platinenunterseite evtl. oder sonst wo). Sind alle Kabel fest in den Klemmen verschraubt? Sind die Klemmen alle eingelötet oder ist eine Klemme auf der Platine lose? Die Schraubklemmen kann man u.U. nachlöten, manchmal sind solche Klemmen auch nicht sauber verlötet. Es muss einen Grund haben, warum ein IC zu heiß wird. Auch die Lötpunkte anschauen, ob irgendwo Zinn quer hängt und evtl. eine Brücke bildet. Und man könnte, wenn dieser Fehler mal behoben ist, auch noch Kühlkörper drauf setzen, wegen dem Abschalten, bei Überhitzung.


MfG

- - - Aktualisiert - - -

Vielleicht ist es auch ein Motor, der ständig zu viel Strom zieht. Kabel alle richtig angelötet (Kurzschluss über Motorgehäuse ausschließen). Motoren mal abklemmen und einzeln anschließen. Vielleicht findest Du so heraus, welcher Probleme macht (vielleicht wird ein Motor auch warm).

inka
26.01.2020, 17:37
damals, 2017, gab es diese probleme nicht, jetzt beim einsetzen der neuen akkus kann sich an den anschlüssen tief drinnen in dem ganzen was halb gelöst haben...
Also morgen aufmachen. Das ist bei mir immer so wie bei den chirurgen eine OP am offenen herzen. Freue mich schon drauf :-)

Moppi
26.01.2020, 18:51
Ich habe diese Gefährte letztens auch irgendwo gesehen. Schlecht sind die nicht - so vom Erscheinungsbild.

Aber ich muss mal sagen, dass Du ganz schön viele Geräte angeschafft hast. Wieviele Roboter hast Du noch so?

Dann viel Spaß beim Auseinanderbauen!
Ich bin immer froh, wenn etwas zusammen ist und ich es nicht aufmachen muss.


MfG

Rabenauge
26.01.2020, 18:58
Das neuere Motorshield kenne ich nicht.
Das ältere konnte nur max. 600mA, wenn ich mich recht entsinne.
Da hab ich, auf die beiden Treiber, huckepack einfach noch welche raufgelötet (den Tip hatte ich irgendwo bekommen)- das verdoppelt die Leistung.

Und nö: so einfache Sachen wie ne Motoransteuerung mache ich ohne Bibliothek- man weiss nie ganz genau, was die im Hintergrund treiben.
Und: da kommt sich auch schnell mal was in die Quere- die eine Bibliothek schnappt sich nen Interrupt, den ich eigentlich wo anders brauche, oder ähnliche Überraschungen.
Da halt ich es wie Moppi: nur das, was mir zu kompliziert wird (beispielsweise WS 2812-RGB-LED-Streifen).
Im XPlorer hab ich genau diese eine Geschichte mit ner Bibliothek gemacht (FastLED)- alles andere zu Fuss.

inka
27.01.2020, 10:10
Ich habe diese Gefährte letztens auch irgendwo gesehen. Schlecht sind die nicht - so vom Erscheinungsbild. Dann viel Spaß beim Auseinanderbauen!

das gehäuse ist nicht schlecht, allerdings habe ich als erstes die gewinde im 1,5mm alu(!) durch setzmuttern aus V2A ersetzt, sonst wäre es heute nur noch schrott - wegen dauernd auseinander nehmen :-)

Ich versuche es aber erstmal mit einem kühlkörper, manchmal muss man den weg des geringeren widerstandes gehen - ich hab einfach schiss, dass da noch mehr kaputtgeht...

@Rabenauge:

Das neuere Motorshield kenne ich nicht. Das ältere konnte nur max. 600mA, wenn ich mich recht entsinne. Da hab ich, auf die beiden Treiber, huckepack einfach noch welche raufgelötet (den Tip hatte ich irgendwo bekommen)- das verdoppelt die Leistung.

Du meinst bestimmt diese abenteuerliche konstruktion:
34771

Rabenauge
27.01.2020, 15:13
Cooles Konstrukt!

Ich hab keinen Kühlkörper raufgemacht, das war nicht nötig (keine Ahnung mehr, wofür ich das Ding das letzte mal verwendet hatte, ist ewig her-> ich mag Shields nicht).
Das mit den aufgedoppelten Treibern sieht aber tatsächlich so aus- und funktioniert super.

inka
27.01.2020, 15:25
Lt. Datenblatt schalten die ab, wenn die zu heiß werden. Das könnte das Aussetzen erklären. Defekt vielleicht noch nicht..... Und man könnte, wenn dieser Fehler mal behoben ist, auch noch Kühlkörper drauf setzen, wegen dem Abschalten, bei Überhitzung.
habe beim aufmachen keinen fehler finden können, aber mit aufgesetzten kühlkörper
34775
geht es einwandfrei, also ohne aussetzer. Ein bischen musste ich noch die maximale geschwindigkeit reduzieren. Aber es ist ja auch kein RC-flitzer...

EDIT:
hier ein video (https://youtu.be/NIYWfLHYADA)... ich bin von der omni wheels einfach begeistert!

Und jetzt geht's an die encoder, im moment wird die dauer der bewegungen alleine über die zeit gesteuert...

Moppi
28.01.2020, 13:53
Ganz schön groß. Mit den Rädern drinnen gut unterwegs. Das gibt einen super Staubsaugerchassis ab. :) Die Bewegungen sind schon so.


MfG

inka
28.01.2020, 15:45
Ganz schön groß. Mit den Rädern drinnen gut unterwegs. Das gibt einen super Staubsaugerchassis ab. :) Die Bewegungen sind schon so.
meinst Du jetzt den roboter oder den kühlkörper? :-)

btw: mein roboterstaubsauger ist gemütlicher unterwegs :-)

aber was anderes, zu den encodern. Du verwendest doch auch die von den TT-motoren:

ich kann alle vier abfragen, sie funktionieren also alle. Um sie nutzen zu können, braucht man ja für eine auf den momentanen stand aufbauenden aktion den momentanen wert, oder sie müssen zu dem zeitpunkt auf "0" gesetzt werden, bevor bei einem bestimmten wert diese eine aktion dann ausgeführt wird. Ein stopp z.b. Wie machst Du das?
- 0-wert, oder
- den momentanen stand abfragen?

Moppi
28.01.2020, 16:26
meinst Du jetzt den roboter oder den kühlkörper? :-)


Sorry, ich bezog mich auf das Video.

TT-Motoren:

Ich benutze diese Lochscheiben, die dabei waren.
Wie mach ich das? - Ich benutze eine Gabellichtschranke, wo die Lochscheibe drin dreht.
Ich habe aber ein Oszi dran gehängt. Das sind sehr schöne Rechtecksignale, die meine Lichtschranke liefert. Je langsamer die Lochscheibe läuft, desto länger werden die Impulse (LOW wird länger und HIGH wird ebenfalls länger). An dieser Länge kann man also th. die Geschwindigkeit berechnen bzw. ablesen. Manche Leute versuchen die Impulse zu zählen, finde ich aber unpraktisch, weil man über eine längere Zeit zählen muss und keinen Impuls verlieren darf.


MfG

021aet04
28.01.2020, 16:49
Man zählt die Impulse (also z.B. steigende Flanke) mit einem Interrupt oder gibt diesen auf einen Timer/Counter Anschluss. Dann wird automatisch gezählt.

Ich würde aber mit einem INT die Impulse zählen und mittels Timer dann den Zählwert auslesen und auf 0 stellen.

MfG Hannes

inka
30.01.2020, 17:10
ich spiel jetzt einfach mal ein bischen mit dem teil und versuche das er sich so bewegt, wie ich's will. Was ich nicht verstehe ist folgendes:

bei diesem
void zehn_ms_rechts_rotieren(void)
{
currentMillis = millis();
servo_mitte();
if (currentMillis - previousMillis > dauer_fahrt)
{

Serial.println("zehn ms rechts rotieren");
motor_hl->setSpeed(s_speed);
motor_hr->setSpeed(s_speed+1);
motor_vr->setSpeed(s_speed+1);
motor_vl->setSpeed(s_speed);

motor_hl->run(FORWARD);
motor_hr->run(BACKWARD);
motor_vr->run(BACKWARD);
motor_vl->run(FORWARD);

dauer_fahrt = 10;

}
}


void halbe_sec_rechts_rotieren(void)
{
currentMillis = millis();
servo_mitte();
if (currentMillis - previousMillis > dauer_fahrt)
{

Serial.println("halbe sec rechts rotieren");
motor_hl->setSpeed(s_speed);
motor_hr->setSpeed(s_speed+1);
motor_vr->setSpeed(s_speed+1);
motor_vl->setSpeed(s_speed);

motor_hl->run(FORWARD);
motor_hr->run(BACKWARD);
motor_vr->run(BACKWARD);
motor_vl->run(FORWARD);

dauer_fahrt = 500;

}
}

void zwei_sec_rechts_rotieren(void)
{
currentMillis = millis();
servo_mitte();
if (currentMillis - previousMillis > dauer_fahrt)
{

Serial.println("zwei sec rechts rotieren");
motor_hl->setSpeed(s_speed);
motor_hr->setSpeed(s_speed+1);
motor_vr->setSpeed(s_speed+1);
motor_vl->setSpeed(s_speed);

motor_hl->run(FORWARD);
motor_hr->run(BACKWARD);
motor_vr->run(BACKWARD);
motor_vl->run(FORWARD);

dauer_fahrt = 2000;

}
}
wobei die richtungsangaben hier nur als beispiel zu sehen sind. Aufgerufen wird das hiermit:

zwei_sec_links_rotieren();
delay(500);
zwei_sec_links_schieben();
delay(500);
zwei_sec_rueckwaerts();
delay(500);
zwei_sec_rechts_schieben();
delay(500);
zwei_sec_vorwaerts();
delay(500);

encoder_auslesen();
Serial.println(out_s);

was mich wundert ist, dass die einzelnen bewegungen, egal ob ich nun 10ms, eine halbe sekunde, oder 2 sec wähle fast gleich lang dauern. Hängt das womöglich mit den ganzen servo und printbefehlen in den funktionen zusammen?

Rabenauge
30.01.2020, 17:56
Wenn du das _so_ lösen willst, wirst du eher ne while()-Schleife brauchen.
Der prüft in deinem Beispiel einmal, ob die Bedingung wahr ist, schaltet dann die Motoren kurz entsprechend und ist aus der Schleife wieder raus.
Vermutlich sorgt dann dein delay(500) im anderen Programmteil dafür, dass die halt ne halbe Sekunde lang so bleiben, wie sie eingeschalten wurden.


Allerdings frage ich mich, wieso du die Motoren zeitgesteuert handlen willst- warum nicht Ereignisgesteuert?
Du hast doch Drehgeber- damit wird es wesentlich einfacher, z.B. Fahrwege zu berechnen, oder auch Kurvenradien.
Zeitgesteuert wird das nie was...

inka
31.01.2020, 15:33
das mit der ereignissteuerung ist noch in der mache...
Dieser

void halbe_sec_vorwaerts(void)
{
currentMillis = millis();

if (currentMillis - previousMillis > dauer_fahrt)
{
Serial.println("halbe sec vorwärts");
motor_hl->setSpeed(s_speed);
motor_hr->setSpeed(s_speed+1);
motor_vr->setSpeed(s_speed+1);
motor_vl->setSpeed(s_speed);

motor_hl->run(FORWARD);
motor_hr->run(FORWARD);
motor_vr->run(FORWARD);
motor_vl->run(FORWARD);
dauer_fahrt = 500;

}
}
sorgt doch dafür, dass die motoren für (hier) eine halbe sekunde mit der hier vorgegebenen geschwindigkeit und richtung eingeschaltet werden und bleiben. Also dass der roboter 30sec in eine bestimmte richtung fährt, während er auch was anderes machen kann...
Oder habe ich da wieder mal was missverstanden?
die delay alternative machte das zumindest, allerdings blockierend, was ich ja nicht will...

Moppi
31.01.2020, 16:46
Hallo,

Wenn ich es richtig sehe, hast Du schon den richtigen Ansatz genommen.
Hier so ein ähnlicher:

1. Du erstellst eine Variable zum Zählen: count oder delay
2. Du durchläufst den Code ohne die Standrad-Delay-Funktion aufzurufen.
3. Am Anfang von loop() ermittelst Du die verstrichene Zeit, dafür gibt es z.B.: millis()
4. aus diesem Miilis()-Wert und dem Letzten ermittelst Du, durch Subtraktion, die Differenz.
5. In einer Schleife kannst Du deine Zählervariable herunterzählen, solang diese (und die berechnete Differenz der Millis) noch größer "0" ist.
6. Wenn Deine Zählervariable "0" erreicht hat, führst Du die Aktion aus.

Alternative für Schritt 5: statt die Zählervariable per Schleife herunter zu zählen, kannst Du auch eine schnellere Variante, mit Subtraktion, wählen.
Wenn also der Wert der Zählervariable größer ist, als die o.g. berechnete Differenz, ziehst Du die Differenz von der Zählervariable ab und fertig.
Wenn der Wert der Zählervariable kleiner ist, als die Differenz, setzt Du die Zählervariable auf "0" und bist ebenfalls fertig.

Dein Ansatz funktioniert auch.

MfG

- - - Aktualisiert - - -

Ich glaube, da ist noch ein Fehler. Du willst, dass die Schleife eine bestimmte Zeit durchlaufen wird und dann nicht mehr. Das müsste dann eigentlich wie folgt aussehen.




dauer_fahrt = 500;

if (currentMillis - previousMillis < dauer_fahrt) {
Serial.println("halbe sec vorwärts");
motor_hl->setSpeed(s_speed);
motor_hr->setSpeed(s_speed+1);
motor_vr->setSpeed(s_speed+1);
motor_vl->setSpeed(s_speed);
motor_hl->run(FORWARD);
motor_hr->run(FORWARD);
motor_vr->run(FORWARD);
motor_vl->run(FORWARD);
}

inka
01.02.2020, 15:40
ich weiss nicht ob das herausnehmen der angabe der fahrtdauer aus der "millis-schleife" das problem löst:

void zwei_sec_links_rotieren(void)
{
currentMillis = millis();
dauer_fahrt = 2000;

if (currentMillis - previousMillis > dauer_fahrt)
{

Serial.println("zwei sec links rotieren");
motor_hl->setSpeed(s_speed);
motor_hr->setSpeed(s_speed + 1);
motor_vr->setSpeed(s_speed + 1);
motor_vl->setSpeed(s_speed);

motor_hl->run(BACKWARD);
motor_hr->run(FORWARD);
motor_vr->run(FORWARD);
motor_vl->run(BACKWARD);

}
}
der code wird in der loop so aufgerufen:

zwei_sec_links_rotieren();
delay(500);
alle_motoren_halt();
und die räder drehen eine halbe sekunde und nicht zwei. Ich verstehe es nicht, in anderen beispielen funktioniert es so mit den millis...

Moppi
01.02.2020, 16:52
Die halbe Sekunde kommt wohl von "delay(500);"

Das mit dem Code haut so nicht hin. Der muss anders gestaltet werden. Du willst doch "delay" raus haben.

Zuerst startest Du die Motoren.
Dann wartest Du in "loop()", bis 2 Sekunden um sind.
Dann stoppst Du die Motoren.

Die Funktion "void zwei_sec_links_rotieren(void)" ist von der Namensgabe her schon so nicht brauchbar, weil sie was falsches vermittelt, was Du dann vermutlich innerhalb der Funktion umzusetzen versuchst, weil ja sonst die Logik nicht zum Namen der Funktion passt.

Also mal anders denken, hier ein Beispiel:

Was brauchst Du für Funktionen?



void links_rotieren(void){

motor_hl->setSpeed(s_speed);
motor_hr->setSpeed(s_speed + 1);
motor_vr->setSpeed(s_speed + 1);
motor_vl->setSpeed(s_speed);


motor_hl->run(BACKWARD);
motor_hr->run(FORWARD);
motor_vr->run(FORWARD);
motor_vl->run(BACKWARD);
}


void alle_motoren_halt(void){

...


}


Welche Variablen außerhalb von "loop()" brauchst Du?



int status = 0;
unsigned long previousMillis, currentMillis, dauer_fahrt;



Wie in "loop()" aufrufen?



currentMillis = millis();


if (status == 0) {
status = 1;
previousMillis = currentMillis;
dauer_fahrt = 2000;
links_rotieren();
}


if (status == 1 && (currentMillis - previousMillis) > dauer_fahrt) {
alle_motoren_halt();
}



PS: der Code soll nur am Beispiel zeigen, wie es funktionieren kann.

MfG

inka
02.02.2020, 16:53
Die Funktion "void zwei_sec_links_rotieren(void)" ist von der Namensgabe her schon so nicht brauchbar, weil sie was falsches vermittelt, was Du dann vermutlich innerhalb der Funktion umzusetzen versuchst, weil ja sonst die Logik nicht zum Namen der Funktion passt.
ich kann selbst nicht mehr nachvollziehen von welchem code und wie oft ich diese schnipsel hin und her kopiert habe, bis sie dann endlich nicht mehr funktioniert haben...




int status = 0;
unsigned long previousMillis, currentMillis, dauer_fahrt;

die unsigned long's hatte ich schon global definiert, hier ist es noch die frage nach dem "status". Sollte die variable immer beim aufruf einer der motorfunktionen neu lokal definiert werden, also z. b. "status-drehen-links" , oder auch global und dann jedesmal aufgerufen werden? Kann man es überhaupt so von vorne herein definieren?


der Code soll nur am Beispiel zeigen, wie es funktionieren kann.

tut er auch, danke, für beides, erklärung und codeschnipsel - dann kann man beides gut nachvollziehen...

Moppi
02.02.2020, 17:14
"status". Sollte die variable immer beim aufruf einer der motorfunktionen neu lokal definiert werden, also z. b. "status-drehen-links" , oder auch global und dann jedesmal aufgerufen werden? Kann man es überhaupt so von vorne herein definieren?

Du kannst die "status-drehen-links" nennen, nur die soll global definiert sein. Was meinst Du mit " jedesmal aufgerufen werden"? Diese Variable dient der Auswertung, damit im Programm ermittelt werden kann, was gerade abläuft und dann kann darauf reagiert werden.


MfG

inka
02.02.2020, 17:20
Du kannst die "status-drehen-links" nennen, nur die soll global definiert sein. Was meinst Du mit " jedesmal aufgerufen werden"? Diese Variable dient der Auswertung, damit im Programm ermittelt werden kann, was gerade abläuft und dann kann darauf reagiert werden.
ich meine immer wieder neu lokal definiert werden, nicht aufgerufen werden, sorry

also global definieren, aber für alle möglichen motoraktionen. z.b. "links drehen" oder "rechts drehen" oder "vorwärts"...

Moppi
02.02.2020, 18:50
ich meine immer wieder neu lokal definiert werden, nicht aufgerufen werden, sorry

also global definieren, aber für alle möglichen motoraktionen. z.b. "links drehen" oder "rechts drehen" oder "vorwärts"...

ja, richtig.