Line sensor structure: Rozdiel medzi revíziami
Prejsť na navigáciu
Prejsť na vyhľadávanie
Vytvorená stránka „= Line sensor structure – štruktúra kódu = <syntaxhighlight lang="C"> #include <Wire.h> #include <VL53L0X.h> #include <Servo.h> // Line senzor const uint8_t SENSOR_COUNT = 4; const uint8_t sensorPins[SENSOR_COUNT] = {26, 27, 28, 29}; const int IR_PIN = 15; const int THRESHOLD = 400; // VL53L0X VL53L0X distSensor; // Servá #define SERVO_LAVY 12 #define SERVO_PRAVY 13 Servo servoLavy; Servo servoPravy; void setup() { Serial.begin(115200); // Line…“ |
Bez shrnutí editace |
||
| Riadok 46: | Riadok 46: | ||
} | } | ||
bool onLine(uint8_t channel) { | bool onLine(uint8_t channel) { | ||
return analogRead(sensorPins[channel]) > THRESHOLD; | return analogRead(sensorPins[channel]) > THRESHOLD; | ||
} | } | ||
// Vráti | // Vráti bitovú masku pozície čiary (0–15) | ||
// Každý bit zodpovedá jednému senzoru: bit0=ľavý krajný ... bit3=pravý krajný | |||
// Príklady: | |||
// 0b0000 = 0 → žiadna čiara | |||
// 0b0001 = 1 → čiara úplne vľavo | |||
// 0b0110 = 6 → čiara v strede | |||
// 0b1111 = 15 → celá čiara (križovatka) | |||
int linePosition() { | int linePosition() { | ||
int result = 0; | |||
for (uint8_t i = 0; i < SENSOR_COUNT; i++) { | |||
if (onLine(i)) result += (1 << i); // bitový posun: 1, 2, 4, 8 | |||
} | |||
return result; | |||
} | } | ||
| Riadok 69: | Riadok 74: | ||
int dist = distSensor.readRangeContinuousMillimeters(); | int dist = distSensor.readRangeContinuousMillimeters(); | ||
if (!distSensor.timeoutOccurred() && dist < 100) { | if (!distSensor.timeoutOccurred() && dist < 100) { | ||
// --- doplňte: prekážka blízko – | // --- doplňte: prekážka blízko – objíďte alebo počkajte --- | ||
return; | return; | ||
} | } | ||
| Riadok 77: | Riadok 82: | ||
// 3. Sleduj čiaru | // 3. Sleduj čiaru | ||
if (pos == | // Nápoveda: pos == 6 (0b0110) = stred, pos <= 3 = vľavo, pos >= 8 = vpravo | ||
if (pos == 6 || pos == 9) { | |||
// --- doplňte: čiara v strede – ide rovno --- | // --- doplňte: čiara v strede – ide rovno --- | ||
} else if (pos < | } else if (pos > 0 && pos <= 3) { | ||
// --- doplňte: čiara vľavo – zatočte doľava --- | // --- doplňte: čiara vľavo – zatočte doľava --- | ||
} else { | } else if (pos >= 8) { | ||
// --- doplňte: čiara vpravo – zatočte doprava --- | // --- doplňte: čiara vpravo – zatočte doprava --- | ||
} | } | ||
// 4. Čo ak nevidíme čiaru vôbec? | // 4. Čo ak nevidíme čiaru vôbec? | ||
if (pos == 0) { | |||
// --- doplňte: čiara zmizla – čo urobíme? --- | |||
} | } | ||
if ( | |||
// --- doplňte: | // 5. Križovatka – všetky senzory vidia čiaru | ||
if (pos == 15) { | |||
// --- doplňte (voliteľné): križovatka – choďte rovno alebo odbočte --- | |||
} | } | ||
Verzia z 18:04, 3. máj 2026
Line sensor structure – štruktúra kódu
#include <Wire.h>
#include <VL53L0X.h>
#include <Servo.h>
// Line senzor
const uint8_t SENSOR_COUNT = 4;
const uint8_t sensorPins[SENSOR_COUNT] = {26, 27, 28, 29};
const int IR_PIN = 15;
const int THRESHOLD = 400;
// VL53L0X
VL53L0X distSensor;
// Servá
#define SERVO_LAVY 12
#define SERVO_PRAVY 13
Servo servoLavy;
Servo servoPravy;
void setup() {
Serial.begin(115200);
// Line senzor
pinMode(IR_PIN, OUTPUT);
digitalWrite(IR_PIN, HIGH);
// VL53L0X
Wire.setSDA(4);
Wire.setSCL(5);
Wire.begin();
if (!distSensor.init()) {
Serial.println("VL53L0X nenájdený!");
while (1);
}
distSensor.setTimeout(500);
distSensor.startContinuous();
// Servá
servoLavy.attach(SERVO_LAVY, 500, 2500);
servoPravy.attach(SERVO_PRAVY, 500, 2500);
stoj();
}
bool onLine(uint8_t channel) {
return analogRead(sensorPins[channel]) > THRESHOLD;
}
// Vráti bitovú masku pozície čiary (0–15)
// Každý bit zodpovedá jednému senzoru: bit0=ľavý krajný ... bit3=pravý krajný
// Príklady:
// 0b0000 = 0 → žiadna čiara
// 0b0001 = 1 → čiara úplne vľavo
// 0b0110 = 6 → čiara v strede
// 0b1111 = 15 → celá čiara (križovatka)
int linePosition() {
int result = 0;
for (uint8_t i = 0; i < SENSOR_COUNT; i++) {
if (onLine(i)) result += (1 << i); // bitový posun: 1, 2, 4, 8
}
return result;
}
void stoj() { servoLavy.write(90); servoPravy.write(90); }
void vpred() { /* --- doplňte --- */ }
void vlavo() { /* --- doplňte --- */ }
void vpravo() { /* --- doplňte --- */ }
void loop() {
// 1. Skontroluj prekážku
int dist = distSensor.readRangeContinuousMillimeters();
if (!distSensor.timeoutOccurred() && dist < 100) {
// --- doplňte: prekážka blízko – objíďte alebo počkajte ---
return;
}
// 2. Zisti pozíciu čiary
int pos = linePosition();
// 3. Sleduj čiaru
// Nápoveda: pos == 6 (0b0110) = stred, pos <= 3 = vľavo, pos >= 8 = vpravo
if (pos == 6 || pos == 9) {
// --- doplňte: čiara v strede – ide rovno ---
} else if (pos > 0 && pos <= 3) {
// --- doplňte: čiara vľavo – zatočte doľava ---
} else if (pos >= 8) {
// --- doplňte: čiara vpravo – zatočte doprava ---
}
// 4. Čo ak nevidíme čiaru vôbec?
if (pos == 0) {
// --- doplňte: čiara zmizla – čo urobíme? ---
}
// 5. Križovatka – všetky senzory vidia čiaru
if (pos == 15) {
// --- doplňte (voliteľné): križovatka – choďte rovno alebo odbočte ---
}
delay(20);
}