Pages: [1]   Go Down
Author Topic: Domanda uso servo.deatch()  (Read 279 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 1
Posts: 96
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
// ** 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
« Last Edit: January 26, 2014, 09:24:34 am by salvatore_94 » Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 96
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 272
Posts: 21940
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 96
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 96
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vabbè, spero non ci siano problemi  smiley-sad
Logged

Italy (Venice)
Offline Offline
Edison Member
*
Karma: 25
Posts: 1367
Quello che non c'è non si può rompere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1]   Go Up
Jump to: