"Problemi con il codice sensore ultrasuoni"URGENTE! REGALO BEFANA mia nipote

Ragazzi questa sera volevo consegnare il mio robottino fai da me a mia nipote come regalo per la befana

ma sbaglio qualche cosa nel codice potete aiutarmi? Il robot va in dietro e gira

Ho sempre usato sensori infrared per fare queste cose ma li avevo finiti così ho montato un HC-SR04

Ma sbaglio qualcosa!!! :frowning:

// pin collegati a trigger ed echo del sensore a ultrasuoni
int pinTrig = 10;
int pinEcho = 11;
                       // durata dell'impulso echo in microsecondi 
unsigned long durata;
                       // distanza dell'ostacolo in centimetri
int distanza;
                       // timeout della funzione pulseIn() in assenza di impulso echo
unsigned long timeout = 100000;

#define PWMA 3
#define PWMB 9
#define AIN1 4
#define AIN2 7
#define BIN1 8
#define BIN2 12
#define STBY 2 

void setup(){
                                             // imposto i pin del sensore
 pinMode(pinTrig, OUTPUT);
 pinMode(pinEcho, INPUT);
                                             // Motori
 pinMode( STBY,OUTPUT );
 pinMode( PWMA,OUTPUT );
 pinMode( PWMB,OUTPUT );
 pinMode( AIN1,OUTPUT );
 pinMode( AIN2,OUTPUT );
 pinMode( BIN1,OUTPUT );
 pinMode( BIN2,OUTPUT ); 
 digitalWrite( STBY,HIGH );

}void loop()
{
int dist = analogRead(pinEcho);
 if ( distanza < 15 ) { gira(); }
 else                      { avanti(); }
}

void avanti()
{
   digitalWrite( AIN1,HIGH );
   digitalWrite( AIN2,LOW );
   digitalWrite( BIN1,HIGH );
   digitalWrite( BIN2,LOW );

   analogWrite( PWMA,100 );
   analogWrite( PWMB,100 );
}

void indietro()
{
   digitalWrite( AIN1,LOW );
   digitalWrite( AIN2,HIGH );
   digitalWrite( BIN1,LOW );
   digitalWrite( BIN2,HIGH );

   analogWrite( PWMA,100 );
   analogWrite( PWMB,100 );
}

void alt()
{
   analogWrite( PWMA,50 );
   analogWrite( PWMB,50 );

   digitalWrite( AIN1,LOW );
   digitalWrite( AIN2,LOW );
   digitalWrite( BIN1,LOW );
   digitalWrite( BIN2,LOW );
}

void gira()
{
 // STOP x 1/2 sec
 alt();
 delay( 500 );

 // INDIETRO x 1/2 secondo
 indietro();
 delay( 500 );

 // STOP x 1/2 sec
 alt();
 delay( 500 );

 // Gira
 digitalWrite( AIN1,LOW );
 digitalWrite( AIN2,HIGH );
 digitalWrite( BIN1,HIGH );
 digitalWrite( BIN2,LOW );

 analogWrite( PWMA,100 );
 analogWrite( PWMB,100 );

 delay( 200 );
}

Non si usa in quel modo il HC-SR04 ... ... guardati QUI un semplice esempio di uso ;)

Guglielmo

Guglielmo qui il tempo stringe e tra poco arriva la mia nipotina

non è che potresti aiutarmi a modificare il codice?

Non sò se faccio in tempo da solo a studiare come funziona tutto il sistema e imparare a scrivere il codice giusto.

Saresti così gentile da aiutarmi?

Intanto grazie per il link

Non ci riesco continua a darmi errore!!!

Exit status 1

‘gira’ was not declared in this scope

Non capisco eppure gli dò tutte le istruzioni… sono un principiante aiuto per favore :confused:

#define trigPin 11
#define echoPin 10
#define PWMA 3
#define PWMB 9
#define AIN1 4
#define AIN2 7
#define BIN1 8
#define BIN2 12
#define STBY 2

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode( STBY,OUTPUT );
  pinMode( PWMA,OUTPUT );
  pinMode( PWMB,OUTPUT );
  pinMode( AIN1,OUTPUT );
  pinMode( AIN2,OUTPUT );
  pinMode( BIN1,OUTPUT );
  pinMode( BIN2,OUTPUT );
  digitalWrite( STBY,HIGH );

}

void loop()


  
  {
  long duration, distance;
  digitalWrite(trigPin, LOW);  // Added this line
  delayMicroseconds(2); // Added this line
  digitalWrite(trigPin, HIGH);
//  delayMicroseconds(1000); - Removed this line
  delayMicroseconds(10); // Added this line
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  if (distance < 15)
  
  {gira();
  
  }
  else 
  
  { avanti();
  
  }
  
  if (distance >= 200 || distance <= 0){
    Serial.println("Out of range");
  }
  else {
    Serial.print(distance);
    Serial.println(" cm");
  }



 
void avanti()
{
    digitalWrite( AIN1,HIGH );
    digitalWrite( AIN2,LOW );
    digitalWrite( BIN1,HIGH );
    digitalWrite( BIN2,LOW );
 
    analogWrite( PWMA,100 );
    analogWrite( PWMB,100 );
}
 
void indietro()
{
    digitalWrite( AIN1,LOW );
    digitalWrite( AIN2,HIGH );
    digitalWrite( BIN1,LOW );
    digitalWrite( BIN2,HIGH );
 
    analogWrite( PWMA,100 );
    analogWrite( PWMB,100 );
}
 
void alt()
{
    analogWrite( PWMA,50 );
    analogWrite( PWMB,50 );
 
    digitalWrite( AIN1,LOW );
    digitalWrite( AIN2,LOW );
    digitalWrite( BIN1,LOW );
    digitalWrite( BIN2,LOW );
}
 
void gira()
{
  // STOP x 1/2 sec
  alt();
  delay( 500 );
 
  // INDIETRO x 1/2 secondo
  indietro();
  delay( 500 );
 
  // STOP x 1/2 sec
  alt();
  delay( 500 );
 
  // Gira
  digitalWrite( AIN1,LOW );
  digitalWrite( AIN2,HIGH );
  digitalWrite( BIN1,HIGH );
  digitalWrite( BIN2,LOW );
 
  analogWrite( PWMA,100 );
  analogWrite( PWMB,100 );
 
  delay( 200 );
  
  }

Se scrivessi meglio il codice, in modo ordinato, ti accorgeresti che manca una parentesi graffa …

#define trigPin 11
#define echoPin 10
#define PWMA 3
#define PWMB 9
#define AIN1 4
#define AIN2 7
#define BIN1 8
#define BIN2 12
#define STBY 2

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode( STBY, OUTPUT );
  pinMode( PWMA, OUTPUT );
  pinMode( PWMB, OUTPUT );
  pinMode( AIN1, OUTPUT );
  pinMode( AIN2, OUTPUT );
  pinMode( BIN1, OUTPUT );
  pinMode( BIN2, OUTPUT );
  digitalWrite( STBY, HIGH );
}

void loop() {
  long duration, distance;
  digitalWrite(trigPin, LOW);  // Added this line
  delayMicroseconds(2); // Added this line
  digitalWrite(trigPin, HIGH);
  //  delayMicroseconds(1000); - Removed this line
  delayMicroseconds(10); // Added this line
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration / 2) / 29.1;
  if (distance < 15) gira();
  else avanti();

  if (distance >= 200 || distance <= 0) {
    Serial.println("Out of range");
  }
  else {
    Serial.print(distance);
    Serial.println(" cm");
  }
}

void avanti()
{
  digitalWrite( AIN1, HIGH );
  digitalWrite( AIN2, LOW );
  digitalWrite( BIN1, HIGH );
  digitalWrite( BIN2, LOW );

  analogWrite( PWMA, 100 );
  analogWrite( PWMB, 100 );
}

void indietro()
{
  digitalWrite( AIN1, LOW );
  digitalWrite( AIN2, HIGH );
  digitalWrite( BIN1, LOW );
  digitalWrite( BIN2, HIGH );

  analogWrite( PWMA, 100 );
  analogWrite( PWMB, 100 );
}

void alt()
{
  analogWrite( PWMA, 50 );
  analogWrite( PWMB, 50 );

  digitalWrite( AIN1, LOW );
  digitalWrite( AIN2, LOW );
  digitalWrite( BIN1, LOW );
  digitalWrite( BIN2, LOW );
}

void gira()
{
  // STOP x 1/2 sec
  alt();
  delay( 500 );

  // INDIETRO x 1/2 secondo
  indietro();
  delay( 500 );

  // STOP x 1/2 sec
  alt();
  delay( 500 );

  // Gira
  digitalWrite( AIN1, LOW );
  digitalWrite( AIN2, HIGH );
  digitalWrite( BIN1, HIGH );
  digitalWrite( BIN2, LOW );

  analogWrite( PWMA, 100 );
  analogWrite( PWMB, 100 );

  delay( 200 );

}

… naturalmente non l’ho provato e non ho idea se funzioni.

Guglielmo

P.S.: Ed impara ad usare la funzione che trovi nel menu dell’IDE Tools → Auto Format … che ti sistema in una forma un po’ più leggibile il codice.

Grazieeeeeee sei un grandissimoooooooo!!!

Grazie grazie grazie!

Adesso il codice l'ha accettato il robot però gira su se stesso e ogni tanto scatta in avanti se muovo i jumper (Anche sul monitor seriale la lettura si interrompe) adesso provo a cambiarli uno per uno e vediamo di fare sto regalo :)

Grazie di Cuore ;-)

P.S. Sono un pò disordinato ma ho appena iniziato con cose un pò più serie di fare lampeggiare led o fare girare motorini con il potenziometro... Con il tempo migliorerò ;-)

Controlla bene i collegamenti, i jumper non sono il modi migliore per farli ...

Verifica inoltre le "distanze" ritornate dal sensore e controlla che siano congrue con quello che tu ti aspetti ;)

Guglielmo

Era proprio colpa loro, Jumper ballerini! Ma erano solo per il collaudo.... Poi ho fatto una corsa con il saldatore per finirlo in tempo!

... E già che c'ero ho passato una bella colata di colla a caldo sulle parti più delicate per rinforzarlo.

Ha funzionato tutto perfettamente e la mia nipotina è stata felicissima :)

Grazie anche al tuo aiuto ;)

Buona serata

FraMor79: Ha funzionato tutto perfettamente e la mia nipotina è stata felicissima :)

Grazie anche al tuo aiuto ;)

Figurati, almeno hai fatto contenta la nipotina :)

Guglielmo