Pagina 1 di 2

PIC e servomotori

MessaggioInviato: 8 nov 2011, 22:28
da aduri
Salve a tutti,
sto facendo un po' di prove con i servomotori ma ho dei problemi.
I servo in questione sono degli MG995.
A volte girano da soli e non rispondono ai comandi.
Ho provato questo banale sw in mikrobasic 7.2 impostando 3 posizioni ma vanno subito in fondo scala (180 gradi) e non si muove da lì.
Mi sono fatto un po' di cultura sull'argomento e credo di aver rispettato le tempistiche.

grazie dell'aiuto

Codice: Seleziona tutto
program pulse_serv_458

main:

TRISB.0 = 0                   'out of servo
PORTB = 0                     'portB to zero value
TRISc.0 = 0                   'out of servo
portc.0=1                     'test

while true

portB.0=1
delay_us(1000)
portB.0=0
delay_ms(18)

delay_ms(1000)

portB.0=1
delay_us(600)
portB.0=0
delay_ms(18)

delay_ms(1000)

portB.0=1
delay_us(1500)
portB.0=0
delay_ms(18)

delay_ms(1000)


wend

end.

Re: PIC e servomotori

MessaggioInviato: 8 nov 2011, 23:29
da AjKDAP
aduri ha scritto:Mi sono fatto un po' di cultura sull'argomento e credo di aver rispettato le tempistiche.


Puoi spiegare un po' come funzionano i servomotori e come vengono controllati? con che tipi di impulsi? di che ampiezza?

Io dal codice che hai postato vedo una sequenza così composta:

-impulso positivo di 1ms
-pausa di circa un secondo (1018ms)
-impulso positivo di 0,6ms
-pausa di circa un secondo (1018ms)
-impulso positivo di 1,5ms
-pausa di circa un secondo (1018ms)

Questa sequenza rispecchia le tempistiche che hai studiato?

Visto che non ho mai lavorato con i servomotori, leggendo in internet ho trovato questa citazione:
Il segnale di comando è costituito da un’onda quadra inviata ripetutamente: il fronte positivo deve avere una durata compresa tra 1 e 2 (tra 0,5 e 2,5 per i servo che ruotano di 180°) millisecondi e la somma del fronte positivo e quello negativo (ovvero: il periodo) deve essere di circa 20mSec (frequenza: 50 Hz). Il segnale fatto in questo modo deve essere inviato di continuo se si vuole che il servocomando, sotto sforzo, mantenga la posizione desiderata

Re: PIC e servomotori

MessaggioInviato: 8 nov 2011, 23:35
da g.schgor
Alla richiesta di Foto UtenteAjKDAP, aggiungo anche
la richiesta di spiegazioni sull'interfaccia adottata tra PIC e servo
(potrebbe darsi che il malfunzionamento dipenda da quello e non
dal software)

Re: PIC e servomotori

MessaggioInviato: 8 nov 2011, 23:35
da AjKDAP
io proverei una cosa del tipo :

Codice: Seleziona tutto

for i=0 to 100
portB.0=1
delay_us(500)
portB.0=0
delay_ms(20)
next i

for i=0 to 100
portB.0=1
delay_us(2500)
portB.0=0
delay_ms(20)
next i

for i=0 to 100
portB.0=1
delay_us(1500)
portB.0=0
delay_ms(20)
next i


Re: PIC e servomotori

MessaggioInviato: 8 nov 2011, 23:59
da aduri
Io ho comandato direttamente dalla porta b0 del PIC senza nessuna interfaccia come tanti esempi visti in rete.
La modifica coi cicli for migliorano il sistema in quanto mantegono la coppia del servo ma non risolvono il problema che io ho riscontrato.
Il mio codice è volutamente molto sintetico per fare delle prove e valutare le tempistiche dei miei servi per farle corrispondere a determinate posizioni.
In rete avevo trovato un utente che con i servi in mio possesso aveva trovato i seguenti tempi:
0,67ms (-45gradi)
1,7ms (0 gradi)
2,83ms (+45gradi)
Comunque l'uscita mi da l'impressione di essere flottante non vorrei che necessiti di resistenze di pull-up.
Avendoli comprati in rete non vorrei che fossero di scarsa qualità e che quindi generino comportamenti anomali.

Re: PIC e servomotori

MessaggioInviato: 9 nov 2011, 0:35
da c1b8
Ti descrivo alcune situazioni che ho dovuto affrontare con i servo.

Anzitutto il segnale di pilotaggio. Deve trattarsi di una onda quadra di frequenza circa 50 Hz, la durata dell'impulso positivo dell'onda quadra deve durare tra i 0,5ms ed i 2,5ms. Non è necessario che la frequenza sia esattamente di 50 Hz, ma è importante che la durata dell'impulso positivo sia all'interno dei tempi indicati.
tempi diversi dell'impulso positivo danno posizioni alterate del servo, una frequenza non esattamente di 50Hz determina una variazione della coppia del servo: maggioare la frequenza -> maggiore la coppia. In ogni caso non puoi allontanarti molto dai 50Hz.
Altra considerazione è il numero di impulsi necessari a posizionare il servo. Nei servo digitali puoi fornire un solo impulso della durata desiderata e nessun altro segnale, il servo si posizionerà correttamente con la massima coppia. Nei servo standard come i tuoi devi continuare a fornire impulsi della stessa durata fino a posizionamento avvenuto e mantenere il segnale per mantenere la coppia del servo. I servo da te scelti hanno una velocità di 60gradi ogni 0,2s, dovrai quindi fornire almeno 50 impulsi della stessa durata per apprezzarne e il posizionamento e la coppia.

Un problema che ho riscontrato nel'utilizzare servo e PIC è stato il reset del PIC stesso quando il servo si doveva muovere. Reset dovuto ad un eccessivo calo di tensione di alimentazione del PIC per il fatto che alimentavo PIC e servo dalla stessa sorgente. Separando le due sorgenti di alimentazione non ho avuto più problemi.
Il pilotare un servo direttamente da una uscita del PIC, al contrario, non mi ha mai creato problemi e non sono mai state necssarie pull-up nel segnale di controllo.

Una volta ho commesso il banale errore di invertire i cavi di alimentazione positiva e di controllo del servo. Ho in pratica fornito tensione continua sul cavetto di controllo (cavo giallo) e il segnale PWM di controllo sull'alimentazione (cavo rosso) del servo, il servo si spostava in un angolo (180 come dici tu) e da li non usciva. Non è rimasto fermo o ronzante o altro, semplicemente si spostava lentamente ma continuamente servo un angolo. Accortomi dell'inversione dei cavetti e risistemati la cosa si è risolta.

Guandardo il tuo codice mi verrebbe da dire che il segnale fornito al servo non è proprio adatto a comandarlo, meglio sicuramente il segnale fornito dal codice di Foto UtenteAjKDAP.

Un'ultima considerazione, una ricerca in rete dei servo da te indicati riporta diverse segnalazioni di problemi per quanto riguarda la velocità di rotazione e la precisione di posizionamento, non vorrei che l'utilizzo di un linguaggio diverso dall'assembly generi un segnale non perfetto (da un punto di vista delle tempistiche) che sommato ai problemi dei servo dia lungo al problema che hai riscontrato.

Re: PIC e servomotori

MessaggioInviato: 9 nov 2011, 9:41
da aduri
Grazie delle risposte,
x c1b8 effettivamente ho letto, in rete, pareri discordanti su questi servo.
Credevo che bastasse un solo impulso corretto per posizionare il servo mentre credevo che il treno di impulsi servisse solo a mantenere la coppia e la posizione.
Ad alimentare il servo separatamente ci avevo pensato anche se avrei sperato non ve ne fosse stato bisogno.
Io ho alimentato il servo con +5V (alimentazione del PIC) tra il rosso(+) ed il marrone(-) mentre il segnale impulsivo di controllo sull'arancione (da segnalazioni trovate in rete).
Cercherò ancora notizie in rete e, in ogni caso, modifico il sw con il treno d'impulsi e stasera farò un po' di prove.

ciao
Antonio

Re: PIC e servomotori

MessaggioInviato: 11 nov 2011, 12:43
da aduri
Salve a tutti,
purtroppo ho provato e riprovato variando le tempistiche, alimentando separatamente il servo dal PIC ma solo con questo sw (derivato dal sito jvboot) ho percepito un piccolissimo guizzo del servo quando passa da 180 gradi a 0 gradi.
Premetto che ho analizzato il segnale all'oscilloscopio e rispetta i tempi.
Non so più coasa fare, penso che passerò ai motorini passo-passo.

Grazie ancora

Codice: Seleziona tutto
program servo_simple_458

'The simple program rotate (180º) ...no timer, no interrupt...ver easy
'
'This example is very good for small applications with servo
'
'To 4Mhz cycle a one us (Clock/4=1) to use function Delay_cyc(xxx) increment 10 cycles.
'
'Max= 255(8bits) *10(delay_cyc)=2250us
'The servo range is 0'3 ms to 2'4 ms
'
'Min: 0'3 ms = 300us --> 300us/10(ciclos) = 30
'Max: 2'4 ms = 2400us --> 2400us/10(ciclos) = 240



'Programa Movimiento de servo simple *******************************************
'Este codigo recorre los 180º de rango del servo para Mikrobasic 5.0.0.0
'
'-HARDWARE:
'    MCU: PIC 16F648A  --> modified by ADuri for PIC18F458
'    Cristal: 4 MHz
'    1- Servo Futaba S3003 conectado a PORTB.0
'orig min 30 max 240 x mio servo 68   e   283
'
'original SW by jvboot.com
'*******************************************************************************

dim Servo as byte    'Variable que lleva la posicion del servo

'Sub-rutina para generar pulsos a los servos 0-255
Sub procedure Pulsout(dim byref Puerto as byte,dim Pin as byte,dim Pos as Byte)
  Setbit(Puerto,Pin)
  Delay_Cyc(Pos)
  Clearbit(Puerto,Pin)
End sub

Main:
INTCON = 0                   'Desabilita las interrupciones

TRISB.0 = 0                   'Salida del servo
PORTB = 0                     'Establecemos a 0 el valor del puertoB

Servo = 68                    'minimo del servo

While true
  Pulsout(PORTB,0,Servo)      'Enviamos el tren de pulsos para el servo
  Delay_ms(18)                '50Hz 20mS

  If Servo < 283 then Inc(Servo) Else Servo=68 End if   'Contador de posicion
  Delay_ms(68)      '?????? orig. 30
wend

End.

Re: PIC e servomotori

MessaggioInviato: 11 nov 2011, 20:34
da AjKDAP
e perché non provare dei servomotori più rinomati e performanti?

Leggendo in internet a proposito di questo modello ho letto anch'io difficoltà di posizionamento e critiche riguardo ai movimenti... boh :-)

Re: PIC e servomotori

MessaggioInviato: 11 nov 2011, 20:59
da davidde
Non saprei, non ho mai usato quel tipo di servocomando. Ho però sviluppato parecchie applicazioni con PIC che generano segnali per i servo e non ho mai riscontrato particolari problemi nel posizionamento.
Io ho sempre utilizzato servocomandi dell' Hitec e sono molto soddisfatto, ultimamente ho prelevato anche il segnale sul potenziometro interno del servocomando (leggendolo con un ingresso A/D del PIC) in modo da poter creare un sistema in anello chiuso. Funziona molto bene.

Prima di passare ai motori passo passo ti consiglio di cambiare marca del servocomando, vedrai che risolvi e ti dimentichi degli stepper ;-) ...