Utilizzare servomotori come normali motori?

Ciao a tutti, mi hanno prestato un robottino che dovrebbe evitare i muri utilizzando 2 sensori di contatto da riprogrammare perchè non funzionante. Ho già in mente tutto il programma ma il robottino monta due servomotori (o a 360° o comunque modificati per la rotazione continua). come posso utilizzarli come due motori normali? a me non interessa dirgli:gira di tot gradi, mi serve digli:gira fino quando non ti dico di smettere...

spero di essermi spiegato, vi ringrazio anticipatamente,
Luca

Bisogna vedere come sono questi servi, ad occhio e creoce non si può dire niente...

poi se sono semplici motoriduttore ti prendi un bel L293D e sei apposto.

eh così sarebbe troppo semplice :slight_smile:
allora, sono andato a vedere e sono due servi a rotazione continua. la sigla stampata sopra è HSR-1422CR.
dai motori escono 3+3 fili che, a occhio, vanno 2+2 all'alimentazione e 1+1 a due pin di un atmega328

Prova a dare corrente sul filo rosso ed sul nero, i +5V di arduino... se inizia girare senza fermarsi sono motoriduttori o servi modificati, se si muove ma poi si ferma sono servi normali...
non trovo info a suo riguardo...

Il HSR-1422CR é un Servo per rotazione continua; percui serve l' alimentazione e massa e sul terzo pin un segnale PPM da Arduino. La programmazione la fai usando la libreria servo.h
Ciao Uwe

grazie mille a entrambi.
@uwe avevo già guardato un po' di esempi ma non ho capito molto...io mando il segnale ppm (mediante le funzioni di libreria), ma posso invertire la direzione di rotazione?

edit:

negli esempi trovo:
myservo.write(pos);
con questa riga di codice faccio ruotare il servo dell'angolo in gradi memorizzato in pos, ma rispetto alla posizione di partenza oppure a quella che il servo aveva nell'istante precedente?

Un Servo viene pilotato con un impulso di durata da 1mSec a 2mSec ogno 20mSec (50Hz).
Un segnale di 1,5mSec corrisponde a una posizione intermedia (90 gradi) oppure a stop nel caso del Servo a rotazione continua. Un segnale piú corto significa una rotazione in un verso e un segnale piú lungo alla rotazione nel altro verso.
Un segnale PWM con certi valori puó essere visto dal Servo come un segnale PPM.
Per usare un Servo in modo corretto usa la libreria servo.h Servo - Arduino Reference

Nel Tuo caso
myservo.write(0); il Tuo Servo gira in una direzione;
myservo.write(180); nell altra.
intorno 90 é fermo (devi vedere il valore giusto perché c'é un po di tolleranza).

Ciao Uwe

oook, ora faccio delle prove. grazie a tutti, sempre rapidi ed esaustivi! :slight_smile:

Luca

rieccomi qui.
allora, ho scritto lo sketch. Potreste dirmi se potrebbe funzionare o se ho commesso delgi errori nella gestione dei servi???

#include <Servo.h> 

#define leftservopin 10
#define rightservopin 11
#define leftsensorpin 9
#define rightsensorpin 12
#define FWD 180
#define BCK 0
#define STOP 90

Servo lservo;
Servo rservo;


void setup ()
{
  lservo.attach(leftservopin);
  rservo.attach(rightservopin);
  pinMode(leftsensorpin,INPUT);
  pinMode(rightsensorpin,INPUT);
}

void loop ()
{
  if(digitalRead(leftsensorpin)&&digitalRead(rightsensorpin))
  {
    lservo.write(FWD);
    rservo.write(FWD);
    delay(15);
  }
  if(!digitalRead(leftsensorpin)&&digitalRead(rightsensorpin))
  {
    lservo.write(FWD);
    rservo.write(BCK);
    delay(15);
   }
  if(digitalRead(leftsensorpin)&&!digitalRead(rightsensorpin))
  {
    rservo.write(FWD);
    lservo.write(BCK);
    delay(15);
   }
  if(!digitalRead(leftsensorpin)&&!digitalRead(rightsensorpin))
  {
    rservo.write(STOP);
    lservo.write(STOP);
    delay(15);
   }
}

grazie,
Luca

Sul mio semplice robot uso questo codice. Se non è chiaro, chiedi pure :wink:

//scritto dal BarbonS®

#include <Servo.h> 

Servo left;
Servo right;

byte leftVal;  // Variabile motori

int pos = 0;    // variable to store the servo position 
 
void setup() 
{ 
  
Serial.begin(9600);
right.attach(9);
left.attach(10);

} 
  
void loop() 
{ 
  if (Serial.available() >0) // Controllo se il buffer di ricezione contiene qualcosa
		{
		Val = Serial.read();
  


if (leftVal=='s') { //s come sinistra

left.write(180); 
right.write(180);

}

if (leftVal=='d') { //d come destra

left.write(0); 
right.write(0);

}

if (leftVal=='c') { //c come centro

left.write(90); 
right.write(91);

}

if (leftVal=='a') { //a come avanti
  
  left.write(180); 
right.write(0);
  
} 
}
}

ma allora se ti funziona, a cosa aserve il delay che c'è nel programma di esempio?

uwefed:
Un Servo viene pilotato con un impulso di durata da 1mSec a 2mSec ogno 20mSec (50Hz).
Un segnale di 1,5mSec corrisponde a una posizione intermedia (90 gradi) oppure a stop nel caso del Servo a rotazione continua. Un segnale piú corto significa una rotazione in un verso e un segnale piú lungo alla rotazione nel altro verso.
Un segnale PWM con certi valori puó essere visto dal Servo come un segnale PPM.
Per usare un Servo in modo corretto usa la libreria servo.h Servo - Arduino Reference

Nel Tuo caso
myservo.write(0); il Tuo Servo gira in una direzione;
myservo.write(180); nell altra.
intorno 90 é fermo (devi vedere il valore giusto perché c'é un po di tolleranza).

Ciao Uwe

Thanks

Il delay serve a scandire il tempo per far raggiungere la posizione che gli dici!

si ok, a quello c'ero...non capisco però perchè tu non lo utilizzi

Non lo utilizzo perchè il movimento che i servi eseguono col mio programma non è autonomo (quindi: 5 secondi avanti, 10 indietro, altri 3 avanti, etc...) ma è comandato dalla seriale (con a vai avanti, con s a sinistra, con d a destra) quindi non serve il delay.

Mi sono spiegato?

ah ok, capito, grazie :slight_smile:

Figurati