1. #include <PololuQTRSensors.h>
  2. #include <OrangutanBuzzer.h>
  3. #include <OrangutanMotors.h>
  4. #include <OrangutanLCD.h>
  5.  
  6. // definice IO portu (vyvodu) - Arduino cislovani !!
  7. const int pinLedRed = 1;     // cervena LED
  8. const int pinLedGreen = 7;   // zelena LED
  9.  
  10. const int pinButtonA = 9;    // tlacitko A
  11. const int pinButtonB = 12;   // tlacisko B
  12. const int pinButtonC = 13;   // tlacitko C
  13.  
  14. OrangutanBuzzer pipak;       // objekt pro "pipak", nutny prislusny INCLUDE
  15. OrangutanMotors motory;      // objekt pro ovladani motoru
  16. OrangutanLCD displej;        // objekt reprezentujici LCD displej
  17.  
  18. PololuQTRSensorsRC sensory;  // objekt senzoru
  19.  
  20. const int pinQtrEmitor = 19; // pin se signalem "prisviceni"
  21. unsigned int sensVals[5];    // pole pro hodnoty ze senzoru
  22.  
  23. void setup()
  24. {
  25.   unsigned char pinsQTR[5] = {14, 15, 16, 17, 18};  // pole cisel pinu senzoru
  26.   sensory.init(pinsQTR, 5, 2000, pinQtrEmitor);  // inicialice objektu senzoru
  27.   sensory.emittersOff();          // zhasni prisviceni
  28.  
  29.   displej.clear();                // smazat
  30.   displej.gotoXY(0, 0);           // kurzor na zacatek
  31.   displej.print("KAE/UPAE");      // max. 8 znaku na radek !
  32.   
  33.   pinMode(pinLedRed, OUTPUT);     // definice vyvodu jako vystup pro LED
  34.   pinMode(pinLedGreen, OUTPUT);
  35.  
  36.   pinMode(pinButtonA, INPUT_PULLUP);  // definice vyvodu jako vstup pro tlacitka
  37.   pinMode(pinButtonB, INPUT_PULLUP);
  38.   pinMode(pinButtonC, INPUT_PULLUP);
  39.  
  40.   pipak.playFrequency(523, 200, 15);  // zapni ton na dobu 200ms
  41.   while (pipak.isPlaying())           // cekej na dohrani tonu
  42.     ;
  43.   pipak.playFrequency(784, 100, 15);  // spust dalsi ton, dohraje "nekdy"
  44. }
  45.  
  46. boolean lastA = true;                 // minuly stav tlacitka A
  47. boolean lastB = true;                 // minuly stav tlacitka B
  48.  
  49. boolean runState = false;             // stav indikujici, zda se ma "pracovat"
  50. boolean isCalibrated = false;         // priznak, ze probehla kalibrace
  51.  
  52. void loop()  
  53. {
  54.   unsigned int cara = sensory.readLine(sensVals, 1);   // "caru" merime vzdy
  55.  
  56.   if (isCalibrated)                 // po dokoncene kalibraci se vypisuje hodnota na displej
  57.   {
  58.     displej.gotoXY(0, 0);           // kurzor na zacatek
  59.     displej.print(cara);            // pokud print dostane INT, vypise jako cislo
  60.     displej.print("        ");      // trik - smazat pripadne "minule" hodnoty na radku
  61.   }
  62.  
  63.   if (runState)                     // pokud ma pracovat
  64.   {
  65.     digitalWrite(pinLedRed, 1);
  66.  
  67.     if ((cara > 1800) && (cara < 2200))   // je na care ?
  68.     {
  69.       motory.setSpeeds(32, 32);     // jizda rovne
  70.     }
  71.     else
  72.     {
  73.       if (cara >= 2200)
  74.         motory.setSpeeds(48, 16);   // zatacej
  75.       else
  76.         motory.setSpeeds(16, 48);
  77.     }
  78.   }
  79.   else
  80.   {
  81.     digitalWrite(pinLedRed, 0);
  82.     motory.setSpeeds(0, 0);         // motory STOP
  83.   }
  84.  
  85.   boolean stav = digitalRead(pinButtonB);   // precti stav tlacitka B
  86.   if (stav != lastB)     // doslo k nejake zmene ?
  87.   {
  88.     lastB = stav;        // uloz novy stav pro priste
  89.  
  90.     if (stav == 1)       // tj. tlacitko nestisknuto = byla to zmena "pusteni tlacitka"
  91.     {
  92.       runState = !runState;   // zmen stav
  93.  
  94.       delay(5);          // cekani, aby to dalsi zmenu nevyhodnotilo ihned
  95.     }
  96.   }
  97.   
  98.   stav = digitalRead(pinButtonA);   // precti stav tlacitka A
  99.   if (stav != lastA)     // doslo k nejake zmene ?
  100.   {
  101.     lastA = stav;        // uloz novy stav pro priste
  102.  
  103.     if (stav == 1)       // tj. tlacitko nestisknuto = byla to zmena "pusteni tlacitka"
  104.     {
  105.       displej.gotoXY(0, 0);           // kurzor na zacatek
  106.       displej.print("Kalibrac");      // vypis informace
  107.  
  108.       kalibrace();
  109.       isCalibrated = true;            // priznak, ze probehla kalibrace
  110.          // pri dalsim pruchodu loop() se na prvni radek zacne vypis "cara"
  111.     }
  112.   }
  113. }
  114.  
  115. void kalibrace(void)
  116. {
  117.   int i;
  118.   
  119.   pipak.playFrequency(523, 200, 15);  // zapni ton na dobu 200ms
  120.  
  121.   motory.setSpeeds(0, 0);    // motory stop
  122.   sensory.resetCalibration();         // vynuluj kalibracni konstanty
  123.   
  124.   motory.setSpeeds(32, -32); // toc se doprava
  125.   for(i = 0; i < 25; i++)
  126.   {
  127.     sensory.calibrate(1);   // kalibruj, 1 = s rozsvicenym prisvicenim
  128.     delay(12);
  129.   }
  130.  
  131.   motory.setSpeeds(-32, 32); // toc se doleva
  132.   for(i = 0; i < 50; i++)
  133.   {
  134.     sensory.calibrate(1);
  135.     delay(12);
  136.   }
  137.   
  138.   motory.setSpeeds(32, -32); // toc se doprava
  139.   for(i = 0; i < 25; i++)
  140.   {
  141.     sensory.calibrate(1);
  142.     delay(12);
  143.   }
  144.  
  145.   motory.setSpeeds(0, 0);    // motory stop
  146. }