Ho costruito un robot che evita gli ostacoli e che gira a dx o sx a secondo di dove è l'ostacolo.Ho usato l' istruzione : analogWrite (5,100); , per poterlo farlo girare, ma mi serve un modo per farlo girare solo di 90 o piu gradi ! chi mi puo darmi un consiglio!
Forse se ci dai qualche info in più... :o
Il mio progetto è questo:
int r,r1,r2;
int distanza;
int duration,duration1,duration2;
void setup() {
pinMode(4,OUTPUT);
pinMode(6,OUTPUT);
pinMode(5,OUTPUT);
pinMode(10,OUTPUT);
// Echoport
pinMode(11,INPUT);
pinMode(8,INPUT);
pinMode(2, INPUT);
// Trygger
pinMode(3,OUTPUT);
pinMode(7,OUTPUT);
pinMode(1,OUTPUT);
Serial.begin( 9600 );
Serial.println( "Sensore ultrasuoni: ");
}
void loop() {
analogWrite(9,100);
analogWrite(6,108);
analogWrite(5,0);
analogWrite(10,0);
digitalWrite(3,LOW );
digitalWrite(3, HIGH );
delayMicroseconds( 10 );
digitalWrite(3, LOW );
duration = pulseIn( 2, HIGH );
r =0.034 * duration / 2;
Serial.print( "\nSensore DX durata: " );
Serial.print( duration );
Serial.print( " , " );
Serial.print( "distanza: " );
Serial.print( r );
digitalWrite(1,LOW );
digitalWrite(1, HIGH );
delayMicroseconds( 10 );
digitalWrite(1, LOW );
duration2 = pulseIn( 11, HIGH );
r2 =0.034 * duration2/ 2;
Serial.print( "\nSensore CX durata: " );
Serial.print( duration2 );
Serial.print( " , " );
Serial.print( "distanza: " );
Serial.print( r2 );
digitalWrite(7,LOW );
digitalWrite(7, HIGH );
delayMicroseconds( 10 );
digitalWrite(7, LOW );
duration1 = pulseIn( 8, HIGH );
r1 =0.034 * duration1 / 2;
Serial.print( "\nSensore SX durata: " );
Serial.print( duration1 );
Serial.print( " , " );
Serial.print( "distanza: " );
Serial.print( r1 );
Serial.println("\n");
///Gira a dx
if((r2<=20 )&&(r1<=20)&&(r>=20)){
analogWrite(6,0);
analogWrite(9,0);
delay(10);
analogWrite(5,750);
delay(10);
}else{
if((r2<=20 )&&(r1>=20)&&(r<=20)){
analogWrite(6,0);
analogWrite(9,0);
delay(10);
analogWrite(10,750);
delay(10);
}
}
delay( 300 );
}
Come potete vedere i motori sia dx che sx non girano per gradi ma per tempo. Vorrei sapere quanto tempo gli devo dare per farlo girare di 90 gradi il robottino?
O vai per tentativi o con calcoli(mi viene in mente una proporzione con l'angolo e il tempo), ma non credo sia possibile dato che la velocità dipende anche dalla carica delle batterie e dal diametro delle ruote
allora forse è meglio con i servomotori!
Oppure fai in modo di avere un voltaggio stabile e fai:
(angolo che percorre con il tempo impostato X 90)diviso il tempo impostato dal programma.
Correggetemi se ho sbagliato ma ho un po' di confusione in testa attualmente!
-Matteo-:
Oppure fai in modo di avere un voltaggio stabile e fai:
Purtroppo non è possibile sterzare di un angolo preciso senza disporre di un feedback di quanto gira la ruota.
Senza encoder sulla ruota, soluzione più semplice e poco costosa, oppure encoder sull'asse posteriore del motore, soluzione ideale ma decisamente più costosa e difficile da implementare, è impossibile far ruotare il robot di tot gradi in modo preciso e ripetibile.
In alternativa si può usare una bussola (magnetometro) per ottenere l'angolo di rotazione, però è indispensabile compensarla sul tilt e roll, ovvero serve anche una IMU 6 d.o.f., non è una cosa semplice da implementare, in interno il magnetometro risente molto dei campi magnetici dovuti alla rete 230 Vac e le masse ferrose come caloriferi e grossi elettrodomestici.
per Astrobeed : Ho gia gli encoder il ln298n!( sbaglio?).
per Matteo : spiegati meglio!
Mar52:
Ho gia gli encoder il ln298n!( sbaglio?).
Il 298 è un ponte H, non è un encoder.