Basic robot - Line-follower

Zo stránky 3D liga wiki
Verzia z 00:07, 22. august 2026, ktorú vytvoril Admin (diskusia | príspevky)
(rozdiel) ← Staršia verzia | Aktuálna úprava (rozdiel) | Novšia verzia → (rozdiel)
Prejsť na navigáciu Prejsť na vyhľadávanie

Ďalší robot, ktorého sme pre vás pripravili, je Line follower.

Robot, ktorý prenasleduje čiaru. Na to, aby vedel, kde je čiara, používame čiarový senzor QRT-8A, z ktorého vychádza 8 analógových výstupov.

Na našom RP2350 máme iba 4 analógové vstupy, čiže využijeme ešte jeden komponent, a to 8-kanálový multiplexor, ktorý prepína kanály, ktoré chceme čítať, a prevádza ich na jeden výstup.

Pri tomto robote sa naučíme, ako sa číta z analógového výstupu, ako prepínať kanály a taktiež jeden algoritmus, ako vyhodnotiť pozíciu čiary.

Bude to náročnejšie na programovanie, ale zato sa naučíte viac nielen o stavebnici, ale aj o tom, čo sú algoritmy.

Samotný algoritmus bude vysvetlený v sekcii SW Setup, ale najprv sa pustime do stavania.

Ak nájdete chyby v návode, prosíme napíšte nám. Bližšie informácie a nastavenia elektroniky nájdete v manuáloch jednotlivých súčiastok.

Na videu vidieť činnosť testovacieho programu - otočí oboma servami a potom neustále sníma všetkých 8 senzorov a zobrazuje ich do Serial Monitora. Najskôr je zobrazený pohyb krížom cez čiernu čiaru, ktorý potom vykonáme aj pri sledovaní výstupu - na ktorom vidieť postupne od posledného senzora - ako senzor prechádza ponad čiaru hodnota je viac ako 900, zatiaľ čo inak je menej ako 400.

Jednoduchý testovací program

Jednoduchý test na overenie, že obe servá, čiarový senzor a multiplexor fungujú tak, ako majú.

#include <Servo.h>

const int PIN_SERVO_LAVE    = 10;
const int PIN_SERVO_PRAVE   = 11;

const int SERVO_STOP = 90; // "stop" poloha pre 360° servá

Servo servoLave;
Servo servoPrave;

void setup() {
  pinMode(13, OUTPUT);   // S0
  pinMode(14, OUTPUT);   // S1
  pinMode(15, OUTPUT);   // S2
  
  servoLave.attach(PIN_SERVO_LAVE, 540, 2400);
  servoPrave.attach(PIN_SERVO_PRAVE, 540, 2400);

  servoLave.write(SERVO_STOP);
  servoPrave.write(SERVO_STOP);

  Serial.begin(115200);
  delay(3000);
  Serial.println("are you there?");

  mux_select(0);

  // Test laveho serva - kratke otocenie jednym a druhym smerom
  Serial.println("Test laveho serva...");
  servoLave.write(SERVO_STOP + 30);
  delay(500);
  servoLave.write(SERVO_STOP - 30);
  delay(500);
  servoLave.write(SERVO_STOP);
  delay(500);

  // Test praveho serva
  Serial.println("Test praveho serva...");
  servoPrave.write(SERVO_STOP + 30);
  delay(500);
  servoPrave.write(SERVO_STOP - 30);
  delay(500);
  servoPrave.write(SERVO_STOP);
  delay(500);
}

// vyber vstupný kanál 0-7
void mux_select(int i)
{
  digitalWrite(13, i & 1);
  digitalWrite(14, (i & 2) >> 1);
  digitalWrite(15, (i & 4) >> 2);
}

int x = 0;

void loop() {

   Serial.print(x / 100);
   Serial.print((x % 100) / 10);
   Serial.print(x % 10);
   Serial.print(":");

   for (int i = 0; i < 8; i++)
   {
      mux_select(i);             // vyber kanál
      int y = analogRead(26);    // prečítaj hodnotu
      Serial.print(" ");         // zobraz ju
      Serial.print(y /100);
      Serial.print((y % 100) / 10);
      Serial.print(y % 10);
      delay(10);
   }
   Serial.println();
   x++;
   if (x == 999) x = 0;
   delay(300);
}