# Συζήτηση Κυκλωμάτων > Ψηφιακά Κυκλώματα > Μικροελεγκτές >  >  Οδήγηση servo μέσω PIC μικροελεγκτή κ MikroBasic.

## Stergios_[.gr]

Προσπαθώ να κατασκευάσω μια πλακέτα οδήγησης ενός servo (σερβοκινητήρα) χρησιμοποιώντας ένα ποτενσιόμετρο, έναν PIC μικροελεγκτή κ MikroBasic. Δημοσιεύω αυτό το θέμα, για να εξοικειωθώ με το πώς λειτουργεί η MB και γιατί ελπίζω να βοηθήσει επόμενους πρωτάρηδες στο να κάνουν κάτι αντίστοιχο... 

*Hardware:*

PicKit2 ProgrammerPic16F887TowerPro SG-5010 Digital Servo44-pin demo board of PicKit2 η οποία παρέχει 8 LED κ 1 trimmerΚαλώδιο συνδεδεμένο στα *[Ground, +5V, RC2(pin36)]*
  
*Software:*

MikroBasicPickit2 Software
*Λίγη θεωρία:*

Για την οδήγηση ενός σερβοκινητήρα χρειάζονται παλμοί PWM (wiki:pulse-width modulation). Αυτοί οι παλμοί επαναλαμβάνονται κάθε 20ms και έχουν διάρκεια από 1ms έως 2ms. Από την διάρκειά τους εξαρτάται η θέση του σερβο.

*Κώδικας:*



```
program PWM_stergios
' * Description
'     This is simple test program to see how PWM library works. Using analog
'     input to read a potentiometer and sending the potentiometers value to
'     change the duty cycle of the PWM pulse on the CCP output pin (RC2).
'
' * Test configuration
'     MCU:            P16F887
'     Dev.Board:      44pin demo board
'     Oscillator:     internal

dim temp as word
dim temp8 as byte
dim servo as byte
OSCCON = %001              ' Setting internal oscillator at 125Khz

  PWM1_Init(50)              ' Initialize PWM1 module at 50Hz
  Pwm_Start                  ' Start PWM
  Pwm1_Change_Duty(18)

main:
  ANSEL  = %00000001         ' Configure AN0 pin as analog
  TRISA  = %00000001         ' PORTA is input
  PORTC =  %11111111               ' Initialize PORTC
  TRISD = %00000000          ' PORTD is output for "servo"
  PORTD = %0
  servo = %00010010           ' Fail-safe for servo, start centered

  while (TRUE)
    temp = ADC_Read(0)        ' Get 10-bit results of AD conversion
    temp8 = temp div %100     ' Change 10-bit to 8-bit approximation =(10bit)/4
    servo = %1100+(temp8 div %10011)  ' Useful Duty Cycle for servo: 1..2ms = %11000 .. %11001 = 12..25
    Pwm1_Change_Duty(servo)   ' Change duty ratio
    PORTD = servo                       ' Output "servo" to the 8 LEDS of the board
  wend

end.
```


Μερικά σχόλια στον κώδικα:



```
temp: εδώ αποθηκεύονται τα δεδομένα από την ανάγνωση της αναλογικής θύρας,
 μετά από την μετατροπή τους σε 10-bit ψηφιακά (ADC). 

temp8: εδώ αποθηκεύονται τα δεδομένα της temp,  αλλά σε μορφή 8-bit. 
Μετατροπή: 8bit = 10bit/4.   4 (δεκαδικό) = 100 (δυαδικό)

servo: η μεταβλητή η οποία καθορίζει την περιστροφή του σερβο.  Θα πρέπει να 
δίνει παλμό από 1ms (αριστερό άκρο) έως 2ms (δεξί άκρο).  Με περίοδο 20ms, 
το 1ms αντιστοιχεί στο 5% του duty cycle, ενώ το 2ms αντιστοιχεί  στο 10% του 
duty cycle. Το 5% με την σειρά του αντιστοιχεί στην τιμή Pwm1_Change_Duty(12) 
και το 10% στο Pwm1_Change_Duty(25).
Άρα η μεταβλητή servo θα παίρνει τιμή από 12 έως 25.
```


*ΠΡΟΒΛΗΜΑ:*
Αν και λειτουργεί σωστά το η μεταβλητή *servo*, οι σερβοκινητήρες μου *ΔΕΝ* στρίβουν. Κάνουν έναν συνεχόμενο ηλεκτρικό θόρυβο, που με αναγκάζει να σταματήσω την τροφοδοσία τους για να μην τους κάψω..
Καμία ιδέα τι κάνω λάθος?
Μήπως δεν έχω καταλάβει σωστά την βιβλιοθήκη *PWM*??

EΥΧΑΡΙΣΤΩ!

----------


## Thansavv

Στέργιε αυτό που λες
 "Για την οδήγηση ενός σερβοκινητήρα χρειάζονται παλμοί PWM (wiki:pulse-width modulation). Αυτοί οι παλμοί επαναλαμβάνονται κάθε 20ms και έχουν διάρκεια από 1ms έως 2ms. Από την διάρκειά τους εξαρτάται η θέση του σερβο."
αναφέρεται σε αναλογικά servos. Εσύ απ ότι κατάλαβα έχεις digital...
Έτσι λίγο που διάβασα, κατάλαβα ότι τα digital δουλέυουνε σε πολύ υψηλότερη συχνότητα παλμών.

Εδώ το διάβασα  και κάτι τέτοιο κατάλαβα...

----------


## Stergios_[.gr]

Θανάση σε ευχαριστώ πολύ για την απάντηση!
Εγώ από το δικό μου διάβασμα, κατάλαβα ότι δέχονται το ίδιο σήμα , απλά το διαχειρίζονται διαφορετικά. Χρησιμοποιούν "ψηφιακούς ενισχυτές" αντί για αναλογικούς...
Παραθέτω:




> (Digital and Analog servos)
> For the sake of discussion, the theory of operation is the same. The signals are merely processed in another way.



Αυτό κατάλαβα και από εδώ.. :Blush: 
http://www.geistware.com/rcmodeling/articles/servos.htm
http://www.fatlion.com/sailplanes/servos.html





> The motor of an *analog* servo receives a signal from the servo amplifier (inside the servo) at 30 times 					a second. [..] In digital servos 300 times a second.

----------


## Thansavv

Σωστά, δίκιο έχεις... Τώρα που το ξαναδιάβασα κατάλαβα ότι οδηγούνται με το ίδιο σήμα, αλλά στο μοτέρ του καθενός πάει διαφορετική μορφή DC τάσης...

----------


## Stergios_[.gr]

Καμία ιδέα, ε?

Αρχίζω να γράφω το δικό μου κώδικα για PWM, παρακάπτοντας αυτό του PIC16F887, γιατί ΔΕΝ καταλαβαίνω γιατί ΔΕΝ ΛΕΙΤΟΥΡΓΕΙ....  :Cursing: 

Θα δοκιμάσω να το γράψω με delay_us(*),
όποιες ιδέες, ευπρόσδεκτες!

----------


## Stergios_[.gr]

*ΕΠΙΤΥΧΊΑ*

[ame="http://www.youtube.com/watch?v=dD40aO_gIoA"]YouTube - MY PWM stergios[/ame]
 



```
program MyPWM_stergios
' * Description
' PWM library was unable to drive the SG5010 digital servo, so i am writing
' my own program. It will read Analog from PORTA.0 and it will create pulse
' of apropriate width every 20ms in PORTC.2
'
' * Test configuration
'     MCU:            P16F887
'     Dev.Board:      44pin demo board
'     Oscillator:     internal 4Mhz
dim temp as word

sub procedure WAIT(dim temp10 as word)
dim i as word
i = 0
for i = 0 to temp10
delay_us(1)
next i
end sub

main:
  ANSEL = %00000001          ' Configure AN0 pin as analog
  TRISA = %00000001          ' PORTA is input
  TRISC = %00000000          ' PORTC is output for pulses
  TRISD = %00000000          ' PORTD is output for temp

  while true
    temp = ADC_READ(0)
    PORTD = temp
    PORTC = %00000100
    delay_us(400)
    WAIT(temp div %1000)
    PORTC = %00000000
    WAIT(1000-temp)
    delay_us(18600)
  wend
end.
```


Τελικά τα κατάφερα με δικό μου κώδικα, εκμεταλλευόμενος το *delay_us(*)* που δίνει η MikroBasic...*OMΩΣ* οι τιμές της διάρκειας των παλμών, δεν συμβαδίζουν με την θεωρία. Πειραματικά διαπίστωσα ότι οι παλμοί που μπορεί να "καταλάβει" αυτός ο σέρβο είναι παλμοί των *50ΗΖ*, διάρκειας από* 0.4* έως *1.4ms*..

Πάνω στην πλακέτα, υπάρχουν 8 LED τα οποία δίνουν την τιμή του ποτενσιόμετρου, το οποίο ρυθμίζει την διάρκεια των παλμών. Ο σέρβο λειτουργεί λίγο σπασμωδικά, γιατί το τριμμερ/ποτενσιόμετρο δεν είναι τόσο καλής ποιότητας, και βγάζει θόρυβο. Ο θόρυβος αυτός φαίνεται χαρακτηριστικά στα LEDs, των οποίων η τιμή έχει διακυμάνσεις..

----------


## billtech

Μπραβο φιλε μου.
καλη δουλεια.
εγω εμπλεξα με την εμφανιση των δεδωμενων στις 7-segment στο θεμα που ασχολουμε και προσπαθω να ξεμπλεξω εκει περα.
ειναι ωραιο που ειμαστε αρκετοι σε αυτο το τομεα με αυτους τους επεξεργαστες και με αυτη τη γλωσσα προγραμματισμου.
καλες επιτυχιες.

----------


## lastid

> Τελικά τα κατάφερα με δικό μου κώδικα, εκμεταλλευόμενος το *delay_us(*)* που δίνει η MikroBasic...*OMΩΣ* οι τιμές της διάρκειας των παλμών, δεν συμβαδίζουν με την θεωρία. Πειραματικά διαπίστωσα ότι οι παλμοί που μπορεί να "καταλάβει" αυτός ο σέρβο είναι παλμοί των *50ΗΖ*, διάρκειας από* 0.4* έως *1.4ms*..



Έχε υπόψιν ότι η WAIT() έτσι όπως υλοποιήθηκε δεν είναι ακριβής, παρόλο που η delay_us(1) είναι. Οι εντολές του loop που εκτελεί μέσα της η WAIT(), εισάγουν καθυστέρηση  που είναι συγκρίσιμη με το 1 microsecond και δεν μπορούμε να την αγνοήσουμε. Επιπλέον, το for πρέπει να ξεκινάει από το 1 και όχι από το 0, για να μην καθυστερείς π.χ. 25 microseconds όταν θέλεις μόνο 24 microseconds. Ακόμα καλύτερα, κάνε το να ξεκινάει από το 2 ή από το 3, προκειμένου να αντισταθμίσεις την έξτρα καθυστέρηση των εντολών, που είπα πιο πάνω.

Για να βεβαιωθείς αν είναι έτσι, κάνε μία δοκιμή: Άναψε ένα LED, κάλεσε την WAIT(16) σου 625000 φορές και μετά σβήστο. Μέτρησες με το ρολόι σου 10 δευτερόλεπτα? (16microseconds x 625000 = 10 seconds)

----------


## Stergios_[.gr]

> Έχε υπόψιν ότι η WAIT() έτσι όπως υλοποιήθηκε δεν είναι ακριβής, παρόλο που η delay_us(1) είναι. Οι εντολές του loop που εκτελεί μέσα της η WAIT(), εισάγουν καθυστέρηση  που είναι συγκρίσιμη με το 1 microsecond και δεν μπορούμε να την αγνοήσουμε. Επιπλέον, το for πρέπει να ξεκινάει από το 1 και όχι από το 0, για να μην καθυστερείς π.χ. 25 microseconds όταν θέλεις μόνο 24 microseconds. Ακόμα καλύτερα, κάνε το να ξεκινάει από το 2 ή από το 3, προκειμένου να αντισταθμίσεις την έξτρα καθυστέρηση των εντολών, που είπα πιο πάνω.
> 
> Για να βεβαιωθείς αν είναι έτσι, κάνε μία δοκιμή: Άναψε ένα LED, κάλεσε την WAIT(16) σου 625000 φορές και μετά σβήστο. Μέτρησες με το ρολόι σου 10 δευτερόλεπτα? (16microseconds x 625000 = 10 seconds)



Σίγουρα η *WAIT()* δεν είναι ακριβής, αλλά σκεπτόμενος ότι οι συγκεκριμένοι σέρβο έχουν dead bandwidth ~4μs υπέθεσα ότι δεν θα χάνω πολύ... Θα κάνω το πείραμα και θα ποστάρω!

----------


## Stergios_[.gr]

> Για να βεβαιωθείς αν είναι έτσι, κάνε μία δοκιμή: Άναψε ένα LED, κάλεσε την WAIT(16) σου 625000 φορές και μετά σβήστο. Μέτρησες με το ρολόι σου 10 δευτερόλεπτα? (16microseconds x 625000 = 10 seconds)






```
program Wait_TEST

' * Test configuration
'     MCU:            P16F887
'     Dev.Board:      44pin demo board
'     Oscillator:     internal 4Mhz

dim j as longint

sub procedure WAIT(dim temp10 as word)
dim i as word
i = 0
for i = 0 to temp10
delay_us(1)
next i
end sub

main:
  TRISD = %00000000          ' PORTD is output
  portD = %11111111
  j=1
  while j<625000
      WAIT(16)
      inc(j)
  wend
  portd = %00011000
end.
```


*WOW!!!*
ΕΣΒΗΣΕ μετά από 00:04:15.... ΤΟΟΟΟΣΟ ΛΑΘΟΣ..  :Blushing: 

Τι κάνω για να το διορθώσω?

----------


## lastid

H Mikrobasic δεν έχει wait_us(variable) ώστε να την χρησιμοποιήσεις. Έχει όμως από ότι βλέπω delay_Cyc(cyclesdiv10). Για 4ΜΗz κρύσταλλο:
- η delay_Cyc(3) προκαλεί καθυστέρηση 30 microseconds. Αυτή είναι και η ελάχιστη καθυστέρηση που μπορεί να δώσει.
- η delay_Cyc(255) προκαλεί καθυστέρηση 2,55 milliseconds. Αυτή είναι και η μέγιστη καθυστέρηση που μπορεί να δώσει.

Εσύ θέλεις καθυστέρηση 1 ms .... 2 ms. Άρα η παράμετρος cyclesdiv10 θα παίρνει τιμές 100...200. 
Χρειάζεσαι λοιπόν έναν μετασχηματισμό της μεταβλητής temp που διαβάζεις από την αναλογική είσοδο (0..255) στην τιμή (100..200) της cyclesdiv10. Ο μετασχηματισμός αυτός είναι ο εξής:

cyclesdiv10 = 100 + (100*temp)/256

----------


## Stergios_[.gr]

> H Mikrobasic δεν έχει wait_us(variable) ώστε να την χρησιμοποιήσεις. Έχει όμως από ότι βλέπω delay_Cyc(cyclesdiv10). Για 4ΜΗz κρύσταλλο:
> - η delay_Cyc(3) προκαλεί καθυστέρηση 30 microseconds. Αυτή είναι και η ελάχιστη καθυστέρηση που μπορεί να δώσει.
> - η delay_Cyc(255) προκαλεί καθυστέρηση 2,55 milliseconds. Αυτή είναι και η μέγιστη καθυστέρηση που μπορεί να δώσει.
> 
> Εσύ θέλεις καθυστέρηση 1 ms .... 2 ms. Άρα η παράμετρος cyclesdiv10 θα παίρνει τιμές 100...200. 
> Χρειάζεσαι λοιπόν έναν μετασχηματισμό της μεταβλητής temp που διαβάζεις από την αναλογική είσοδο (0..255) στην τιμή (100..200) της cyclesdiv10. Ο μετασχηματισμός αυτός είναι ο εξής:
> 
> cyclesdiv10 = 100 + (100*temp)/256



 :Thumbup:  Ευχαριστώ πάρα πολύ!! Είναι μόλις η 3η μου βδομάδα στους μΕ και την MB!!

Καλά,* 578* σελίδες manual έχει η MikroBasic, και δεν έχει πουθενά εξήγηση για την *delay_CYC(*)*???  :Cursing:

----------


## Nemmesis

> Ευχαριστώ πάρα πολύ!! Είναι μόλις η 3η μου βδομάδα στους μΕ και την MB!!
> 
> Καλά,* 578* σελίδες manual έχει η MikroBasic, και δεν έχει πουθενά εξήγηση για την *delay_CYC(*)*???



την εχει σιγουρα στο help παντος... και να μην την ειχε μπορεις να κανεις εναν account στη σελιδα με το φορουμ την mikrobasic και οτι απορια-προβλημα εχεις σε βοηθαν εκει μεσα... πολλες φορες μαλιστα απανταν και οι ιδιοι που την φτιαξαν οποτε καταλαβενεις..

----------


## Stergios_[.gr]

Άρχισα να δουλεύω delay_cyc.. Δεν ξέρω αν πέτυχε, γιατί όταν τροφοδότησα σέρβο + μΕ, ο σέρβο άρχισε να κάνει σπασμωδικές κινήσεις! Μαζί με τον σέρβο, τρεμοπαίζαν και τa LEDs που χρησιμοποίησα για ένδειξη του, οπότε υπέθεσα ότι μάλλον φταίει η USB τροφοδοσία..



```
program MiniSimTest

' * Description
' PWM library was unable to drive the SG5010 digital servo, so i am writing
' my own program. It will read Analog from PORTA.0 and it will create pulse
' of apropriate width every 20ms in PORTC.2  . NOW IN mikroBasic PRO.
'
' * Test configuration
'     MCU:            P16F887
'     Dev.Board:      44pin demo board
'     Oscillator:     internal 4Mhz
dim temp_adc as word
dim temp as word
dim LED as byte

main:
  ANSEL = %00000001          ' Configure AN0 pin as analog
  TRISA = %00000001          ' PORTA is input
  TRISC = %00000000          ' PORTC is output for pulses
  TRISD = %00000000          ' PORTD is output for temp_adc

  while true
    temp_adc = ADC_READ(0)

    PORTC = %00000100
    temp = 100 + (temp_adc div 10)  'η μεταβλητή που ορίζει την καθυστέρηση
    PORTD = temp 'εμφανίζω την μεταβλητή ΤΕΜΡ στα LEDs 
    delay_cyc(temp)
    PORTC = %00000000
    delay_cyc(200-temp) 'περιμένει τον αναγκαίο χρόνο ώστε να συμπληρωθούν τα 20ms της περιόδου
    delay_ms(18)
  wend
end.
```


Για να γλυτώσω την USB τροφοδοσία, σκέφτηκα να χρησιμοποιήσω τρανζίστορ. Δεν έχω ξαναχρησιμοποιήσει όμως, θα μπορούσε να με καθοδηγήσει κάποιος?
ΕΥΧΑΡΙΣΤΩ

----------


## DT200

αχ ... τι μου θυμίζετε τώρα εγώ δεν προλαβαίνω ποια. :Sad: 

δεν μελέτησα το πρόγραμμα σου αλλά βρήκα ένα λάθος που είναι 
πολύ σημαντικό για την σωστή λειτουργία.

η εντολή delay_cyc δεν μπορεί να πάρει όποια τιμή θέλεις εσύ αλλά 
παίρνει μόνο τιμές από 3 έως 255.

καλή συνέχεια.

----------


## lastid

Στο παραπάνω πρόγραμμα:
Η temp_adc είναι από *0* έως *255*.

Άρα:
H temp θα είναι από *100* μέχρι *125*, εντός των ορίων της delay_cyc() δηλαδή.
Η πρώτη delay (ON παλμός) θα είναι από *1 ms* μέχρι *1.25ms*.
Η δεύτερη delay (OFF παλμός) θα είναι από 19 ms μέχρι 18.75 ms.

Συμπέρασμα:
Θα έπρεπε να παρατηρείται ομαλή κίνηση του σέρβο σε μία μικρή περιοχή (25% της πλήρους διαδρομής ).
To γεγονός ότι δεν παρατηρείται αυτό, σημαίνει ότι πρέπει να βρεις πού είναι το λάθος.
Αφού το βρεις, θα πρέπει να αλλάξεις και την πράξη, ώστε να έχεις 1ms...2ms  :Biggrin: 

Μπορείς να πειραματιστείς με τα εξής:
- Μάθε με τα leds τί τιμή παίρνει η temp
- Μάθε με τα leds τί τιμή παίρνει η temp div 10
- Τα leds αναβοσβήνουν τρελά ακόμη και αν αποσυνδεθεί το σέρβο?

----------


## DT200

θα ρωτήσω κάτι ακόμα και δεν θα σας ¨ενοχλήσω¨ άλλο,
η λέξη του ADC είναι 10 bit άρα παίρνει τιμές από το 0 έως το 1023.
πώς περιορίζετε ο αριθμός του ADC μέχρι την τιμή 255 ?

----------


## lastid

Έχεις δίκιο, είναι 10 bits.
Απλά επειδή δεν είχα δουλέψει σε Mikrobasic και επειδή αναφερόμενος παραπάνω (στο μήνυμα #11) σε 8 bits αποτέλεσμα δεν το παρατήρησε κανένας, θεώρησα και τώρα ότι το αποτέλεσμα που επιστρέφει η ADC_READ() είναι 8-bits.
Όμως ακόμη και έτσι, η delay_cyc() του πρώτου παλμού παίρνει έγκυρες τιμές παντού, σωστά? Διότι η temp θα είναι από 100 μέχρι 202.

----------


## Stergios_[.gr]

Παιδιά σας ευχαριστώ για τις απόψεις σας! Έλειπα και έχασα τον διάλογο...
LastID, όπως σωστά λες, η *temp* παίρνει τιμές από *100* έως *202*, οπότε είναι μέσα στο "αποδεκτό" για σέρβο. 



```
Παράδειγμα ΜΑΧ:
ADC_READ(0) = 1024
temp = 100 + (1024 div 11) = 100 + 102 = 202
delay_cyc(temp) = delay_cyc(202) = delay 2,02 ms
```


Προσπαθώ αλλά δεν μου κάθεται...

 :Biggrin: ΠΑΡΑΚΑΛΩ ενόχλησέ μας DT200 ΟΣΟ ΘΕΣ!!! :Biggrin: 
Tα LEDs ΔΕΝ αναβοσβήνουν τρελά μόλις βγάλω τον σερβο.. Λειτουργούν ομαλά.

----------


## Stergios_[.gr]

Πήρα και μικρούς σέρβο, ΜΗ-ψηφιακούς, για να δοκιμάσω τον θεωρητικά σωστό αλγόριθμό μου... για να δούμε..
Αυτοί είναι οι σέρβο, από ΕΒΑΥ:

http://cgi.ebay.com/ws/eBayISAPI.dll...d=&mfe=sidebar

----------


## billtech

συγνωμη να ρωτησω κατι?
με την mikrobasic pro δεν εχουμε την εντολη pulsout? που σου βγαζει σταθερο παλμο?
και κανει αυτο που θες?αν θυμαμαι καλα.
θα ψαξω κατι που εχω φυλαξει και θα επανελθω.να σου πω τι βρηκα φιλε Στεργιε.

----------


## Stergios_[.gr]

Σε MikroC έχω δει pulseout... Εύχομαι να βρείς κάτι!
Σε ευχαριστώ πολύ Βασίλη!

----------


## billtech

φιλε μου το εψαξα αλλα τελικα ηταν στην PICBASIC που ισχυει αυτο.
εκει το ειχα δει.
αναιβαζω και το pdf που το ειδα.
ισως να φανει χρησιμο.ισως εσυ ισως καποιος αλλος να παρει καποιες ιδεες απο μεσα και αν τις προσαρμοσει στα προγραμματα του.
το ειχα κατεβασει απο Rapidshare αλλα δεν το βρισκω τωρα που το ψαχνω και το βρηκα στον υπολογιστη μου.

http://www.sendspace.com/file/ac2z4x

----------


## Stergios_[.gr]

THX Bill! Το κατέβασα, θα φανεί πολύ χρησιμο!

----------


## Stergios_[.gr]

> ΑΠΙΣΤΕΥΤΟ!! Τόσα datasheets είχα διαβάσει και δεν το είχα παρατηρήσει!! ΜΕΧΡΙΣ στιγμής είχα την εντύπωση ότι έπρεπε να στείλω παλμό διάρκειας από 1ms έως 2ms κάθε 20ms! 
> 
> *ΟΜΩΣ:* Θα πρέπει να στέλνω παλμό διάρκειας από 1ms έως 2ms *ακολουθούμενο από παύση 20ms!*
> 
> ΟΛΑ ΛΑΘΟΣ ΜΕΧΡΙΣ ΣΤΙΓΜΗΣ!! ΛΑΘΟΣ ΣΤΗΝ ΘΕΩΡΙΑ!!!!
> οπότε:
> *ΛΑΘΟΣ:* 20ms = [παλμός 1.5ms] + [18.5ms παύση]
> *ΣΩΣΤΟ:* [20ms παύση] + [επιθυμητός παλμός από 1ms έως 2ms]
> 
> ...



http://www.hlektronika.gr/forum/show...418#post335418

----------


## nassosxlvbros

Καλημέρα! 
παλιότερα για να τσεκάρω τους σερβομηχανισμούς (δούλευα στο Futaba service)είχα φτιάξει ένα κύκλωμα οδήγησης με το 555...δούλεψε και δουλεύει μιά χαρά!  :Smile: 

και το κύκλωμα: http://project.irone.org/?attachment_id=523

[IMG]file:///C:/DOCUME%7E1/Nasos/LOCALS%7E1/Temp/moz-screenshot.jpg[/IMG][IMG]file:///C:/DOCUME%7E1/Nasos/LOCALS%7E1/Temp/moz-screenshot-1.jpg[/IMG]

----------


## hulios

http://hvlabs.com/serservo.html

δοκιμασμενο απο εμενα με τον 16f628a

[ame="http://www.youtube.com/watch?v=NKcsRS_8U88"]YouTube- laser servo pic[/ame]

----------

