robot inseguitore di linea

ciao a tutti, io sto progettando un robot inseguitore di linea utilizzando un boebot della parallax con due servo motori, un Arduino uno e tre sensori a infrarossi per visualizzare il colore della linea, uno centrale che visualizzerà il colore nero e due laterali che visualizzeranno il colore bianco. per adesso ho fatto il seguente programma ma non capisco dove posso aver sbagliato. mi potreste aiutare?? grazie

_3Sensori_ultimo.ino (3.59 KB)

#include <Servo.h> // Include servo library
Servo servoSx; // dichiaro il servo sx e dx
Servo servoDx;

void setup() // Built-in initialization block
{
  pinMode(10, INPUT); pinMode(9, OUTPUT); // sensore sinistro IR LED & Receiver
  pinMode(3, INPUT); pinMode(2, OUTPUT); // sensore destro IR LED & Receiver
  pinMode(6, INPUT); pinMode(5, OUTPUT); // sensore centrale IR LED & Receiver
  servoSx.attach(13); // servo sx su pin 13
  servoDx.attach(12); // servo dx su pin 12
  Serial.begin(9600);
}


void loop() // Main loop auto-repeats
{
ciclo:
  if ((RCTimesx == 0) && (RCTimeC == 0) && (RCTimeDx == 0)) // se tutto sul nero, fermati
  {
    servoSx.detach(); // Stop servo signals
    servoDx.detach();
    tone(4, 3000, 1000); // inizio tone per 1 s
    delay(1000);
  }
  else if ((RCTimesx == 0) && (RCTimeC == 0) && (RCTimeDx == ! 0)) // sx nero, c nero, dx bianco -> gira a sx
  {
    maneuver(-200, 200, 375); // gira a sx per 375ms
    goto ciclo;
  }

  else if ((RCTimesx == 0) && (RCTimeC = !0) && (RCTimeDx == 0)) // sx nero, c bianco, dx nero -> impossibile
  {
    servoSx.detach(); // Stop servo signals
    servoDx.detach();
  }
  else if ((RCTimesx == 0) && (RCTimeC = ! 0) && (RCTimeDx = ! 0)) // sx nero, c bianco, dx bianco = curva stretta a sx
  {
    maneuver(-200, 200, 375); // gira a sx per 375ms
    goto ciclo;
  }
  else if (RCTimesx = ! 0) && (RCTimeC == 0) && (RCTimeDx == 0) // sx bianco, c nero, dx nero -> gira a dx
  {
    maneuver(200, -200, 375); // gira a dx per 375ms
    goto ciclo;
  }
  else if (RCTimesx = ! 0) && (RCTimeC == 0) && (RCTimeDx = ! 0) // sx bianco, c nero, dx bianco -> procedi dritto
  {
    maneuver(200, 200, 375); // procede dritto
    goto ciclo;
  }
  else if (RCTimesx = ! 0) && (RCTimeC = ! 0) && (RCTimeDx == 0) // sx bianco, c bianco, dx nero = curva stretta a dx
  {
    maneuver(200, -200, 375); // gira a dx per 375ms
    goto ciclo;
  }
  else // condizione di perdita riferimenti
  {
    maneuver(-200, -200, 1000); // va indietro per un secondo
    do {
      maneuver(200, 0, 100); // gira a dx per 100ms
    } while (RCTimesx = ! 0) && (RCTimeC = ! 0) && (RCTimeDx = ! 0) // gira a dx per 100ms e esce quando trova pista
      goto ciclo;
  }
}

Serial.print(RCTimesx(2));
Serial.print(" ");
Serial.print(RCTimeC(5));
Serial.print(" ");
Serial.print(RCTimeDx(8));
Serial.println(' ');
delay(500);

long RCTimesx(int sensorln2) {
  long duration2 = 0;
  pinMode(sensorln2, OUTPUT);
  digitalWrite(sensorln2, HIGH);
  delay(1);
  pinMode(sensorln2, INPUT);
  digitalWrite(sensorln2, LOW);
  while (digitalRead(sensorln2)) {
    duration2++;
  }
  return duration2;
  Serial.println(RCTime5(5));
}

long RCTimeC(int sensorln5) {
  long duration5 = 0;
  pinMode(sensorln5, OUTPUT);
  digitalWrite(sensorln5, HIGH);
  delay(1);
  pinMode(sensorln5, INPUT);
  digitalWrite(sensorln5, LOW);
  while (digitalRead(sensorln5)) {
    duration5++;
  }
  return duration5;
}

long RCTimeDx(int sensorln8) {
  long duration8 = 0;
  pinMode(sensorln8, OUTPUT);
  digitalWrite(sensorln8, HIGH);
  delay(1);
  pinMode(sensorln8, INPUT);
  digitalWrite(sensorln8, LOW);
  while (digitalRead(sensorln8)) {
    duration8++;
  }
  return duration8;
}

void maneuver(int speedLeft, int speedRight, int msTime)
{
  // speedLeft, speedRight ranges: Backward Linear Stop Linear Forward
  // -200 -100......0......100 200
  servoSx.writeMicroseconds(1500 + speedLeft); // Set left servo speed
  servoDx.writeMicroseconds(1500 - speedRight); // Set right servo speed
  if (msTime == -1) // if msTime = -1
  {
    servosx.detach(); // Stop servo signals
    servoDx.detach();
  }
  delay(msTime); // Delay for msTime
}

Ci sono molti errori nello sketch.
Richiami funzioni come variabili, non è permesso. inoltre se è previsto gli devi passare i parametri.
Hai scritto una parte dei comandi fuori da qualsiasi funzione.
Dovresti cercare di eliminare i Goto: sono da programmazione in Basic e non da linguaggio C, anche se supportati dal compilatore.
Ti conviene utilizzare dei #define o delle costanti per definire i pin utilizzati in tutto il programma.
Non c'è bisogno di ridefinire N funzioni diverse quando hanno lo stesso codice, basta che gli invii parametri diversi.
Per il ciclo do...while ci vuole il ; finale

do {
  codice
} while(condizione);

Spiega per bene cosa deve fare il programma, anche passo passo; così potremmo aiutarti meglio. :grin:
Per usare al meglio il forum leggi il Regolamento, in particolare i punti 7, 8 e 9 --> [REGOLAMENTO] Come usare questa sezione del forum - Italiano - Arduino Forum

Benvenuto. :smiley:
p.s. Prima di postare il codice usa la funzione di formattazione automatica che trovi nel menu Strumenti dell'IDE di Arduino. Serve per identare il codice.