Arduino - muovere 2 servo con pulsante

Ciao a tutti;
sono nuovo del forum e sto cercando di effettuare uno sketch che mi permetta di muovere due servo grazie ad un pulsante:
i servo si devono muovere contemporaneamente con delle angolazioni da definire al premere del pulsante, si preme il pulsante e i servo vanno ad un’angolazione, poi si ripreme il pulsante e i servo tornano alla posizione iniziale. Se riuscissi vorrei anche che al premere del pulsante si accenda un led e al ripremere del pulsante si rispenga il led.

questo è quello che ho scritto:

#include<Servo.h>
#define Led 13
#define Occhi 2// Il Pin del Led
#define Bottone 7
#define DTesta 9
#define STesta 10

int Valore = 0; // Valore servirà per conservare lo stato del Pin di Input
int Vecchio_Valore = 0; // Questa variabile conserva il valore precedente di "Valore"
int Stato = 0; // 0 = Led spento e 1 = Led acceso
int statoPrecedente=0;
int vel=9;
int angleUP=150;
int angleDOWN=0;

Servo servoA;
Servo servoB;

void fadeup();
void fadedown();
void openElmo ();;
void closeElmo ();

void setup()
{
pinMode(Occhi, OUTPUT);
pinMode(Led, OUTPUT); // Indica ad Arduino che Led è un Output
pinMode(Bottone, INPUT);
pinMode(DTesta, OUTPUT); // e che Pulsante è un Input
pinMode(STesta, OUTPUT); // e che Pulsante è un Input


servoA.attach(DTesta);
servoB.attach(STesta);
}

void loop()
{
Valore = digitalRead(Bottone); // Legge il valore dell'Input e lo conserva
delay(20);
if ((Valore == HIGH) && (Vecchio_Valore == LOW))  {Stato = 1 - Stato;}
Vecchio_Valore = Valore;

if (Stato == 1 && statoPrecedente!=1) {openElmo();
fadedown();}

if (Stato == 0 && statoPrecedente!=0) {closeElmo();
fadeup();}

}

void fadeup(){
int brightness=0;
int fadeamount=3;
for(brightness=0;brightness<255;brightness=brightness+fadeamount){
analogWrite(Occhi, brightness);
delay(vel);
}
if(brightness!=0){statoPrecedente=0;}
}

void fadedown(){
int brightness=255;
int fadeamount=5;
for(brightness=255;brightness>=0;brightness=brightness-fadeamount){
analogWrite(Occhi, brightness);
delay(vel);
}
if(brightness!=255){statoPrecedente=1;}
}

void openElmo(){
int i=0;
for(i=angleDOWN;i<angleUP;i+=1){
digitalWrite(Led, HIGH);
servoA.write(i);
servoB.write(i);
delay(vel);
}
if(i==angleUP){statoPrecedente=1;}
}

void closeElmo(){
int i=0;
for(i=angleUP;i>angleDOWN;i-=1){
digitalWrite(Led, LOW);
servoA.write(i);
servoB.write(i);
delay(vel);
}
if(i==angleDOWN){statoPrecedente=0;}
}

il problema è che quando premo il pulsante partono i due servo ma poi c’è sicuramente qualche errorre che fa tornare indietro i servo all’inizio senza quindi fare ciò che voglio fargli fare…
Qualcuno riesce a correggermi lo sketch o a scriverne un’altro che poi posso provare??
Grazie a tutti in anticipo

Ciao e benvenuto. I nuovi arrivati dovrebbero presentarsi sull'apposito thread prima di fare una domanda. E' una questione di cortesia ;) Ti ricordo inoltre di includere il codice usando gli appositi tag per facilitarne la lettura.

potrebbe essere un problema di corrente. Dove hai attacato l' alimentazione dei Servo? Sul Arduino? Alimenta i Servo da un alimentatore separata abbastanza potenze ( almeno 1.5A) e collega il polo negativo a GND di Arduino.

Ciao Uwe

ma secondo te lo sketch è corretto??

secondo me si, non ho trovato errori; Ma se vuoi essere sicuro fai un po di debug scrivendo in vari punti qualcosa sulla seriale oppure nei For il valore della variabile. Cosí sai in che punto si trova l'esecuzione dello sketch. Ciao Uwe

pinMode(DTesta, OUTPUT); // e che Pulsante è un Input
pinMode(STesta, OUTPUT); // e che Pulsante è un Input

Puoi toglierli, non serve dichiarare i pin come uscita se ci colleghi i servi… fa tutto la libreria.
Ciao

Il mio problema è che i due servo partono ma poi tornano indietro senza che io riprema il pulsante...poi sembra che un secondo prima di tornare all'inizio si scollegasse la corrente e poi si ricollegasse...non riesco proprio capire il motivo... Qualcuno ha qualche idea?? avete modo di provare il mio sketch per vedere meglio che cosa succede??

Sí ho un idea. Potrestri rispondere alla domanda:

potrebbe essere un problema di corrente. Dove hai attacato l' alimentazione dei Servo? Sul Arduino?

Ciao Uwe

esattamente un problema di corrente!! risolto perfettamente!!

Grazie!!

Cioa non riesco aggiungere altri 2 servo che fanno lo stesso movimento degli altri 2 aiutatemi grazie

#include<Servo.h>
#define Led 13
#define Occhi 2// Il Pin del Led
#define Bottone 7
#define DTesta 9
#define STesta 10

int Valore = 0; // Valore servirà per conservare lo stato del Pin di Input
int Vecchio_Valore = 0; // Questa variabile conserva il valore precedente di "Valore"
int Stato = 0; // 0 = Led spento e 1 = Led acceso
int statoPrecedente=0;
int vel=9;
int angleUP=150;
int angleDOWN=0;

Servo servoA;
Servo servoB;

void fadeup();
void fadedown();
void openElmo ();;
void closeElmo ();

void setup()
{
pinMode(Occhi, OUTPUT);
pinMode(Led, OUTPUT); // Indica ad Arduino che Led è un Output
pinMode(Bottone, INPUT);
pinMode(DTesta, OUTPUT); // e che Pulsante è un Input
pinMode(STesta, OUTPUT); // e che Pulsante è un Input


servoA.attach(DTesta);
servoB.attach(STesta);
}

void loop()
{
Valore = digitalRead(Bottone); // Legge il valore dell'Input e lo conserva
delay(20);
if ((Valore == HIGH) && (Vecchio_Valore == LOW))  {Stato = 1 - Stato;}
Vecchio_Valore = Valore;

if (Stato == 1 && statoPrecedente!=1) {openElmo();
fadedown();}

if (Stato == 0 && statoPrecedente!=0) {closeElmo();
fadeup();}

}

void fadeup(){
int brightness=0;
int fadeamount=3;
for(brightness=0;brightness<255;brightness=brightness+fadeamount){
analogWrite(Occhi, brightness);
delay(vel);
}
if(brightness!=0){statoPrecedente=0;}
}

void fadedown(){
int brightness=255;
int fadeamount=5;
for(brightness=255;brightness>=0;brightness=brightness-fadeamount){
analogWrite(Occhi, brightness);
delay(vel);
}
if(brightness!=255){statoPrecedente=1;}
}

void openElmo(){
int i=0;
for(i=angleDOWN;i<angleUP;i+=1){
digitalWrite(Led, HIGH);
servoA.write(i);
servoB.write(i);
delay(vel);
}
if(i==angleUP){statoPrecedente=1;}
}

void closeElmo(){
int i=0;
for(i=angleUP;i>angleDOWN;i-=1){
digitalWrite(Led, LOW);
servoA.write(i);
servoB.write(i);
delay(vel);
}
if(i==angleDOWN){statoPrecedente=0;}
}

Ciao, Chi sei Tu?

Ciao Uwe

Ciao sono Enzo vorrei realizzare elmo iroman un servo deve girare a sx e l altro a dx cosa devo aggiungere nello schema qui sopra grazie mille.

Ciao a tutti ho visto che si puo realizzare con azione vocale apri e chiudi sarebbe migliore; se qualcuno mi potrebbe aiutare grazie milleeeeee

Scordati il comando vocale. A casa con il silenzio assoluto funziona una volta su 3, pensa a tutti i rumori ambientali che hai indossando il casco magari vicino a tanta gente.
Te lo dico per esperienza personale, ho meccanizzato tanti uomini di ferro :slight_smile:

grazie di avermi risposto gentilissimo se potevi aiurtarmi per uno dei servo che si devono muovere uno a sx uno dx quali sketch devo aggiungere nell esmpio riportato qui sopra con pulsante grazie ancora