Tutorial: Arduino, i servo e i pulsanti

In passato hai pilotato i servo per modellisti con Arduino ed uno o più potenziometri, ma potrebbe non essere il metodo migliore per il tuo progetto.

servo arduino e pulsanti

Una prima controindicazione viene dal fatto che un potenziometro potrebbe non essere di tipo lineare ma di tipo logaritmico, per comprendere la differenza ti invito a leggere la pagina di wikipedia relativa: potenziometro.

Una seconda controindicazione è che un potenziometro col tempo perde la sua risposta, questo è dovuto al deterioramento naturale del materiale resistivo che con l’uso ed il tempo si deteriora. Esistono differenti tipi di potenziometri costruiti per durare nel tempo e mantenere invariate le proprie caratteristiche per anni, questo tipo di potenziometri sono di solito impiegati negli impianti audio, hanno di contro il prezzo e la difficoltà di reperimento in ambienti hobbistici.

Tralasciando queste informazioni, il tuo progetto potrebbe non avere necessità di comandare un servo con un potenziometro ma con due pulsanti che ad ogni pressione incrementino o decrementino di un grado l’angolo in cui è posizionata la leva del servo.

Iniziamo dallo schema dei collegamenti:

servo e pulsanti

Ed ecco lo sketch:

// Controlling a servo position using two button
// by Alfieri Mauro <http://www.mauroalfieri.it> 

#include <Servo.h> 

Servo myservo;  // create servo object

int grado = 0;
int minGrad = 0;
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(15);
}

Come avrai già notato usi la libreria Servo.h per pilotare il servo, in questo modo tutta la parte di comando del server è demandata alla libreria e ti puoi concentrare sulla gestione dei pulsanti.

inizia dalla linea 04: includi la libreria Servo.h;

linea 06: inizializza un oggetto di tipo Servo che chiami myservo;

linea 08: definisci la variabile grado in cui memorizzare il grado a cui vuoi che il servo si posizioni, ad esempio se vuoi che il servo parta dalla posizione di 90° non dovrai far altro che impostare questa variabile a 90, nell’esempio è impostata a 0° considerando che sia questa la posizione iniziale del servo;

linea 09: definisci la variabile minGrad in cui memorizzi il limite minimo a cui vuoi che il servo arrivi, se ad esempio il servo non deve ami scendere sotto i 10° imposta a 10 questo valore, l’impostazione dipende dal tuo progetto e dal tipo di movimento che il servo deve avere;

linea 10: analoga alla linea precedente a meno del fatto che la variabile maxGrad definisce il limite in gradi superiore del movimento.

linea 11: definisci la variabile pinServo in cui memorizzi il valore del pin a cui colleghi il servo, in questo modo se per tue esigenze di progetto vuoi collegare il servo ad un altro pin puoi farlo e basta cambiare solo questa variabile;

linee 12-13: definisci in queste linee due variabili prev e  next ripettivamente legate ai pin A1 e Ao, ossia gli input analogici, questa configurazione permette di utilizzare i pin analogici A0 e A1 per impartire i comandi, anche se li utilizzi come input di tipo digitale, vedrai in seguito perchè;

linea 17: imposti l’oggetto myservo indicandogli il pin a cui è collegato il servo;

linea 18: con il metodo write() decidi dove posizionare il servo, in gradi, essendo questa la funzione setup() imposta il grado di partenza del servo all’accensione del progetto o alla pressione del pulsante reset di Arduino;

linee 20-21: imposta i pin collegati ad A0 ed A1 come INPUT mediante il comando pinMode di Arduino;

linea 26: contiene alcuni comandi in cascata il primo è l’if di controllo, la condizione che se verificata decrementa il valore attribuito alla varibile grado posizionando il servo un grado in meno rispetto alla precedente posizione; la condizione if verifica che il pulsante connesso al pin A1 sia stato premuto per farlo utilizzi la funzione analogRead() di arduino, leggendo il valore di prev. Cosa avviene in pratica: prev indica il pin A1 a cui è connesso il pulsante con cui decrementi i gradi del servo, ad ogni pressione del pulsante il valore letto dal comando analoRead( prev )  è 1023, valore superiore a 1000, che è il valore di controllo con cui lo confronti, la condizione è quindi verificata e il valore di grado è decrementato.

linea 27: è una condizione identica a quella della linea 26, l’unica differenza è nella variabile verificata da analogRead che in questo caso è next collegata al pin A0;

linea 29: definisci una condizione di verifica del raggiungimento del valore massimo, serve a evitare che il servo vada oltre il valore massimo che hai impostato alla linea 10, in pratica ogni volta che la pressione del pulsante connesso ad A0 viene premuto la linea 27 incrementa di 1 il valore di grado, questa condizione verifica che se grado è arrivato a superare il valore impostato come grado massimo   ( maxGrad ) il valore della variabile grado resti identico a quello massimo impostato;

linea 30: è una condizione identica a quella definita alla linea 29, la cui differenza è quella di reagire al valore minimo dei gradi e non massimo;

linea 32: utilizza il metodo write dell’oggetto servo per impostare il grado definito alle linee precedenti e spostare il servo in quella posizione;

linea 33; imposta un tempo di 15 millisecondi un cui il servo può raggiungere il grado impostato, puoi diminuire questo valore se hai un servo con una risposta maggiore in velocità o puoi aumentarlo se vuoi che la pressione prolungata di un pulsante abbia un effetto rallentato sul raggiungimento della posizione desiderata da parte del servo.

Questo è l’effetto dello sketch:

Buon divertimento.

Cortesemente, prima di inserire i commenti leggi il regolamento

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

188 comments

1 ping

Skip to comment form

    • Claudio GIRAUDO on 1 settembre 2012 at 23:15
    • Reply

    Ottimo progetto. Mi potrebbe essere utile per realizzare un follow focus per la mia fotocamera DSLR durante le riprese video.

    1. Grazie Claudio,
      quando avrai ultimato il tuo progetto mi piacerebbe vederlo e se ti va pubblicarlo.

      Mauro

        • filippo on 23 gennaio 2014 at 11:52
        • Reply

        buongiorno in relazione a questo sketch non riesco ad aumentare il numero dei servi ne devo comandare 3 (sono nuovo ) di arduino
        Servo myservo;

        mi interesserebbe capire come mai mi da un errore cortesemente vi ringrazio filippo

        1. Ciao Filippo,
          gli sketch sono pubblicati e commentati gratuitamente per aiutarti nei tuoi progetti e insegnare a chi si avvicina ad arduino come usarlo.
          Come avrai letto in fondo all’articolo, o forse no, c’è scritto di non incollare codice nei commenti; tale regola è ancor più valida se si tratta dello sketch che ho scritto io, non serve.

          Posso suggerirti di leggere gli articoli in cui è descritto come usare più server e dal confronto capire come modificare questo sketch per il tuo progetto.

          Mauro

            • filippo on 23 gennaio 2014 at 19:34

            grazie mille per l’aiuto sinceramente pensavo che andasse bene come sketch perché mi muove un servo precisamente come voglio io il mio problema è quando provo a farne più di uno che mi da errore ,ho guardato un po’ in giro per questi articoli ma forse non riesco questi articoli

          1. Ciao Filippo,
            Non ho compreso l’ultima frase, tuttavia prima di decidere cosa scrivere sarebbe buona cosa che tu decidessi come devono muoversi questi 3 servo:

            – tutti insieme nello stesso verso é allo stesso tempo?
            – ognuno con un verso proprio ma allo stesso tempo?
            – tutti nello stesso verso ma in tempi differenti?
            – ecc..

            Senza queste info é impossibile darti un aiuto anche solo sugli articoli da consultare.

            Mauro

            • filippo on 24 gennaio 2014 at 09:37

            grazie Mauro! io vorrei muovere questi 3 servi separatamente sono per un braccetto robotico che ho realizzato in alluminio mosso da 3 servi quindi ogni movimento dovrebbe essere separato dall’ altro ,ho già preparato una pulsantiera con 6 pulsanti che mi servono per il senso orario ed anti orario di ogni servo questa fase iniziale:

            (non metterti a ridere !! di sicuro ci saranno errori madornali di compilazione ) puoi aiutarmi?

            grazie e apresto filippo

          2. Ciao Filippo,
            non rido, sono alquanto arrabbiato in quanto è la terza volta che ti scrivo di non incollare i tuoi sketch nei commenti e li ignori.
            C’è anche scritto alla fine di ogni articolo.

            Probabilmente non leggi quello che ti scrivo e immagino tu non legga neppure i miei articoli per questo non riesci a far funzionare il tuo sketch.

            Se hai 3 servo e si devono muovere in modo indipendente dovrai triplicare tutte le istruzioni e variabili in modo che lo sketch possa capire con chiarezza ciò che vuoi.
            Se tutti i servo si muovono insieme hai usato la stessa variabile per controllarli tutti.

            Mauro

            • filippo on 24 gennaio 2014 at 11:43

            grazie Mauro non ti arrabbiare non sapevo come farti capire, ho visto che delle persone scrivono sketch qui sopra come leggo qui sotto (io invece sono contento che comunque tu mi aiutato grazie ancora)

          3. Ciao Filippo,
            purtroppo i codici nei commenti arrivano a me illeggibili e non posso comunque aiutarti.
            Se mi poni il problema io posso indirizzarti agli articoli che possono aiutarti nella soluzione 🙂

            Mauro

    • Claudio GIRAUDO on 2 settembre 2012 at 20:39
    • Reply

    Ho provato a riprodurre il tutorial gia’ qualche ora fa utilizzando la breadboard ma non capisco se ho il servo ciucco (gira lentamente rispetto al video di esempio) e gratta. Come se non si fermasse ma stesse in tensione pur non muovendosi (a volte invece non si sente alcuna vibrazione).

    Potrebbe essere difettoso il servo ed eventualmente cosa mi consigli di acquistare per avere il tuo stesso risultato?

    Grazie 1000 per il supporto.

    Per esempio ho inserito alcune linee per accendere un led quando premo i pulsanti ma non si spegne piu’! Allego il tuo script con le aggiunte:

    // Controlling a servo position using two button
    // by Alfieri Mauro

    #include

    Servo myservo; // create servo object

    int grado = 0;
    int minGrad = 0;
    int maxGrad = 180;
    int pinServo = 3;
    int prev = A1;
    int next = A0;
    int led = 13;

    void setup()
    {

    myservo.attach( pinServo );
    myservo.write( grado );
    pinMode( prev, INPUT );
    pinMode( next, INPUT );
    pinMode(led, OUTPUT);
    }

    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 );
    digitalWrite(led, HIGH);
    delay(10);
    digitalWrite(led, LOW);
    }

    1. Ciao Claudio,
      il comportamento del servo è strano, ma potrebbe essere dovuto alla meccanica del servo, che modello stai utilizzando?
      Io nell’esempio ho impiegato un vecchio servo futaba FP-S148 ma ne ho in test degli altri più moderni, prova a guardare sui siti di modellismo e robotica, ogni servo ha le sue caratteristiche meccaniche che il costruttore riporta, cerca quella con la velocità angolare che fa al caso tuo.

      Per lo sketch l’errore è la posizione in cui hai inserito le linee, in quel punto lo sketch ci passa sempre anche se non premi i pulsanti, se vuoi ottenere che il led resti acceso solo durante la pressione del pulsante prova a cambiare lo sketch in questo modo:

      if ( analogRead( prev ) > 1000 ) { grado–-; digitalWrite(led, HIGH); }
      if ( analogRead( next ) > 1000 ) { grado++; digitalWrite(led, HIGH); }

      eliminando digitalWrite(led, HIGH); e lasciando tutto invariato.
      Non sono riuscito a provare questo sketch e non è detto che funzioni come sperato, ma ci possiamo lavorare.

      Mauro

    • tiziano amidani on 13 ottobre 2012 at 12:38
    • Reply

    E’ possibile dare ai servo una rotazione in senso orario e non antiorario e viceversa?

    1. Ciao Tiziano,
      i servo si muovono sia in senso orario sia in senso antiorario, almeno quelli che utilizzo nei miei tutorial.
      La differenza nel verso di rotazione dipende se da 0° varo a 180° o viceversa.

      Mauro

    • paolo on 23 novembre 2012 at 16:48
    • Reply

    ciao mauro,
    questi giorni sto tentando di modificare il tuo script in questa maniera:
    #include

    Servo myservo; // create servo object

    int grado = 0;
    int minGrad = 0;
    int a=90;
    int maxGrad = 180;
    int pinServo = 3;
    int prev = A1;
    int next = A0;
    int n=A2;

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

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

    void loop()
    {
    if ( analogRead( prev ) > 1000) { myservo.write( grado = minGrad ); }
    if ( analogRead( next ) > 1000 ) { myservo.write( grado = maxGrad ); }
    if (analogRead( n ) > 1000 ) { myservo.write( grado = a ); }
    delay(15);
    }

    Le funzioni le esegue perfettamente, l’unico problema è che non segue il delay. Come posso modificarlo?
    ti ringrazio anticipatamente
    Paolo

    1. Ciao Paolo,
      in che senso “non esegue il delay”?
      Hai impostato un delay di 15 millisecondi, quanto volevi stesse fermo tra un ciclo ed il successivo?
      Cosa vuoi ottenere?

      Mauro

    • paolo on 24 novembre 2012 at 10:37
    • Reply

    no non mi serve tra un ciclo e l’altro ma mi serve impostargli la velocità al servomotore
    Paolo

    1. Ciao Paolo,
      per regolare la velocità del servo devi mettere un delay tra un grado e l’altro che fai eseguire al servo.
      Se ad esempio dici al servo vai a 0° premendo un pulsante, e vai a 90° premendone un’altro, il passaggio tra 0 e 90° devi gestirlo con un ciclo for o while dove aumenti i gradi tra 0 e 90 di uno in uno e ad ogni step gli inserisci il valore che vuoi.

      Ho scritto degli articoli in cui è descritta questa modalità.

      Mauro

    • paolo on 24 novembre 2012 at 11:33
    • Reply

    potresti postarmi un link, e comunque grazie mille per il tempo che mi dedichii..
    Paolo

    • paolo on 24 novembre 2012 at 11:49
    • Reply

    Ho provato a modificarlo cosi ma non funzionaa..

    #include

    Servo myservo; // create servo object

    int grado = 0;
    int minGrad = 0;
    int a=90;
    int maxGrad = 180;
    int pinServo = 3;
    int prev = A1;
    int next = A0;
    int n=A2;

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

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

    void loop()
    {
    for (int prev=0; prev > 1000; ){
    myservo.write( grado = minGrad );
    delay(10);
    }
    for (int next=0; next > 1000; ){
    myservo.write( grado = maxGrad );
    delay(10);
    }
    for (int n=0; n > 1000; ){
    myservo.write( grado = a );
    delay(10);
    }
    }

    1. Ciao Paolo,
      quello che hai scritto è errato.
      I cicli for:
      primo devono essere negli if e non al posto degli if;
      secondo la sintassi è completamente errata, prova a leggere dei miei articoli o il manuale di arduino;
      terzo le variabili prev,next ed n corrispondono a dei pin, e non a dei valori letti sui pin;
      terzo non puoi basare un ciclo for sul valore letto da un pin analogico se vuoi che il servo compia determinati gradi;

      Probabilmente hai scritto questo codice di getto e per come ti conosco io dai progetti che fai questo non è nel tuo stile, sembra che tu non abbia mai scritto uno sketch e questo non è vero 🙂 sei davvero bravo a farlo.

      Mauro

    • Maurizio on 11 gennaio 2013 at 20:01
    • Reply

    Salve Mauro sono sempre io 🙂 Leggevo il tutorial ed è abbastanza chiaro, non mi è chiaro però come imprimere la velocità di rotazione al servo, diceva a Paolo che bisogna impostare il ciclo for o while, non so cosa sia, e non ho trovato l’articolo in cui ne parlava. Mi potrebbe dare una mano?
    Grazie

    Maurizio

    1. Ciao Maurizio, ti consiglio di leggere le pagine del Corso Arduino su questo Blog, partendo dalle lezioni base, solo così potrai imparare passo passo le basi della programmazione con arduino, sempre che tu voglia imparare.

      I cicli for e while sono strutture usate in programmazione, non ci sono articoli dedicati, puoi leggere sul sito arduino ufficiale come funzionano e quale sia la sintassi.

      Sul blog poi troverai moltissimi esempi in cui li uso e nella spiegazione trovi la descrizione specifica del ciclo in quello sketch.

      Mauro

    • danilo on 13 marzo 2013 at 21:43
    • Reply

    ciao io ti volevo chiedere se è possibile sempre con due pulsanti comandare un servo che ruota a 360 gradi??? se il circuito e sempre lo stesso???? e se non è così come posso pilotare un servo 360??? grazie mille ciao se vuoi puoi anche rispondermi via mail ciao

    1. Ciao Danilo,
      non possiedo un sevo da 360° da provare, so che ne esistono alcuni in grado di regolare solo la velocità ed altri in grado di regolare anche la posizione.
      Preferisco rispondere sul blog per condividere le esperienze e le info con altri appassionati che se vogliono possono partecipare e darti aiuto.

      Mauro

    • danilo on 14 marzo 2013 at 14:40
    • Reply

    grazie della risposta mi potresti dire ancora un’altra cosa; io in pratica devo costruire un piccolo robot con tre servo e volevo comandarli con due pulsanti ogni servo, l’unico problema e che a me serve un servo scusa il gioco di parole, che mi facci girare il braccio a 360 gradi quindi devo metterne uno alla base del braccio ma non so se usare un servo che fa giri completi oppure un motorino passo passo??? grazie dell’aiuto ciao

    1. Ciao Danilo,
      motore passo-passo senza ombra di dubbio 🙂

      Mauro

    • danilo on 14 marzo 2013 at 16:48
    • Reply

    mi potresti dire quale tipo di passo passo comprare e che circuito integrato comprare per farlo funzionare ho già visto i tuoi tutorial ma non so dove comprare il circuito integrato e il motorino passo passo , scusa la mia ignoranza ma sono agli inizi, mi potresti anche dire un sito italiano dove comprarli grazie mille ciao

    1. Ciao Danilo,
      io compro da robot-domestici.it e trovi sia i driver per il controllo dei motori passo-passo sia i motori.

      Mauro

    • danilo on 14 marzo 2013 at 18:24
    • Reply

    Questo motorino (http://www.robot-domestici.it/joomla/component/virtuemart/robotica-domotica/motori/motori-passo-passo/stepper-motor-with-cable)
    secondo te potrebbe andare bene per il braccio so che nn sono preciso ma nn so ancora bene le dimensioni del braccio e comunque lo faccio in plexyglass ed è piccolino quindi penso che basti questo motorino l’unica cosa mi puoi dire quale circuito integrato usare perchè il driver per il motorini mi sa che mi costa un po’ troppo e poi ho visto nei tuoi video che usi questo SN754410NE però non so se va bene con questo motorino e se c’è sul sito che mi hai detto non lo trovo grazie mille ciao

    1. Ciao Danilo,
      per scegliere il motore sarebbe corretto avere il braccio già progettato e conoscere la copia necessaria in modo da essere certo che funzioni.
      Comprendo che se non sei un Ing. Meccanico, come non lo sono io, é arabo quello che ti ho scritto, questo motore io l’ho provato ed ha una buona coppia.

      L’easydriver ti rende tutto più semplice e non devi aggiungere nulla.
      L’SN754410NE è una buona alternativa ad uso hobbystico, non puoi usarlo senza componenti aggiuntivi per lungo periodo perché rischi di bruciarlo, puoi realizzare il circuito base descritto nel datasheet del componente.

      In quanto a dove comperare i componenti elettronici ti consiglio di andare da un rivenditore di materiale elettronico nella tua zona e acquistare tutto il necessario, on-line c’é Farnell che vende componenti elettronici ed é affidabile.

      Mauro

    • danilo on 15 marzo 2013 at 14:42
    • Reply

    quindi secondo te devo per forza comprare un easydriver con passo passo oppure potrei usare anche un servo 360 ??? perchè nell’altra risposta mi hai detto che è meglio il passo passo però ho visto che alcuni servo 360 anno una buona coppia tipo 4 kg/cm e di sicuro non penso che il mio braccio divneti pesantissimo

    1. Ciao Danilo,
      i servo a 360 che conosco io possono regolare solo la velocità mediante PWM.
      Questo significa che se non trovi un servo a cui puoi dare come comando i gradi a cui posizionarsi avrai un braccio che ruota sempre e di cui puoi gestire solo la velocità di rotazione.

      Non escludo esistano servo da 360° pilotabili per gradi, solo non ne conosco.

      Mauro

    • danilo on 15 marzo 2013 at 16:15
    • Reply

    quindi tu vorresti dire che con il servo a 360 non posso fare la stessa cosa che hai fatto tu in questo video con i servo normali???? scusa la mia ignoranza!!!! perchè a me interessava soltanto farlo girare a una velocità bassa nn elevata di 360 gradi e che con un pulsante girasse in senso orario e con un altro in senso antiorario secondo te è fattibile con un 360 ripeto a me non importano i gradi preci a me serve che giri quando glielo dico io con i pulsante grazie ancora una volta

    1. Ciao Danilo,
      Non so se puoi farlo, dovresti provare 🙂

      Mauro

    • danilo on 15 marzo 2013 at 20:35
    • Reply

    e poi mi puoi dire che servo è quello che usi nel video che marca e dove lo hai comprato graziemille ancora una volta ciao

    1. Ciao Danilo,
      il servo é un Futaba, l’ho comprato 22anni fa in un negozio di modellismo, non esistevano negozi on-line 🙂 oggi puoi trovare ottimi prodotti da robot-domestici.it, io i nuovi servo li compro da loro.

      Mauro

    • danilo on 17 marzo 2013 at 20:50
    • Reply

    scusa ancora ma mi è rimasto un dubbio sui servomotori perchè finalmente ho finito il progetto del braccio in plaxyglass è dovrebbe venire a pesare sui 2,5 kg e 3 kg, ma non ho capito bene per quanto riguarda la coppia dei servo perchè sui normali servo c’è scritto tipo 2 kg/cm però non so se basterebbe per il mio braccio perchè il braccio deve avere un servo alla base che lo faccia girare tutto più altri due quindi non so di che taglia dovrei prenderli se puoi aiutarmi te ne sarei molto grato ciao

    1. Ciao Danilo,
      se il peso complessivo è 3Kg io starei un po’ largo con i servo per non bruciarli.
      Come calcolare la coppia angolare puoi cercarlo su Google se non sai farlo tu:

      http://it.answers.yahoo.com/question/index?qid=20100108010836AASNNyU

      Questo è un esempio.

      Mauro

    • danilo on 18 marzo 2013 at 08:37
    • Reply

    grazie dell’aiuto però una volta fatti i calcoli mi trovo N/m come faccio a cambiarlo in kg/cm e poi il numero che ho di coppia devo dividerlo per tre essendo tre i servo e ultima cosa il servo alla base nn dovrebbe avere più fprza rispetto agli altri due dovendo portare il peso di tutto il braccio ???

    1. Ciao Danilo,
      per la prima domanda, puoi usare google esistono le formule di conversione N/m -> Kg/cm
      Quello che calcoli è la coppia della base, per gli altri servo dovrai fare altri calcoli simili ma applicati agli snodi su cui i servo lavorano.

      Mauro

    • danilo on 18 marzo 2013 at 11:32
    • Reply

    ok grazie mille di tutto l’aiuto,
    spero che il braccio riesca a funzionare

    ciao

    1. Ciao Danilo,
      sono sicuro che funzionerà, se vorrai condividere il tuo progetto sono a disposizione per offrirti spazio nel Blog.

      Mauro

    • danilo on 4 aprile 2013 at 15:34
    • Reply

    volevo chiederti una cosa ma nello schema che hai fatto hai messi due resistenza ma da quanto sono???

    e poi un’altra cosa ho provato ad usare una resistenza da 220 ohm e il mio servo è come questo (http://www.robot-domestici.it/joomla/component/virtuemart/robotica-domotica/servomotori/df05bb-standard-servo-5kg) funzionare funziona l’unica cosa che vibra un po’ quando è fermo sembra che dentro giri lo stesso anche se è fermo è normale o no????

    1. Ciao Danilo,
      le resistenze sono da 10K, ma puoi usare quelle da 220ohm o 330ohm, il loro scopo é fare da pull-down.

      Il servo potrebbe vibrare sia a causa dell’alimentazione, prova ad alimentarlo con una fonte esterna da 6v, collega la massa dell’alimentazione a quella di arduino ( solo il negativo ) oppure potrebbero vibrare perché non riescono a mantenere la posizione ed in questo caso é la tipologia costruttiva del servo.

      Mauro

    • danilo on 4 aprile 2013 at 21:14
    • Reply

    grazie mille ho provato ed è come dici tu “non riescono a mantenere la posizione ed in questo caso é la tipologia costruttiva del servo.” adesso funziona bene, una domanda che mi serve con questo metodo potrei comandare 4 servi ovviamente con una alimentazione esterna e comandati ogni servo da due pulsanti??? e poi per poterli alimentare esternamente cosa devo fare??? portare il filo del segnale ad arduino e poi gli altri due???

    1. Ciao Danilo,
      fino a 6 servo puoi utilizzare le uscite PWM.
      Dovrai usare 8 pulsanti = 8 pin di arduino.
      Potresti usare i 5 analogici e 3 digitali, oppure costruire un partitore di resistenza come fa il Keypad LCD ed usare solo 4 pin analogici, uno ogni 2 pulsanti.

      Per le connessioni puoi seguire uno degli articoli dedicati a più servo, tra gli ultimi che ho scritto ne trovi uno sul movimento armonico di 4 servo.

      Mauro

    • danilo on 5 aprile 2013 at 14:47
    • Reply

    grazie della risposta a me servirebbe controllare quattro servo come hai fatto in questo video(http://www.mauroalfieri.it/elettronica/servo-con-movimento-armonico-con-arduino.html) ma usando 8 pulsanti l’unica cosa che non ho capito bene e come colleghi l’alimentazione esterna ai servo in pratica tu gli dai sia il positivo che il negativo delle pile direttamente ai + e- dei servo con il filo del segnale collegato ad arduino??? se potessi farmi vedere uno schema tipo quello che hai fatto per questa dimostrazione te ne sarei infinitamente grato

    1. Ciao Danilo,
      hai individuato perfettamente il collegamento.
      Mandi + e – delle batterie ai servo, ad arduino il filo del segnale di ciascun servo.

      Ricordati di collegare il negativo delle pile ad arduino, solo il negativo 🙂 serve a chiudere il circuito e fare da riferimento elettrico per i servo.

      Mauro

    • danilo on 5 aprile 2013 at 16:24
    • Reply

    a e come ultima cosa visto che sono agli inizi però devo finire il mio progetto il prima possibile e non ho ancora grande dimestichezza nel programmare arduino mi potresti dire come fare il programma per comandare 4 servi con 8 pulsanti?? io avevo pensato di usare il tuo sketch e di copiarlo 4 volte cambiando le uscite ma nn riesco a farlo funzionare se puoi aiutarmi te ne sarei estremamente grato ciao

    1. Ciao Danilo,
      cosa ti mette urgenza?
      Arduino è un hobby ed un gioco con cui sperimentare e ti invito a farlo.

      Cosa differente è se ti occorre un progetto su commissione, in tal caso posso intervenire ma mi servono più informazioni su cosa stai realizzando.

      Mauro

    • danilo on 5 aprile 2013 at 22:23
    • Reply

    perchè devo portare un progetto di un braccio appunto entro uno / due mesi e la parte fisica con tutti i collegamenti e fatta ho calcolato le portate dei servi e tutto mi manca solo la programmazione di arduino ho una batteria esterna con cui alimentare i servo e mi serve solo il programma che mi comandi 4 servo con 8 pulsanti nello stesso modo in cui tu hai fatto questo, ho provato a farlo da solo ma ogni volta ci sono sempre errori e non so come fare se riuscissi a farmelo o almeno darmi qualche dritta te ne sarei infinitamente grato ciao

    1. Ciao Danilo,
      si tratta quindi di un progetto scolastico?
      Ti do delle dritte su che strada prendere:
      avrai notato c’è l’oggetto servo deve avere nomi differenti per ciascun servo;
      avrai definito i pin a cui hai collegato i pulsanti;

      Hai provato a scrivere uno sketch semplice in cui leggi solo i pulsanti e ti fai restituire sul monitor seriale un valore per ogni pulsante?

      Se lo hai fatto sei ben oltre la metà dell’opera, ti resta da incrementare 4 variabili di angolo, una x ogni servo, alla pressione del relativo pulsante e poi applicare a ciascun servo l’angolo corrispondente.

      Mauro

    • danilo on 6 aprile 2013 at 20:08
    • Reply

    il problema che non so bene ancora come funziona proprio la programmazione però mi sono impegnato in questo progetto e devo finirlo in breve tempo, ho provato ad ispirarmi a quello che hai fatto in questo video ma non riesco ho copiato la parte ( Servo myservo; che cambiato e ho fatto uno con questo nome u l’altro ho provato a chiamarlo Servo myservo1; poi ho copiato
    int grado = 0;
    int minGrad = 0;
    int maxGrad = 180;
    int pinServo = 3;
    int prev = A1;
    int next = A0;) e ho cambiato a1 e a0 in a2 e a3 e anche il pin ho messo 4 poi ho copiato

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

    pinMode( prev, INPUT );
    pinMode( next, INPUT );
    } cambiando il nome del myservo con quello normale e quello con 1 e poi ho copiato questo

    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(15);
    } cambiando sempre il nome myservo ma mi da sempre degli errori che non riesco a capire se mi potresti aiutare facendo l'esempio di come si comandano due servo con 4 pulsanti poi io basta che lo amplio ad 4 servo però non so proprio a chi rivolgermi e mi sono scervellato ore e ore ma senza risultati

    1. Ciao Danilo,
      se rinomini un oggetto myservo in myservo1 (strada corretta) devi cambiario in tutto lo sketch.
      Ti consiglio di leggere tutti gli articoli sui servo, partendo da quelli base, vedrai che ci riesci.

      Ho in programma alcuni articoli e quello relativo alla tua esigenza potrebbe essere pubblicato tra 3/4 mesi, per cui arriverebbe tardi per il tuo progetto.

      Se mi scrivi gli errori c’è ti appaiono provo a capire cosa sbagli.

      Mauro

    • danilo on 7 aprile 2013 at 15:53
    • Reply

    #include

    Servo myservo1;

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

    void setup ()
    {
    myservo1.attach( pinServo );
    myservo1.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 1000 ) { grado–; }
    if ( analogRead( next ) > 1000 ) { grado++; }

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

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

    ho provato così è mi da errore all'inizio sulla prima parte (int grado = 0;) e mi dice (expected initializer before numeric constant) cosa può essere??? e cosa devo cambiare????

    1. Ciao Danilo,
      controlla che la classe Servo.h sia inclusa e che la trovi nel path delle librerie Arduino.

      Mauro

    • danilo on 7 aprile 2013 at 16:20
    • Reply

    mi da errore su int minGrad = 0; e non riesco a capire perchè e mi dice expected initializer before numeric constant cosa può essere???

    1. Ciao Danilo,
      sembra che tu non abbia incluso la classe Servo.h op che non la trovi.

      Mauro

    • danilo on 9 aprile 2013 at 20:08
    • Reply

    per fortuna sono riuscito a risolvere il problema adesso ho provato e funziona di nuovo bene. Adesso volevo provare di nuovo con i pulsanti Una cosa che volevo ancora chiederti e se oltre alla programmazione che per adesso lascio da parte quando io devo collegare i servi con la blackboard seguo il tuo disegno aggiungendo due pulsanti e tutti i contatti e resistenze però non mi funzione in pratica; il programma va bene e sono riuscito pure a caricarlo però quello che non funziona e il collegamento io penso che siano i pulsanti in quanto nelle due uscite vanno al + e al – ma essendo in comune con gli altri due pulsanti forse creano conflitto e non funziona ??? se mi dai la tua mail ti mando la foto dei collegamenti fatti con il programma che usi te per fare i disegni che sono riuscito a scaricare.

    1. Ciao Danilo,
      fatico a capire cosa stai facendo, puoi mettere qualche virgola o punto per aiutarmi?
      L’email la trovi nella pagina contatti.

      Mauro

    • danilo on 9 aprile 2013 at 22:18
    • Reply

    Senti finalmente sono riuscito a farlo funzionare con 4 pulsanti e due servo quindi il tuo aiuto tra firgolette non mi servirebbe più 🙂 però mi rimane ancora una problema in quanto, devo utilizzare 5 servo per il mio progetto e però i pin analogici di arduino sono solo 6, e a me ne servirebbero ancora 4 , io avevo pensato di usare i pin digitali ma ho provato a sostituirli agli analogici ma non funziona come posso risolvere questo ultimo problema poi protetto che ti lascierò in pace 🙂 🙂

    1. Ciao Danilo,
      mi fa piacere che tu stia riuscendo nel tuo progetto.
      Sono sicuro che continuerai a leggere e consultare il mio Blog ogni volta che vorrai.
      Ti chiedo di scrivere usando la punteggiatura, in generale perché le persone ti capiscano, se hai fretta, fermati e scrivi in un altro momento.

      Se vuoi collegare dei pulsanti ai pin digitali dovrai modificare il codice, sicuramente analogRead() non é il comando che ti occorre.

      Leggi i tutorial base del corso Arduino che ho pubblicato, capirai subito come fare.

      Mauro

    • danilo on 10 aprile 2013 at 16:05
    • Reply

    ciao ho guardato le tue prime spiegazioni che mi sono servite molto, e ho provato a cambiare lo steck in questo modo:

    #include

    Servo myservo;

    int grado = 0;
    int minGrad = 0;
    int maxGrad = 180;
    int pinServo = 3;
    int prev= 11;
    int next= 10;

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

    pinMode( 11, INPUT );
    pinMode( 10, INPUT );

    }

    void loop()
    {
    analogWrite(11,127);
    analogWrite(10,127);

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

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

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

    arduino mi dice che è giusto e non ci sono errori, di fatti ho caricato lo steck su arduino; collegando al posto di A0 e A1 i pin digitali 10 e 11 però il servo non risponde ai pulsanti cosa potrei aver sbagliato???

    1. Ciao Danilo,
      ci sono diversi errori logici, non di sintassi per questo l’IDE non ti da errore.
      Innanzitutto i pin 10 e 11 sono pin digitali e non analogici, quindi non puoi usare analogRead.
      Secondo a cosa servono i due comandi analogWrite(10,127) e analogWrite(11,127) ?
      Infine, attenzione, i segnali digitali differiscono da quelli analogici per cui non potrai confrontare questo valore con 1000.

      Ti consiglio la lettura dei primi 10 articoli del corso arduino che trovi nel Blog, se vuoi provare a realizzare qualcosa con Arduino.

      Mauro

    • danilo on 16 aprile 2013 at 18:54
    • Reply

    ciao senti mi sono impegnato e ho letto tutte le tue prime lezione ma non riesco proprio a usare un pin digitale tipo 11 e 10 come pin analogico ??? mi puoi aiutare perché nn so proprio cosa fare

    1. Ciao Danilo,
      I pin digitali non puoi usarli come analogici.
      Al posto di analogRead dovrai usare digitalRead.
      Per il valore ti consiglio di farti un piccolo ske Tag in cui leggi il valore sul pin e lo scrivi sul monitor seriale, in questo modo sai se premendo hai 0 ( LOW ) o 255 ( HIGH )

      Mauro

    • matteo on 22 aprile 2013 at 09:48
    • Reply

    Ciao Mauro,
    vorrei costruire un orologio luminoso con arduino.
    Fare in modo che alle lancette siano collegati dei led
    Ora mi chiedo se un servo riesca a sorregere la struttura.
    grazie mille anticipatamente

    1. Ciao Matteo,
      di servo ne esistono molti tipi con forze di coppia differenti.
      Il problema maggiore sono i gradi a mio avviso, in quanto i servo sono di solito 0-180gradi, esistono da 360° ma non ho ancora avuto modo di provarne uno per capire se si possono pilotare in gradi 🙁

      Mauro

    • danilo on 29 aprile 2013 at 19:31
    • Reply

    ciao sono ancora io, non sono ancora riuscito a risolvere il problema dei pin digitali; lo steck è

    #include

    Servo myservo1;

    int grado1 = 0;
    int minGrad1 = 0;
    int maxGrad1 = 180;
    int pinServo1 = 3;
    int prev1 = 11; ho messo su prev e next i pin digitali 11 e 10
    int next1 = 10;

    void setup()
    {
    myservo1.attach( pinServo1 );
    myservo1.write( grado1 );

    pinMode( prev1, OUTPUT ); qui ho messo sempre i pin 10 e 11 come uscite
    pinMode( next1, OUTPUT);
    }

    void loop()
    {

    if ( digitalRead( prev1 ) > 1000 ) { grado1—; } qui ho cambiato il digitalwrite al posto dell’analogwrtie
    if ( digitalRead( next1 ) > 1000 ) { grado1++; }

    if ( grado1 > maxGrad1 ) { grado1 = maxGrad1; }
    if ( grado1 < minGrad1 ) { grado1 = minGrad1; }

    myservo1.write( grado1 );
    delay(15);
    }

    Il programma mi da tutto giusto ma come sempre non funziona nella realtà e non so come o cosa posso ancora cambiare ?????

    1. Ciao Danilo,
      due macroerrori:

      1. i pin prev e next non sono OUTOUT ma INPUT, tu vuoi leggere il loro valore non scriverci su;
      2. non puoi semplicemente sostituire analogRead con digitalRead perchè i valori restituiti non sono identici, il primo ti restituisce da 0 a 1023 ed il secondo o 0 ( LOW ) o 255 ( HIGH ) per cui dovrai adeguare le righe di confronto al comando che usi.

      Mauro

    • danilo on 30 aprile 2013 at 16:38
    • Reply

    grazie come sempre in tutto questo tempo mi hai sempre risposto e ti ringrazio ancora una volta.
    Sono riuscito ad usare i due pin digitali con questo stecks:

    #include

    Servo myservo1;

    int grado1 = 0;
    int minGrad1 = 0;
    int maxGrad1 = 180;
    int pinServo1 = 3;
    int prev1 = 10;
    int next1 = 11;
    int x; ho chiamato x e y come se fossero i due pulsanti
    int y;
    void setup()
    {
    myservo1.attach( pinServo1 );
    myservo1.write( grado1 );

    pinMode( prev1, INPUT );
    pinMode( next1, INPUT );

    }

    void loop()
    {
    x= digitalRead (prev1);
    y= digitalRead (next1);

    if (x== HIGH) { grado1++; }
    if (y== LOW) { grado1–; }

    if ( grado1 > maxGrad1 ) { grado1 = maxGrad1; }
    if ( grado1 < minGrad1 ) { grado1 = minGrad1; }

    myservo1.write( grado1 );
    delay(15);
    }

    L'unica cosa che nn funziona è che quando premo un pulsante si muove normalmente nella direzione voluta, ma come io lascio tale pulsante torna nella posizione iniziale?? e non rimane dove io l'ho fatto arrivare cosa può essere???? e come posso risolvere il problema???

    1. Ciao Danilo,
      il motivo potrebbe essere dovuto al fatto che per qualche motivo, di natura elettrica, quando lasci il pulsante si resetta arduino e riporta il servo in posizione iniziale.
      Non mi convince il fatto che tu abbia usato HIGH per X e LOW per Y come confronto, se i pulsanti sono connessi allo steso modo dovrai avere sempre un confronto con lo stesso valore.

      Prova a verificare i collegamenti elettrici, e se necessario inserisci dei Serial.println() lungo lo sketch in modo da fare qualche debug dello sketch.

      Mauro

    • Andrea on 13 maggio 2013 at 11:39
    • Reply

    Ciao Mauro, finalmente dopo parecchio tempo ricomincio a sperimentare con Arduino. Tempo fa ho trovato un vecchio joystick della nintendo n64 e uno della play station sony. Vorrei poter guidare dei servi con le levette e magari accendere led ect ect con i tasti. Come collego questi joystick con arduino?…ho cercato su ionternet del materiale ma non ho trovato quasi nulla…Grazie mille per la risposta. Andrea

    1. Ciao Andrea,
      non possiedo ne conosco quei joystick, dovresti provare a verificare quale protocollo utilizzano e se questo è compatibile con Arduino.
      Il nunchuck ad esempio usa l’I2C.

      Mauro

    • andrea on 20 maggio 2013 at 13:44
    • Reply

    Ciao Mauro,
    innanzitutto grazie per i tuoi utilissimi e dettagliati tutorial.
    Per cortesia puoi suggerirmi come implementare il tuo codice per far lavorare i pulsanti in modo che basti una pressione/rilascio ed il servo si muove fino al punto int maxGrad = x; e viceversa, altra pressione/rilascio per portarsi all’int minGrad =y?
    Grazie ed ancora complimenti.
    Andrea.

    1. Ciao Andrea,
      se leggi il mio blog sai che mi piace dare suggerimenti e spunti per sperimentare e raggiungere da solo i tuoi risultati.
      Prova a leggere altri tutorial sui pulsanti, anche se non con i servo, magari con i led troverai qualche sketch simile a cuoi puoi applicare un servo come vuoi tu.

      Stai realizzando un sistema a stati:
      STATO A = servo a x°
      STATO B = servo a y°

      Mauro

        • andrea on 21 maggio 2013 at 21:46
        • Reply

        Ciao Mauro,
        ti ringrazio molto per la tua risposta. Andrò a vedere gli altri tuoi tutorial.
        Stò realizzando una mano che prende un oggetto. In pratica con un pulsante vorrei premere e rilasciare subito ed il servo ruota e si porta a maxgrad, dopodichè con l’altro pulsante premo e rilascio per cui torna a mingrad.
        In pratica un sistema a stati.
        Grazie.
        Andrea.

        1. Ciao Andrea,
          il sistema a stati l’ho descritto in tanti tutorial, soprattutto sui led 🙂

          Mauro

    • danilo on 22 maggio 2013 at 16:35
    • Reply

    ciao volevo chiederti visto che forse un mio amico possiede l’arduino due, se al posto di cambiare come ti avevo chiesto i pin digitali in analogici potrei usare quelli di arduino 2 che se non sbaglio ne ha 15 o 16 ???? e inoltre arduino 2 è uguale nelle impostazioni del programma??? poi come ultima cosa ti volevo chiedere visto che ho provato a far funzionare con lo stesso steck tuo ripetuto tre volte per i rispettivi pin analogici e funzionava tutto l’unica cosa che quando sono andato a provarlo sui servo, sui primi due non c’è problema come collego il terzo però non mi funziona e sugli altri due o delle irregolarità come per esempio premo un pulsante e si muovono tutti e due oppure va solo avanti e non indietro secondo te cosa può essere ti metto anche lo steck così che tu possa capire meglio e per quanto riguarda i collegamenti li ho fatti uguali a quello che hai fatto tu solo ripetuto tre volte??? scusa ancora una volta ciao e grazie

    #include

    Servo myservo1;

    int grado1 = 0;
    int minGrad1 = 0;
    int maxGrad1 = 180;
    int pinServo1 = 5;
    int prev1 = A0;
    int next1 = A1;

    Servo myservo2;

    int grado2 = 0;
    int minGrad2 = 0;
    int maxGrad2 = 180;
    int pinServo2 = 6;
    int prev2 = A2;
    int next2 = A3;

    Servo myservo3;

    int grado3 = 0;
    int minGrad3 = 0;
    int maxGrad3 = 180;
    int pinServo3 = 9;
    int prev3 = A4;
    int next3 = A5;

    void setup()
    {
    myservo1.attach( pinServo1 );
    myservo1.write( grado1 );

    myservo2.attach( pinServo2 );
    myservo2.write( grado2 );

    myservo3.attach( pinServo3 );
    myservo3.write( grado3 );

    pinMode( prev1, INPUT );
    pinMode( next1, INPUT );

    pinMode( prev2, INPUT );
    pinMode( next2, INPUT );

    pinMode( prev3, INPUT );
    pinMode( next3, INPUT );
    }

    void loop()
    {
    if ( analogRead( prev1 ) > 1000 ) { grado1–; }
    if ( analogRead( next1 ) > 1000 ) { grado1++; }

    if ( analogRead( prev2 ) > 1000 ) { grado2–; }
    if ( analogRead( next2 ) > 1000 ) { grado2++; }

    if ( analogRead( prev3 ) > 1000 ) { grado3–; }
    if ( analogRead( next3 ) > 1000 ) { grado3++; }

    if ( grado1 > maxGrad1 ) { grado1 = maxGrad1; }
    if ( grado1 maxGrad2 ) { grado2 = maxGrad2; }
    if ( grado2 maxGrad3 ) { grado3 = maxGrad3; }
    if ( grado3 < minGrad3 ) { grado3 = minGrad3; }

    myservo1.write( grado1 );
    myservo2.write( grado2 );
    myservo3.write( grado3 );
    delay(15);
    }

    1. Ciao Danilo,
      ti chiedo la cortesia di non postare sketch xchè arrivano illeggibili.
      Ho notato due errori nelle linee:

      if ( grado1 maxGrad2 ) { grado2 = maxGrad2; }
      if ( grado2 maxGrad3 ) { grado3 = maxGrad3; }

      Manca il < , > o = non so cosa volessi scrivere, può essere errore dovuto proprio a quanto ti ho scritto sopra riguardo ai commenti.

      Il problema di instabilità può essere dovuto all’alimentazione insufficiente per il tipo di servo che stai usando, usa un’alimentazione esterna per i servo, collegando SOLO il negativo in comune ad arduino.

      Per l’arduino due considera che funziona a 3,3v e potrebbe non controllare correttamente i servo, non ho mai provato.

      Mauro

    • danilo on 22 maggio 2013 at 21:14
    • Reply

    per quanto riguarda l’alimentazione esterna uso una batteria a sei volt con 2000 mah quindi dai dati dei servo dovrebbe bastare poi per quanto riguarda i collegamenti sono uguali a quelli che hai fatto tu con l’eccezione che il + e – che sarebbere gnd e 5v li prendo direttamente dalla batteria e li collego sulla bleckboaard e poi metto un filo dopo quello – della batteria che va al gnd di arduino per farti capire meglio guarda questa immagine fatta da me e che rappresenta il circuito spero che si veda http://www.flickr.com/photos/96210606@N05/8783289597/ .Scusa per lo steck e poi non so perchè ma e venuto scritto male ed è per questo che nn ci sono > < ma nel vero steck ci sono, inoltre per quanto riguarda arduino 2 se però io comunque usassi sempre l'alimentazione esterna dovrebbe funzionare lo stesso oppure avendo delle nuove funzioni non può farlo???

    1. Ciao Danilo,
      dai collegamenti vedo che i servo li hai collegati ai primi pin dal 2 in poi, l’immagine é sgranata ma intuisco dalla direzione dei collegamenti.
      Connetti i servo alle sole uscite PWM di Arduino, modificando lo sketch.
      La batteria, se carica, dovrebbe darti sufficiente alimentazione.

      Per Arduino due é da provare, come ti ho scritto non l’ho ancora fatto.

      Se il tuo dilemma sono i pin a cui collegare i pulsanti, sappi che puoi collegare i pulsanti anche ai pin digitali usandoli come input, dovrai modificare lo sketch in quanto su quest’ultimi non puoi usare analogRead ma digitalRead ed i valori letti sono solo LOW e HIGH.

      Mauro

    • danilo on 23 maggio 2013 at 07:44
    • Reply

    grazie mille come sempre, l’unica cosa che non ho capito e quando mi hai detto di connettere i servo direttamente alle uscite PWR di arduino?? in pratica non va bene mettere il + e – come o fatto o cosa??? scusa la mia ignoranza ma non ho capito grazie ancora una volta

    1. Ciao Danilo,
      le uscite PWM ( Pulse Width Modulation ) non PWR.

      Mauro

    • danilo on 23 maggio 2013 at 19:01
    • Reply

    scusa ancora ma credo di non aver capito il più e il meno del servo li collego alla blackboaard dove c’è l’alimentazione della batteria e invece il terzo filo che è quello del segnale lo collego ai pin digitali Pwm se quello che mi vuoi dire è questo nn c’è problemi perchè nello schema è così

    1. Ciao Danilo,
      hai capito perfettamente.
      Probabilmente ho visto io male nello schema.

      Così non dovresti avere problemi di oscillazione dei servo.

      Mauro

    • danilo on 23 maggio 2013 at 20:10
    • Reply

    ok però non so perchè ma quando uso due servo funziona tutto bene senza alcun problema mentre se ne aggiungo ancora uno cioè il terzo comincia a muoversi in maniera strana ( esempio premo un pulsante e si muove il servo che devo comandare ma nello stesso momento un’altro servo si muove assieme al primo??) io penso che sia per colpa dei pin A0 A1 e A4 A5 in quanto se uso A0 A1 con A2 A3 tutto ok se uso A2 A3 con A4 e A5 ok mentre se uso A0 A1 con A4 A5 non funziona e comincia a muoversi stranamente ( esempio il primo servo va avanti ma non riesce a tornare indietro sempre ovviamente usando i pulsanti ) cosa può essere secondo te ???

    1. Ciao Danilo,
      ora sei più chiaro, dicendo stranamente e non spiegando lo avevo inteso ne i trattasse di sfarfallii del servo, solitamente dovuti all’alimentazione o ai pin a cui é collegato il servo.

      Il tuo problema é chiaramente di sketch, metti dei debug sui valori letti da A0 ad A5 ed osserva se premendo i vari pulsanti le letture sono quelle attese.

      Mauro

    • Emanuele on 4 giugno 2013 at 08:53
    • Reply

    Ciao,
    avrei bisogno del tuo aiuto e volevo chiederti visto che non riesco a contattarti su Facebook se hai una mail dove posso scriverti cosi che riuscirai a rispondermi =)
    Grazie!

    1. Ciao Emanuele,
      puoi scrivermi commentando gli articoli.
      Su FB ci passo pochissimo tempo come a leggere le email … cerco di dedicare il mio tempo al blog ed agli esperimenti nuovi con Arduino.
      A volte questo comport che mi faccio attendere nelle risposte ma è perché sto provando nuovi progetti.

      Mauro

    • jassi on 8 giugno 2013 at 00:53
    • Reply

    Salve, seguo i vostri progetti da un un paio di giorni, sto realizzando il mio primo progetto con un servo, e non riesco a farlo girare come voglio io. Ho 2 serbatoi da 10 litri. esempio sciaquone del WC
    -premo il pulsante
    -si apre la valvola di scarico acqua con servo
    -livello basso acqua
    -chiusura valvola
    -se valvola è chiusa mi accende la pompa dal secondo serbatoio (dove è scesa l’acqua dal primo serbatoio)
    -raggiunto il livello massimo si spegne la pompa

    #include

    Servo myservo;
    int pos = 0;
    int start= 10;
    int valore_start=0;
    int livelloalto = 4;
    int valore_livelloalto =0;
    int livellobasso = 6;
    int valore_livellobasso = 0;
    int pompa = 8;
    void setup()
    {

    pinMode(start,INPUT);
    pinMode(livelloalto,INPUT);
    pinMode(livellobasso, INPUT);
    pinMode(pompa,OUTPUT);
    myservo.attach(9);
    }

    void loop() {
    valore_start = digitalRead(start);
    if ( valore_start==HIGH){
    do {

    for(pos = 0; pos < 90; pos += 1)
    {
    myservo.write(pos);
    delay(15);
    }
    valore_start=digitalRead(start);//,valore_livelloalto=digitalRead(livelloalto);
    } while (valore_start==HIGH);
    }

    valore_livellobasso=digitalRead(livellobasso);
    if (valore_livellobasso==HIGH) {
    do {

    for(pos = 0; pos < 90; pos += 1)
    {
    myservo.write(pos); '
    delay(15);
    }
    valore_livellobasso=digitalRead(livellobasso);
    }while (valore_livellobasso==HIGH);
    }
    }

    il problema è che il servo fà avanti e indietro. e ciò che non riesco è far premere il pulsante e vada tutto. senza star li a tener premuto il pulsante fino all'apertura.
    se qualcuno è cosi gentile da darmi una mano,

    1. Ciao Jassi,
      Come avrai letto in fondo agli articoli chiedo di non postare codice xchè diventa illeggibile.
      Da quello che posso vedere hai copiato il codice da sketch trovati in rete con finalità differenti dalla tua.

      Ci sono alcuni errori logici: i cicli for per portare il servo da 0 a 90gradi non servono, basta scrivere servo.write(0) per portarlo a 0 gradi e servo.write(90) per portarlo a 90 gradi.

      Inoltre il while con la condizione di verifica pressione pulsante ad HIGH fa in modo che appena lasci il pulsante il servo torni in posizione e si fermi il flusso idrico.

      Mauro

    • jassi on 8 giugno 2013 at 10:05
    • Reply

    si ho cercato di prender spunto da sketch di arduino e il resto insieme al mio amico, proviamo e modificare alcune cose allora, grazie del consiglio provo a fare come dici te.quindi invece di mettere questa funzione (pos = 0; pos < 90; pos += 1) basta mettere solo servo.write(90) oppure servo.write(0),

    1. Ciao Jassi,
      si almeno per la prima parte, ma non risolve tutto, il resto ci devi ragionare un po’ su.

      Mauro

    • jassi on 8 giugno 2013 at 11:23
    • Reply

    ok il programma funziona l’ho semplificato abbastanza. una cosa con la funzione servo.write(90);
    non riesco a dargli il delay(1000); devo far rallentare la chiusura, e l’apertura mi va benissimo perchè è veloce.
    per il resto ci sono

    1. Ciao Jassi,
      se vuoi rallentare il moto del servo devi costruire un ciclo for cha vada da 0 a 90 e per ogni grado metti un piccolo delay.

      Prova a leggere il tutorial sul passaggio a livello ferroviario 🙂

      Mauro

    • Simone on 8 giugno 2013 at 12:22
    • Reply

    Ciao Mauro ho questo problema…Dovrei far funzionare due servo con un arduino( li uso in un progetto che riguarda un parcheggio) il primo servo si aziona grazie ad un sensore dove al momento del passaggio della macchinina in entrata si alza la sbarra e dopo qualche secondo si riabbassa; con lo stesso principio utilizzo anche il secondo servo per l’uscita.Il problema è che entro con la macchinina e tutto funziona ma all’uscita il servo rimane fermo come se fosse bloccato…Dove ho sbagliato?? Grazie per l’attenzione a presto

    1. Ciao Simone,
      purtroppo non saprei dirti, controlla di aver dichiarato 2 servo e altrettanti pulsanti o sensori.
      Inserisci delle linee di debug ( Serial.println ) per vedere cosa accade mentre esegui lo sketch, magari non legge il secondo sensore.

      Mauro

        • Simone on 10 giugno 2013 at 17:38
        • Reply

        Il problema è che tutto comandato da un PLC…Il sensore legge il movimento ma non fa azionare il secondo servo.Provo a mettere due arduino, uno per l’entrata e uno per l’uscita?

        1. Ciao Simone,
          mi sembra eccessivo 🙂
          Ti basta lavorare sull’alimentazione esterna.

          Mauro

            • Simone on 10 giugno 2013 at 17:59

            Non sono per le cose facili 😀 grazie mille per l’attenzione!!

    • jassi on 10 giugno 2013 at 23:30
    • Reply

    mauro un grande problema che non sò come risolverlo, hai presente il controllo livello liquido ? vorrei usare la 5 volt nell’acqua cosi appena và a contatto con l’acqua il livello alto l’uscita và alla base del bc337 cosi mi accende il relè. Il problema viene sul sensore del minimo, che mi deve chiudere la valvola. ma come faccio se il sensore del minimo sarà già a contatto nell’acqua? teoricamente dovrebbe chiudermi la valvola appena non è più in contatto con l’acqua, come faccio a gestire la corrente e il programma? è un problema tra 10 giorni ho l’esame di maturità

    1. Ciao Jassi,
      Il controllo liquidi non si fa con il contatto.
      Primo perché si ossidano col tempo e secondo perché il corto circuito non é una buona soluzione.
      Io opterei per un sensore a ultrasuoni che ti rilevi il livello dell’acqua, lo metti sul “tetto” del contenitore e lui misura la distanza del liquido.

      Mauro

    • jassi on 11 giugno 2013 at 14:19
    • Reply

    col sensore ultrasuoni non saprei come fare il programma, non l’ho mai utilizzato, riesci a darmi qualche dritta riguardo ai ultrasuoni e il programma se non è complicato

    1. Ciao Jassi,
      nel blog trovi srf05, ho scritto un articolo con cui puoi usarlo ti bastano poche righe di codice ed il gioco è fatto.

      Mauro

    • jassi on 11 giugno 2013 at 23:33
    • Reply

    grazie mille mauro sempre gentile,
    scusate ma ho due mila problemi. ho acquistato un servocomando della hitech HS-7954SH con arduino myservo.write(90); non riesco far la funzione, con un’altro servo lo fà..appena dò l’impulso si posiziona allo 0 poi dico di andare a 90, ma non lo fà.. che problema può essere?? ” gli dò alimentazione esterna a 5 volt con il gnd comune all’arduino

    1. Ciao Jassi,
      puoi darmi del tu senza problemi siamo appassionati Makers.
      Il servo che hai acquistato é un servo digitale
      , con una coppia interessante 29km*cm, la classe Servo controlla servo analogici.
      Mi incuriosisce il test di un servo di questo tipo, ma non ne possiedo uno per verificarne le potenzialità e fare esperimenti.

      Mauro

    • jassi on 12 giugno 2013 at 12:23
    • Reply

    è potentissimo, ho provato a fermarlo con forza ma lui spinge lo stesso, io per ora l’ho provato con 5 volt e sono contento per quello che serve a me è già troppo, immagina a 7,4 volt che bestia che diventa. 🙂 però sono deluso da una parte xkè non riesco a farlo andare con digitalWrite non sò xkè non funziona più, invece con analog funziona, diamine cerco di risolvere i problemi e mi si creano altri

    se riesci a darmi una mano a far i movimenti da 90 a 0 gradi , con digitalWrite posso mettere un video qui per dare una dimostrazione della potenza cosi se uno è interessato lo potrà ordinare da internet, ovviamente costa non si può pretendere di spender meno su queste cose

    1. Ciao Jassi,
      i servo digitali e analogici sono differenti non solo per precisione ma sopratutto per metodo di controllo.
      Modificare il comando potrebbe non essere sufficiente.

      Purtroppo non avendo un servo di questo tipo non saprei dove provare lo sketch.

      Mauro

    • jassi on 13 giugno 2013 at 00:34
    • Reply

    mauro risolto tutto, funziona tutto a meraviglia, il fatto che questi servo ad alta precisione hanno una gradazione più elevata rispetto ai normali servo, la sua gradazione è diversa. per esempio se voglio la gradazione 0 , dovrò mettere 98 e per essere a 90° metto 166 tutto se metti 180° non funziona. questa è la novità di servo ad alta precisione

    1. Bene Jassi,
      sono contento che tu abbia risolto.

      Mauro

    • Marco on 26 agosto 2013 at 20:58
    • Reply

    ciao tutorial molto interessante ma vorrei sapere se fosse possibile impostare delle variabili utilizzando un solo pulsante per servo per cui quando il servo arriva alla massima ampiezza premendo nuovamente l pulsane il servo ruoti in senso opposto e arrivi alla minima ampiezza. sono ore che cerco di modificare il tuo script per arrivare al mio scopo ma non riesco… potresti apportarmi tu le modifiche da me richieste e upparmi il nuovo script grazie ?
    grazie mille

    1. Ciao Marco,
      ciò che vuoi fare é possibile.
      Lo scopo del Blog é fornire spunti e per stimolare la realizzazione dei tuoi progetti.
      Inoltre ci sono tanti progetti con i servo e le lezioni on-line per imparare e sperimentare con arduino.

      Posso consigliarti la lettura dell’articolo sul passaggio a livello per plastici ferroviari, troverai che il funzionamento é molto simile a quello che desideri realizzare.

      Se non ci riesci posso darti qualche dritta su come impostare il tuo sketch.

      Mauro

        • Marco on 27 agosto 2013 at 13:50
        • Reply

        ciao, non capisco come potrebbe essermi utile il tutorial passaggio a livello per plastici ferroviari, potresti spiegarmi meglio? grazie

        1. Ciao Marco,
          hai provato a seguire il mio consiglio? Hai letto l’articolo?
          Se ci pensi un passaggio a livello funziona come vuoi tu:
          1. il treno, passando sui binari precedenti al passaggio a livello, preme un interruttore
          2. il passaggio a livello si chiude, il servo va alla posizione desiderata
          3. il treno passa
          4. il treno, passando oltre il passaggio a livello, preme un pulsante che da il segnale di apertura
          5. il passaggio a livello si apre, il servo torna alla posizione iniziale

          A volte la fantasia risolve problemi complessi in pochi passaggi.

          Mauro

            • Marco on 27 agosto 2013 at 15:25

            concordo sull’ultima frase ma non credo che questo risponda alle mie richieste ciò che dico io è:
            1: viene premuto un pulsante il servo ruota fino ad un range prestabilito
            2:viene ri-premuto e il servo si ferma
            3: il pulsante vien premuto nuovamente e il servo ritorna in posizione iniziale

            sarebbe fattibile? è giusta l’idea di dover creare delle variabili?
            quali modifiche potrei apportare al tuo sketch per arrivare al risultato voluto ?
            grazie per la pazienza e il tempo che mi stai dedicando…

          1. Ciao Marco,
            ora ho compreso meglio ciò che vorresti fare, resta fattibile.
            Sono curioso di sapere perché se il servo alla pressione del primo pulsante inizia la sua corsa verso un punto preciso, che tu avrai definito come angolo di arrivo, es.: 180, ti occorra un ulteriore pulsante per fermare questo moto.

            L’idea delle variabili é corretta ha bisogno di definire il grado di artenza, quello di fine e quello corrente ed implementare la rotazione dal min al max grado alla pressione del primo pulsante a meno che non sia premuto il secondo pulsante, c’è ferma tutto.

            In ultimo il terzo pulsante riporta il servo in posizione 0.

            Mauro

    • tobia on 27 novembre 2013 at 22:25
    • Reply

    ciao mauro perche non colleghi i pulsanti ai pin digitali così verrebbe più semplice?

    1. Ciao Tobia,
      ottima intuizione, ci sono alcuni motivi:

      1. i pin digitali sono sempre pochi nei progetti, mentre i pin analogici avanzano sempre, in questo modo lascio più pin digitali al progetto;

      2. come suggerisci correttamente sarebbe più semplice, quindi meglio spiegare la parte più complicata 🙂

      Mauro

    • andrea on 8 gennaio 2014 at 12:30
    • Reply

    ciao bellissimo video ti volevo chiedere un informazione. Se io invece volessi gestire un servo sempre con i due pulsantii che se ne schiaccio uno il servo gira a 360° da una parte e se schiaccio l altro gira a 360° nell altro verso ?

    1. Ciao Andrea,
      i servo che uso nei miei tutorial sono servo da 180° e non possono eseguire movimenti a 360°.
      Se vuoi eseguire la rotazione in verso orario e antiorario con due pulsanti puoi seguire il tutorial sul passaggio a livello ferroviario e modificarlo leggendo la descrizione che trovi nell’articolo.

      Mauro

    • Francesco on 17 gennaio 2014 at 17:25
    • Reply

    Ciao Mauro,
    sto provando a replicare il tutorial per realizzare un progetto, sto utilizzando un micro servo 9g ma non vanno, leggendo altri commenti ho visto che alcuni servi potrebbero dare dei problemi perché con diverse caratteristiche da quello usato nel tutorial, come posso risolvere questo problema e utilizzare i miei servi 9g
    grazie dell’aiuto,

    Francesco

    1. Ciao Francesco,
      alcuni servo non accettano i comandi inviati con il metodo write() della libreria Servo.h
      Proprio oggi ho pubblicato un progetto in cui uso il metodo writeMicrosecond() puoi provare con questo metodo.

      Mauro

    • Francesco on 17 gennaio 2014 at 17:46
    • Reply

    ok grazie mille proverò e ti faro sapere grazie ancora.

    Francesco

    • Francesco on 17 gennaio 2014 at 18:21
    • Reply

    ho provato e con quel metodo vi servo va una meraviglia… il problema è che non riesco ad inserire i pulsanti…

    1. Ciao Francesco,
      come leggi in tutti i miei articoli chiedo di non postare codice perché arriva illeggibile e non posso aiutarti.

      Per inserire i pulsanti non devi cambiare nulla rispetto allo sketch indicato, quella parte non varia, tu sostituirai solo i comandi di controllo del servo.

      Mauro

    • Claudio on 16 marzo 2014 at 23:01
    • Reply

    Ciao Mauro, ho provato questo esempio ma ho un problema con gli angoli negativi.
    Ovvero il mio servo deve muoversi da +28 a -28 e partire da 0.
    Quando premo il pulsante per tornare indietro si ferma a 0 e non va a -28.
    Per il resto funziona tutto a meraviglie.
    Grazie per i tuoi preziosi esempi.
    Claudio

    1. Ciao Claudio,
      i servo non lavorano per gradi negativi ma solo da 0 a 180°

        • Motux on 18 marzo 2014 at 22:25
        • Reply

        Ci ho pensato dopo…ho girato il tutto di 90° ed il gioco è fatto. Ora ho un solo piccolo problemino il servo in fase finale verso il 118 si sente come un ronzio (tremolio).
        Ho letto che può essere dovuto alla alimentazione della porta USB, ma volgio provare con un diodo da inserire prima.

        Cosa ne pensi?
        A presto

        1. Ciao Motux,
          se il servo vibra può dipendere dalla meccanica non particolarmente affidabile o dall’alimentazione insufficente.
          Nel primo caso dovresti osservare la vibrazione nei punti estermi (0° e 180°) o per tutti i gradi a cui posizioni il servo.
          Nel secondo caso ti basta alimentare il servo con 6v esterni ad arduino come descritto in molti dei miei tutorial sui servo e l’alimentazione esterna.

    • pasquale adobbato on 14 aprile 2014 at 18:53
    • Reply

    Ciao Mauro,sono nuovo in arduino! ho bisogno di reperire un semplice codice che mi esegua questa cosa qui : in ingresso un segnale servo da una ricevente in uscita lo stesso segnale ma con un temporizzatore ritartdato alla diseccitazione in pratica ogni volta che ho una variazione sul canale di ingresso devo trasferirlo in uscita per un tempo x .
    grazie ciao

    1. Ciao Pasquale,
      se vuoi realizzartelo da solo posso indicarti come articoli che possono fare al caso tuo quelli dedicati a “Wirc” ed al “Leo-Wi Rover 5”.
      Nel tuo caso puoi recuperare il codice relativo all’acquisizione del segnale PWM per poi trasferirlo al servo, dai miei test consiglio di utilizzare la Leonardo come scheda che ha una risposta in termini di tempo migliore.

      Se invece vuoi che te lo realizzi io scrivimi sulla casella info del blog ed io proverò a verificarne la fattibilità.

    • ALESSANDRO on 3 giugno 2014 at 17:08
    • Reply

    ciao Mauro…
    Da premettere che sei un grande….ma ti prego aiutami…
    allora ho due servo ” MG946R” che mi stanno facendo impazzire…ora me li mangio….ma magari prima di fare indigestione,vorrei un tuo consiglio grazie…
    in pratica devono compiere simultaniamente un giro da 0 a 180, e viceversa,tramite interruttore….e fino a qui ci siamo!carico il programma sull’arduino, collego il tutto ad un pacco batterie di 4 stilo…ma non appena premo l’interruttore per farli muovere,vanno come pazzi…vibrano…tremano…non si muovono proprio…non mantengono la posizione ecc ecc ecc…quindi come posso fare per evitare di farmi impazzire ancora di piu’?…..grazie mille…

    1. Ciao Alessandro,
      da premettere che ti aiuto volentieri ma la tua prima frase è proprio brutta 🙂
      Da quello che mi descrivi è un problema di alimentazione, sei certo che i collegamenti tra i servo e le 4 stilo siano corretti?
      Hai provato a seguire il mio articolo su come alimentare i servo con alimentazione esterna?

    • ALESSANDRO on 3 giugno 2014 at 17:53
    • Reply

    CIAO MAURO….
    SI….E DA LI CHE HO PRESO LO SPUNTO…
    MA FANNO COME MATTI…
    STO USANDO 4 DURACELL AA….MANGERO’ PURE QUELLE SE NON TROVO UNA SOLUZIONE…TI PREGO AIUTAMI……. 🙁

    1. Ciao Alessandro, ti chiedo di non scrivere in MAISCOLO, su internet é maleducazione e di non aspettarti risposte ogni minuto alle tue domande.
      In una parola usa la dovuta educazione come tutti altrimenti cestino i tuoi commenti.

      I servo li hai provati singolarmente, uno alla volta ?
      Si comporta allo stesso modo ?

      Provali con il codice di esempio dei servo fornito con l’IDE arduino ( Knob ) se anche con quel codice vibra il servo che provi é un problema meccanico di questo modello di servo o di frequenza dei pin e la soluzione é più complessa.

    • ALESSANDRO on 4 giugno 2014 at 09:52
    • Reply

    Ciao Mauro scusami….
    Non sapevo che scrivere in maiuscolo significasse maleducazione…io scrivo sempre cosi per abitudine…scusami davvero…
    ma non ho scritto nulla di male,se e cosi perdonami….
    Si lo fanno anche singolarmente,e vibrano sempre…..cosa mi suggerisci?…calcola che non sono molto esperto,quindi se esiste un modo semplice e meglio…grazie mille

    • Alessandro on 16 giugno 2014 at 19:30
    • Reply

    Ciao Mauro
    volevo chiederti se gentilmente potevi darmi qualche indicazione su come far cessare il tremolio a i due servo….grazie

    1. Ciao Alessandro, dovresti capire se il problema riguarda l’elettronica, la meccanica o la programmazione.
      Nel primo caso prova un solo servo e se non trema potrebbe essere l’alimentazione insufficiente.
      Nel secondo caso puoi farci poco perché la meccanica dipende dal costruttore.
      Nel terzo caso prova l’esempio Knob fornito con arduino e capirai se l’errore é nel tuo codice o meno

    • Alessandro on 17 giugno 2014 at 09:37
    • Reply

    Ciao Mauro
    Grazie mille sei stato gentilissimo….ho fatto tutte le prove che mi hai detto, risultato ….continuano a tremare…ho anche provato con servo diversi e funziona tutto bene, soltanto con questo modello, si comportano cosi. Peccato perche ne ho 4 e vorrei usarli e cercare di risolvere il tremolio che fanno…grazie mille

    1. Ciao Alessandro,
      se il problema si verifica con tutti gli sketch è quasi certamente un problema meccanico.
      Di solito capita con i mini-servo a basso costo, hanno meccanica ed elettronica interna poco stabile.

    • Alessandro on 17 giugno 2014 at 11:09
    • Reply

    Ciao Mauro
    Però ho notato che con il knob vanno bene… Eseguono il movimento giusto
    Stavo pensando, magari sbaglio qualcosa sulla programmazione? Non e che magari tu puoi inviarmi un skect tramite mail su come devono muoversi? Devono andare da 0 a 180 e tornare indietro…tramite un pulsante
    Grazie mille

    1. Ciao Alessandro,
      perdonami ma dal tuo commento avevo compreso che anche con lo sketch di esempio avessero problemi.
      Se con quello vanno bene prova uno dei miei tutorial sui servo usano la stessa libreria allo stesso modo.

    • ALESSANDRO on 17 giugno 2014 at 14:59
    • Reply

    Ciao Mauro
    ho provato alcuni tuoi esempi,si muovono ma sempre con un tremolio…e in più noto che si scaldano abbastanza,cosa mi suggerisci?
    grazie mille

    1. Ciao Alessandro, mi sembra molto strano che con l’esempio Knob tutti i servo funzionino e cambiando sketch ma non i collegamenti essi inizino a tremare.
      Hai eseguito l’esempio e gli sketch con il medesimo numero di servo connessi e in movimento e con i collegamenti identici?

      Questo test deve determinare se il problema dipenda dallo sketch o dall’alimentazione ma deve essere eseguito nelle medesime condizioni.

    • Alessandro on 18 giugno 2014 at 08:35
    • Reply

    Ciao Mauro
    Stavo pensando che questo tremolio me lo fa perché ci sarà un calo di tensione, e se usassi dei condensatori? Magari uno lo collego ai servo, e l’ altro all’ interruttore..Che te ne pare?
    Grazie ancora

    1. Ciao Ale, eseguendo i test che ti ho indicato puoi confermare la tua ipotesi. In ogni caso é sempre bene usare un alimentazione esterna quando hai dei servo da muovere. Esistono delle shield che eventualmente puoi utilizzare per controllare i servo con alimentazione corretta.

    • marco on 29 giugno 2014 at 19:43
    • Reply

    Semplice e banale domanda, perchè ha messo le resistenze?

    1. Ciao Marco,
      trovi la risposta nelle prime lezioni del corso arduino online gratuito che ti invito a leggere.
      Si chiamano resistenze di pul-down o pull-up.

    • marco on 30 giugno 2014 at 21:39
    • Reply

    buona sera,
    grazie per avermi risposto in tempi brevissimi! Volevo chiederle un ultima cosa:
    Se volessi comandare i servo in remoto? si potrebbe fare?
    Sono riuscito a recuperare un tsop1736, mi sono ricavato la piedinatura dal datasheet, trovato il codice del telecomando e riuscito ad accendere e spegnere un led, con un telecomando. Adesso, volevo provare a muovere un servomotore ma non so come fare, mi potrebbe aiutare?
    P.s: Veramente complimenti, un bel sito,ricco di tutorial spiegati bene!

    1. Ciao Marco,
      sei già arrivato all’80% dell’opera ti manca solo di applicare tutto al servo.
      Per decidere come procedere devi definire in che modo vuoi che la pressione di un pulsante influisca sul servo e applicare questa logica agli esempi che trovi nel sito per i servo ed i pulsanti come in questo articolo.

    • Andrea on 5 ottobre 2014 at 21:17
    • Reply

    Salve io vorrei sapere come fare se devo voglio comandare un servo con un pulsante: quando lo schiaccio una volta va al grado 0, e la seconda volta al grado 180. Grazie

    1. Ciao Andrea,
      hai già letto i miei articoli sui servo ed i pulsanti?
      Se leggi attentamente gli articoli e le loro descrizioni imparerai a far fare al servo tutti i gradi che desideri.
      In genere per ottenere quello che desideri io userei una variabile contatore per conscere il numero di volte che hai premuto il pulsante 1 o 2.

  1. bellissimo e istruttivo. ma è lo stesso se sostituisco il servo con un motore cc e una shield attaccando i 2 pulsanti ai pin digitali?? grazie1000

    1. Ciao Den,
      i servo ed i motori cc hanno caratteristiche elettromeccaniche molto differenti.
      Otterrai comportamenti differenti.

    • Giovanni on 17 febbraio 2015 at 11:58
    • Reply

    Ciao!
    volevo sapere come faccio a far lampeggiare 2 led e intanto far andare il servo (passaggio a livello con luci lampeggianti).
    Grazie in anticipo

    1. Ciao Giovanni,
      potresti usare la funzione millis() per conteggiare il tempo dei lampeggi senza interrompere il ciclo loop()

    • Gianfranco on 18 febbraio 2015 at 14:03
    • Reply

    Ciao Mauro, esiste uno sketch per controllare il servo con un solo pulsante anzichè con due?
    (es. interruttore on/off).

    Come si potrebbe associare “premuto” a prev e “non premuto” a next?

    Grazie mille,
    Gianfranco

    1. Ciao Gianfranco,
      in internet ci sono migliaia di sketch che fanno tante cose ed alcuni li trovi anche nel blog.
      Tuttavia ti invito a comprendere il funzionamento di uno dei miei sketch sul controllo dei servo ed applicare le modifiche che vorresti, ti garantisco che la soddisfazione è massima.

    • Ivan on 26 aprile 2015 at 18:50
    • Reply

    Ciao Mauro;
    Bellissimo lavoro, molto interessante.
    Scusa volevo domandarti ma come faccio a comandare 2 servomotori in questo modo con lo stesso arduino.

    Grazie
    Ivan

    1. Ciao Ivan,
      dipende da come desideri controllarli in modo sincrono o asincrono ?
      Ossia desideri che entrambi eseguano il medesimo spostamento in gradi in modo parallelo o devono eseguire due gradi di spostamento differenti ?

      Mauro

    • michele on 24 luglio 2015 at 22:02
    • Reply

    salve mauro ho visto il suo tutorial e lo trovo molto interessante,
    su youtube ho trovato questo video:
    https://www.youtube.com/watch?v=h7xAM177DR0
    mi piacerebbe molto replicarlo e volevo chiedere il suo aiuto per realizzarlo
    premetto che ho il modulo wifi ESP 8266
    telefono sia apple che android….
    ma per il resto ahimè ho poca esperienza essendo entrato nel mondo arduino da poco tempo…
    grazie in anticipo…

    1. Ciao Michele,
      perdonami ma quel video non è il mio ed in questo articolo non si parla di nulla che abbia a che fare con quel video, come hai associato le due cose?
      Io ho realizzato dei tutorial in cui puoi controllare un servo con uno smartphone ma uso delle Shield adatte con le proprie App.
      Si può certamente fare anche con l’ESP8266 ma richiede molta conoscenza di programmazione sia di arduino sia App .. Direi che iniziare con qualcosa di semplice aiuta a comprendere i concetti e poi decidere come replicarli ed adattarli.

      • michele on 28 luglio 2015 at 18:35
      • Reply

      ah ok mi potresti dare il link del tutorial da te eseguito perchè non l’ho trovato…grazie

      1. Ciao Michele,
        prova a cercarlo come “bear” è il tipo di scheda che ho utilizzato.

  2. ciao Mauro, ho difficoltà nel “void loop” che dopo aver compilato lo sketch mi da il seguente errore:

    sketch_aug11a.ino: In function ‘void loop()’:
    sketch_aug11a:25: error: lvalue required as decrement operand
    sketch_aug11a:26: error: lvalue required as increment operand
    sketch_aug11a:28: error: lvalue required as left operand of assignment
    sketch_aug11a:29: error: lvalue required as left operand of assignment
    lvalue required as decrement operand

    Dunque che volori devo inserire dalla riga 26 alla 30??

    Ecco anche lo sketch che ho compilato:

    [[ codice rimosso in automatico ]]

    Grazie in anticipo!

    1. Ciao Davide,
      come hai letto è vietato inserire codice nei commenti e viene rimosso, sopratutto se si tratta di mio codice.
      Hai certamente modificato il mio sketch senza averne compreso a fondo il significato per generare quel tipo di errore in quanto io non ho valori specificati alle righe evidenziate dall’IDE in fase di compilazione.
      Controlla di aver copiato correttamente il mio esempio e di aver compreso la sua descrizione riga per riga fatta sotto, l’errore dovrebbe sparire.

  3. ottimo, sembra funzionare, non mi da errori, appena collego tutto vedrò se funziona, grazie mille!

    • peppe on 18 dicembre 2015 at 09:14
    • Reply

    salve
    da pochissimo ho conosciuto il mondo di arduino e ho comprato un kit di partenza ….
    sto leggendo il tuo bellissimo sito e ti ringrazio in primis per la condivisione gratuita di moltissime informazioni
    mi interesso di fermodellismo e vorrei realizzare alcune cose con arduino

    volevo chiederti

    nell’utilizzare un servo per un deviatore (scambio) da dx a sx e viceversa cioè da – 45° a + 45° circa

    è possibile comandare da programma un servo con un solo tasto o ne servono per forza due ?

    grazie

    1. Ciao Peppe,
      dipende dalla logica che desideri applicare, puoi controllare più servo con uno,due,tre o più tasti.

    • Marco on 3 gennaio 2016 at 13:38
    • Reply

    Buongiorno, ho un problema di comprensione per quanto riguarda lo schema elettrico. Immagino che ogni singolo pulsante sia a doppio contatto normalmente aperto, e che chiuda alla sua pressione nel modo seguente: reoforo in alto a sinistra con reoforo in basso a sinistra e in modo identico alto destro con basso destro. Detto questo il positivo che dal filo rosso del servo va al pulsante, dall’altra parte dove è collegato? Grazie per la risposta
    Ps avrei pronta una immagine, ma non so come allegarla.

    1. Ciao Marco,
      penso di non aver compreso la domanda.
      Nello schema illustrato in questo articolo sono presenti due pulsanti in configurazione pull-down con resistenza da 10K ciascuno.
      Il filo rosso è collegato al +5v di arduino, il nero a Gnd

    • Marco on 4 gennaio 2016 at 15:42
    • Reply

    Cerco di spiegarmi meglio. Come saprai i pulsanti sono venduti con la meccanica interna che può essere di tipo NA (normalmente aperto) oppure NC normalmente chiuso. Avendo chiarito che si tratta di un collegamento pull (indifferentemente down o up) i pulsanti sono per forza di tipo NA (chiudono il contatto alla loro pressione). Poi la differenza sta nel posizionamento della resistenza.(down a -Vcc e up a +Vcc). Quei pulsantini da cs al loro interno hanno un doppio contatto. Conteggiando i piedini in senso orario, 1 chiude su 4 mentre 2 su 3. Nello schema è chiaro che il ramo con la resistenza R1 chiude su analog 0 e quindi il piedino 2 con il 3 non è chiaro se il piedino 1 chiude sul piedino 4 quindi a +5Vcc, in quanto, secondo me mancano nello schema disegnato 2 cavallotti. Grazie, spero di essere stato chiaro.
    Ps. Sto costruendo una testa mobile per telecamere sarei lieto di passarti poi il progetto per poterlo mettere a disposizione della comunità.

    1. Ciao Marco,
      i pulsanti che ho utilizzato sono NC su 1-2 e 3-4 e NA su 1-4 2-3.
      Alla pressione del pulsante si genera un contatto unico tra 1-2-3-4.

      Ecco perché non è necessario, nel mio schema, alcun altro collegamento.
      Se hai pulsanti differenti dovrai applicare i collegamenti mancanti.

      Mi farà molto piacere ricevere il tuo progetto per una pubblicazione.

        • Marco on 5 gennaio 2016 at 12:38
        • Reply

        Ciao, ho effettuato dei collegamenti volanti e il tutto funziona. Per il momento ho riscontrato un problema: il servo si muove in modo non del tutto lineare (ho utilizzato un servo da giocattolo). Dovrò sicuramente utilizzare una alimentazione duale per non caricare in corrente l’uscita di arduino. Faccio ulteriori prove con un servo un pò più serio e poi ti saprò dire. Ciao e grazie.

        1. Ciao Marco,
          immagino tu volessi dire “alimentazione separata” e non “duale” in quanto in elettronica l’alimentazione duale indica un tipo di alimentazione del tipo: +5v 0 -5v che nel tuo progetto penso non serva.

    • Marco on 4 gennaio 2016 at 17:37
    • Reply

    Ciao di nuovo e scusa. Per tagliare la testa al toro potresti darmi lo schema del circuito interno del pulsante? Grazie ancora!

  4. Buonasera, come mai la scelta di usare 2 input analogici per i 2 pulsanti che possono assumere valori logici (0/1) usando quindi più “logicamente” scusa il gioco di parole, i pin digitali 213 ?
    Grazie e buona serata !

    1. Ciao Stefano,
      ho colto l’occasione per mostrare un uso alternativo dei pulsanti che non sia il classico collegamento ai pin digitali.

    • luca on 12 giugno 2016 at 23:20
    • Reply

    Ciao Mauro. Prima di tutto ti faccio i miei complimenti per il tempo la passione e le tue conoscenze che metti a disposizione di tutto.
    E anche io come gli altri vorrei farti una domanda e mi sarò se non è questa la sezione giusta.
    Allora inizio con lo spiegarti quello che avrei in mente di fare:
    Vorrei realizzare un impianto di aspirazione in un laboratorio centralizzato e alla canalizzazione sui macchinari metterò delle valvole che staranno normalmente chiuse e aperte all accensione del macchinario acceso. In totale 6. A dimenticavoi motori dell aspirazione saranno due, uno da 5cv e uno da 2,5cv e anche questa accensione va controllata in base alle macchine accese.
    Allora adesso ti chiedo prima di tutto quale Arduino devo ordinare visto che ce ne sono molte versioni e ce bisogno di moduli aggiuntivi?
    Ordinero anche un display touch screen per poter intervenire su qualche parametro.

    Intanto ti ringrazio per l’attenzione.
    Saluti Luca

    1. Ciao Luca,
      con le informazioni che mi fornisci è complesso darti una risposta precisa.
      Occorrerebbe uno studio di fattibilità con maggiori dettagli sui motori e sul funzionamento totale del sistema.
      Ti consiglio di scrivere su un documento tutti i sensori e gli attuatori che ti occorrono, con le potenze ed i pin che ciascuno richiede per il controllo e in funzione di queste informazioni conti quanti pin totali devi avere su genuino per scegliere il modello adatto.

      Se vuoi posso eseguire uno studio di fattibilità su commissione, scrivimi alla casella info del blog.

    • luca on 13 giugno 2016 at 22:12
    • Reply

    Ciao Mauro ti ho mandato una mail dettagliata sull indirizzo info.
    Attendo notizie.
    Grazie

    1. Bene Luca,
      ti risponderò via email come previsto per i progetti su commissione.

    • Sebastian on 1 luglio 2016 at 19:44
    • Reply

    Ciao Mauro, avrei un problemino da risolvere, e vorrei un tuo consiglio per quanto riguarda il corretto funzionamento del mio servomotore. Il progetto è un caveau e usiamo un servomotore che gira di 90° a destra e a sinistra come porta(in tutto ha un’apertura massima di 180°), e per farlo usiamo 2 pulsanti, uno che apre il servomotore e che quindi si gira di 90° gradi in senso orario e con l’altro pulsante si girà sempre di 90° gradi in senso antiorario per chiudere la porta. Cosa dovremmo cambiare per fare ció? Grazie per la risposta! 🙂

    1. Ciao Sebastian,
      se ho compreso bene quello che devi realizzare è un sistema di controllo a due pulsanti della rotazione del servo: 90-0-90
      Leggendo la descrizione del codice non dovresti aver problema a comprendere come modificarlo, se qualche linea non ti è chiara scrivimi quale e provo ad approfondirti l’argomento e la descrizione.

    • Giovanni on 10 luglio 2016 at 22:15
    • Reply

    Buonasera Mauro, volevo chiederti un paio di cose su uno sketch chi ho scritto…

    Devo muovere 2 servo tramite i tasti di un lcd keypad shield ed una scheda arduino.In particolare i 2 servo devono muoversi di 2 angoli (0 – 90 gradi) tramite 2 pulsanti, inoltre ho altri 2 pulsanti che utilizzo per switchare tra i 2 servo (ovviamente parlo dei tasti del lcd keypad).
    Vi allego lo sketch…..

    [ codice rimosso in automatico ]

    Spero si riesca a capire il funzionamento..( nel primo caso ho impostato gli angoli nel secondo gli impulsi).

    La domanda che volevo farti è questa:

    Quando vado a selezionare il servo da utilizzare, questo si sposta in una posizione random(credo), non so per quale motivo.
    Si può eliminare questo difetto? Cioè vorrei che quando lo seleziono non vada in una posizione casuale ma rimanga in quella attuale( per esempio 90 gradi).

    ti ringrazio per la pazienza

    Buona serata a tutti

    1. Ciao Giovanni,
      in primo luogo ti invito alla lettura delle regole del blog, presenti in fondo ad ogni articolo, e rispettarle per correttezza verso tutti gli appassionati.
      Per risolvere il tuo problema ti basta registrare il valore in gradi di ciascun servo in una variabile o un array e riutilizzarlo come prima impostazione appena esegui lo switch.

  1. […] 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 […]

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.