Basic robot - Line-follower: Rozdiel medzi revíziami

Zo stránky 3D liga wiki
Prejsť na navigáciu Prejsť na vyhľadávanie
Sebastian (diskusia | príspevky)
Vytvorená stránka „Ďalší robot, ktorého sme pre vás pripravili je Line follower. Robot, ktorý prenasleduje čiaru. Na to aby vedel kde je čiara tak použícame číarový senzor QRT-8A, z ktorého vychádza 8 analogových výstupov. Na našom RP2350 máme iba 4 analogove vstupy, ciže využijeme eŠte jeden komponent a to je 8 kanálový multiplexor, ktorý prepína kanály, ktoré chceme čítať a prevádza ich na jeden výstup. Pri tomto robotovy sa naučíme ako sa cita…“
 
dBez shrnutí editace
 
(Jedna medziľahlá úprava od jedného ďalšieho používateľa nie je zobrazená)
Riadok 1: Riadok 1:
Ďalší robot, ktorého sme pre vás pripravili je Line follower.  
Ďalší robot, ktorého sme pre vás pripravili, je Line follower.
Robot, ktorý prenasleduje čiaru. Na to aby vedel kde je čiara tak použícame číarový senzor QRT-8A, z ktorého vychádza 8 analogových výstupov.  
 
Na našom RP2350 máme iba 4 analogove vstupy, ciže využijeme eŠte jeden komponent a to je 8 kanálový multiplexor, ktorý prepína kanály, ktoré chceme čítať a prevádza ich na jeden výstup.  
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.
Pri tomto robotovy sa naučíme ako sa cita z analogoveho vystupu, ako prepinat kanaly a taktiez jeden algoritmus ako vyhodnotit poziciu ciary.  
 
Bude to narocnejsie na programovanie, ale za to sa viacej naucite nie len o stavebnici ale o tom co su algoritmi.
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.
Samotny algoritmus bude vysvetleny v sekcii [[SW Setup]], ale najprv sa pustme do stavania.
 
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.


* [[Návod na poskladanie sledovača čiary |  Návod na skladanie sledovača čiary]]
* [[Návod na poskladanie sledovača čiary |  Návod na skladanie sledovača čiary]]


Ak nájdete chyby v návode, prosíme napíšte nám.
Ak nájdete chyby v návode, prosíme napíšte nám.
Bližšie informácie a nastavenia elektroniky nájdete v [[Electronics|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.
<youtube>cP4vufLOp5o</youtube>


=== Jednoduchý testovací program ===
=== Jednoduchý testovací program ===


Jednoduchý test na overenie, že všetky dve servá, čiarový senzor a multiplexor fungujú tak, ako majú.
Jednoduchý test na overenie, že obe servá, čiarový senzor a multiplexor fungujú tak, ako majú.
 
<syntaxhighlight lang="C++">
#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(":");


Bližšie informácie a nastavenia elektroniky nájdete v [[Electronics | manuále jednotlivej súčiastky ]]
  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);
}
</syntaxhighlight>

Aktuálna revízia z 00:07, 22. august 2026

Ď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);
}