Problema robot evita ostacoli

Per divertimento volevo costruire un robot che evitasse gli ostacoli, prendendo circuito e sketch da questa pagina web: Arduino per principianti: Progetto 19: creare un Robot evita ostacoli.
Ho costruito il circuito e caricato lo sketch, solo che i motori non partono, il sensore ultrasuoni e i motori sono funzionanti, cosa è errato? Grazie e buona giornata.

se hai messo il latte nel primo ripiano del frigo è quello!!!

a parte gli scherzi,
sicuramente ci servono lo sketch che stai usando e una spiegazione dettagliata di cosa stai usando.... motori, controller, sensori...
più una descrizione o meglio foto (se possibile) del circuito che hai realizzato

Patrick_M:
sicuramente ci servono lo sketch che stai usando e una spiegazione dettagliata di cosa stai usando.... motori, controller, sensori...

Ehm, se vai al link che ha postato trovi (quasi) tutto... :wink:

docdoc:
Ehm, se vai al link che ha postato trovi (quasi) tutto... :wink:

si l'ho visto

ma vorrei vedere se è stato riprodotto esattamente e il codice copiato correttamente :wink:
e soprattutto quali e come ha collegato l'alimentazione dei motori perchè proprio nel link i motori sono alimentati da Arduino e se non hai le pile cariche al 101%... è facile che stiano fermi... e comunque quei motorini assorbono ben più di 100-200 mA :smiley:

I collegamenti li ho controllati, per l’alimentazione utilizzo una batteria da 9 volt, ho provato anche 4 batterie da 1,5 volt, ma non parte lo stesso. Il circuito l’ho allegato, lo sketch è questo:

int MOTORD=8;
 int MOTORS=9;
#define echoPin 2                            // Pin to receive echo pulse
#define trigPin 3

void setup(){
  Serial.begin(9600);
pinMode(MOTORD,OUTPUT);
pinMode(MOTORS,OUTPUT);
pinMode(echoPin, INPUT);// set echopin input
pinMode(trigPin, OUTPUT); // set pin trigger output
}
void loop(){
  
  
  digitalWrite(trigPin, LOW);                   // Set the trigger pin to low for 2uS
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);                  // Send a 10uS high to trigger ranging
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);                   // Send pin low again
  int distance = pulseIn(echoPin, HIGH);        // Read in times pulse
  distance= distance/58;                        // Calculate distance from time of pulse
   Serial.println(distance);
   // se ho un ostacolo a 25 cm di distanza gira a destra tenedo ferma la ruota destra
  if((distance<25)&&(distance!=0)){  // a volte arrivano degli zeri e quelli non li devo prendere in considerazione
  digitalWrite(MOTORS,HIGH); // accendo un motore e spengo l'altro così posso girare
  digitalWrite(MOTORD,LOW);
  delay(500);
  }
   else{ // vado dritto
  digitalWrite(MOTORS,HIGH);
  digitalWrite(MOTORD,HIGH);
  
  }
  
}

I motori li ho testati da soli con alimentazione con batteria da 9 volt e funzionano, anche il sensore ultrasuoni che ho usato per altri progetti funziona. Grazie per l’attenzione.

Lo schema secondo me è sbagliato, l'alimentazione ad entrambi i motori li prendi da Arduino, invece (come tra l'altro è schematizzato in quella pagina nella foto di un disegno a penna, che ti riporto qui sotto) i motori vanno alimentati separatamente o al limite con la stessa alimentazione di Arduino

Quindi NON prendendola dall'uscita +5V di Arduino ma andando in parallelo all'alimentazione o, meglio, batterie separate per Arduino e motori (con il solo GND in comune).

Poi in quella pagina non ho visto un elenco dei materiali, in particolare quali transistor e quali motori usa? E quali hai usato tu? E poi dubito che con un transistorino si possa comandare in quel modo un motore (senza rischiare di danneggiare Arduino stesso), servirebbe almeno un L298n motor driver...

In generale posso consigliarti di NON prendere circuiti da sitarelli "sparsi" più o meno casalinghi, con descrizioni scarne ed informazioni mancanti, ma andare prima su qualcosa di più affidabile come Instructables ad esempio? Dove puoi trovare tanti progetti del genere, ad esempio vedi QUESTO.

Grazie per i suggerimenti.

io continuo a sostenere che se i motori sono alimentati prendendo il positivo dal pin 5V di arduino non è bello, sarebbe meglio se le batterie andassero al + e - della breadboard e da li prendessi l’alimentazione per VIn

ti ho fatto qualche modifica…

byte MOTORD = 8;
byte MOTORS = 9;
#define echoPin 2                            // Pin to receive echo pulse
#define trigPin 3

// funzione lanciata ogni 60 millisecondi per trovare ostacoli
long trovaOstacolo() {
   digitalWrite(trigPin, LOW);                   // Set the trigger pin to low for 2uS
   delayMicroseconds(2);
   digitalWrite(trigPin, HIGH);                  // Send a 10uS high to trigger ranging
   delayMicroseconds(10);
   digitalWrite(trigPin, LOW);                   // Send pin low again
   long durata = pulseIn(echoPin, HIGH);        // Read in times pulse
   return durata;
}
void setup() {
   Serial.begin(9600);
   pinMode(MOTORD, OUTPUT);
   pinMode(MOTORS, OUTPUT);
   pinMode(echoPin, INPUT);// set echopin input
   pinMode(trigPin, OUTPUT); // set pin trigger output
}
void loop() {
   long durata = trovaOstacolo();
   long distance = durata / 58;                     // Calculate distance from time of pulse
   Serial.println(distance);
   if (durata > 40) {  //oltre 40 millisec non c'è ostacolo
      digitalWrite(MOTORS, HIGH);
      digitalWrite(MOTORD, HIGH);
   } else if ((distance < 25) && (distance > 0)) { // a volte arrivano degli zeri e quelli non li devo prendere in considerazione
      digitalWrite(MOTORS, HIGH); // accendo un motore e spengo l'altro così posso girare
      digitalWrite(MOTORD, LOW);
      delay(440);                //440 +60 = i 500 di prima :-)
   }
   delay(60);                    // tra 2 letture minimo 60 millisec.
}