Go Down

Topic: Drehscheibe Modellbahn mit RF24 (Read 6429 times) previous topic - next topic

postmaster-ino

Hi

Warum versuchst Du's nicht einfach?
Mehr, als daß Dir der Compiler das XOR um die Ohren haut, kann nicht passieren.
Mein Compiler traut Sich Das aber scheinbar nicht:
Code: [Select]
const byte schritte_max = 48;   //Anzahl an möglichen Anschlußpunkten

byte von;                       //Ausgangsgleis
byte nach;                      //Zielgleis

void setup() {
  // put your setup code here, to run once:
}

void loop() {
  // put your main code here, to run repeatedly:
  von = random(schritte_max) + 1;   //von und bis 'auswürfeln'
  nach = random(schritte_max) + 1;

  Serial.print("Von ");       // Von 1
  Serial.print(von);
  Serial.print(" nach ");     // nach 12
  Serial.println(nach);

  byte schritte_a = abs(von - nach);
  Serial.print("Entfernung ohne 1-");
  Serial.print(schritte_max - 1);
  Serial.print(" Wechsel ");  //Entfernung ohne 1-47 Wechsel 11
  Serial.println(schritte_a);
  byte schritte_b = schritte_max - schritte_a;
  Serial.print("Entfernung mit 1-");
  Serial.print(schritte_max - 1);
  Serial.print(" Wechsel ");   //Entfernung mit 1-47 Wechsel 37
  Serial.println(schritte_b);
  //wenn schritte_a<schritte_b && von<nach, dann 'aufwärts' drehend ... 1->12
  //wenn schritte_a<schritte_b && von>nach, dann 'abwärts' drehend  ... 12->1
  //wenn schritte_a>schritte_b && von<nach, dann 'abwärts' drehend  ... 1->48
  //wenn schritte_a>schritte_b && von>nach, dann 'aufwärts' drehend  ... 48->1
  if (schritte_a) {
    if (schritte_a < schritte_b xor von < nach) { //jedes der Statements kann nur wahr oder falsch sein
      Serial.println("Starte Abwärts");   // wenn nur Eines wahr ist
    } else {
      Serial.println("Starte Aufwärts");  // wenn Keines oder Beide wahr sind
    }
  } else {
    Serial.println("identisches Gleis");
  }
  delay(1000);
}

Ungetestet - das 'xor' lässt sich recht einfach in der Zeile 35 entdecken.

Der Hintergedanke dazu ist, daß sich die Drehrichtung umkehren muß, wenn der Weg 'durch die Null' länger ist, oder (eigentlich exclusives oder) Start und Ziel die Positionen getauscht haben.

KA, ob's so wirklich klappt, sollte aber.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Acki1985

Guten abend,

random heißt doch Zufall oder? Wie soll das mit Zufall denn funktionieren?

postmaster-ino

Hi

Das soll Dir zeigen, ob die Berechnung so passt - wenn hier Patzer erscheinen, sollte dieser Code vll. doch nicht in die endgültige Version Einzug erhalten.

Also:
- Auf einen Arduino brutzeln
- Terminal aufmachen und die Zeilen, Die der Arduino ausspuckt, interpretieren

Dazu gehört auch: Wenn Er IMMER die falsche Richtung wählt, passt Das auch - dann statt XOR == oder die Bedingungen 'durchtauschen'.

MfG

PS: Du darfst auch was selber machen, zumindest das Antesten ... so mit fertigem Code, am Besten noch mit Schleifchen drum herum, tun wir uns hier gelegentlich arg schwer!
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Acki1985

Ich möchte auch keinen fertigen Code. Ich will es ja auch lernen. Ich konnte mir nur nicht vorstellen was der Random Befehl soll. Aber ich habe es begriffen. Mit dem Befehl werden Zusatzzahlen erstellt die dann mit durch xor verglichen werden. Ich danke euch :-)

Tommy56

Mit dem Befehl werden Zusatzzahlen erstellt
Zufallszahlen.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Acki1985

Meinte ich natürlich auch. Hab es übrigens gerade getestet. Das sieht gut aus.

postmaster-ino

;)

Sieht nach Autokorrektur aus.

Durch Zufall (... Pseudo! Sind immer die Gleichen, da ich keinen Seed setze) werden die beteiligten Gleise 'ausgewürfelt', die Formeln werden mit diesen Gleisen durchgerechnet und Du bekommst das Ergebnis ins Terminal.
Hier musst Du 'nur noch' entscheiden, ob die Ergebnisse ok sind, wobei 'Alle falsch' ebenfalls ok ist - dann muß man nur die Abfrage oder die Ansteuerung des Motor umdrehen.

Wenn vereinzelt Ausreißer auftreten, müsste man Diesen nachgehen, wer wo was falsch berechnet.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Acki1985

#97
Jan 17, 2019, 10:18 pm Last Edit: Jan 17, 2019, 10:35 pm by Acki1985
Hab den Code etwas abgeändert, in der Hoffnung das ich das richtig interpretiert habe?

Code: [Select]


const byte schritte_max = 48;   //Anzahl an möglichen Anschlußpunkten

byte von;                       //Ausgangsgleis
byte nach;                      //Zielgleis

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}




void loop() {
  // put your main code here, to run repeatedly:
  von = random(schritte_max) + 1;   //von und bis 'auswürfeln'
  nach = random(schritte_max) + 1;

  Serial.print("Von ");       // Von 1
  Serial.print(von);
  Serial.print(" nach ");     // nach 12
  Serial.println(nach);

  byte schritte_a = abs(von - nach);
  Serial.print("Entfernung links 1-");
  Serial.print(schritte_max - 1);
  Serial.print(" Wechsel ");  //Entfernung ohne 1-47 Wechsel 11
  Serial.println(schritte_a);
  byte schritte_b = schritte_max - schritte_a;
  Serial.print("Entfernung rechts 1-");
  Serial.print(schritte_max - 1);
  Serial.print(" Wechsel ");   //Entfernung mit 1-47 Wechsel 37
  Serial.println(schritte_b);
  //wenn schritte_a<schritte_b && von<nach, dann 'aufwärts' drehend ... 1->12
  //wenn schritte_a<schritte_b && von>nach, dann 'abwärts' drehend  ... 12->1
  //wenn schritte_a>schritte_b && von<nach, dann 'abwärts' drehend  ... 1->48
  //wenn schritte_a>schritte_b && von>nach, dann 'aufwärts' drehend  ... 48->1
  if (schritte_a) {
    if (schritte_a < schritte_b xor von < nach) { //jedes der Statements kann nur wahr oder falsch sein
      Serial.println("Starte links");   // wenn nur Eines wahr ist
    } else {
      Serial.println("Starte rechts");  // wenn Keines oder Beide wahr sind
    }
  } else {
    Serial.println("identisches Gleis");
  }
  delay(1000);
}



Komischerweise kommt dann irgendwann:

Von 4 nach 24
Entfernung links 1-47 Wechsel 20
Entfernung rechts 1-47 Wechsel 28
Starte rechts
?
rechts ist ja richtig aber es sind nur 20 anstatt 28 Schritte??

oder
Von 9 nach 20
Entfernung links 1-47 Wechsel 11
Entfernung rechts 1-47 Wechsel 37
Starte rechts

oder

Von 3 nach 34
Entfernung links 1-47 Wechsel 31
Entfernung rechts 1-47 Wechsel 17
Starte links

oder

Von 37 nach 38
Entfernung links 1-47 Wechsel 1
Entfernung rechts 1-47 Wechsel 47
Starte rechts


Acki1985

#98
Jan 17, 2019, 10:41 pm Last Edit: Jan 17, 2019, 10:42 pm by Acki1985
Ich glaube es ist mein Fehler. Mit Wechsel meinst es geht über 0 zur 47 und ohne Wechsel meinst du es geht nicht über 0. Richtig? Somit ist meine Änderung Käse

postmaster-ino

Hi

Ok, eigentlich sollte 'rechts herum' im Uhrzeigersinn sein - also von 4 nach 24 Rechts:20, Links:28

Störe Dich nicht am eigentlichen Text einer Anzeige, sondern passe Diese so an, daß Die zum Vorhaben stimmt.
Ich habe den Sketch so runtergetippt und geschaut, ob Er kompiliert - on Rechts jetzt wirklich Rechts ist - entscheidest Du.
Hätte auch A und B schreiben können, dann muß man aber IMMER in den Kommentaren schauen, was welche Zeile bedeuten soll.
Passe die Zeilen so an, daß Das bei Dir Sinn ergibt.

Dann bitte drei Beispiele mit von<nach und Drei mit von>nach - wenn in Deiner Ausgabe dann auch noch die Richtung, Die eingeschlagen werden soll, richtig 'geschwätzt' wird, schadet bestimmt auch nicht.

Wenn Er dann immer noch Fehler bringt, Diese bitte auch hier rein mit dem Sketch/der Berechnung, Die Du dann benutzt.

MfG

PS: Ja, Da fehlt klassisch ein 'MIT' und ein 'OHNE' - ist wohl rausgeflogen, als ich von '48' auf 'schritte_max' geändert habe - liest sich SO nämlich äußerst anstrengend!
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Acki1985

Hoffe man kann es jetzt besser lesen.

Von 13 nach 3
Entfernung in Drehrichtung links 1-47 nicht ueber 0 =10 Schritte
Entfernung in Drehrichtung rechts 1-47 ueber 0 =38 Schritte
gewählte Drehrichtung links


Von 3 nach 34
Entfernung in Drehrichtung links 1-47 nicht ueber 0 =31 Schritte
Entfernung in Drehrichtung rechts 1-47 ueber 0 =17 Schritte
gewählte Drehrichtung links


Von 4 nach 22
Entfernung in Drehrichtung links 1-47 nicht ueber 0 =18 Schritte
Entfernung in Drehrichtung rechts 1-47 ueber 0 =30 Schritte
gewählte Drehrichtung rechts


Von 32 nach 33
Entfernung in Drehrichtung links 1-47 nicht ueber 0 =1 Schritte
Entfernung in Drehrichtung rechts 1-47 ueber 0 =47 Schritte
gewählte Drehrichtung rechts


Von 2 nach 25
Entfernung in Drehrichtung links 1-47 nicht ueber 0 =23 Schritte
Entfernung in Drehrichtung rechts 1-47 ueber 0 =25 Schritte
gewählte Drehrichtung rechts


Von 19 nach 38
Entfernung in Drehrichtung links 1-47 nicht ueber 0 =19 Schritte
Entfernung in Drehrichtung rechts 1-47 ueber 0 =29 Schritte
gewählte Drehrichtung rechts


Mit dem Code:

Code: [Select]

const byte schritte_max = 48;   //Anzahl an möglichen Anschlußpunkten

byte von;                       //Ausgangsgleis
byte nach;                      //Zielgleis

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  von = random(schritte_max) + 1;   //von und bis 'auswürfeln'
  nach = random(schritte_max) + 1;

  Serial.print("Von ");       // Von 1
  Serial.print(von);
  Serial.print(" nach ");     // nach 12
  Serial.println(nach);

  byte schritte_a = abs(von - nach);
  Serial.print("Entfernung in Drehrichtung links 1-");
  Serial.print(schritte_max - 1);
  Serial.print(" nicht ueber 0 =");  //Entfernung ohne 1-47 Wechsel 11
  Serial.print(schritte_a);
  Serial.println(" Schritte");
  byte schritte_b = schritte_max - schritte_a;
  Serial.print("Entfernung in Drehrichtung rechts 1-");
  Serial.print(schritte_max - 1);
  Serial.print(" ueber 0 =");   //Entfernung mit 1-47 Wechsel 37
  Serial.print(schritte_b);
  Serial.println(" Schritte");
  //wenn schritte_a<schritte_b && von<nach, dann 'rechts' drehend ... 1->12
  //wenn schritte_a<schritte_b && von>nach, dann 'links' drehend  ... 12->1
  //wenn schritte_a>schritte_b && von<nach, dann 'links' drehend  ... 1->48
  //wenn schritte_a>schritte_b && von>nach, dann 'rechts' drehend  ... 48->1
  if (schritte_a) {
    if (schritte_a < schritte_b xor von < nach) { //jedes der Statements kann nur wahr oder falsch sein
      Serial.println("gewählte Drehrichtung links");   // wenn nur Eines wahr ist
    Serial.println(" ");
    } else {
      Serial.println("gewählte Drehrichtung rechts");  // wenn Keines oder Beide wahr sind
    Serial.println(" ");
    }
  } else {
    Serial.println("identisches Gleis");
    Serial.println(" ");
  }
  delay(1000);
}

Acki1985

Guten abend,

Kann mir jemand helfen?

Acki1985

Hallo alle zusammen,

von 4 nach 24 wird immer die Falsche Richtung genommen?
Woran könnte das liegen?

Code: [Select]

const byte schritte_max = 48;   //Anzahl an möglichen Anschlußpunkten

byte von;                       //Ausgangsgleis
byte nach;                      //Zielgleis

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  von = random(schritte_max) + 1;   //von und bis 'auswürfeln'
  nach = random(schritte_max) + 1;

  Serial.print("Von ");       // Von 1
  Serial.print(von);
  Serial.print(" nach ");     // nach 12
  Serial.println(nach);

  byte schritte_a = abs(nach - von);
  Serial.print("Entfernung in Drehrichtung links 1-");
  Serial.print(schritte_max );
  Serial.print(" nicht ueber 0 =");  //Entfernung ohne 1-47 Wechsel 11
  Serial.print(schritte_a);
  Serial.println(" Schritte");
 
  byte schritte_b = schritte_max - schritte_a;
  Serial.print("Entfernung in Drehrichtung rechts 1-");
  Serial.print(schritte_max );
  Serial.print(" ueber 0 =");   //Entfernung mit 1-47 Wechsel 37
  Serial.print(schritte_b);
  Serial.println(" Schritte");
  //wenn schritte_a<schritte_b && von<nach, dann 'rechts' drehend ... 1->12
  //wenn schritte_a<schritte_b && von>nach, dann 'links' drehend  ... 12->1
  //wenn schritte_a>schritte_b && von<nach, dann 'links' drehend  ... 1->48
  //wenn schritte_a>schritte_b && von>nach, dann 'rechts' drehend  ... 48->1
  if (schritte_a) {
    if (schritte_a < schritte_b) { //jedes der Statements kann nur wahr oder falsch sein
      Serial.println("gewählte Drehrichtung links");   // wenn nur Eines wahr ist
    Serial.println(" ");
    } else {
      Serial.println("gewählte Drehrichtung rechts");  // wenn Keines oder Beide wahr sind
    Serial.println(" ");
    }
  } else {
    Serial.println("identisches Gleis");
    Serial.println(" ");
  }
  delay(1000);
}

Acki1985

verstehe es nicht?

Von 3 nach 34
Entfernung in Drehrichtung links 1-48 nicht ueber 0 =31 Schritte  //falsch
Entfernung in Drehrichtung rechts 1-48 ueber 0 =17 Schritte
gewählte Drehrichtung rechts
 
Von 20 nach 14
Entfernung in Drehrichtung links 1-48 nicht ueber 0 =6 Schritte   //richtig
Entfernung in Drehrichtung rechts 1-48 ueber 0 =42 Schritte
gewählte Drehrichtung links
 
Von 4 nach 22
Entfernung in Drehrichtung links 1-48 nicht ueber 0 =18 Schritte  //falsch
Entfernung in Drehrichtung rechts 1-48 ueber 0 =30 Schritte
gewählte Drehrichtung links
 
Von 32 nach 33
Entfernung in Drehrichtung links 1-48 nicht ueber 0 =1 Schritte  //falsch
Entfernung in Drehrichtung rechts 1-48 ueber 0 =47 Schritte
gewählte Drehrichtung links
 
Von 2 nach 25
Entfernung in Drehrichtung links 1-48 nicht ueber 0 =23 Schritte  //falsch
Entfernung in Drehrichtung rechts 1-48 ueber 0 =25 Schritte
gewählte Drehrichtung links
 
Von 30 nach 18
Entfernung in Drehrichtung links 1-48 nicht ueber 0 =12 Schritte  //richtig
Entfernung in Drehrichtung rechts 1-48 ueber 0 =36 Schritte
gewählte Drehrichtung links
 
Von 45 nach 44
Entfernung in Drehrichtung links 1-48 nicht ueber 0 =1 Schritte  //richtig
Entfernung in Drehrichtung rechts 1-48 ueber 0 =47 Schritte
gewählte Drehrichtung links
 
Von 19 nach 38
Entfernung in Drehrichtung links 1-48 nicht ueber 0 =19 Schritte  //falsch
Entfernung in Drehrichtung rechts 1-48 ueber 0 =29 Schritte
gewählte Drehrichtung links
 
Von 42 nach 18
Entfernung in Drehrichtung links 1-48 nicht ueber 0 =24 Schritte  //richtig
Entfernung in Drehrichtung rechts 1-48 ueber 0 =24 Schritte
gewählte Drehrichtung rechts
 
Von 5 nach 41
Entfernung in Drehrichtung links 1-48 nicht ueber 0 =36 Schritte  / /richtig
Entfernung in Drehrichtung rechts 1-48 ueber 0 =12 Schritte
gewählte Drehrichtung rechts
 
Von 5 nach 3
Entfernung in Drehrichtung links 1-48 nicht ueber 0 =2 Schritte   //richtig
Entfernung in Drehrichtung rechts 1-48 ueber 0 =46 Schritte
gewählte Drehrichtung links
 
Von 13 nach 21
Entfernung in Drehrichtung links 1-48 nicht ueber 0 =8 Schritte  //falsch
Entfernung in Drehrichtung rechts 1-48 ueber 0 =40 Schritte
gewählte Drehrichtung links

postmaster-ino

Hi

Schade, daß Du einen 'Ausreißer' drin hast
Quote
Von 5 nach 41
Entfernung in Drehrichtung links 1-48 nicht ueber 0 =36 Schritte  / /richtig
Entfernung in Drehrichtung rechts 1-48 ueber 0 =12 Schritte
gewählte Drehrichtung rechts
Ohne diesen 'Richtig', wären alle Fälle falsch gewesen, in Denen das Start-Gleis kleiner als das Ziel-Gleis war - durch den Ausreißer ist diese Theorie aber wieder Müll.

Sorry, daß Du mit meinem Versuch jetzt doch so viel Zeit unnütz verballert hast.
Leider sehe ich gerade aber auch keine Gemeinsamkeit - der XOR-Ansatz hätte eigentlich passen sollen ... eigentlich.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Go Up