Line sensor structure: 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 „= 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…“
 
Sebastian (diskusia | príspevky)
Bez shrnutí editace
Riadok 46: Riadok 46:
}
}


// Načíta hodnoty zo senzora – vráti true ak kanál vidí čiaru
bool onLine(uint8_t channel) {
bool onLine(uint8_t channel) {
   return analogRead(sensorPins[channel]) > THRESHOLD;
   return analogRead(sensorPins[channel]) > THRESHOLD;
}
}


// Vráti pozíciu čiary – záporné = čiara vľavo, kladné = čiara vpravo, 0 = stred
// 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() {
   // Senzory: 0=ľavý krajný, 1=ľavý stred, 2=pravý stred, 3=pravý krajný
   int result = 0;
   // --- doplňte: vypočítajte pozíciu čiary podľa toho ktoré kanály vidia čiaru ---
   for (uint8_t i = 0; i < SENSOR_COUNT; i++) {
  // Nápoveda: ak vidí iba kanál 0 = čiara je veľmi vľavo (-2)
    if (onLine(i)) result += (1 << i)// bitový posun: 1, 2, 4, 8
  //          ak vidí iba kanál 3 = čiara je veľmi vpravo (+2)
  }
  //           ak vidí kanály 1 a 2 = čiara je v strede (0)
  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 – zastavte a počkajte ---
     // --- 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 == 0) {
  // 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 < 0) {
   } 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?
   bool anyLine = false;
   if (pos == 0) {
  for (uint8_t i = 0; i < SENSOR_COUNT; i++) {
     // --- doplňte: čiara zmizla – čo urobíme? ---
     if (onLine(i)) anyLine = true;
   }
   }
   if (!anyLine) {
 
     // --- 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 ---
   }
   }



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