arduino robot line follower e evita ostacoli

buongiorno a tutti,
sto realizzando un progetto di un robot che segue una linea nera ed evita gli ostacoli...ho completato i due programmi separatamente, ma non riesco ad unirli...il robot deve dare la precedenza alla linea e quando finisce la linea deve usare il sensore ad ultrasuoni, per poi ripassare alla linea...
Questi sono i due programmi:

#include <QTRSensors.h>


#define Kp 0.1 // Azione proporzionale
#define Kd 0.2 // Azione derivatrice ( Nota: Kp < Kd) 
#define rightMaxSpeed 150 // Velocità Massima del motore destro
#define leftMaxSpeed 150 // Velocità Massima del motore sinistro
#define rightBaseSpeed 110 // Velocità quando il robot segue perfettamente la linea, motore destro
#define leftBaseSpeed 110  // Velocità quando il robot segue perfettamente la linea, motore sinistro
#define NUM_SENSORS  6     // Numero di sensori IR usati
#define TIMEOUT       2500  // waits for 2500 us for sensor outputs to go low
#define EMITTER_PIN   QTR_NO_EMITTER_PIN  

#define in1 9 // Marcia avanti motore destro
#define in2 8 // Marcia indietro motore destro
#define enA 10 //Abilità il motore destro

#define in3 7  // Marcia avanti motore sinistro
#define in4 6 // Marcia indietro motore sinistro
#define enB 5 // Abilità il motore sinistro




QTRSensorsRC qtrrc((unsigned char[]) {A0,A1,A2,A3,A4,A5}, 6); // 6 pin usati per la barra IR

unsigned int sensorValues[NUM_SENSORS];

void setup()
{
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(enA, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(enB, OUTPUT);
  

  
  int i;
for (int i = 0; i < 100; i++) // Calibrazione facend passare il sensore attraverso la linea
 
   qtrrc.calibrate();   
   delay(20);
wait();  
delay(2000); // Aspetta per 2s per posizionare il robot prima di entrare in loop
    
   
    // Stampa nel monitor seriale la calibrazione
    
    Serial.begin(9600);
    for (int i = 0; i < NUM_SENSORS; i++)
    {
      Serial.print(qtrrc.calibratedMinimumOn[i]);
      Serial.print(' ');
    }
    Serial.println();

    for (int i = 0; i < NUM_SENSORS; i++)
    {
      Serial.print(qtrrc.calibratedMaximumOn[i]);
      Serial.print(' ');
    }
    Serial.println();
    Serial.println(); 
 
  } 

int lastError = 0;

void loop()
{
  unsigned int sensors[6];
  int position = qtrrc.readLine(sensors); // get calibrated readings along with the line position, refer to the QTR Sensors Arduino Library for more details on line position.
  int error = position - 2500;

  int motorSpeed = Kp * error + Kd * (error - lastError);
  lastError = error;

  int rightMotorSpeed = rightBaseSpeed + motorSpeed;
  int leftMotorSpeed = leftBaseSpeed - motorSpeed;
  
  if (rightMotorSpeed > rightMaxSpeed ) rightMotorSpeed = rightMaxSpeed; // Permette al motore destro di non superare la velocità massima
  if (leftMotorSpeed > leftMaxSpeed ) leftMotorSpeed = leftMaxSpeed; // Permette al motore sinistro di non superare la velocità massima
  if (rightMotorSpeed < 0) rightMotorSpeed = 0; // Rende la velocità del motore destro positiva
  if (leftMotorSpeed < 0) leftMotorSpeed = 0; // Rende la velocità del motore sinistro positiva
  
   {

  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(enA, rightMotorSpeed);

  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enB, leftMotorSpeed);

}
}
  
void wait(){

}
#define echoPin 2 // Echo Pin
#define trigPin 4 // Trigger Pin


int maximumRange = 200; // Range massimo del sensore
int minimumRange = 10; // Range minimo del sensore 


int in1 = 9;  // Marcia avanti motore destro
int in2 = 8;  // Marcia indietro motore destro
int enA = 10;  // Marcia indietro motore destro

int in3 = 7;  // Marcia avanti motore sinistro
int in4 = 6; // Marcia indietro motore sinistro
int enB = 5; // Abilità il motore sinistro

long duration, distance; 
 
void setup() {
 Serial.begin (9600);
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
 pinMode(enA, OUTPUT);
 pinMode(enB, OUTPUT);
 pinMode(in1, OUTPUT);
 pinMode(in2, OUTPUT);
 pinMode(in3, OUTPUT);
 pinMode(in4, OUTPUT);
 
}
  

void loop(){
  
  
  // Invio e ricezione del segnale inviato (TX - RX)
 digitalWrite(trigPin, LOW); 
 delayMicroseconds(2); 
 
 delay(500);
 
 digitalWrite(trigPin, HIGH);
 delayMicroseconds(2); 
 
 digitalWrite(trigPin, LOW);
 duration = pulseIn(echoPin, HIGH);


 
 // Calcola la distanza in centimetri dall'oggetto*/
 distance = duration/90;
 
 if (distance <= minimumRange){

   // Ha rilevato un ostacolo quindi sterza verso destra
   
 Serial.println("Ostacolo");
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enA, 0);
  analogWrite(enB, 150);
 
}
 else {

   // Non ha rilevato ostacoli quindi prosegue dritto
   
 Serial.println(distance);
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enA, 100);
  analogWrite(enB, 100);

}
}

Nessuno?

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

conosci le funzioni()?

tonio75:
sto realizzando un progetto di un robot che segue una linea nera ed evita gli ostacoli...ho completato i due programmi separatamente, ma non riesco ad unirli...il robot deve dare la precedenza alla linea e quando finisce la linea deve usare il sensore ad ultrasuoni, per poi ripassare alla linea...

Facci capire, intendi dire che dobbiamo unirteli noi?
Non è per non aiutarti, ma inizia a farlo tu, e se non ci riesci posta lo sketch risultante e vediamo di darti una mano. Ma non puoi pensare che il lavoro lo si faccia noi, ti pare? :wink: