Werken met servo's

Gepost door Jeroen Vreuls op maandag 9 november 2015 21:36

Een zelfgebouwde servo

We hebben het over de in de handel zijnde servo's gehad, maar je kan er ook een zelf maken natuurlijk. Het voordeel is dan dat je een servo kan maken die enorm veel koppel kan leveren en het is tevens een leuk experimenteerproject. Zie hieronder een voorbeeld hoe je zoiets kan maken.

Zelfbouw servo met een RB35Zelfbouw servo met een RB35

In het voorbeeld heb ik een tandriem gebruikt, maar het kan ook met bijvoorbeeld tandwielen. Of je zet de potmeter met een koppeling direct op de motoras, alleen kan je dan slechter iets op de motoras monteren. De motor kan je dan bijvoorbeeld aansturen met een L293D, dat is een H-brug in IC vorm. De brug kan je weer aansturen met bijvoorbeeld een opamp die als window comparator staat geschakeld, de potmeter (die op de motor zit) wordt dan teruggekoppeld naar de opamp. Op deze manier kan je zelf een servo maken. Let er wel op dat de potmeter goed aangesloten moet worden, anders blijft de motor doorlopen en gaat de potmeter stuk.

Even voor de goede orde: deze zelfgemaakte servo's kun je niet met een modelbouwzender-/ontvanger bedienen.

Schema

Hieronder een schema van de besturing. Voor de hysteresis kan je nog wat experimenteren met de 220 Ω weerstanden of je zet - in plaats van één weerstand van 220 Ω - een potmeter van 5 kΩ.

Besturing van de zelfbouw servoBesturing van de zelfbouw servo

Deze besturing kunnen we ook met een microcontroller maken, we gebruiken hier een PIC16F887 voor maar dat mag ook een ander type zijn natuurlijk. Hieronder het programma.

Device 16F887             ; Processor type
 
Xtal 10                   ; Cristal 10 MHz
 
Asm                       ; Config settings
CONFIG_REQ
__CONFIG _CONFIG1, HS_OSC & WDT_OFF & DEBUG_OFF & FCMEN_OFF & LVP_OFF & IESO_OFF & BOR_OFF & CPD_OFF & CP_OFF & MCLRE_OFF & PWRTE_ON
__CONFIG _CONFIG2, WRT_OFF & BOR40V
EndAsm
 
All_Digital true          ; Alle poorten digitaal
 
Declare Adin_Res = 8      ; resolutie 8 bits
Declare Adin_Tad = frc    ; set RC osc
Declare Adin_Stime = 50   ; sample tijd 5
Declare LCD_RSPin PORTD.2 ; Reset display poort D.2
Declare LCD_ENPin PORTD.3 ; Enable display poort D.3
Declare LCD_DTPin PORTD.4 ; Data display poort D.4 t/m D.7
 
Symbol UIT1 = PORTB.0     ; Naar ingang H-brug
Symbol UIT2 = PORTB.1     ; Naar ingang H-brug
 
Dim WAARDE_1 As Byte      ; Variabele in programma
Dim WAARDE_2 As Byte      ; Variabele van potmeter
 
Cls                       ; Wis display
 
DelayMS 500               ; Pauze 0.5 sec
 
Clear ; Wis geheugen
 
         ;543210          ; Hulpregel poort A
PORTA  = %000000          ; Maak poort A laag
TRISA  = %111111          ; Poort A I/O
 
         ;543210          ; Hulpregel poort B
PORTB  = %000000          ; Maak poort B laag
TRISB  = %000000          ; Poort B I/O
 
         ;76543210        ; Hulpregel poort C
PORTC  = %00000000        ; Maak poort C laag
TRISC  = %00000000        ; Poort C I/O
 
         ;76543210        ; Hulpregel poort D
PORTD  = %00000000        ; Maak poort D laag
TRISD  = %00000000        ; Poort D I/O
 
         ;210             ; Hulpregel poort E
PORTE  = %000             ; Maak poort E laag
TRISE  = %111             ; Poort E I/O
 
         ;76543210        ; Hulpregel analoog
ADCON0 = %00000001        ; ADCON0 register analoog
 
         ;543210          ; Hulpregel analoog poort_B
ANSELH = %000000          ; ANSEL register analoog poort_B
 
;----------------------------
; PROGRAMMA ZELFBOUW SERVO.
;----------------------------
 
positie_0:
    WAARDE_1 = 0
    WAARDE_2 = ADIn 0
 
    Print At 1,1,"GA NAAR POS 0"
    Print At 2,1,"POS"
    Print At 2,5,Dec ADIn 0, " "
 
    If WAARDE_1 > WAARDE_2 + 1 Then
        UIT1 = 1
    Else 
        UIT1 = 0
        If WAARDE_1 < WAARDE_2 Then
            UIT2 = 1
        Else
            UIT2 = 0
        EndIf
    EndIf
 
    If WAARDE_2 = 0 Then
        GoTo wacht_0
    EndIf
 
    GoTo positie_0
 
wacht_0:
    DelayMS 5000
    Cls
    GoTo positie_1
 
positie_1:
    WAARDE_1 = 200
    WAARDE_2 = ADIn 0
 
    Print At 1,1,"GA NAAR POS 200"
    Print At 2,1,"POS"
    Print At 2,5,Dec ADIn 0, " "
 
    If WAARDE_1 > WAARDE_2 + 1 Then
        UIT1 = 1
    Else
        UIT1 = 0
        If WAARDE_1 < WAARDE_2 Then
            UIT2 = 1
        Else 
            UIT2 = 0
        EndIf
    EndIf
 
    If WAARDE_2 = 200 Then
        GoTo wacht_1
    EndIf
 
    GoTo positie_1
 
wacht_1:
    DelayMS 5000
    Cls
    GoTo positie_2
 
positie_2:
    WAARDE_1 = 75
    WAARDE_2 = ADIn 0
 
    Print At 1,1,"GA NAAR POS 75"
    Print At 2,1,"POS"
    Print At 2,5,Dec ADIn 0, " "
 
    If WAARDE_1 > WAARDE_2 + 1 Then
        UIT1 = 1
    Else
        UIT1 = 0
        If WAARDE_1 < WAARDE_2 Then
            UIT2 = 1
        Else 
            UIT2 = 0
        EndIf
    EndIf
 
    If WAARDE_2 = 75 Then
        GoTo wacht_2
    EndIf
 
    GoTo positie_2
 
wacht_2:
    DelayMS 5000
    Cls
    GoTo positie_3
 
positie_3:
    WAARDE_1 = 150
    WAARDE_2 = ADIn 0
 
    Print At 1,1,"GA NAAR POS 150"
    Print At 2,1,"POS"
    Print At 2,5,Dec ADIn 0, " "
 
    If WAARDE_1 > WAARDE_2 + 1 Then
        UIT1 = 1
    Else
        UIT1 = 0
        If WAARDE_1 < WAARDE_2 Then
            UIT2 = 1
        Else
            UIT2 = 0
        EndIf
    EndIf
 
    If WAARDE_2 = 150 Then
        GoTo wacht_3
    EndIf
 
    GoTo positie_3
 
wacht_3:
    DelayMS 5000
    Cls
    GoTo positie_4
 
positie_4:
    WAARDE_1 = 25
    WAARDE_2 = ADIn 0
 
    Print At 1,1,"GA NAAR POS 25"
    Print At 2,1,"POS"
    Print At 2,5,Dec ADIn 0, " "
 
    If WAARDE_1 > WAARDE_2 + 1 Then
        UIT1 = 1
    Else
        UIT1 = 0
        If WAARDE_1 < WAARDE_2 Then
            UIT2 = 1
        Else
            UIT2 = 0
        EndIf
    EndIf
 
    If WAARDE_2 = 25 Then
        GoTo wacht_4
    EndIf
 
    GoTo positie_4
 
wacht_4:
    DelayMS 5000
    Cls
    GoTo positie_1
 
End

Hier hoort weer een ander schema bij, er wordt wel weer een L293D gebruikt. Hieronder het schema.

Eindtrap zelfbouw servoEindtrap zelfbouw servo

Poort B.0 en poort B.1 van de controller komen aan de klemmen IN_R en IN_L van de eindtrap. De PWM klem komt aan de 5 V DC te zitten, omdat deze niet gebruikt wordt in het programma. Als de PWM functie in het programma erbij gezet wordt (dan moet het programma aangepast worden) dan kan de PWM klem van de eindtrap op de HPWM pin (poort C.1 of poort C.2) van de controller aangesloten worden. Op deze manier kan dan ook het toerental van de servo geregeld worden. Let er wel op dat de PWM frequentie niet groter dan 5 kHz mag zijn voor de L293D.

Op de klemmen MOT_1 en MOT_2 wordt de motor aangesloten, op de klemmen 5VDC en 0VDC komt de 5 V DC voeding voor de elektronica en op de klemmen 12VDC en 0VDC komt de 12 V DC voeding voor de motor. De externe potmeter (de potmeter die op de motoras zit) komt aan de analoge ingang A.0 (ADIN 0). Denk er ook hier weer aan dat de potmeter goed aangesloten moet worden.

Het programma loopt automatisch vier posities af, maar dat kan naar eigen wens aangepast worden natuurlijk. Let er ook op dat de voorbeelden met de L293D alleen geschikt is voor kleine motoren, zoals de RB35, dus motoren die meer dan 1,5 A trekken gaan niet met deze schakeling.