Line sensor bonus 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 bonus structure – štruktúra kódu = <syntaxhighlight lang="C"> #include <Wire.h> #include <VL53L0X.h> #include <Servo.h> #include <Adafruit_Sensor.h> #include <Adafruit_BNO055.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; // BNO055 Adafruit_BNO055 bno; bool bnoActive = false; // Servá #define SERV…“
 
Sebastian (diskusia | príspevky)
 
Riadok 1: Riadok 1:
= Line sensor bonus structure – štruktúra kódu =
<syntaxhighlight lang="C">
<syntaxhighlight lang="C">
#include <Wire.h>
#include <Wire.h>
Riadok 7: Riadok 5:
#include <Adafruit_Sensor.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
#include <Adafruit_BNO055.h>
#include <LittleFS.h>
// Multiplexer
const int MUX_Z  = 26;
const int MUX_S0 = 6;
const int MUX_S1 = 7;
const int MUX_S2 = 8;


// Line senzor
// Line senzor
const uint8_t SENSOR_COUNT = 4;
const uint8_t SENSOR_COUNT = 8;
const uint8_t sensorPins[SENSOR_COUNT] = {26, 27, 28, 29};
const int IR_PIN    = 15;
const int IR_PIN    = 15;
const int THRESHOLD = 400;
const int THRESHOLD = 400;
Riadok 31: Riadok 35:
long lastLog = 0;
long lastLog = 0;
const int LOG_INTERVAL = 100;  // logujeme každých 100ms
const int LOG_INTERVAL = 100;  // logujeme každých 100ms
File logFile;


void setup() {
void setup() {
   Serial.begin(115200);
   Serial.begin(115200);
  analogReadResolution(12);


   // Line senzor
   // Multiplexer
  pinMode(MUX_S0, OUTPUT);
  pinMode(MUX_S1, OUTPUT);
  pinMode(MUX_S2, OUTPUT);
 
  // IR LED
   pinMode(IR_PIN, OUTPUT);
   pinMode(IR_PIN, OUTPUT);
   digitalWrite(IR_PIN, HIGH);
   digitalWrite(IR_PIN, HIGH);


   // I2C
   // VL53L0X
   Wire.setSDA(4);
   Wire.setSDA(4);
   Wire.setSCL(5);
   Wire.setSCL(5);
   Wire.begin();
   Wire.begin();
  // VL53L0X
   if (!distSensor.init()) {
   if (!distSensor.init()) {
     Serial.println("VL53L0X nenájdený!");
     Serial.println("VL53L0X nenájdený!");
Riadok 52: Riadok 61:
   distSensor.startContinuous();
   distSensor.startContinuous();


   // BNO055 – automatické hľadanie adresy
   // BNO055
   int adresa = 0;
   int adresa = 0;
   for (byte addr = 1; addr < 127; addr++) {
   for (byte addr = 1; addr < 127; addr++) {
Riadok 62: Riadok 71:
     if (bno.begin()) {
     if (bno.begin()) {
       bnoActive = true;
       bnoActive = true;
       Serial.println("BNO055 OK");
       Serial.println("BNO055 OK – čakám na kalibráciu...");
     }
     }
  }
  // LittleFS
  if (!LittleFS.begin()) {
    Serial.println("LittleFS zlyhalo!");
    while (1);
  }
  // Otvoríme súbor na zápis – každé spustenie prepíše predchádzajúci záznam
  logFile = LittleFS.open("/data.csv", "w");
  if (logFile) {
    logFile.println("cas_ms,uhol_z,pozicia_ciary,prekazka_mm");
    Serial.println("Logovanie OK");
  } else {
    Serial.println("Chyba otvorenia súboru!");
   }
   }


Riadok 71: Riadok 94:
   stoj();
   stoj();


  // Hlavička CSV
   Serial.println("OK – čakám na kalibráciu gyroskopu...");
   Serial.println("cas_ms,uhol_z,pozicia_ciary,prekazka_mm");
}
}


bool isCalibrated() {
void selectChannel(uint8_t channel) {
   uint8_t system, gyro, accel, mag;
   digitalWrite(MUX_S0, (channel >> 0) & 1);
  bno.getCalibration(&system, &gyro, &accel, &mag);
   digitalWrite(MUX_S1, (channel >> 1) & 1);
   return system >= 1;
   digitalWrite(MUX_S2, (channel >> 2) & 1);
}
 
float getAngleZ() {
  imu::Vector<3> euler = bno.getVector(Adafruit_BNO055::VECTOR_EULER);
   return euler.z();
}
}


bool onLine(uint8_t channel) {
bool onLine(uint8_t channel) {
   return analogRead(sensorPins[channel]) > THRESHOLD;
  selectChannel(channel);
  delayMicroseconds(10);
   return analogRead(MUX_Z) > THRESHOLD;
}
}


// Vráti bitovú masku pozície čiary (0–15)
// 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;
   int result = 0;
Riadok 102: Riadok 115:
   }
   }
   return result;
   return result;
}
bool isCalibrated() {
  uint8_t system, gyro, accel, mag;
  bno.getCalibration(&system, &gyro, &accel, &mag);
  return system >= 1;
}
float getAngleZ() {
  imu::Vector<3> euler = bno.getVector(Adafruit_BNO055::VECTOR_EULER);
  return euler.z();
}
}


Riadok 112: Riadok 136:
   if (!bnoActive || !isCalibrated()) return;
   if (!bnoActive || !isCalibrated()) return;
   if (millis() - lastLog < LOG_INTERVAL) return;
   if (millis() - lastLog < LOG_INTERVAL) return;
  if (!logFile) return;


   // CSV výstup – cas, uhol, pozicia ciary, vzdialenost od prekazky
   logFile.print(millis());        logFile.print(",");
  Serial.print(millis());        Serial.print(",");
   logFile.print(getAngleZ());    logFile.print(",");
   Serial.print(getAngleZ());    Serial.print(",");
   logFile.print(pos);            logFile.print(",");
   Serial.print(pos);            Serial.print(",");
   logFile.println(dist);
   Serial.println(dist);
  logFile.flush();  // uistíme sa že dáta sú zapísané na flash


   lastLog = millis();
   lastLog = millis();
}
void printLog() {
  // Zatvori súbor a znova otvor na čítanie
  logFile.close();
  File r = LittleFS.open("/data.csv", "r");
  if (!r) return;
  Serial.println("=== /data.csv ===");
  while (r.available()) {
    Serial.println(r.readStringUntil('\n'));
  }
  r.close();
  Serial.println("=================");
}
}


Riadok 128: Riadok 166:
     delay(100);
     delay(100);
     return;
     return;
  }
  // Príkaz cez sériový monitor: 'P' = vypíš súbor
  if (Serial.available()) {
    char c = Serial.read();
    if (c == 'P') printLog();
   }
   }


Riadok 143: Riadok 187:


   // 3. Sleduj čiaru
   // 3. Sleduj čiaru
   if (pos == 6 || pos == 9) {
   if (pos == 24 || pos == 36) {
     // --- doplňte: čiara v strede – ide rovno ---
     // --- doplňte: čiara v strede ---
   } else if (pos > 0 && pos <= 3) {
   } else if (pos > 0 && pos < 16) {
     // --- doplňte: čiara vľavo – zatočte doľava ---
     // --- doplňte: čiara vľavo ---
   } else if (pos >= 8) {
   } else if (pos >= 64) {
     // --- doplňte: čiara vpravo – zatočte doprava ---
     // --- doplňte: čiara vpravo ---
   }
   }


  // 4. Čo ak nevidíme čiaru vôbec?
   if (pos == 0) {
   if (pos == 0) {
     // --- doplňte: čiara zmizla ---
     // --- doplňte: čiara zmizla ---
   }
   }


  // 5. Križovatka
   if (pos == 255) {
   if (pos == 15) {
     // --- doplňte (voliteľné): križovatka ---
     // --- doplňte (voliteľné): križovatka ---
   }
   }


   // 6. Zaloguj dáta
   // 4. Zaloguj dáta
   logData(pos, dist);
   logData(pos, dist);



Aktuálna revízia z 01:41, 8. máj 2026

#include <Wire.h>
#include <VL53L0X.h>
#include <Servo.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
#include <LittleFS.h>

// Multiplexer
const int MUX_Z  = 26;
const int MUX_S0 = 6;
const int MUX_S1 = 7;
const int MUX_S2 = 8;

// Line senzor
const uint8_t SENSOR_COUNT = 8;
const int IR_PIN    = 15;
const int THRESHOLD = 400;

// VL53L0X
VL53L0X distSensor;

// BNO055
Adafruit_BNO055 bno;
bool bnoActive = false;

// Servá
#define SERVO_LAVY  12
#define SERVO_PRAVY 13

Servo servoLavy;
Servo servoPravy;

// Logovanie
long lastLog = 0;
const int LOG_INTERVAL = 100;  // logujeme každých 100ms
File logFile;

void setup() {
  Serial.begin(115200);
  analogReadResolution(12);

  // Multiplexer
  pinMode(MUX_S0, OUTPUT);
  pinMode(MUX_S1, OUTPUT);
  pinMode(MUX_S2, OUTPUT);

  // IR LED
  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();

  // BNO055
  int adresa = 0;
  for (byte addr = 1; addr < 127; addr++) {
    Wire.beginTransmission(addr);
    if (Wire.endTransmission() == 0) adresa = addr;
  }
  if (adresa > 0) {
    bno = Adafruit_BNO055(55, adresa, &Wire);
    if (bno.begin()) {
      bnoActive = true;
      Serial.println("BNO055 OK – čakám na kalibráciu...");
    }
  }

  // LittleFS
  if (!LittleFS.begin()) {
    Serial.println("LittleFS zlyhalo!");
    while (1);
  }
  // Otvoríme súbor na zápis – každé spustenie prepíše predchádzajúci záznam
  logFile = LittleFS.open("/data.csv", "w");
  if (logFile) {
    logFile.println("cas_ms,uhol_z,pozicia_ciary,prekazka_mm");
    Serial.println("Logovanie OK");
  } else {
    Serial.println("Chyba otvorenia súboru!");
  }

  // Servá
  servoLavy.attach(SERVO_LAVY, 500, 2500);
  servoPravy.attach(SERVO_PRAVY, 500, 2500);
  stoj();

  Serial.println("OK – čakám na kalibráciu gyroskopu...");
}

void selectChannel(uint8_t channel) {
  digitalWrite(MUX_S0, (channel >> 0) & 1);
  digitalWrite(MUX_S1, (channel >> 1) & 1);
  digitalWrite(MUX_S2, (channel >> 2) & 1);
}

bool onLine(uint8_t channel) {
  selectChannel(channel);
  delayMicroseconds(10);
  return analogRead(MUX_Z) > THRESHOLD;
}

int linePosition() {
  int result = 0;
  for (uint8_t i = 0; i < SENSOR_COUNT; i++) {
    if (onLine(i)) result += (1 << i);
  }
  return result;
}

bool isCalibrated() {
  uint8_t system, gyro, accel, mag;
  bno.getCalibration(&system, &gyro, &accel, &mag);
  return system >= 1;
}

float getAngleZ() {
  imu::Vector<3> euler = bno.getVector(Adafruit_BNO055::VECTOR_EULER);
  return euler.z();
}

void stoj()   { servoLavy.write(90); servoPravy.write(90); }
void vpred()  { /* --- skopírujte z predchádzajúcej úlohy --- */ }
void vlavo()  { /* --- skopírujte z predchádzajúcej úlohy --- */ }
void vpravo() { /* --- skopírujte z predchádzajúcej úlohy --- */ }

void logData(int pos, int dist) {
  if (!bnoActive || !isCalibrated()) return;
  if (millis() - lastLog < LOG_INTERVAL) return;
  if (!logFile) return;

  logFile.print(millis());        logFile.print(",");
  logFile.print(getAngleZ());     logFile.print(",");
  logFile.print(pos);             logFile.print(",");
  logFile.println(dist);
  logFile.flush();  // uistíme sa že dáta sú zapísané na flash

  lastLog = millis();
}

void printLog() {
  // Zatvori súbor a znova otvor na čítanie
  logFile.close();
  File r = LittleFS.open("/data.csv", "r");
  if (!r) return;
  Serial.println("=== /data.csv ===");
  while (r.available()) {
    Serial.println(r.readStringUntil('\n'));
  }
  r.close();
  Serial.println("=================");
}

void loop() {
  // Čakaj na kalibráciu gyroskopu
  if (bnoActive && !isCalibrated()) {
    Serial.println("Kalibrujem BNO055...");
    delay(100);
    return;
  }

  // Príkaz cez sériový monitor: 'P' = vypíš súbor
  if (Serial.available()) {
    char c = Serial.read();
    if (c == 'P') printLog();
  }

  // 1. Skontroluj prekážku
  int dist = distSensor.readRangeContinuousMillimeters();
  if (!distSensor.timeoutOccurred() && dist < 100) {
    stoj();
    logData(0, dist);
    // --- doplňte: objíďte alebo počkajte ---
    return;
  }

  // 2. Zisti pozíciu čiary
  int pos = linePosition();

  // 3. Sleduj čiaru
  if (pos == 24 || pos == 36) {
    // --- doplňte: čiara v strede ---
  } else if (pos > 0 && pos < 16) {
    // --- doplňte: čiara vľavo ---
  } else if (pos >= 64) {
    // --- doplňte: čiara vpravo ---
  }

  if (pos == 0) {
    // --- doplňte: čiara zmizla ---
  }

  if (pos == 255) {
    // --- doplňte (voliteľné): križovatka ---
  }

  // 4. Zaloguj dáta
  logData(pos, dist);

  delay(20);
}