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)
dBez shrnutí editace
dBez shrnutí editace
 
Riadok 14: Riadok 14:


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 ===
Riadok 19: Riadok 25:
Jednoduchý test na overenie, že obe servá, čiarový senzor a multiplexor fungujú tak, ako majú.
Jednoduchý test na overenie, že obe servá, čiarový senzor a multiplexor fungujú tak, ako majú.


Bližšie informácie a nastavenia elektroniky nájdete v [[Electronics|manuáloch jednotlivých súčiastok]].
<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(":");
 
  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);
}