Risolvere problema regolazione microservi

Ciao a tutti ragazzi. Sto cercando di risolvere il noiosissimo problema dei servomotori a rotazione continua, cioè l’eterno setting per avere la giusta posizione del potenziometro (o giusto valore delle resistenze fisse al posto del potenziometro) per tenere ferme le ruote senza tremori o traballamenti.

Per risolvere questo problema ho pensato che, potendo avere feedback della tensione presente all’interno del circuito di alimentazione del motore (quindi i due cavi che alimentano il motore) con due porte analogiche, sarebbe piuttosto semplice pilotare il servomotore in modo che assorba 0, utilizzando la funzione analogWrite(), variando la tensione all’interno del circuito del potenziometro connesso a due porte digitali (i tre cavi che andrebbero connessi al potenziometro) si potrebbe pilotare tramite arduino il setting del motore, cioè fare le veci del potenziometro con arduino in modo logico e regolabile dal controllore. Questo renderebbe dinamica la gestione dello 0 del servomotore liberandoci dallo sbattimento del setting e permetterebbe anche un discreto feedback sul movimento fatto dal servomotore, cioè si potrebbe utilizzare questo valore per determinare quanta strada sta facendo il robot.

I problemi sono:

  • Basta tirare un cavo dai cavi di alimentazione a una analogica per ottenere la tensione all’interno?
  • Il motore rischia di assorbire tutta la corrente? In questo caso otterremo qualcosa nelle analogiche?
  • Come costruire il circuito in modo che non vada in corto se il motore inverte la sua rotazione

Ecco un disegno che ho fatto che descrive il circuito che analizza la tensione presente ai capi del motore:

Finchè il giallo è il rosso tutto funziona, ma se il senso di rotazione del motore cambia, ci sarebbe un corto circuito al diodo connesso al nero. Ci vorrebbe un elemento discreto in grado di switchare il contatto tra ground dopo il diodo e i due poli in base al verso della corrente. Sapreste darmi un consiglio?

Un esempio del futuro codice:

int assorbimento = analogRead(0); 
for(int i = 0.1; assorbimento < 0; i++)  { // se il motore sta ruotando in senso antiorario 
servo.write(ultimo comando dato + i); //fai un passo verso lo 0 
} 
for(int i = 0.1; assorbimento > 0; i++)  { //se il motore sta ruotando in senso orario 
servo.write(ultimo comando dato - i); //fai un passo verso lo 0 
}

Discussione originale:
http://www.gioblu.com/community/forum/topic?id=143&p=1883#p1883

ciao gbm

Na permettimi una valutazione da "rompiballe" che é dell'idea che le soluzioni piú semplici sono da preferire.

Al posto del Potenziometro del Servo se ci metti 2 resistenze dello stesso valore ( al limite al 1%) hai una tensione fissa a metá della tensione di retroazione e percui a 0 gradi é fermo il motore e a -90 o +90 gira nelle 2 direzioni.

Ciao Uwe

Ciao Uwe, la tecnica di base che ho utilizzato in passato e che molti newbies utilizzano è quella che consigli tu, che per esempio ho utilizzato nel mio robot self-balancing. Il problema è che: proprio perchè le resistenze e il valore che tu setti come posizione di stop (che cmq è 90, visto che il servomotore si utilizza con valori tra 0 e 180) dei servi sono statici, al variare della corrente con cui alimenti i servomotori varia anche il valore con cui stanno fermi, di conseguenza iniziano a tremolare o avanzare leggermente in una direzione. TUTTI e dico TUTTI i robot del mondo che utilizzano un servomotore modificato a rotazione continua sono affetti da questa sorta di morbo di parkinson. L'unico modo per risolvere la questione con le resistenze fisse è trovare empiricamente il valore con cui si fermano i servomotori e perderci noiosissimi minuti inutili. Secondo me un lavoro del genere non è ben fatto ma soprattutto non è utile per imparare qualcosa!!

Per questo ho pensato a un modo per ingannare la centralina del servo generando una corrente con analogWrite e una porta digitale. In questo modo è possibile simulare un potenziometro e modificare dinamicamente la posizione di esso.

Chiaramente il motore in basso nella foto è il motore interno al servomotore, che non sono riuscito a rappresentare meglio di cosi' :stuck_out_tongue:

Con i 4 diodi che vedi in figura filtro la corrente che arriva dalla centralina del servomotore in direzione del motore del servo in modo da evitare corti circuiti e per ottenere corrente positiva da mandare a due porte analogiche (se il motore va in una direzione otterro' un valore alto e uno chiuso dal diodo ecc. ecc.). In teoria conoscendo il voltaggio interno al circuito di alimentazione del motore e le specifiche del motore, riduzione e diametro della ruota potrebbe essere possibile ipotizzare un valore di spazio percorso / sec.

Se funziona con due for come quelli in esempio nel primo post, sarà molto semplice fermare il motore indipendentemente dalla corrente / tensione del circuito, dalla % di carica della batteria o temperatura dei servi. Se una di queste variabili cambiasse, il codice si risistemerebbe sul valore corretto di resistenza necessario a portare al minimo la corrente generata dalla centralina in direzione del motore.

Con le resistenze fisse o potenziometro devi ri-regolare ogni 10 minuti :wink:

Ragazzi ce l'ho fatta! :wink:
Non c'era bisogno di nessun componente discreto!! Ringrazio Brain per i vari consigli e il supporto!
basta saldare due cavi ai poli del motore del servo e tirarli alle due analogiche e il gioco è fatto!! Ragazzi mi sono aperto un mondo davvero!! Posso smettere di smadonnare per non fare avere il parkinson al robot e ho un input in piu' da utilizzare per mapping / ipotesi distanza percorsa / regolazione adattiva potenza motori in rapporto alla tensione ecc. ecc.

ho in mente anche qualcos'altro :wink:
stay tuned!