hmm, als state-machine ist eigentlich ne schöne idee. besser als immer nur zickzack zu fahren bis die linie "gesehen" wird =) das war mein letzter versuch vor dem umbau. ich seh schon, ich muss mir ne erweiterungsplatine mit loniensensor bauen... =)
Hallo,
anbei das Programm, mit welchem myIrAsuro im Qualifying der RobotChallenge letztes Wochenende in Wien die 354cm lange Strecke in 10.1s (mit 35.05cm/s) schaffte (12. Platz, der erste Robby schaffte 60.00cm/s).
Mit diesem Programm schaffte Robertor, als er noch ein Standard-Asuro war (mit roter LED, bei völliger Dunkelheit im Raum) 9.22s auf 357cm der Strecke Qualifying 2006, also 38.72cm/s (siehe folgenden Beitrag), bei einer Maximalgeschwindigkeit von 45cm/s (geradeaus).
Das Programm ist recht einfach, ohne PID-Regler oder ähnliches. Bis zur Standard-Asuro-Geschwindigkeit von 45cm/s war dies auch ausreichend; jetzt mit Endgeschwindigkeiten von 1.1m/s (myIrAsuro) und 1.8m/s (Robertor, siehe Beitrag Asuro "upside down") werde ich mich wohl doch mit dem Thema (PID-)Regelung auseinandersetzen müssen ...
Das ganze Programm ist als state-machine realisiert -- der Asuro weiß zu jedem Zeitpunkt, ob er auf der Linie ist (ON_LINE), links daneben (OFF_LEFT) oder rechts daneben (OFF_RIGHT).
Auf der Linie fährt er einfach voll geradeaus, wenn er links daneben ist, fährt er einen Kreis nach rechts, und wenn er rechts daneben ist, fährt er einen Kreis nach links -- das war's!
Dieses Programm hat die Eigenschaft, daß "normalerweise" der Asuro beim Verlassen am Ende der Linie er diese wieder mittels eines Kreises nach rechts oder links sucht, und dann dieselbe Strecke wieder zurückfährt ...
Vielleicht schaut Ihr ja mal, ob das Programm bei Euch auch funktioniert (Anpassen von THRESHOLD nicht vergessen), viel Spaß!Code:// // Program used by "myIrAsuro" in qualifying for competition // "Parallel Slalom" of RobotChallenge 2007 in Vienna (24th march): // http://www.robotchallenge.at // // Time 10.1s for 354cm, that is speed 35.05cm/s (best was 60.00 cm/s). // // myIrAsuro has reduction of 1:12.5 (Asuro standard is 1:25), see: // https://www.roboternetz.de/phpBB2/viewtopic.php?t=28876 // // The entries 0xFF for both SPEED values below will work on // a standard Asuro with speed < 0.5m/s. // // The value for THRESHOLD must be changed if no IR-FrontLED // with white shield is used, see: // https://www.roboternetz.de/phpBB2/viewtopic.php?t=29109 // // // Robot will have to be placed on the line for starting! // // After starting the StatusLED of Asuro will blink [ready]. // After (any) switch is pressed both BackLED's turn on [steady]. // Releasing the switch will start the Robot [go]. // #include <asuro.h> #define OFF_LEFT -1 #define ON_LINE 0 #define OFF_RIGHT +1 #define SPEED 0xdF // 0xFF #define SPEED1 0xbF // 0xFF #define SPEED2 0x00 #define THRESHOLD 1100 void RaceStart(void); // blink until any switch is pressed, // then wait until switch is released int main(void) { unsigned int sum,data[2]; int position = ON_LINE; Init(); RaceStart(); FrontLED(ON); MotorDir(FWD,FWD); MotorSpeed(SPEED,SPEED); while (1) // state machine: position on/off the line { LineData(data); sum = data[LEFT] + data[RIGHT]; if (sum>=THRESHOLD) // not on the line { if (position==ON_LINE) // switch state if previously on the line { position = (data[LEFT]<data[RIGHT]) ? OFF_RIGHT : OFF_LEFT; BackLED( (position==OFF_LEFT)?ON:OFF, (position==OFF_RIGHT)?ON:OFF ); } } else // on the line { if (position!=ON_LINE) // switch state if previously not on the line { position = ON_LINE; BackLED(OFF,OFF); } } if (position==ON_LINE) { MotorSpeed(SPEED,SPEED); } // full FWD else if (position==OFF_RIGHT) { MotorSpeed(SPEED2,SPEED1); } // turn left else if (position==OFF_LEFT) { MotorSpeed(SPEED1,SPEED2); } // turn right } while (1); // code unreachable return 0; } void RaceStart(void) // blink until any switch is pressed, { // then wait until switch is released uint8_t t1, t2; unsigned int col=OFF; while (1) // blinking StatusLED until any switch is pressed { t1 = PollSwitch(); t2 = PollSwitch(); if (t1==t2) { if (t1) { break; } else { col ^= GREEN; StatusLED(col); } } Msleep(50); } StatusLED(OFF); // turn off StatusLED and ... BackLED(ON,ON); // ... turn on both BackLED's while (1) // wait until switch is released { t1 = PollSwitch(); t2 = PollSwitch(); if (t1==t2) { if (!t1) { break; } } Msleep(50); } BackLED(OFF,OFF); // turn off BackLED's indication start of race }
hmm, als state-machine ist eigentlich ne schöne idee. besser als immer nur zickzack zu fahren bis die linie "gesehen" wird =) das war mein letzter versuch vor dem umbau. ich seh schon, ich muss mir ne erweiterungsplatine mit loniensensor bauen... =)
Hallo,
schau doch mal die vorletze Bilderreihe im folgenden Beitrag an, da ist genau so eine Erweiterungsplatine dargestellt.Zitat von damaltor
Diese könntest Du nutzen, wenn Du Deinen Asuro auch umdrehst [daß das von der Motorhöhe her paßt, kannst Du den Bildern in folgendem Beitrag entnehmen (dort ist allerdings alles falschherum), allerdings wäre die Platine bei den 38er-Rädern dann vorne höher als hinten] -- die (einfachen) notwendigen softwareseitigen Maßnahmen sind in dem Beitrag dargestellt ...
hmm... ich glaub ich hab nicht den elan das alles umzubauen =) aber ich hab mir shon was überlegt, wenn ich mal wieder etwas mehr zeit hab für den kleinen dann werd ich mal was basteln.
hi hermann,
ich habe noch nicht so ganz genau verstanden wie der wert von 11oo zustande kam.
Ist es die summe der werte der linienfolgesensoren (die höchsten werte) oder ist das was anderes?
Ich verwende eine "normale" rote LED, da ist der asuro nur geradeaus gefahren. Beim einsetzen von einer IR diode )ich habe mir steckbare module gemacht) drehte er sich nur im kreis.
Als ich den wert auf 400 gesetzt habe (bei IR) fuhr er auf der linie, allerdings auf einer breiteren (ca. 1,5cm breit) recht flott herum, auf der dünnen linie von der testarena fährt er mit dem gleichen wetr und IR nur sinnlos in der gegend herum
gruß georg
gruß inka
ich denke mal der wert muss je nach asuro und linie und diode angepasst werden... muss man halt etwas austesten.
naja, was ich meine ist ob es sowas wie "deutungen" der veränderung und den auswirkungen dieser gibt, z.b. von 200 rauf= schmalere linie, IR-werte irgendwo bei ...?, der schwellenwert bei 1000 und darunter= dickere linie, schlechter diode o.ä...
also mehr oder weniger ein paar erfahrungswerte bei änderungen des wertes. So langsam habe ich nämlich bedenken wegen der anzahl der flashvorgänge, die der prozessor mitmacht
gruß georg
gruß inka
Also was mir dazu einfällt:
Die Taster haben doch sogesehen keine Funktion.
Du kannst halt je zwei Taster verwenden um die Werte zu modifizieren.
zB Taster1 schwellenwert um 50 erhöhen, taster2: schwellenwert um 50 verringern usw.
nach jeder Änderung am besten noch über IR die Daten zurück an den PC schicken. So kannst du rumexperementieren ohne zu flashen. Sobald du dann die besten Werte hast, kannst draus ein festes Programm bauen.
18.März '07- mein erster ASURO
Hallo Georg,
es ist der Schwellwert zur Unterscheidung, ob der Asuro noch auf den Linie (mehr oder weniger) drauf ist (ON_LINE, wenn sum<THRESHOLD), oder nicht mehr auf der Linie ist (OFF_LEFT oder OFF_RIGHT, wenn sum>=THRESHHOLD), wobei sum die Summe der Werte des linken und des rechten Fototransistors ist -- siehe auch folgenden Code-Ausschnitt:Zitat von inkaCode:... while (1) // state machine: position on/off the line { LineData(data); sum = data[LEFT] + data[RIGHT]; if (sum>=THRESHOLD) // not on the line { ... } else // on the line { ... } ... } ...Schön, daß Du "einfach mal probiert hast, die richtigen Werte zu finden", und natürlich ist es auch richtig hier zu fragen [besonders freut micht die Formulierung fuhr er auf der linie, allerdings auf einer breiteren (ca. 1,5cm breit) recht flott herum ].Ich verwende eine "normale" rote LED, da ist der asuro nur geradeaus gefahren. Beim einsetzen von einer IR diode )ich habe mir steckbare module gemacht) drehte er sich nur im kreis.
Als ich den wert auf 400 gesetzt habe (bei IR) fuhr er auf der linie, allerdings auf einer breiteren (ca. 1,5cm breit) recht flott herum, auf der dünnen linie von der testarena fährt er mit dem gleichen wetr und IR nur sinnlos in der gegend herum
In folgendem Beitrag im Thread Vollausschlag für die Fotosensoren kannst Du sehen, daß die Summenmesswerte von myIrAsuro zwischen 500 (auf der Linie) und 1950 (auf weißem Untergrund) liegen, da war 1100 eine pragmatische Wahl des Schwellwertes.
Man kann den Schwellwert aber auch einfach experimentell Bestimmen (z.B. für die beiden Setups von Dir mit 1,5cm breiten und mit schmalen Linien)!
- Flashe dazu einfach ein Programm, welches die LineData()-Werte des Asuro in einem Terminalprogramm auf dem PC ausgibt, auf den Asuro (falls keines zur Hand, dann findest Du eines in diesem Beitrag).
- Setze den Asuro auf die Linie und bewege ihn dann soweit nach links oder rechts, bis Du möchtest, daß er den Zustand als nicht mehr auf der Linie ansehen soll.
- Verwende die Summe der LineData()-Werte an dieser Stelle als Wert für die Konstante THRESHOLD.
Ich hoffe, das obige Rezept zur Festlegung von THRESHOLD ist hilfreich.naja, was ich meine ist ob es sowas wie "deutungen" der veränderung und den auswirkungen dieser gibt, z.b. von 200 rauf= schmalere linie, IR-werte irgendwo bei ...?, der schwellenwert bei 1000 und darunter= dickere linie, schlechter diode o.ä...
Welche Testarena? Die Linien auf der RobotChallenge sind 1.5cm breit, siehe hier.... auf der dünnen linie von der testarena ...
Ich glaube irgendwo gelesen zu haben, daß man den Asuro mindestens 10000 mal Flashen kann, da brauchst Du wohl erst mal keine Bedenken haben ...So langsam habe ich nämlich bedenken wegen der anzahl der flashvorgänge, die der prozessor mitmacht
hi hermann,
nun habe ich die osterntour mit ihren über 2000km hinter mir und kann mich wieder etwas um den asuro kümmern
danke erstmal für die erklärungen zum THREESHOLD, damit blicke ich durch und werde den experimentelen weg versuchen...
diese hier, habe ich von damaltor zugeschickt bekommen. Besteht aus 9 blättern, die aneinander geklebt werden, allerdings muss der (mein) asuro schon seehhr langsam sein um nicht rauszufliegen...Welche Testarena?
edit/
was die anzahl der flashvorgänge betrifft, ich glaube eine zahl 10x kleiner mal gelesen zu haben ???
/edit
gruß inka
Lesezeichen