Motori!

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.