RedBot Basic Kit #3 – prosty line follower

Dziś przedstawię najprostszy możliwy przykład programu line follower działającego na robocie RedBot Basic KitRedBot Basic Kit jest wyposażony w trzy czujniki odbiciowe światła podczerwonego, dzięki temu idealnie nadaje się do budowy prostego robota line follower (budowa czegoś bardziej zaawansowanego wymagałaby użycia dodatkowych czujników lub listwy z czujnikami).

Mój program powstał na bazie przykładu dostarczanego przez producenta, ale do uzyskania zadowalających efektów musiałem go mocno zmodyfikować. Idea działania jest bardzo prosta:

  • po dołączeniu zasilania robot czeka na naciśnięcie przycisku
  • po naciśnięciu przycisku robot startuje
  • podczas jazdy sprawdzamy okresowo stan lewego i prawego czujnika (środkowy nie jest używany), w zależności od odczytanych stanów robot steruje odpowiednio silnikami:
    Lewy czujnik Prawy czujnik Akcja
    Jasno Jasno Jazda do przodu
    Jasno Ciemno Skręcanie w lewo
    Ciemno Jasno Skręcanie w prawo
    Ciemno Ciemno Jazda do tyłu

Poniżej znajduje się kod programu.

#include <RedBot.h>

RedBotMotors motors;

// czujniki IR
RedBotSensor lSen = RedBotSensor(A6);
RedBotSensor rSen = RedBotSensor(A7);

// piny przycisku i głośnika
#define BEEPER 9
#define BUTTON_PIN 12


// poziomy jasności tła i linii
const int bgLevel = 600;
const int lineLevel = 700;

// flaga trybu standby
volatile boolean standby = true;

void setup()
{
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  tone(BEEPER, 2000, 750);  
  delay(1000);
}

void loop()
{
  // czekaj na nacisniecie przycisku
  if (digitalRead(BUTTON_PIN) == LOW)
    standby = false;

  if (!standby)
  {
    // jasno pod oboma czujnikami -> jedz do przodu
    if (lSen.read() < bgLevel && rSen.read() < bgLevel) motors.drive(-100);    
    // ciemno pod oboma czujnikami -> cofnij się
    else if (lSen.read() > lineLevel && rSen.read() >lineLevel) motors.drive(100);    
    // ciemno pod prawym czujnikiem -> skrec w prawo
    else if (rSen.read() > lineLevel) {
      motors.leftDrive(-100);
      motors.rightBrake();         
    }
    // ciemno pod lewym czujnikiem -> skrec w lewo
    else if (lSen.read() > lineLevel) {
      motors.rightDrive(-100);
      motors.leftBrake();
    }    
  }
  else motors.brake();
}

Na filmie możecie zobaczyć robota w akcji.