Go Down

Topic: "controllo" servocomando a rotazione continua  (Read 767 times) previous topic - next topic

jeshinji00

ciao ,

il mio studio di arduino continua ,e pure i miei test !! ora mi si pone un problema con un servo a rotazione continua (il servo verrà modificato fissando il potenziometro , non ho ancora capito bene se usando una resistenza avrei dei vantaggi ...indagherò ) . Il servo fa ruotare una vite senza fine .

ho 5 pulsanti ogni pulsante da al servo un'istruzione diversa (rotazione e tempo che rimane in tensione) l'idea è in base al pulsante pemuto il servo rimane sotto tensione per un tot di tempo stabilito da me ( tempo che in soldoni mi darà l'angolo che mi serve una volta fermato) , finito il tempo si arresta,  tensione 0, rimanendo fermo, premendo di nuovo lo stesso pulsante , fa ruotare il servo in senso contrario portandolo allo stato di stallo , cosi si può ripremere un'altro pulsante per eseguire un'altra operazione .

è fattibile ? esiste un metodo più facile , magari usando altrio componenti hardware?

p.s. non posso usare i normali servi in quanto la vite senza fine è fondamentale per il progetto , ho anche pensato a un motore pololu con encoder ma ho letto che non vanno d'accordo con arduino


come sempre un grosso GRAZIE !!

astrobeed

#1
May 11, 2017, 06:12 pm Last Edit: May 11, 2017, 06:13 pm by astrobeed
Se ti serve ottenere posizioni precise il servo a rotazione continua è una scelta pessima, questo perché la velocità di rotazione è un parametro molto aleatorio, fortemente legato al carico meccanico, ovvero se fai girare il servo per tot secondi in un verso e fai altrettanto nel verso opposto sicuramente si ferma con un errore di molti gradi rispetto al punto iniziale.
La soluzione è usare un motoriduttore dotato di encoder a media/bassa risoluzione, max 32 impulsi a giro, per ogni canale, se calettato direttamente sul motore, questo è possibile gestirlo con Arduino collegandolo ai due pin Int0 e Int1, esiste una libreria specifica qui.
Scientia potentia est

jeshinji00

Se ti serve ottenere posizioni precise il servo a rotazione continua è una scelta pessima, questo perché la velocità di rotazione è un parametro molto aleatorio, fortemente legato al carico meccanico, ovvero se fai girare il servo per tot secondi in un verso e fai altrettanto nel verso opposto sicuramente si ferma con un errore di molti gradi rispetto al punto iniziale.
La soluzione è usare un motoriduttore dotato di encoder a media/bassa risoluzione, max 32 impulsi a giro, per ogni canale, se calettato direttamente sul motore, questo è possibile gestirlo con Arduino collegandolo ai due pin Int0 e Int1, esiste una libreria specifica qui.
Grazie della risposta astrobeed , avendo uno spazzio minimo , sto pensando di puntare a questo :

https://www.robotstore.it/product/985/Encoder-magnetico-per-micro-motoriduttori-con-asse-posteriore-esteso-12-CPR-compatibile-HPCB-coppia.html

andrebbe bene?


nel tanto pongo un'altra domanda , il mio sistema avrà 5 servocomandi (alimentati con un dc-dc stepdown )e un encoder , quanti encoder è possibile usare con arduino?

grazie ancora

 



astrobeed

nel tanto pongo un'altra domanda , il mio sistema avrà 5 servocomandi (alimentati con un dc-dc stepdown )e un encoder , quanti encoder è possibile usare con arduino?
L'encoder va bene, attenzione che quel modello è specifico per i motori Pololu con asse posteriore, sono ottimi però costano attorno ai 18E.
Arduino Uno supporta un solo encoder se lo usi in quadratura, due Encoder se lo usi monocanale, in questo caso non puoi sapere il verso di rotazione però per il tuo specifico caso non credo sia un problema.
Per usare cinque encoder devi passare a una Mega2560 dove disponi di sei pin per l'interrupt, in questo modo puoi usare fino a sei motori con encoder monocanale, va bene anche quello a doppio canale basta che lasci scollegato A o B.
Scientia potentia est

jeshinji00

L'encoder va bene, attenzione che quel modello è specifico per i motori Pololu con asse posteriore, sono ottimi però costano attorno ai 18E.
Arduino Uno supporta un solo encoder se lo usi in quadratura, due Encoder se lo usi monocanale, in questo caso non puoi sapere il verso di rotazione però per il tuo specifico caso non credo sia un problema.
Per usare cinque encoder devi passare a una Mega2560 dove disponi di sei pin per l'interrupt, in questo modo puoi usare fino a sei motori con encoder monocanale, va bene anche quello a doppio canale basta che lasci scollegato A o B.
perfetto grazie ,vedo di procurami i pezzi .

- qua dici " in questo caso non puoi sapere il verso di rotazione " , per farla breve io premo il pulsante che aziona un servomotore portandolo a un determinato angolo e mantenendolo , allo stesso tempo (o anche dopo che il servo ha finito lo spostamento ) parte l'encoder portando una leva anch'essa a un  determinato angolo . premendo un'altreo pulsante riesegue la stessa operazione portando il tutto ad altre angolazioni programmate .


- "un solo encoder se lo usi in quadratura, due Encoder se lo usi monocanale",    ammetto che non mi sono ancora informato , perdonami ma oggi sono incasinato e la voglia di sapere è troppa , per usarlo in monolocale  intendi prima si aziona un encoder finito il processo parte l'altro? se cosi fosse potrei sostituire un servo con unì'altro pololu

aspettando i motori  in serata provo a buttare giù il codice .

ancora GRAZIE astrobeed

jeshinji00

non capendo come buttare giu il codice ho girovagato in rete e trovato questo codice (sotto) , porta l'encoder all'angolo desiderato , in pratica se ho ben capito mi basterebbe aggiungere un pulsante e stabilire i gradi che mi servono .
Non mi sono chiare molte cose , le riporto sotto :


int flag=0;    questa variabile cosa serve?
int check;     mentre questa esegue un controllo giusto?


digitalWrite(motorPin1,100); il numero 100 cosa indica ? l'angolo ?
digitalWrite(motorPin2, HIGH)


non mi sono chiare anche altre cose , ma sto cercando di capire portate pazienza



 
Code: [Select]
int motorPin1 = 8; //pin 2 of motor driver to any digital pin of arduino
int motorPin2 = 4; //pin 6 of motor driver to any digital pin of arduino
int enablePin = 9; //pin 4 of motor driver to any digital pin of arduino
int flag=0;
int check;
int encoderPinA = 3; //yellow wire of encoder to interrupt pin arduino
int encoderPinB = 2; //white wire of encoder to interrupt pin arduino
long int c = 0; //stores the count of encoder

void setup() {
  // put your setup code here, to run once:
 pinMode(motorPin1, OUTPUT);
 pinMode(motorPin2, OUTPUT);
 //pinMode(enablePin, OUTPUT);
 //set a enablePIn  high thath motor can turn ;
 digitalWrite(enablePin, HIGH);
 //end use it in the void loop
 // initalise serial comunicator at 15200 bit per second
 Serial.begin(115200);
 attachInterrupt(0,counter,CHANGE); //interrup pins must be used for encode imput
 attachInterrupt(1,counter,CHANGE);

}

void loop() {
  // put your main code here, to run repeatedly:

digitalWrite(motorPin1,100);
digitalWrite(motorPin2, HIGH);
check=1;
//if u want to rotate motor et son analogue value then use nalog write( enaloPin,analog Value);
analogWrite(enablePin,90);
{
if (flag == 0)
{
  Serial.println("motor right");
  flag=1;
}
}

if(c > 800)
{
  digitalWrite(motorPin1, HIGH);// set poin 2
  digitalWrite(motorPin2, HIGH); //set pin 6

  Serial.println("motor: stop");
  analogWrite(enablePin,0);

}

Serial.println(c);
 
}
void counter()
{
  if(check==0)
  {
    c--;
  }
else if(check==1)
{
  c++;
}
}




un grazie anticipato a chi ha voglia di spiegarmi .


Go Up