Go Down

Topic: "Problemi con il codice sensore ultrasuoni"URGENTE! REGALO BEFANA mia nipote (Read 781 times) previous topic - next topic

FraMor79

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!!!  :(


Code: [Select]
// 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 );
}

 





gpb01

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

Guglielmo
Search is Your friend ... or I am Your enemy !

FraMor79

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

FraMor79

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   :smiley-confuse:

Code: [Select]

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

gpb01

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


Code: [Select]
#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.
Search is Your friend ... or I am Your enemy !

FraMor79

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

gpb01

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
Search is Your friend ... or I am Your enemy !

FraMor79

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

gpb01

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

Grazie anche al tuo aiuto  ;)
Figurati, almeno hai fatto contenta la nipotina :)

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up