Comandare un servomotore

Buongiorno a tutti,

come qualcuno ha già avuto modo di constatare, io sono completamente digiuno di elettronica. Ho trovato, grazie al vostro aiuto, un bellissimo pdf online della vecchia rivista "Nuova Elettronica" e sto imparando le basi, nel frattempo cerco anche articoli a destra e sinistra su quello che mi può interessare al momento.

Ho comprato da poco un clone cinese di Arduino Uno (Elegoo UNO R3) insieme ad un kit di componenti, e in questo momento mi sto cimentando con il servomotore, anche perché il primo progetto che ho intenzione di realizzare è un labirinto per biglie servocomandato (un joystick a due assi e due servomotori per i due assi di rotazione) con cui far giocare i miei figli.

Seguendo il tutorial arrivato con il kit ho collegato il servomotore (Microservo 9g SG90) alla mia board, ho caricato il programma demo "sweep" e l'ho eseguito. Funzionare funziona, ma il servo, invece di eseguire una rotazione completa di 180° come dovrebbe, si attesta sui 150° circa. Ho cercato un po' di informazioni sulla libreria e alla fine ho scoperto che in fase di inizializzazione si possono impostare manualmente i valori della lunghezza dell'impulso corrispondente a 0° e 180°, e infatti scrivendo

void setup() {
  myservo.attach(9,480,2400);
}

void loop() {
  myservo.write(0);
  delay(1000);
  myservo.write(180);
  delay(1000);
}

vedo che il servo effettivamente compie una rotazione di 180°. Però il problema non è risolto, perché se inserisco un write(90) nel mezzo, il servo non compie una rotazione intermedia di 90° ma di circa 120°... allora ho eseguito di nuovo il ciclo for dell'esempio con tempi di delay più lunghi e ho notato che per le prime 5-6 esecuzioni del ciclo (write(1), write(2) ecc...), l'angolo di rotazione dell'asse è superiore a 1° come dovrebbe essere, per poi attestarsi su valori corretti.

Ho provato a usare il metodo writeMicroseconds() e ho visto che non riesco a determinare spostamenti per valori inferiori a 550us e superiori a 2400us, ottenendo per altro una rotazione dell'albero inferiore ai 180° e molto simile a quella che ottenevo all'inizio senza specificare le "frequenze di esercizio" nel metodo di inizializzazione... però a questo punto mi sfugge il perché quei 480us specificati come opzione in "attach()" funzionino, e più in generale non capisco perché questo servo si comporti in questa maniera strana.

Lumi?

Grazie, Davide.

PS. Scusate l'edit, mi è scappato l'invio prima di finire di scrivere tutto, e per quanto riguarda il servo in sé non escludo che essendo una cinesata sia malfunzionante di suo.

I servo SG90 hanno comportamenti ondivaghi, per usare un eufemismo. Permettimi alcune osservazioni sul tuo progetto:

  1. Gli SG90 hanno una coppia bassa. Non so se riescono a far basculare la tavoletta del gioco che vuoi costruire.
  2. Gli SG90, una volta raggiunta la posizione, tendono a vibrare leggermente. Non credo che questo aiuti per il gioco che vuoi costruire
  3. Il joystick a due assi tipo questo hanno una corsa breve per una escursione alta della resistenza del potenziometro interno. Ciò comporta scarsa precisione.

Il mio consiglio è di provare joystick e servo PRIMA di costruire il gioco e verificare quanto ti ho detto. Se nell'intorno della posizione neutra (corrispondente alla tavoletta orizzontale) il servo non vibra e il joystick comanda agevolmente i piccoli spostamenti, allora puoi provare a costruire il tutto.

Ciao,
P.

pgiagno:
I servo SG90 hanno comportamenti ondivaghi, per usare un eufemismo.

Ok, allora è una cinesata :slight_smile:
Per adesso me lo faccio bastare, rivedendo il progetto ho visto che mi basta una rotazione complessiva di 90º.

Permettimi alcune osservazioni sul tuo progetto:

  1. Gli SG90 hanno una coppia bassa. Non so se riescono a far basculare la tavoletta del gioco che vuoi costruire.
  2. Gli SG90, una volta raggiunta la posizione, tendono a vibrare leggermente. Non credo che questo aiuti per il gioco che vuoi costruire
  3. Il joystick a due assi tipo questo hanno una corsa breve per una escursione alta della resistenza del potenziometro interno. Ciò comporta scarsa precisione.

Il mio consiglio è di provare joystick e servo PRIMA di costruire il gioco e verificare quanto ti ho detto. Se nell'intorno della posizione neutra (corrispondente alla tavoletta orizzontale) il servo non vibra e il joystick comanda agevolmente i piccoli spostamenti, allora puoi provare a costruire il tutto.

Ciao,
P.

La tavoletta è un 20x20 in cartone ondulato, dovrebbe essere sufficiente.

Nel frattempo ho realizzato il codice con circuito su basetta e funziona egregiamente, adesso devo studiare un po’ per capire se la board regge un altro servo uguale o se devo inserire una sorgente di alimentazione esterna.

Sì, la board regge due servo SG90 senza bisogno di alimentazione esterna. Controlla solo che l'alimentatore che alimenta l'Arduino abbia corrente sufficiente (2A ok), perché è dal +5V dell'Arduino che arriva l'alimentazione dei servo.

Ciao,
P.

P.S. se fai una foto della meccanica potrebbe essere interessante...

Perfetto, appena mi arriva il materiale che ho ordinato mi metto all'opera

pgiagno:
P.S. se fai una foto della meccanica potrebbe essere interessante...

Sicuramente!

pgiagno:
Controlla solo che l'alimentatore che alimenta l'Arduino abbia corrente sufficiente (2A ok)

Scusa, stavo leggendo questa discussione: Quanto danno in uscita la 5V e la 3.3V in amperaggio dell'Arduino UNO R3? - Generale - Arduino Forum

Se non ho capito male dice che comunque, alimentando da rete, più di 800mA non vengono forniti. Ho un alimentatore da 1A, fornito col kit... sarebbe sufficiente per i due servo? A che rischi potrei andare incontro?

davidevitali:
... Ho un alimentatore da 1A, fornito col kit... sarebbe sufficiente per i due servo? A che rischi potrei andare incontro?

1A è un po' pochino. Comunque puoi provare. L'unico inconveniente a cui puoi andare incontro consiste in restart dell'Arduino per alimentazione insufficiente.

Comunque alimentatori da 2A ormai si trovano anche dal salumiere.

Ciao,
P.