Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

PIC e servomotori

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] PIC e servomotori

Messaggioda Foto Utenteaduri » 8 nov 2011, 22:28

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.
Avatar utente
Foto Utenteaduri
435 1 5 10
Expert
Expert
 
Messaggi: 937
Iscritto il: 29 giu 2005, 23:13
Località: Genova

0
voti

[2] Re: PIC e servomotori

Messaggioda Foto UtenteAjKDAP » 8 nov 2011, 23:29

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
Avatar utente
Foto UtenteAjKDAP
1.255 2 6 9
Expert EY
Expert EY
 
Messaggi: 796
Iscritto il: 17 mag 2006, 0:13
Località: nella coda dei pronti

0
voti

[3] Re: PIC e servomotori

Messaggioda Foto Utenteg.schgor » 8 nov 2011, 23:35

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)
Avatar utente
Foto Utenteg.schgor
57,8k 9 12 13
G.Master EY
G.Master EY
 
Messaggi: 16971
Iscritto il: 25 ott 2005, 9:58
Località: MILANO

0
voti

[4] Re: PIC e servomotori

Messaggioda Foto UtenteAjKDAP » 8 nov 2011, 23:35

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

Avatar utente
Foto UtenteAjKDAP
1.255 2 6 9
Expert EY
Expert EY
 
Messaggi: 796
Iscritto il: 17 mag 2006, 0:13
Località: nella coda dei pronti

0
voti

[5] Re: PIC e servomotori

Messaggioda Foto Utenteaduri » 8 nov 2011, 23:59

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.
Avatar utente
Foto Utenteaduri
435 1 5 10
Expert
Expert
 
Messaggi: 937
Iscritto il: 29 giu 2005, 23:13
Località: Genova

0
voti

[6] Re: PIC e servomotori

Messaggioda Foto Utentec1b8 » 9 nov 2011, 0:35

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.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[7] Re: PIC e servomotori

Messaggioda Foto Utenteaduri » 9 nov 2011, 9:41

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
Avatar utente
Foto Utenteaduri
435 1 5 10
Expert
Expert
 
Messaggi: 937
Iscritto il: 29 giu 2005, 23:13
Località: Genova

0
voti

[8] Re: PIC e servomotori

Messaggioda Foto Utenteaduri » 11 nov 2011, 12:43

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.
Avatar utente
Foto Utenteaduri
435 1 5 10
Expert
Expert
 
Messaggi: 937
Iscritto il: 29 giu 2005, 23:13
Località: Genova

0
voti

[9] Re: PIC e servomotori

Messaggioda Foto UtenteAjKDAP » 11 nov 2011, 20:34

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 :-)
Avatar utente
Foto UtenteAjKDAP
1.255 2 6 9
Expert EY
Expert EY
 
Messaggi: 796
Iscritto il: 17 mag 2006, 0:13
Località: nella coda dei pronti

1
voti

[10] Re: PIC e servomotori

Messaggioda Foto Utentedavidde » 11 nov 2011, 20:59

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 ;-) ...
Avatar utente
Foto Utentedavidde
13,3k 4 9 12
G.Master EY
G.Master EY
 
Messaggi: 4026
Iscritto il: 2 ago 2007, 11:40
Località: Bologna

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 9 ospiti