Arduino per comandare due servo con i pulsanti

Alcuni appassionati di arduino mi hanno segnalato la volontà di usare arduino per comandare due servo con i pulsanti, in pratica utilizzando 3 pulsanti per ciascuno dei servo motori è possibile spostare questi ultimi nella posizione desiderata.

arduino servo pulsanti

il progetto in se non è molto complesso, devi procurarti il materiale seguente:

  • n.1 arduino uno, leonardo, mini ….
  • n.1 breadboard per le connessioni
  • n. 14 cavetti per breadboard
  • n. 6 ponticelli rigidi da breadboard, in alternativa usa 6 cavetti
  • n. 6 pulsanti NA
  • n.6 resistenze da 330ohm
  • n.2 servomotori modellistici

a questo punto assembla il tutto.

Montaggio arduino per comandare due servomotori con i pulsanti

per aiutarti nel collegamento dei cavi ho scelto di utilizzare delle foto:

arduino servo e pulsanti

posiziona i 6 pulsanti sulla breadboard collegando uno dei terminali di ogni pulsante al polo positivo di arduino ( +5v )  e l’altro terminale al polo negativo attraverso la resistenza da 330ohm:

connessione arduino servo pulsnati

ciascun cavetto che collega il pulsante ad arduino lo devi collegare sul pin del pulsante a cui hai collegato la resistenza da 330ohm, se non ti è chiaro questo passaggio puoi leggere l’articolo Tutorial: Arduino, i servo e i pulsanti

collega i pin provenienti dai pulsanti ad arduino:

arduino servo pulsanti connessioni

ho deciso di collegarli agli ingressi analogici per mostrati come si rileva un pulsante collegato all’ingresso analogico invece che al solito ingresso digitale. Avrai notato che i cavetti colorati li hai collegati ai pin A0,A1 ed A2 mentre quelli verdi ai pin A3,A4 ed A5 questa distinzione ti serve anche a capire quali pulsanti sono connessi al servomotore denominato X ( i colorati ) e quali al servo denominato Y ( i verdi ) la seguente figura può aiutarti:

arduino per comandare due servo con i pulsanti

Lo sketch del progetto

#include <Servo.h> 

#define servoPinX 10
#define servoPinY 11

Servo myservoX;
Servo myservoY;

int buttX[]    = { A0,A1,A2 };
int gradX[]   = { 0,90,180 };
int lengthX = 3;

int buttY[]    = { A3,A4,A5 };
int gradY[]   = { 0,90,180 };
int lengthY = 3;

int servoPosX = 0;
int servoPosY = 0;

void setup()
{
  myservoX.attach( servoPinX );
  myservoX.write( servoPosX );

  myservoY.attach( servoPinY );
  myservoY.write( servoPosY );

  for (int pin=0; pin<lengthX; pin++)
  {
    pinMode( buttX[pin],INPUT );
  }
  for (int pin=0; pin<lengthY; pin++)
  {
    pinMode( buttY[pin],INPUT );
  }

} 

void loop()
{
  for (int pin=0; pin<lengthX; pin++)
  {
    if ( analogRead(buttX[pin]) > 1000 ) { servoPosX = gradX[pin]; }
  }

  for (int pin=0; pin<lengthY; pin++)
  {
    if ( analogRead(buttY[pin]) > 1000 ) { servoPosY = gradY[pin]; }
  }

  myservoX.write( servoPosX );
  myservoY.write( servoPosY );
  delay( 15 );
}

partiamo dalle righe fondamentali:

linea 01: includi la classe Servo.h;

linee 03-04: definisci le due costanti servoPinX e servoPinY a cui sono connessi rispettivamente il pin di controllo;

linee 06-07: definisci due istanze dell’oggetto Servo;

linea 09: definisci un array di tipo integer i cui valori indicano i pin a cui sono collegati i pulsanti relativi al controllo del servo X;

linea 10: definisci un array di tipo integer i cui valori indicano i gradi che vuoi impostare alla pressione del pulsante corrispondente;

linea 11: imposta una variabile con la lunghezza dei due array definiti alle linee 09 e 10;

avrai notato che i due array corrispondono in numero di elementi, questo perchè userai un unico indice per entrambi in pratica alla pressione del pulsante corrispondente al pin A1 di arduino il servo si posizionerà a 90°, per A2 a 180°

linee 13-15: imposti le stesse variabili viste alle linee 09-11 per l’asse Y;

linee 17-18: imposta a 0 il valore dei gradi iniziali a cui il servo deve andare prima della pressione di un pulsante;

linee 22-23: imposta il pin a cui è connesso il servomotore X per l’istanza corrispondente e posizionlo al valore in gradi definito nella variabile servoPosX;

linee 25-26: esegui la stessa impostazione per l’istanza Y;

linee 28-31: imposta un ciclo for da 0 al valore massimo definito nella variabile lengthX e per ciascun valore di pin imposta a INPUT la modalità di funzionamento del pin corrispondente;

linee 33-35: esegui la stessa operazione vista alle linee 28-31 per i valori di Y;

linee 41-44: imposta un ciclo del tutto simile a quello impostato alla linea 28 con la differenza che per ciascun valore della variabile pin testi che il convertitore analogico-digitale di arduino ti restituisca un valore superiore a 1000. Come saprai il convertitore analogico digitale di arduino uno è a 10bit che vuol dire una risoluzione di 1024 bit da 0 a 5v, quando il pulsante è aperto il valore di tensione sul pin analogico è dato dalla corrente che transita attraverso la resistenza da 330ohm, alla pressione del pulsante al pin arriva +5v diretti ed il valore dell’ADC è di 1023 circa, per questo motivo puoi definire la condizione alla linea 43 testando che il valore analogico letto sul pin Ax ( 0 <= x < 3 ) sia superiore a 1000;

linee 46-49: imposta il ciclo visto alle linee 41-44 per la componente Y del progetto;

linee 51-52: sposta il servo alla posizione di angolo desiderata;

linea 53: attendi 15 millisecondi prima di ricominciare il loop per consentire l’eseguzione dei comandi precedenti;

Il video su come usare arduino per comandare due servo con i pulsanti

ecco il video mente testo il progetto ultimato:

Buon divertimento

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/arduino-servo-e-pulsanti.html

132 comments

Skip to comment form

    • pratelli enrico on 19 dicembre 2012 at 22:45
    • Reply

    passione elettronica tanto ,

    • paolo on 30 gennaio 2013 at 17:22
    • Reply

    ciao mauro, come posso risolvere il problema che i miei servi hanno bisogno dell’impostazione della velocità sennò non girano?
    Mi spiego meglio, ho un piccolo servo (forza 3kg) che con questo programma funziona bene, mentre con quello più grande (forza 15kg) non gira? Ho notato che se nel programma c’è l’impostazione della velocita il servo grande gira bene, mentre se non c’è non gira…
    cosa sbaglio ?
    cordiali saluti..
    a presto
    Paolo

    1. Ciao Paolo,
      che modello di servo da 15Kg stai utilizzando?

      Mauro

    • paolo on 31 gennaio 2013 at 10:52
    • Reply

    df15mg della dfrobot…

    1. Ciao Paolo,
      il servo utilizzato è il DF15 Metal Gear Servo (15kg) un normale servo analogico.
      Cosa intendi per velocità?

      Mauro

    • paolo on 31 gennaio 2013 at 15:02
    • Reply

    nel senso che, se nel programma gli viene dato il tempo in cui eseguire il movimento ( nel senso di girare più o meno veloce) gira bene, ma se gli viene fornito soltanto il grado da eseguire il servo non parte..

    1. Ciao Paolo,
      questo è normale sui servo senza grandi performance, probabilmente è il tuo caso.
      Quando impartisci un comando devi attendere che il servo possa eseguirlo prima di impartirgliene un’altro.

      Eliminando il delay alla fine dello sketch, trasferisci i comandi alla velocità di clock di arduino ed il servo non riesce ad interpretarli.

      Mauro

    • paolo on 1 febbraio 2013 at 10:25
    • Reply

    ma non l’ho eliminato il delay.. cosa può essere?
    Paolo

    1. Ciao Paolo,
      non mi è chiaro dove gli hai dato il tempo, nel mio sketch solo il delay alla fine imposta la velocità di rotazione.

      Mauro

    • paolo on 1 febbraio 2013 at 12:04
    • Reply

    Ho provato a mettere il tuo sketch, ma non funziona =( , e non riesco a capire il perchè..

    1. Ciao Paolo,
      quale sketch stavi utilizzando?
      Se mi scrivi su un articolo io immagino che stia utilizzando lo sketch che ho descritto, altrimenti non ci si capisce più nulla.

      Mauro

    • paolo on 1 febbraio 2013 at 12:22
    • Reply

    si, sto utilizzando lo sketch qui sopra descritto.. però i servi non si muovono…

    1. Nello sketch a quale velocità ti riferisci?

      Mauro

    • paolo on 1 febbraio 2013 at 12:34
    • Reply

    penso sia quello il problema, perchè i servi, si muovono solo una volta portandosi a 90°, poi anche se clicchi gli altri pulsanti non succede nulla…

    1. Mi indichi la linea di codice a cui ti riferisci per impostare la velocità?

      Mauro

    • paolo on 1 febbraio 2013 at 12:54
    • Reply

    la 53…

    Paolo

    1. Ciao Paolo,
      c’è qualcosa di non chiaro.
      Se utilizzi il mio sketch alla linea 53 c’è il delay di cui ti ho scritto e che ti ho espressamente detto di non togliere spiegandotene il motivo, vedi sopra.
      Se togli la linea 53 e non funziona è chiaro il motivo, leggi sopra.

      Mauro

    • paolo on 1 febbraio 2013 at 14:42
    • Reply

    lo so, ma infatti non l’ho tolto..
    Paolo

    • paolo on 1 febbraio 2013 at 18:42
    • Reply

    finalmente ho risolto il problema, ho dovuto modificare il programma cosi:
    #include

    #define servoPinX 10
    #define servoPinY 11

    Servo myservoX;
    Servo myservoY;

    int buttX[] = { A0,A1,A2 };
    int gradX[] = { 20,90,150 };
    int lengthX = 3;

    int buttY[] = { A3,A4,A5 };
    int gradY[] = { 20,90,150 };
    int lengthY = 3;

    int servoPosX = 0;
    int servoPosY = 0;

    void setup()
    {
    myservoX.attach( servoPinX );
    myservoX.write( servoPosX );

    myservoY.attach( servoPinY );
    myservoY.write( servoPosY );

    for (int pin=0; pin<lengthX; pin++)
    {
    pinMode( buttX[pin],INPUT );
    }
    for (int pin=0; pin<lengthY; pin++)
    {
    pinMode( buttY[pin],INPUT );
    }

    }

    void loop()
    {
    for (int pin=0; pin 1000 ) { servoPosX = gradX[pin]; }
    }

    for (int pin=0; pin 1000 ) { servoPosY = gradY[pin]; }
    }

    myservoX.write( servoPosX );
    myservoY.write( servoPosY );
    delay( 15 );
    }
    grazie mille per il tuo aiuto
    Paolo

    1. Ciao Paolo,
      sono contento tu abbia risolto.
      A cosa servono i due cicli for nella loop()?
      In che punto leggi i pulsanti per impartire i comandi ai servo?

      Mauro

    • paolo on 2 febbraio 2013 at 15:57
    • Reply

    servono a verificare se è stato premuto il pulsante, ma io non ho modificato quello, ma i gradi, che evidentemente scritti troppo precisi per il servo che ho non andavano bene…
    Paolo

    1. OK, ho riguardato lo sketch, nel copia e incolla sul commento si sono persi dei pezzi che rendevano il codice apparentemente errato.
      Lo sketch dell’articolo è giusto.

      Mauro

    • oliver on 14 marzo 2013 at 16:30
    • Reply

    ciao,
    Volevo chiederti se potresti fare un tutorial o spiegarmi come comandare arduino con un telecomando modellistico, in pratica io vorrei poter dire ad arduino con un interruttore del telecomando quando far partire il programma che farà poi muovere due servi .
    Grazie Oliver

    1. Ciao Oliver,
      interessante spunto.
      Mi sai dire la frequenza di uscita del segnale sulla ricevente quando muovi l’interruttore?

      Mauro

        • oliver on 14 marzo 2013 at 18:04
        • Reply

        trovato , ha una frequenza fissa di 50hz e un duty cicle che varia tra 1000 e 2000 us

        1. Ciao Oliver,
          questo é il dato giusto.
          Purtroppo tutte le riceventi per modellismo lavorano su questo duty cicle, ti consiglio di leggere il mio articolo sul rover5 che si guida con iPad e comprende come puoi misurare il livello di segnale a interruttore off ed on, a quel punto sará per te un gioco da ragazzi impostare il programma.

          Mauro

            • oliver on 14 marzo 2013 at 20:14

            ho guardato vari tutorial sul rover5, ma non trovo quello dove parli della misura del segnale

          1. Ciao Oliver,
            hai già leggo questo articolo ?
            http://www.mauroalfieri.it/elettronica/wirc-collegalo-ad-arduino.html

            Contiene tutte le informazioni di cui hai bisogno.

            Mauro

    • oliver on 15 marzo 2013 at 08:55
    • Reply

    Grazie , mi sono chiarito molte cose, non ho capito dove dovrei collegare il pin del segnale del ricevitore ad Arduino .
    Ho visto in altri tuttorial che chiedevi quale fosse il programma per simulare i crcuiti con Arduino, si chiama fritzing

    1. Ciao Oliver,
      grazie per la info, da un po di tepo l’ho scoperto ed ho iniziato ad usarlo.
      Trovo Fritzing molto comodo 🙂

      Il tuo ricevitore dovrebbe avere una contattiera in cui inserire i servo, devi collegare il pin segnale corrispondente al servo al pin arduino su cui leggi, scegli tu quale.
      Ricorda che il pin del segnale lato ricevitore deve essere quello del canale che riceve informazioni dall’interruttore.

      Mauro

        • oliver on 15 marzo 2013 at 17:11
        • Reply

        io ho provato ad usare il programma che hai messo nel tutorial che mi hai linkato, da quel che ho capito dovrebbe far funzionare il servo nello stesso modo di come muovo lo stick della radio ???

        Penso che a me serva qualcosa di molto più semplice , io ho questo programma :

        #include

        Servo sportelli;
        Servo pinna;

        int pos = 0;

        void setup()
        {
        sportelli.attach(9);
        pinna.attach(10);
        }

        void loop()
        {
        for(pos = 0; pos < 180; pos += 5) //apre gli sportelli
        {
        sportelli.write(pos);
        delay(15);
        }
        delay(1000); //aspetta 1 secondi

        for(pos = 0; pos =1; pos-=5) //chiude gli sportelli
        {
        sportelli.write(pos);
        delay(15);
        }
        delay(10000); //aspetta 10 secondi

        seconda parte :

        for(pos = 0; pos =1; pos-=1) //chiude la pinna
        {
        pinna.write(pos);
        delay(15);
        }
        delay(1000); //aspetta 1 secondi che la pinna rientri

        for(pos = 180; pos>=1; pos-=5) //chiude gli sportelli
        {
        sportelli.write(pos);
        delay(15);
        }

        delay(10000);

        }

        e ho bisogno che quando l’ interruttore è in una posizione fa partire la prima parte del programma e quando è nel altra fa partire la seconda parte .
        Forse con la domanda di comandare un servo con un interruttore sono partito sbagliato…
        Grazie Oliver

        1. Ciao Oliver,
          ti ho consigliato questo sketch perché tu possa utilizzarlo per capire che tipo di segnale esce dalla tua ricevente quando sposti l’interruttore.
          Poi potrai applicare quei valori al tuo sketch.
          Leggi attentamente il mio articolo e scoprirai cosa puoi dare con quello sketch.

          Mauro

    • mirco on 2 aprile 2013 at 13:08
    • Reply

    sono nuovissimo con arduino e ti sto seguendo su tutto adesso stavo facendo un progetto (modificando uno tuo ) pero non so come risolverlo allora io sto cercando di fare con un arduino uno comandare due servo motori GS-9018 con un unico pulsante e che vadano da grado 38 a grado 180 io utilizzo il tuo sketch
    controllin a servo position using two buotton e lo modificato con i gradi che mi servono:
    #include

    Servo myservo;

    int grado = 38;
    int minGrad = 38;
    int maxGrad = 180;
    int pinServo = 3;
    int prev = A1;
    int next = A0;

    void setup()
    {
    myservo.attach( pinServo );
    myservo.write( grado );

    pinMode( prev, INPUT );
    pinMode( next, INPUT );
    }

    void loop()
    {
    if ( analogRead( prev ) > 1000 ) { grado–; }
    if ( analogRead( next ) > 1000 ) { grado++; }

    if ( grado > maxGrad ) { grado = maxGrad; }
    if ( grado < minGrad ) { grado = minGrad; }

    myservo.write( grado );
    delay(1);
    }

    xo cosi vengono comandati da due pulsanti uno che apre e uno che chiude volevo chiederti come posso fare per usare un solo pulsante in apertura e chiusura?
    poi domanda banale per alimentare l'arduino uno dove mi posso collegare?quanti volto servono?
    grazie mille in anticipo

    1. Ciao Mirco,
      lo sketch che stai utilizzando ti permette di incrementare e decrementare i gradi del servo da 38-180-30 in base al pulsante che premi.
      Se lo sostituissi con uno solo non comprendo come vorresti che si muovesse, da 38 a 180 e poi al contrario fino a quando il pulsante resta premuto?
      O vuoi che premendo una volta il servo vada a 180° e ripremendolo torni a 38° ?

      Per alimentare Arduino puoi usare un alimentatore stabilizzato da 9/12v, o una pila da 9v, il problema possono essere i due servo che potrebbero richiedere un’alimentazione esterna a 6v.

      Mauro

  1. potresti dirmi se questo sketch per 6 servo e 12 pulsanti (2 per uno) è giusto? se no potresti scrivermene uno tu ??? sono disperato!! 🙁

    #include

    #define servoPinX 10
    #define servoPinY 11

    #define servoPinX 10
    #define servoPinY 11

    #define servoPinX 10
    #define servoPinY 11

    Servo myservoX;
    Servo myservoY;

    Servo myservoX;
    Servo myservoY;

    Servo myservoX;
    Servo myservoY;

    int buttX[] = { A0,A1,A2 };
    int gradX[] = { 0,90,180 };
    int lengthX = 3;

    int buttY[] = { A3,A4,A5 };
    int gradY[] = { 0,90,180 };
    int lengthY = 3;

    int buttX[] = { A0,A1,A2 };
    int gradX[] = { 0,90,180 };
    int lengthX = 3;

    int buttY[] = { A3,A4,A5 };
    int gradY[] = { 0,90,180 };
    int lengthY = 3;

    int buttX[] = { A0,A1,A2 };
    int gradX[] = { 0,90,180 };
    int lengthX = 3;

    int buttY[] = { A3,A4,A5 };
    int gradY[] = { 0,90,180 };
    int lengthY = 3;

    int servoPosX = 0;
    int servoPosY = 0;

    int servoPosX = 0;
    int servoPosY = 0;

    int servoPosX = 0;
    int servoPosY = 0;

    void setup()
    {
    myservoX.attach( servoPinX );
    myservoX.write( servoPosX )

    myservoY.attach( servoPinY );
    myservoY.write( servoPosY );

    myservoX.attach( servoPinX );
    myservoX.write( servoPosX )

    myservoY.attach( servoPinY );
    myservoY.write( servoPosY );

    myservoX.attach( servoPinX );
    myservoX.write( servoPosX )

    myservoY.attach( servoPinY );
    myservoY.write( servoPosY );

    for (int pin=0; pin<lengthX; pin++)
    {
    pinMode( buttX[pin],INPUT );
    }
    for (int pin=0; pin<lengthY; pin++)
    {
    pinMode( buttY[pin],INPUT );
    }
    for (int pin=0; pin<lengthX; pin++)
    {
    pinMode( buttX[pin],INPUT );
    }
    for (int pin=0; pin<lengthY; pin++)
    {
    pinMode( buttY[pin],INPUT );
    }
    for (int pin=0; pin<lengthX; pin++)
    {
    pinMode( buttX[pin],INPUT );
    }
    for (int pin=0; pin<lengthY; pin++)
    {
    pinMode( buttY[pin],INPUT );
    }
    }

    void loop()
    {
    for (int pin=0; pin 1000 ) { servoPosX = gradX[pin]; }
    }

    for (int pin=0; pin 1000 ) { servoPosY = gradY[pin]; }
    for (int pin=0; pin 1000 ) { servoPosX = gradX[pin]; }
    }

    for (int pin=0; pin 1000 ) { servoPosY = gradY[pin]; }
    for (int pin=0; pin 1000 ) { servoPosX = gradX[pin]; }
    }

    for (int pin=0; pin 1000 ) { servoPosY = gradY[pin]; }
    }

    myservoX.write( servoPosX );
    myservoY.write( servoPosY );
    myservoX.write( servoPosX );
    myservoY.write( servoPosY );
    myservoX.write( servoPosX );
    myservoY.write( servoPosY );
    delay( 15 );
    }

    1. Ciao Dario,
      spesso mi sopravvalutate, non sono in grado di leggere uni sketch e verificare come si comporta.
      Il bello di Arduino è che sperimenti, sperimenti e sperimenti e ottieni quello che vuoi.

      Se mi dici cosa vuoi ottenere io posso darti qualche dritta, più preciso sarai nella descrizione più preciso potrò essere sulla soluzione.

      Se desideri che scriva io uno sketch su commissione ci posso pensare, tuttavia ho necessità di conoscere i particolari del progetto.

      Mauro

    • dario on 24 maggio 2013 at 15:33
    • Reply

    L’idea era di realizzare un braccio robotico muovendo le sezioni con dei servi collegati a dei pulsanti ( volevo usare 6 servi e 2 pulsanti ciascuno)
    nei tuoi video, che ho trovato altamente istruttivi ,spieghi come muovere un servo con dei pulsanti
    (http://www.mauroalfieri.it/elettronica/tutorial-arduino-i-servo-e-i-pulsanti.html)
    vorrei fare la stessa cosa ma utilizzando sei servomotori al posto di uno solo (come nel link)
    il mio problema non è il montaggio hardware poichè ho imparato dal tuo video , oggetto di questa discussione , ma bensì la programmazione dello sketch tramite arduino
    detto questo mi scuso per il disturbo e ti chiedo se potresti mandarmi in risposta uno sketch che soddisfi le condizioni prima citate
    grazie in anticipo.

    1. Ciao Dario,
      dalla tua spiegazione comprendo che si tratta di un tuo esperimento, correggimi se sbaglio, non di un lavoro.
      In tal caso ti invito a studiare i miei tutorial gratuiti per capire come scrivere il tuo sketch.

      Siccome avrai molti pulsanti, considerando 6 servo, saranno almeno 12 ed i pin di arduino potrebbero non bastarti ti propongo di valutare una scheda joystick tipo questa: http://www.mauroalfieri.it/elettronica/joystick-per-arduino-input-shield.html
      che renderebbe più interessante anche il tipo di controllo.

      Mauro

    • dario on 24 maggio 2013 at 16:42
    • Reply

    mi sono dimenticato di precisare che il movimento che i servo devono compiere è di 5 o massimo 10 gradi per ogni volta che si schiaccia il pulsante
    inoltre tenendo premuto un pulsante dovrebbe continuare a girare in senso orario o antiorario

    1. Ciao Dario,
      vedi risposta sopra.

      Mauro

    • dario on 24 maggio 2013 at 17:53
    • Reply

    grazie dell’informazione , è stata utile
    guarderò i tutorial per capire come scrivere lo sketch
    grazie ancora

    • dario on 24 maggio 2013 at 18:54
    • Reply

    spero di non disturbarti ulteriormente ma vorrei che tu rispondessi alla seguente domanda :
    nella parte di sketch ove sono rappresentati i caratteri A1 A2 A3 eccetera potresti spiegarmi come vanno collegati ad arduino?
    poichè usando 6 servo a1 a2 a3 fino ad a5 si ripetono 2 volte
    è un problema o è indifferente e non influisce sul progetto ?
    es:
    int buttA[] = { A0,A1,A2 };
    int gradA[] = { 0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180 };
    int lengthA = 3;

    int buttB[] = { A3,A4,A5 };
    int gradB[] = { 0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180 };
    int lengthB = 3;

    int buttC[] = { A0,A1,A2 };
    int gradC[] = { 0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180 };
    int lengthC = 3;

    int buttD[] = { A3,A4,A5 };
    int gradD[] = { 0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180 };
    int lengthD = 3;

    int buttE[] = { A0,A1,A2 };
    int gradE[] = { 0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180 };
    int lengthE = 3;

    int buttF[] = { A3,A4,A5 };
    int gradF[] = { 0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180 };
    int lengthF = 3;

    1. Ciao Dario,
      non ho capito cosa mi hai chiesto, perdonami devi essere più chiaro.
      Ti chiedo di non inserire parti di sketch nei commenti xchè si leggono male e non posso capire cosa fanno solo leggendoli.

      Quello che leggo é confusione, probabilmente sei partito dall’esempio sbagliato o troppo complesso per quello che vuoi realizzare.

      Parti dai primi articoli del corso arduino on-line e man mano troverai come scrivere lo sketch.

      Mauro

    • dario on 24 maggio 2013 at 22:07
    • Reply

    non vorrei essere insistente ne sembrare ossessivo ma ti chiedo se per favore potresti scrivermi uno sketch che faccia eseguire a sei servomotori le stesse operazioni che svolge il tuo in questo video
    http://www.mauroalfieri.it/elettronica/tutorial-arduino-i-servo-e-i-pulsanti.html

    p.s. volevo chiarire che sono nuovo in questo campo poichè ho solo 14 anni
    ma visto che frequento l’itis di crema ho una piccola preparazione in materia

    ti ringrazio sia tu voglia mettere a mia disposizione lo sketch sia il contrario
    grazie
    Dario

    1. Ciao Dario,
      sei un ragazzo certamente in gamba, e la tua giovane età ti da l’entusiasmo e la carica che dimostri quando i scrivi.

      Non voglio scriverti io lo sketch perché mio padre mi ha insegnato, quando avevo soli 10anni, che se un esperimento lo realizzi con le tue forze sarai super soddisfatto se te lo realizza qualcun’altro é solo un gioco passeggero e deludente.

      Io ti voglio aiutare nel tuo progetto, solo lo farò non scrivendo ti il codice me dando ti gli spunti per imparare a fare non solo questo progetto ma tutti quelli ha vorrai.

      Ti va?

      Mauro

    • dario on 25 maggio 2013 at 13:02
    • Reply

    sono rimasto colpito dalle tue parole e mi sono stupito per la veridicità di esse
    hai ragione , sto sperimentando vari sketch e sto raggiungendo il mio scopo , l’unico problema sono i pin analogici poichè me ne servirebbero 12 ma sono solamente 6
    ho dato un ‘ occhiata all’espansione che mi hai consigliato ma credo che non sia la soluzione migliore
    anche perchè applicando il joystick lo sketch diventerebbe piu complicato
    se sei a conoscenza di qualche altro metodo potresti informarmi?
    grazie in anticipo

    1. Ciao Dario,
      ci sono molte tecniche che puoi utilizzare, ti suggerisco i primi due c’è mi vengono in mente:

      1. la Keypad LCD, se leggi l’articolo, troverai che con un solo pin controlla 5 pulsanti e lo fa con delle resistenze in serie ai pulsanti, lato sketch ogni pulsante ti da un valore differente;

      2. puoi usare anche i pin digitali per collegare i pulsanti, in tal caso li leggi come digitalRead ed il valore potrà essere LOW o HIGH dipende da come li colleghi al positivo e negativo.

      Mauro

    1. Ciao Dario,
      non vedo l’immagine, per quale parte del progetto intendevi utilizzarlo?

      Mauro

    • dario on 27 maggio 2013 at 15:21
    • Reply

    volevo utilizzare uno sdoppiatore di pin per aumentare quelli di arduino da 6 a 12
    così potrò procedere con il progetto senza molti intoppi

    1. Ciao Dario,
      non vedo l’immagine del prodotto, ma considerata la descrizione é solo un cavo per sdoppiare l’alimentazione nulla che possa essere usato come vuoi tu.

      Mauro

    • dario on 28 maggio 2013 at 17:13
    • Reply

    avrdude: stk500_getsync(): not in sync: resp=0x30
    mi esce questo errore quando carico lo sketch su arduino
    cosa posso fare

    1. Ciao Dario,
      è un errore di comunicazione, prova a verificare che l’esempio blink funzioni 🙂

      Mauro

    • dario on 28 maggio 2013 at 18:03
    • Reply

    collego tutto come nell’esempio ma non funziona niente

    1. Ciao Dario,
      se hai lo stesso errore che mi hai detto sopra è normale che non funzioni nulla, non hai trasferito lo sketch ad Arduino.

      Mauro

    • dario on 28 maggio 2013 at 19:50
    • Reply

    stesso errore e adesso arduino non segnala la luce tipica verde di quando è acceso

    1. Ciao Dario,
      potrebbe essere un errore di installazione dell’IDE, un collegamento errato dell’arduino o il computer che non riconosce Arduino.

      Mauro

    • dario on 28 maggio 2013 at 20:41
    • Reply

    ho risolto il problema delle lucine ma l’errore che non mi fa caricare lo sketch sul componente hardware persiste
    come lo risolvo?

    1. Ciao Dario,
      lo risolvi analizzando il problema passo-passo:
      – controlla la connessione pc-arduino;
      – controlla che il driver sia installato;
      – controlla che il pc veda arduino;
      – ecc..

      Mauro

    • dario on 28 maggio 2013 at 21:12
    • Reply

    risolti tutti gli errori ma i servo non si muovono di un millimetro
    ho collegato come nello schema
    potresti fare un video tutorial, mi servirebbe di questa tua recensione .
    http://www.mauroalfieri.it/elettronica/tutorial-arduino-i-servo-e-i-pulsanti.html

    1. Ciao Dario,
      bene per gli errori.
      Siccome sei alle prime armi ti consigli di iniziare a leggere il mio corso on-line e man mano provare gli esperimenti.
      Vedrai che sarai in grado di comprendere i tuoi errori ed i collegamenti e di farne di nuovi.

      Mauro

    • dario on 29 maggio 2013 at 21:02
    • Reply

    ho ascoltato il tuo consiglio risultato :
    ho imparato molte cose nuove e dopo tanti tentativi sono riuscito a assemblare la parte elettronica del progetto quindi prevedo che entro due giorni riuscirò a completare il braccio meccanico e vedrò di migliorarlo in futuro.

    Dario

    1. Grande Dario,
      mi fa estremamente piacere e sono pronto a ricevere foto,testi,schemi e video del progetto se vorrai condividerli sul blog con altri appassionati.

      Mauro

    • dario on 30 maggio 2013 at 15:42
    • Reply

    anche seguendo il corso on line ho avuto un problema con i pin digitali
    lo sketch è giusto :

    #include

    Servo myservo; // create servo object

    int grado = 0;
    int minGrad = 0;
    int maxGrad = 180;
    int pinServo = 3;
    int low = 4 ;
    int high = 2;

    void setup()
    {
    myservo.attach( pinServo );
    myservo.write( grado );

    pinMode( low, INPUT );
    pinMode( high, INPUT );
    }

    void loop()
    {
    if ( digitalRead( LOW ) > 1000 ) { grado–; }
    if ( digitalRead( HIGH ) > 1000 ) { grado++; }

    if ( grado > maxGrad ) { grado = maxGrad; }
    if ( grado < minGrad ) { grado = minGrad; }

    myservo.write( grado );
    delay(15);
    }

    ma nonostante questo non funziona il servo
    i cavetti dei relativi pin digitali sono collegati ad un'estremità del pulsante come fossero analogici
    sbaglio forse quello?

    1. Ciao Dario,
      sei certo di aver seguito il corso?
      Probabilmente hai prestato poca attenzione, penso di non aver mai scritto una linea del tipo:

      if ( digitalRead( LOW ) > 1000 ) { grado–; }

      in quanto profondamente errata.
      Credimi sarebbe per me più facile scriverti lo sketch ma preferisco che tu provi a impegnarti, se vuoi imparare qualcosa, e correggere da solo l’enorme errore, ti consiglio di guardare il manuale arduino, che sempre dovrebbe essere di riferimento per tutti, anche io lo consulto prima di scrivere u comando: http://arduino.cc/en/Reference/DigitalRead

      Per il collegamento elettrico, da quello che scrivi è corretto.
      Mauro

    • dario on 30 maggio 2013 at 20:13
    • Reply

    non riesco a trovare l’errore
    ti chiedo se gentilmente potresti indicarmelo ed io provvederò a sistemare lo sketch
    Dario

    1. Ciao Dario,
      non so come aiutarti, ti ho indicato la linea di errore nel precedente commento e anche dove leggere la correzione.

      Mauro

    • dario on 31 maggio 2013 at 17:16
    • Reply

    ho corretto cosi ma nessun risultato
    #include

    Servo myservo;

    int grado = 0;
    int minGrad = 0;
    int maxGrad = 180;
    int servoPin = 13;
    int inPin = 7;
    int newPin = 2;
    int val = 0;

    void setup()
    {
    myservo.attach( servoPin );
    myservo.write( grado );

    pinMode(inPin, INPUT);
    pinMode(newPin, INPUT);
    }

    void loop()
    {
    if ( digitalRead( inPin ) > 1000 ) { grado–; }
    if ( digitalRead( newPin ) > 1000 ) { grado++; }

    if ( grado > maxGrad ) { grado = maxGrad; }
    if ( grado < minGrad ) { grado = minGrad; }

    myservo.write( grado );
    delay(15);

    val = digitalRead(inPin);
    digitalWrite(servoPin, val);

    val = digitalRead(newPin);
    digitalWrite(servoPin, val);
    }

    1. Ciao Dario,
      non stai seguendo nessuna delle mie guide e neppure il manuale arduino.
      Stai tentando a caso di farcela.

      L’impegno e la lettura dei documenti è la prima regola in questa passione per riuscire.

      Mauro

    • dario on 3 giugno 2013 at 15:33
    • Reply

    spero di non averti dato troppa noia con le mie assillanti richieste, ma , ancora una volta , grazie a te , ho raggiunto il mio obbiettivo!!!
    ora posso collegare fino a 6 servo con 2 pulsanti ciascuno !
    non ti ringrazierò mai abbastanza per le tue dritte ed i tuoi consigli ma…

    grazie mille!!! 🙂 🙂

    1. Ciao Dario,
      i tuoi ringraziamenti sono sufficienti e sono certo che la soddisfazione che provi nell’avercela fatta sia incredibile.
      Se ti va di pubblicare i tuoi successi sono disponibile a farlo e lo ritengo impareggiabile ringraziamento perché l’ultimo passo è condividere le proprie idee e progetti.

      Mauro

    • dario on 5 giugno 2013 at 14:48
    • Reply

    ciao Mauro
    questa volta volevo chiederti se puoi spiegarmi o postarmi un link su come controllare tramite pc un servomotore

    Dario

    1. Ciao Dario,
      non comprendo cosa tu voglia fare, dovresti essere più chiaro esistono mille modi di fare quello che vuoi ed ognuno ha delle caratteristiche e delle difficoltà differenti.

      Mauro

    • dario on 5 giugno 2013 at 18:23
    • Reply

    una volta constatato che il braccio meccanico può essere mosso da dei servomotori i quali si muovono tramite dei pulsanti (decrementando e incrementando il grado) mi piacerebbe muovere ogni singolo servomotore ,indipendentemente, dal mio computer senza utilizzare cavi (non pretendo un raggio d’azione di chilometri anche se sarebbe bello , ma mi accontento tra virgolette di 60 / 100 metri oppure il massimo che mi sai consigliare, poichè non voglio sparare numeri astronomici a caso 🙂 )
    in poche parole fare le stesse cose che faceva prima utilizzando i pulsanti solo che ora , per esempio , schiacciando la lettera “A” incrementi il grado di un servo e schiacciando la lettera “B” decrementi il grado.

    Spero di essermi chiarito bene
    grazie in anticipo 🙂

    1. Ciao Dario,
      bel progetto io lo affronterei con gli Xbee che funzionano come seriali e sono semplici da configurare, purtroppo non ho un tutorial sugli Xbee da suggerirti.

      Mauro

    • Emanuele on 7 giugno 2013 at 13:30
    • Reply

    Ciao Mauro,
    ora ti scrivo lo sketch che sto cercando di completare per far funzionare due servo contemporaneamente con l’utilizzo di un pulsante…i problemi che mi sorgono sono: -si muove un solo serve e non tutti e due;
    – dopo un pò che non schiaccio il pulsante l’unico servo che si muove parte da solo…
    Non riesco a trovare l’inghippo…
    Spero potrai essermi di aiuto =)

    #include
    #define Led 13
    #define Occhi 2// Il Pin del Led
    #define Polsiera 7
    #define Testa 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=20;
    int angleUP=100;
    int angleDOWN=5;

    Servo servo;

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

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

    servo.attach(STesta);
    servo.attach(Testa);
    }

    void loop()
    {
    Valore = digitalRead(Polsiera); // 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=0;brightness=brightness-fadeamount){
    analogWrite(Occhi, brightness);
    delay(vel);
    }
    if(brightness!=255){statoPrecedente=1;}
    }

    void openElmo(){
    int i=0;
    for(i=angleDOWN;iangleDOWN;i-=1){
    digitalWrite(Led, LOW);
    servo.write(i);
    delay(vel);
    }
    if(i==angleDOWN){statoPrecedente=0;}
    }

    1. Ciao Emanuele,
      ci sono diversi errori nello sketch:

      1. se usi 2 servo non puoi chiamarli tutti e due servo ma servo A e servoB, leggi gli articoli in cui lavoro con più servo;
      2. nella funzione openElmo mancao delle info nel for, forse dovuti al copia e incolla, come avrai letto chiedo di non postare codici xchè tanto arrivano illegibili.
      3. il problema del servo che parte a caso potrebbe essere dovuto ad uno di questi errori od ad un collegaento elettrico non fermo, il calssico falsocontatto.

      Prova nella setup() a inserire un digitalWrite(Testa,LOW) e lo stesso per sTesta.

      Mauro

        • Emanuele on 8 giugno 2013 at 01:41
        • Reply

        Ciao Mauro

        Oggi sono ripartito da zero e ho provato a scrivere un’altro sketch ma ho ancora toppato….
        non riesco ad arrivare ad una fine…sicuramente per te srivere una sketch del genere sarà una passeggiata…non è che puoi darmi delle dritte? sto cercando di non arrendermi ma è ormai parecchio tempo che non riesco =(.
        Grazie

        1. Ciao Emanuele,
          ti ho dato tutte le dritte necessarie a sistemare il tuo precedente sketch, ti ho evidenziato gli errori e detto come correggerli.

          Come ti ho scritto realizzò sketch su commissione quando sono progetti complessi ma in questo caso ci vuole solo un po’ di buona volontà.

          Mauro

            • Emanuele on 8 giugno 2013 at 10:36

            Ciao Mauro,
            le correzioni che mi avevi dato nell sketch ho provato a farle ma niente…sono rimasto con lo stesso problema…
            A questo punto anche se per te è una baggianata mi chiedo se magari quando hai qualche minuto libero riuscissi a compilarmi una sketch…te lo chiedo semplicemente perchè sono bloccato e non posso andare avanti nel mio progetto..
            Se vorrai aiutarmi poi ti darò tutte le informazioni necessarie, altrimenti ti ringrazio lostesso per la pazienza che hai avuto fino ad adesso .

            Emanuele

          1. Ciao Emanuele,
            Io voglio aiutarti, ma non é scrivendo lo sketch al tuo posto c’è ci riuscirò e sopratutto ne imparerai a continuare con questa passione.

            Hai seguito alla lettera i miei consigli? Hai creato due istanze servo?
            Già solo questo doveva far migliorare il funzionamento del tuo progetto.

            Hai definito le due istanze nel ciclo for in modo corretto?

            Inoltre, una banalità, hai pensato di collegare tutti e due i servo allo stesso pin?

            Mauro

    • dario on 9 giugno 2013 at 11:23
    • Reply

    ciao Mauro ,
    avrei una domanda davvero banale da farti :
    i motori passo passo hanno un numero limitato di giri da compiere?
    per esempio: tenendo premuto un pulsante per farlo girare in senso antiorario si fermerà dopo una rotazione di 360°?
    oppure può compiere “infiniti giri”?

    grazie Dario

    1. Ciao Dario,
      possono compiere infiniti giri.

      Mauro

    • Emanuele on 10 giugno 2013 at 00:25
    • Reply

    Ciao Mauro,
    ho fatto delle correzioni creando due instanze per i due servo ed adesso si muovovo in contemporanea…poi però adesso sorge un’altro problema…il fatto che i servo partono e fin li tutto ok…poi arrivati a metà del lorotragitto di andata si bloccano e sembra come se si staccasse l’alimentazione per un’instante e poi tornasse e i servo se ne tornano al punto di partenza senza motivo… non riesco a capire quale sia il problema…penso che il problema si ancora nello sketch…
    Non ho inserito, come consigliavi tu, le due instanze dei servo nel ciclo del for perchè non sapevo come inserirle…
    Vorrei sottoporti a controllo lo sketch ma considerando, come dici tu, gli errori del copia e incolla non so come mandartelo…mi farebbe piacere se riuscissi a provarlo e vedere tu stesso quale problema esce fuori…

    Grazie
    Emanuele

      • Emanuele on 10 giugno 2013 at 13:27
      • Reply

      Ciao Mauro,
      visto che non hai risposto subito io sto continuando a fare delle prove…
      Ho notato che se collego un solo servo tutto funziona correttamente mentre poi quando metto anche il secondo poi non va più come prima…a questo punto mi sono posto una domanda… ma se il problema sorge dall’alimentazione?? potrebbe non bastare l’alimentazione da usb di arduino per i due servo?? potrebbe essere questo il mio problema??

      Emanuele

      1. Ciao Emanuele,
        sono contento che tu stia provando e riprovando.
        Da quello che scrivi il problema sembra esattamente quello che hai individuato 🙂
        Alimenta i servo in modo indipendente da Arduino, trovi degli articoli sui servo in cui ti mostro come fare.

        Attenzione: collegare carichi eccessivi su arduino può rovinarti la porta Usb del Pc.

        Mauro

    1. Ciao Emanuele,
      sicuramente l’errore è nello sketch.
      Ti invito a leggere gli articoli sui servo e provare, se te lo risolvo io perdi tutto il divertimento.

      Mauro

    • dario on 10 giugno 2013 at 11:53
    • Reply

    Ciao Mauro,
    quest’oggi volevo che tu mi dessi un consiglio oppure mi indirizzassi su qualche sito ove viene spiegato come connettere dei sensori di flessione a dei servomotori .
    il tutto fatto a distanza tramite moduli xbee .
    pensavo a qualcosa del genere:
    http://buzzlough.com/2012/12/costruire-una-mano-robotica/

    quindi tramite un guanto e dei sensori di flessione comunicare ai servo (tramite xbee) di quanti gradi debbano spostarsi per riprodurre più o meno il movimento della mia mano .
    grazie

    Dario.

    1. Ciao Dario,
      il link mi sembra che ti dia già tutto quello che ti occorre.
      Il tuo progetto è interessante, tuttavia non è tra i progetti che ho in programma di seguire, magari tra qualche mese lo farò.

      Mauro

    • dario on 10 giugno 2013 at 16:41
    • Reply

    si lo so , ma quel che mi serve , non è la costruzione hardware , ma lo sketch , oppure come fare a leggere il segnale del sensore di flessione e indirizzarlo nel giusto modo al servomotore

    grazie , Dario

    1. Ciao Dario,
      io ho letto velocemente l’articolo ed in fondo ho trovato un link al firmware, è un’altro modo di chiamare lo sketch.

      Se preferisci che te lo scriva io posso farlo su commissione, mi serve che tu mi spedisca i componenti: sensori,resistenze,shied e servo che vuoi utilizzare ed io ti posso preventivare il costo di realizzazione dello sketch.

      Mauro

    • dario on 10 giugno 2013 at 17:57
    • Reply

    no grazie comunque
    il problema è che quando clicco su firmware mi dice:
    external link not trusted
    e mi reindirizza su questa pagina
    potresti mostrarmi lo sketch da lui utilizzato se riesci ba vederlo ?
    grazie

    Dario

    1. Ciao Dario,
      se il link non funziona prova a scrivere all’autore per segnalarglielo, magari non lo sa e gli offri il tuo aiuto.

      Mauro

    • Emanuele on 10 giugno 2013 at 20:36
    • Reply

    Ciao Mauro,
    sono finalmente riuscito a far funzionare tutto!!.. il problema era proprio quello che avevi individuato nell’alimentazione =) =)

    Ora resta soltanto un piccolissimo difettuccio che con il tuo consenso sarei felice di farti vedere con un video che potrei inviarti su facebbok xkè non so come spiegarlo a parole…

    Grazie
    Emanuele

      • Emanuele on 10 giugno 2013 at 22:57
      • Reply

      Ciao Mauro,
      dopo averti finalmente detto di essere riuscito a fare quello che volevo mi è sorto un problema di movimento che non avevo tenuto in considerazione…mi ero completamente dimenticato che i due servo devo posizionarli in direzioni opposte e quindi di conseguenza si dovranno muovere in sensi opposti….
      c’è per caso un’articolo in cui parli di questa cosa? ho dato un’occhiata ma non l’ho visto…
      Su questo argomento sono completamente impreparato….puoi darmi un’aiuto?

      Grazie
      Emanuele

      1. Ciao Emanuele,
        non ricordo se ho scritto un articolo in merito.
        Se mi trovassi nella tua situazione lo risolverei matematicamente ossia se il ciclo for va da 0 a 180 gradi il primo servo esegue esattamente i gradi, il secondo esegue il contrario:

        grado = ( 180 – valore )

        Avrai che quando il primo è a 180 il secondo é a 0 e viceversa.

        Mauro

          • Emanuele on 12 giugno 2013 at 00:12
          • Reply

          Ciao Mauro,
          non so come inserire i due servo con funzioni inverse nel for…sarei felice se potessi dare un’occhiata al mio sketch x darmi un consiglio per riuscire a completare lo sketch.

          Grazie
          Emanuele

            • Emanuele on 12 giugno 2013 at 01:21

            Poi forse non mi sono spiegato bene…ho bisogno che un serva faccia da 0 a 100 ° e un’altro invece che faccia da 0 a -100°….mi sono completamente bloccato…non so come muovermi per questo ti chiedo un’aiuto per completare lo sketch visto che ormai manca soltanto quest’ultima cosa che mi ero dimenticato di tenere in considerazione…

            Emanuele

          1. Ciao Emanuele,
            innanzitutto c’é un errore nel tuo ragionamento i servo possono compiere da 0 a 100 ( 180 ) non possono muoversi da 0 a -100 é la posizione di montaggio e lo sketch che derminano il verso di rotazione.

            Per cui avrai e il primo servo va da 0 a 100 ed il secondo da 100 a 0 se osservi il ragionamento capisci subito c’è la formula matematica che ti ho indicato va benissimo a meno di scriverlo come:

            grado_secondo_servo = ( 100 – grado_primo_servo )

            Per cui al valore 0 avrai (100-0)=100 al valore 100 avrai (100-100)=0 ed il gioco é fatto.

            Ti ho praticamente scritto lo sketch.
            Mauro

          2. Ciao Emanuele,
            ti ho spiegato nella mia precedente risposta come fare.
            Devi usare la matematica, (180 – grado ) = grado_inverso

            Non é complesso, sono sicuro che se ti impegni c’è la fai.

            Mauro

    1. Ciao Emanuele,
      sono contento !!!
      Per il video, postali su youtube e inviami il link alla casella info del blog.

      Mauro

    • dario on 11 giugno 2013 at 15:33
    • Reply

    mi spiace ma adesso non trova la pagina completa e non posso inserire commenti ..
    potresti postarmi lo sketch da lui utilizzato?

    grazie
    Dario

    1. Ciao Dario,
      purtroppo anche io come fai tu, se non risponde la pagina dovrai attendere che ritorni disponibile.
      Non è un mio sito e non posso ricavarmi lo sketch se non funziona il sito.

      Mauro

    • dario on 12 giugno 2013 at 14:26
    • Reply

    ciao Mauro , oggi volevo presentarti queste domande sorte da piccoli problemi
    1- lo shield per xbee : devo prenderne uno specifico o non cambia (qualsiasi shield prendo )?
    2- potresti chiarirmi a che pin di arduino sono collegati le due uscite del sensore di flessione (con relativa resistenza )?
    3-una volta montato su arduino lo shield e il relativo modulo xbee (parte trasmittente credo)m la parte con i servomotori (ricevente) come devo montarla ?

    ti ringrazio molto se deciderai di rispondere alle mie domande…

    grazie , Dario

    1. Ciao Dario,
      provo a rispondere un quesito alla volta:

      1. non tutti gli adattatori sono identici ma sono molto simili, scegline uno che abbia anche l’adattatore di tensione a 3,3v xchè Xbee funziona a 3,3v

      2. Il sensore di flessione va collegato con un pin al negativo e l’altro ad un pin analogico da cui parte una resistenza di pari valore del sensore che va al pin positivo, come un partitore di tensione ( leggi articolo sul partitore di tensione)

      3. se usi un modulo xBee collegato ad arduino per il trasmettitore dovrai averne uno anche per il ricevitore a cui colleghi i servo.

      Mauro

    • dario on 4 ottobre 2013 at 18:38
    • Reply

    caro mauro è da un po di tempo che non scrivo sul tuo forum e volevo dirti che presto vorrei pubblicare ( con il tuo consenso ) un video tutorial di un semplice braccio robotico semovente …
    oggi volevo sapere se conosci un modo per risolvere un piccolissimo errore in cui mi sono imbattuto :
    grazie ai tuoi tutorial ed i tuoi consigli sono riuscito a completare un piccolo braccio robotico utilizzando 6 piccoli servomotori da 9 grammi , senza trovare alcun tipo di problema di natura tecnica eccetto uno :
    ho notato che se ad arduino collego un servomotore controllandolo tramite pulsanti ( con breadboard , collegamenti e sketch giusti ) il servomotore si muove , ipotizzando che metta come delay 6 , ad una certa velocità , ma , man mano che il numero di servomotori collegati ad arduino ed alla breadboard aumenta ( io sono appunto arrivato a collegarne sei senza problemi di sketch o tecnici ) la velocità di rotazione a cui mi riferivo prima quando ho citato il delay diminuisce nonostante il delay [ scusa la ripetizione 🙂 ] rimanga fisso , in questo caso sei .
    fammi sapere se ho esposto chiaramente il problema e se c’è un qualsiasi tipo di ” soluzione “.

    P.S.
    ho già visto il tuo tutorial sui servo con movimento armonico ma mi chiedevo se ci fosse un modo per controllarli medesimamente ma impostando il grado . esempio se tengo tenuto premuto un pulsante si sposta in senso antiorario e viceversa .

    grazie mille in anticipo .

    Dario

    1. Ciao Dario,
      il rallentamento potrebbe essere dovuto alla mancanza di alimentazione adeguata, i servo li hai alimentati con una batteria esterna?
      Il movimento armonico è possibile impostando anche un grado, tuttavia dovrai sviluppare lo sketch per farlo partendo da quelli pubblicati.

      Mauro

    • dario on 6 ottobre 2013 at 10:44
    • Reply

    come alimentazione uso o il mio pc portatile o il cavo di arduino collegato a una presa elettrica tramite uno spinotto usb.

    • Pasquale on 10 ottobre 2013 at 20:27
    • Reply

    Mauro salve come posso fare per far girare un servo di 360° invece di faro girare solo di esempio 45°?

    1. Ciao Pasquale,
      innanzitutto devi possedere un servo in grado di compiere i 360 gradi, se il tuo é di questo tipo dovrai leggere dal sito del produttore quali comandi inviare e quindi scrivere lo sketch.

      Mauro

    • matteo on 29 gennaio 2014 at 19:02
    • Reply

    ciao mauro, sto utilizzando il tuo sketch per un progetto casalingo, ho modificato il tuo sketch perchè a me serve solo che i servo vadano da 0 a 90 e da 90 a 0. ora, il problema e che, a me serve che i servo, quando gli impartisco il comando, si muovano piu lentamente, potresti dirmi come posso risolvere questo problema? non so che parte di sketch devo modificare.. grazie in anticipo 😉

    1. Ciao Matteo,
      puoi aumentare il delay tra un ciclo ed il successivo, questo incrementa il tempo tra un grado ed il successivo.

      Mauro

    • Umberto on 30 aprile 2014 at 20:37
    • Reply

    Ciao Mauro,
    Io di arduino sono poco pratico ma grazie hai tuoi tutorial sono riuscito a muovere i servo solo che io vorrei muovere con un pulsante prima un servo a 90 gradi e pio dopo l’apertura del servo partisse anche l’altro dp di 90 gradi ripremendo il pulsante si chiude e si richiude e dp due secondi anche l’altro… Spero che hai capito xD

    1. Ciao Umberto, se ho compreso ciò che vuoi realizzare é un movimento temporizzato. Ti consiglio di leggere i tutorial sui giochi di luce in cui troverai moti modi di temporizzare più uscite arduino. Nel tuo caso dovrai scatenare il primo evento alla pressione del pulsante e impostare i gradi dei servo invece di accendere luci.

    • Claudio on 1 giugno 2014 at 18:41
    • Reply

    Gentile Mauro
    Sono un progettista meccanico e per 35 anni ho fatto appunto il progetista. Lavorando presso la Soc. Elettronica di Roma, operante nel campo della Difesa,mi sono anche occupato un pò di elettronica per hobby,qualche infarinatura cel’ho, ma non troppa ho fatto molti circuiti con master funzionanti, ma solo parterndo da schemi.Oggi avrei la necessità di muovere in X eY di pochi gradi, un videoproiettore montato a 4 metri di altezza e da vecchio aeromodellista ho subito pensato a dei servi comandabili via cavo.
    Ho visto il tuo interessante articolo su questo argomento, ma purtroppo per realizzarlo avrei bisogno di uno schema elettrico a simboli,completo di tutto,collegamenti su Arduino e alimentazioni varie.
    Puoi mandarmi qualcosa via mail, a lavoro ultimato ne farò partecipi gli amici del forum dandoti chiaramente il merito.
    Cari saluti, e buon lavoro Claudio

    1. Ciao Claudio,
      con X ed Y intendi Pan e Tilt immagino per questa ragione parli di servo.
      Su schemi per collegarli ne trovi a decine sul blog, ti consiglio l’articolo dedicato ai servo con alimentazione esterna che ha un semplice schema e garantisce più stabilità al progetto

    • Simone on 3 febbraio 2015 at 15:12
    • Reply

    Ciao mauro
    ho provato a fare questo progetto, ma mi serviva che facesse muovere un solo servo sempre con tre pulsanti, quindi ho rimosso la parte del servo y. Una volta caricato però non succede niente… ho anche provato a usare lo sketch senza modificarlo ma stesso risultato. il montaggio sulla breadboard e lo stesso… come potrei risolverlo

    1. Ciao Simone,
      controlla che l’IDE non ti dia degli errori in fase di caricamento.

    • Claudio on 9 febbraio 2015 at 11:47
    • Reply

    Ciao Mauro.
    Ma anzichè un servo usassi un normale motorino dc va bene comunque?
    Se si devo caricare comunque la classe ?
    Grazie mille!
    Ps: la casetta di Barbie è fatta! Mancano alcuni particolari ma mia figlia insiste: dov’è l’ascensore?!????

    1. Ciao Claudio,
      servo e motori Dc hanno caratteristiche differenti sia per meccanica che per controllo.
      Ad esempio per un motore DC devi trovare un altro modo di controllare la posizione, magari con un encoder, e devi usare una motor shield o altro driver di corrente per motori DC.

    • Paolo on 20 marzo 2015 at 09:47
    • Reply

    Mi è tutto chiaro. Solo non capisco quel > 1000, Perché è versa se maggiore di 1000, perché quel mille? cosa è?

    1. Ciao Paolo,
      quando leggi da un pin analogico su arduino ottieni un valore da 0 a 1023 ( 10bit di conversione ) corrispondente a 0-5v a cui arriva ogni pin arduino.
      Nella configurazione dei pulsanti come mostrato in questo esempio il pulsante premuto restituisce un valore prossimo ai 1023 ( +5v ) per cui > 1000 vuol dire premuto.
      Maggiori dettagli li trovi negli articoli dedicati ad arduino ed i pulsanti nel corso arduino base on-line gratuito

        • Paolo on 20 marzo 2015 at 23:19
        • Reply

        Grazie ora mi è molto chiaro! Grazie mille!

    • paolo on 6 luglio 2016 at 21:34
    • Reply

    Ciao Mauro,
    mi chiamo Paolo, avrei da chiederti un piacere.. sto cercando di far comandare un servo motore con un pulsante, ma non riesco a capire come importare lo sketch del progetto
    Avresti un paio di minuti per aiutarmi?
    Grazie mille in anticipo
    Ciao

    Paolo

    1. Ciao Paolo,
      usa il copia e incolla dal blog al tuo IDE.
      Se non sai usare l’IDE per programmare arduino puoi seguire il mio corso arduino gratuito on-line.

    • fabrizio di galbo on 20 gennaio 2017 at 19:44
    • Reply

    ciao mauro,
    vorrei una dritta da lei…devo comandare un servo motore con due pulsanti, uno che gli fa fare un movimento verso destra e l’altro verso sinistra.. è fino a qua ci siamo..la dritta che voglio e… si può fare che quando io gli do l’impulso per esempio con il pulsante che lo comanda verso destra con un solo tocco di pulsante lui può andare per esempio( 120°) e ritornare al posto di partenza? e certamente lo deve fare anche con l’altro verso…se puoi darmi questo consiglio…aspetto tuo notizie..

    1. Ciao Fabrizio,
      se ho compreso bene vuoi poter premere un pulsante e raggiungere i 120°, si si può fare sostituendo i gradi attuali con quello a cui vuoi andare.

    • Gabriele on 16 maggio 2018 at 22:20
    • Reply

    Buonasera Mauro, ho compilato uni sketch in cui tramite 2 pulsanti muovo a step un servo in senso orario o antiorario… vorrei mettere un terzo bottone in cui se premuto mi porti il servo a 90°, mi potresti aiutare che non ne vengo a capo? grazie

    1. Ciao Gabriele,
      con la medesima tecnica di controllo dei due pulsanti precedenti aggiungine uno che esegua solo il comando di posizionamento a 90°

        • Gabriele on 17 maggio 2018 at 21:23
        • Reply

        Grazie mille Mauro per la risposta, sinceramente ci ho provato, manon riesco a dargli l’istruzione giusta probabilmente perché non si muove nulla..
        prendo una riga del tuo sketch.. if ( analogRead( nextDX ) > 1000 ) { gradoDX++; } al posto del ++ per portarlo a 90° cosa è corretto scrivere?grazie

        1. Ciao Gabriele,
          devi impostare il gradoDX = 90; ti consiglio la lettura di un manuale c base per comprendere la sintassi del linguaggio, altrimenti qualsiasi modifica ti sembrerà impossibile da effettuare.

    • Gabriele on 18 maggio 2018 at 17:27
    • Reply

    Ok grazie mille Mauro, inizio subito, comunque avevo provato ad inserire gradodx=90 ma non andava.. probabilmente ometto qualche passaggio..

Lascia un commento

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.