- #include <PololuQTRSensors.h>
- #include <OrangutanBuzzer.h>
- #include <OrangutanMotors.h>
- #include <OrangutanLCD.h>
-
- // definice IO portu (vyvodu) - Arduino cislovani !!
- const int pinLedRed = 1; // cervena LED
- const int pinLedGreen = 7; // zelena LED
-
- const int pinButtonA = 9; // tlacitko A
- const int pinButtonB = 12; // tlacisko B
- const int pinButtonC = 13; // tlacitko C
-
- OrangutanBuzzer pipak; // objekt pro "pipak", nutny prislusny INCLUDE
- OrangutanMotors motory; // objekt pro ovladani motoru
- OrangutanLCD displej; // objekt reprezentujici LCD displej
-
- PololuQTRSensorsRC sensory; // objekt senzoru
-
- const int pinQtrEmitor = 19; // pin se signalem "prisviceni"
- unsigned int sensVals[5]; // pole pro hodnoty ze senzoru
-
- void setup()
- {
- unsigned char pinsQTR[5] = {14, 15, 16, 17, 18}; // pole cisel pinu senzoru
- sensory.init(pinsQTR, 5, 2000, pinQtrEmitor); // inicialice objektu senzoru
- sensory.emittersOff(); // zhasni prisviceni
-
- displej.clear(); // smazat
- displej.gotoXY(0, 0); // kurzor na zacatek
- displej.print("KAE/UPAE"); // max. 8 znaku na radek !
-
- pinMode(pinLedRed, OUTPUT); // definice vyvodu jako vystup pro LED
- pinMode(pinLedGreen, OUTPUT);
-
- pinMode(pinButtonA, INPUT_PULLUP); // definice vyvodu jako vstup pro tlacitka
- pinMode(pinButtonB, INPUT_PULLUP);
- pinMode(pinButtonC, INPUT_PULLUP);
-
- pipak.playFrequency(523, 200, 15); // zapni ton na dobu 200ms
- while (pipak.isPlaying()) // cekej na dohrani tonu
- ;
- pipak.playFrequency(784, 100, 15); // spust dalsi ton, dohraje "nekdy"
- }
-
- boolean lastA = true; // minuly stav tlacitka A
- boolean lastB = true; // minuly stav tlacitka B
-
- boolean runState = false; // stav indikujici, zda se ma "pracovat"
- boolean isCalibrated = false; // priznak, ze probehla kalibrace
-
- void loop()
- {
- unsigned int cara = sensory.readLine(sensVals, 1); // "caru" merime vzdy
-
- if (isCalibrated) // po dokoncene kalibraci se vypisuje hodnota na displej
- {
- displej.gotoXY(0, 0); // kurzor na zacatek
- displej.print(cara); // pokud print dostane INT, vypise jako cislo
- displej.print(" "); // trik - smazat pripadne "minule" hodnoty na radku
- }
-
- if (runState) // pokud ma pracovat
- {
- digitalWrite(pinLedRed, 1);
-
- if ((cara > 1800) && (cara < 2200)) // je na care ?
- {
- motory.setSpeeds(32, 32); // jizda rovne
- }
- else
- {
- if (cara >= 2200)
- motory.setSpeeds(48, 16); // zatacej
- else
- motory.setSpeeds(16, 48);
- }
- }
- else
- {
- digitalWrite(pinLedRed, 0);
- motory.setSpeeds(0, 0); // motory STOP
- }
-
- boolean stav = digitalRead(pinButtonB); // precti stav tlacitka B
- if (stav != lastB) // doslo k nejake zmene ?
- {
- lastB = stav; // uloz novy stav pro priste
-
- if (stav == 1) // tj. tlacitko nestisknuto = byla to zmena "pusteni tlacitka"
- {
- runState = !runState; // zmen stav
-
- delay(5); // cekani, aby to dalsi zmenu nevyhodnotilo ihned
- }
- }
-
- stav = digitalRead(pinButtonA); // precti stav tlacitka A
- if (stav != lastA) // doslo k nejake zmene ?
- {
- lastA = stav; // uloz novy stav pro priste
-
- if (stav == 1) // tj. tlacitko nestisknuto = byla to zmena "pusteni tlacitka"
- {
- displej.gotoXY(0, 0); // kurzor na zacatek
- displej.print("Kalibrac"); // vypis informace
-
- kalibrace();
- isCalibrated = true; // priznak, ze probehla kalibrace
- // pri dalsim pruchodu loop() se na prvni radek zacne vypis "cara"
- }
- }
- }
-
- void kalibrace(void)
- {
- int i;
-
- pipak.playFrequency(523, 200, 15); // zapni ton na dobu 200ms
-
- motory.setSpeeds(0, 0); // motory stop
- sensory.resetCalibration(); // vynuluj kalibracni konstanty
-
- motory.setSpeeds(32, -32); // toc se doprava
- for(i = 0; i < 25; i++)
- {
- sensory.calibrate(1); // kalibruj, 1 = s rozsvicenym prisvicenim
- delay(12);
- }
-
- motory.setSpeeds(-32, 32); // toc se doleva
- for(i = 0; i < 50; i++)
- {
- sensory.calibrate(1);
- delay(12);
- }
-
- motory.setSpeeds(32, -32); // toc se doprava
- for(i = 0; i < 25; i++)
- {
- sensory.calibrate(1);
- delay(12);
- }
-
- motory.setSpeeds(0, 0); // motory stop
- }