leggor.de -> ris -> linefollower light
+-
home
|
|
+---
nxt
|
|
+--+-
ris
| |
| |
| +----
linefollower 1
|
|
+---
technic
|
|
+---
train
|
|
+---
vignettes
|
|
+---
history
|
|
+---
links
|
|
+---
mail
|
|
+---
impressum
<<
>>
// software: // --------- // compiler: nqc.exe - version 3.1.2.5 // ide: bricx command center - version 3.3 // firmware: lego - version 0309 // os: windows XP - sp2 // // //__________________________________________________________ // hardware: // --------- // serieller tower // sitecom usb to serial // rcx 1.0 // // //__________________________________________________________ // anschlussbelegung: // ------------------ // OUT_1 - nicht belegt // OUT_2 - motor // OUT_3 - nicht belegt // SENSOR_1 - nicht belegt // SENSOR_2 - optischer sensor(licht-Sensor) // SENSOR_3 - nicht belegt // // //__________________________________________________________ // programmablauf: // --------------- // // 1.) variablen(Dunkel = oberer grenzwert, // Hell = unterer grenzwert, // Tolleranz = 1 / 5 der differenz von Hell // und Dunkel, // Kraft = motorkraft, // i = schleifenzaehler) werden // deklariert. // // 2.) konstante(Freq1 = tonfrequenz in sub Countdown1, // Freq2 = tonfrequenz in sub Countdown1, // Freq3 = tonfrequenz in sub Countdown2, // Pause = zeitschaltung in sub LinieSuchenL // und sub LinieSuchenR). // // 3.) optischen sensor an eingang 2 mit raw modus bekannt // machen. // // 4.) setzen der variable "Dunkel": der wert des // (os ist ueber linie) SENSOR_2 wird nun // im display an- // angezeigt, dabei // laeuft eine 7 sek // schleife // (sub Countdown1()) // mit immer laengeren // pausen zwischen // den toenen ab. // am ende der // schleife klingt der // ton 2 sekunden nach. // dabei wird der // aktuelle wert(raw) // von SENSOR_2 in die // variable "Dunkel" // geschrieben. // // 5.) setzen der variable "Hell": gleiche prozedur wie // (os is nicht ueber linie) beim setzen der // variable "Dunkel" // nur wird der wert // nun in variable // "Hell" geschrieben. // // 6.) berechnung des tolleranzwertes: Tolleranz = // (Dunkel - Hell) / 6 // // 7.) die grenzwerte werden unter einbezug des tolleranz- // wertes neu berechnet. dass heisst "Dunkel" wird // etwas heller und "Hell" wird etwas dunkler. // // 8.) fuenf sekuendiger akustischer countdown // (sub Countdown2()). // // 9.) task LinieFolgen() wird gestartet. // // 10.) der task Liniefolgen() besteht aus zwei einfachen // unterprogrammen: LinieSuchen() und LinieVerlassen(). // // 11.) das unterprogramm LinieSuchenL() laesst OUT_2 so // lange rueckwaerts drehen bis der wert von SENSOR_2 // gleich "Dunkel" ist. nach einer pause von einer // sekunde wird OUT_2 ausgeschaltet. // // 12.) das unterprogramm LinieSuchenR() laesst OUT_2 so // lange vorwaerts drehen bis der wert von SENSOR_2 // gleich "Hell" ist. nach einer pause von einer // sekunde wird OUT_2 wie im unterprogramm // LinieSuchenL() ausgeschaltet. // //__________________________________________________________ int Dunkel; int Hell; int Tolleranz; int Kraft; int i; #define Freq1 320 #define Freq2 300 #define Freq3 440 task main() { Kraft = 7; SetPower(OUT_B, Kraft); SetSensorType(SENSOR_2,SENSOR_TYPE_LIGHT); SetSensorMode(SENSOR_2,SENSOR_MODE_RAW); SelectDisplay(DISPLAY_SENSOR_2); Countdown1(); Dunkel = SENSOR_2; Countdown1(); Hell = SENSOR_2; Tolleranz = (Dunkel - Hell) / 6; Dunkel = Dunkel - Tolleranz; Hell = Hell + Tolleranz; Countdown2(); start LinieFolgen; } task LinieFolgen() { while(true) { LinieSuchenL(); LinieSuchenR(); } } sub LinieSuchenL() { Rev(OUT_B); On(OUT_B); while(SENSOR_2 < Dunkel) { Wait(10); } Off(OUT_B); } sub LinieSuchenR() { Fwd(OUT_B); On(OUT_B); while(SENSOR_2 > Hell) { Wait(10); } Off(OUT_B); } sub Countdown1() { i = 30; while(i < 200) { PlayTone(Freq1 ,25); Wait(i); i = i + 17; } PlayTone(Freq2,110); } sub Countdown2() { i = 0; while(i < 5) { PlayTone(Freq3,25); Wait(175); i = i + 1; } PlayTone(Freq3,110); }