Basic robot - Line-follower: Rozdiel medzi revíziami
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ú. | ||
<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);
}