Risparmio energetico servo

Risparmio energetico servo

Se si vuole alimentare un servo a batterie e muoverlo solo una volta ogni tanto allora conviene spegnerlo in modo che non consumi più nulla, vediamo come si fa ad attuare questo risparmio energetico.

Esempio di codice:

#include <JeeLib.h>                            //libreria risparmio energetico
#include <Servo.h>                             //libreria servo

ISR(WDT_vect) { Sleepy::watchdogEvent(); }     //imposta watchdog

Servo myservo;                                 //nome servo
int alto=2500;                                 //variabile altezza massima
int basso=500;                                 //variabile altezza minima 
int velox=2;                                   //variabile velocità
int pos=1500;                                  //variabile posizione
int pmos=8;                                    //variabile pmos al pin D8

void setup()                                   //esegue una sola volta
{
 myservo.attach(9);                            //abilito il servo al pin D9
 pinMode(pmos,OUTPUT);                         //pin D8 uscita
} 

void loop()                                    //esegue ciclicamente
{
  digitalWrite(pmos,LOW);                      //attivo il pmos
  myservo.attach(9);                           //abilito il servo al pin D9
   
   for(pos=alto; pos>=basso; pos--)            //cicla da alto a basso
   {                                
   myservo.writeMicroseconds(pos);             //muove il servo alla nuova posizione
   delay(velox);                               //aspetta 2ms
   }
  
  delay(1000);                                 //aspetta un secondo
    
   for(pos=basso; pos<=alto; pos++)            //cicla da basso ad alto
   {                                 
   myservo.writeMicroseconds(pos);             //muove il servo alla nuova posizione
   delay(velox);                               //aspetta 2ms
   }

  myservo.detach();                            //scollega il servo al D9
  pinMode(9,INPUT);                            //pin D9 ingresso
  digitalWrite(pmos,HIGH);                     //disattivo il pmos
  Sleepy::loseSomeTime(20000);                 //sleep di 20 secondi
}

Nel codice il servo viene mosso da una posizone bassa ad una alta, la posizione alta viene mantenuta per un secondo, e dopo il servo torna alla posizione bassa e ci rimane per circa 20 secondi, in questo tempo Arduino su breadboard va in sleep e il servo viene spento.

Per poter spegnere il servo bisogna eseguire questa procedura:

1)Usare il comando detach() che scollega il servo dal pin a cui è collegato, in questo caso D9

2)Va messo come input lo stesso pin a cui è collegato il servo, in questo caso D9

3)Va tolta l’alimentazione al positivo del servo tramite un p mosfet

4)Va messo in sleep il microcontrollore

Per riattivare il servo invece:

1) Si alimenta il positivo del servo tramite il pmos

2)Si attacca il servo con attach()

Nelle foto qua sotto si può vedere come il consumo totale, quindi Arduino+servo, passi da circa 60mA con entrambi attivi, a circa 7µA con microcontrollore in sleep e servo spento, di norma il solo il servo acceso da fermo consuma dai 6 ai circa 20mA, il microcontrollore da acceso circa 10mA.

Risparmio energetico servo4Risparmio energetico servo5Risparmio energetico servo6Risparmio energetico servo7Risparmio energetico servo3

Ovviamente non essendoci più l’alimentazione, il servo non avrà molta forza per mantenere la posizione, la rotazione del servo sarà infatti impedita dagli attriti fra gli ingranaggi, quelli del potenziometro e delle calamite del motore contro il traferro, inoltre una volta riattivato il mosfet ci sarà per un istante un piccolo scatto del servo.

Visto che il mosfet è un condensatore, la resistenza da 1k serve per limitare la massima corrente erogabile dal microcontrollore.

Inoltre bisogna ricordarsi di riattivare il servo prima di usarlo, un saluto e alla prossima.

I commenti sono chiusi.