Gepost door Jeroen Vreuls op maandag 9 november 2015
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.
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.
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Ω.
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.
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.