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...
docdoc:
Ehm, se vai al link che ha postato trovi (quasi) tutto...
si l'ho visto
ma vorrei vedere se è stato riprodotto esattamente e il codice copiato correttamente
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
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.
}