Go Down

Topic: Domanda uso servo.deatch() (Read 300 times) previous topic - next topic

salvatore_94

Jan 26, 2014, 03:22 pm Last Edit: Jan 26, 2014, 03:24 pm by salvatore_94 Reason: 1
Salve ragazzi,
stavo scrivendo uno sketch per porvare i miei servomotori e per iniziare a programmare il mio braccio robotico.
Avevo una domanda però: se utilizzo troppe volte attach() e detach(), c'è qualchè problema? nel senso, si possono rovinare i motori o arduino? oppure ci sono altri problemi?
Lo sketch è questo:
Code: [Select]
// ** Braccio robotico **

//M:includo le librerie utili
#include<Servo.h>

//M: dichiaro la costante per la pausa e per i pin dei servi
#define pausa 400
#define pin_base 3
#define pin_spalla 5
#define pin_gomito 6
#define pin_polso 9
#define pin_mano 10

//M: creo gli oggetti dei 5 servi
Servo base;   //A: servomotore alla base del braccio
Servo spalla; //A: servomotore iniziale del braccio
Servo gomito; //A: servomotore a metà braccio
Servo polso;  //A: servomotore che gira la mano
Servo mano;   //A: servomotore che apre e chiude la mano

//M: dichiaro le variabili utili


//M: dichiaro i prototipi delle funzioni e delle procedure
void azzera_braccio();
void prova_servo(Servo motore);

void setup()
{
 Serial.begin(9600);
}

void loop()
{
 int scelta;
 
 if(Serial.available())
 {
   scelta=Serial.read()-48;
   Serial.println(scelta);
   switch(scelta)
   {
     case 1: azzera_braccio(); delay(pausa); break;
     case 2: prova_servo(base, pin_base); delay(pausa); break;
     case 3: prova_servo(spalla, pin_spalla); delay(pausa); break;
     case 4: prova_servo(gomito, pin_gomito); delay(pausa); break;
     case 5: prova_servo(polso, pin_polso); delay(pausa); break;
     case 6: prova_servo(mano, pin_mano); delay(pausa); break;
   }
 }
   
}

void azzera_braccio()
{
 //M:dichiaro la variabile per la posizione dei servi
 int pos=0;
 
 delay(pausa/2);
 
 //M:posiziono i servi su pos
 base.attach(pin_base);
 base.write(pos);
 delay(pausa);
 base.detach();
 
 spalla.attach(pin_spalla);
 spalla.write(pos);
 delay(pausa);
 spalla.detach();
 
 gomito.attach(pin_gomito);
 gomito.write(pos);
 delay(pausa);
 gomito.detach();
 
 polso.attach(pin_polso);
 polso.write(pos);
 delay(pausa);
 polso.detach();
 
 mano.attach(pin_mano);
 mano.write(pos);
 delay(pausa);
 mano.detach();
 
}

void prova_servo(Servo motore, int pin)
{
//M: dichiaro la variabile pe rla posizione
int pos=0;

motore.attach(pin);

for(pos=1;pos<=180;pos++)
{
  motore.write(pos);
  delay(5);
}

motore.detach();

}


Come potete vedere ho usato varie volte attach() e detach() perchè altrimenti i servi iniziavano a vibrare e non smettevano più, se non durante il posizionamento.
Con detach e attach ho risolto questo problema, ma non avendoli mai usati, ho vari dubbi.
Grazie, Salvatore

salvatore_94

E' forse una domanda troppo stupida?  :smiley-sweat:

uwefed

Non é stupida se spiegi perche devi fare un detach().
Un detach() disattiva il segnale che riceve il servo. Dipende poi dal tipo di servo cosa fa.
Ciao Uwe

salvatore_94

Perchè se non uso detach i servi iniziano a vibrare e a fare tantissimo rumore anche se non si muovono, invece con detach non ho alcun problema

salvatore_94

Vabbè, spero non ci siano problemi  :(

icio

La maggior parte dei servo se non invii più l'impulso di comando ogni 20 mSec oppure se lo invii dopo un tempo molto superiore a 20mSec non resta fermo ma si porta in posizione di riposo che corrisponde alla posizione estrema sinistra

Go Up