Het bouwen van een super servo

Gepost door Jeroen Vreuls op dinsdag 2 mei 2023

Profilab

Nu besturen we de servo via een potmeter, maar dat kun je ook via de PC doen met Profilab Expert 4.0. Ik ga daar een voorbeeld van laten zien hoe je dat kunt maken. De data wordt serieel verzonden via de USB-poort, in combinatie met een USB naar serieel adapter met FTDI chipset. Hier het voorbeeld in Profilab.

Servo besturing in ProfilabServo besturing in Profilab

PT1 is de potmeter, de waarde van de potmeter gaat via FRM1 naar het display op de frontplaat. In de module FRM1 staat een kleine formule, E0 X 5 + 850, dit geeft de positie aan van de servo. De waarde van de potmeter gaat ook naar een $CHR1 module, deze zet de waarde van de potmeter om in een string. De string wordt dan verzonden via de $CS1 module, met deze module stuur je de USB-poort aan. De G1 module is een pulsgenerator en verstuurt de waarde met 50 Hz naar de controller via de USB-poort. De waarde wordt dus 50 maal per seconde verzonden door de PC.

Hier hoort nog een bedieningspaneel bij, de frontplaat.

Frontplaat in ProfilabFrontplaat in Profilab

Het enige wat hier opstaat is de potmeter en het display. De potmeter kun je bedienen via je toetsenbord of de muis. Via het toetsenbord gaat het met de page-up of page-down toets en via de muis kun je de potmeter bedienen met het scroll-wieltje.

Het programma van de controller is iets aangepast.

Device 16F887                            ; Processor type

Xtal 10                                  ; Crystal 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 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

Declare Hserial_Baud   9600              ; Set baudrate op 9600
Declare Hserial_RCSTA  %10010000         ; Register instelling
Declare Hserial_TXSTA  %10100110         ; Register instelling 
Declare Hserial_Clear = On               ; Reset buffer bij een overflow  

Symbol SERVO_MOT = PORTC.0               ; Uitgang servo

Dim POSITIE As Word                      ; Variabele positie servo

Dim DATA_IN As Byte                      ; Variabele data servo

Cls                                      ; Wis display

DelayMS 500                              ; Wachttijd

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  = %000001                         ; 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

;----------------------------
; TEST PROGRAMMA SUPER-SERVO
;----------------------------

RUN: 


    Print At 1,1,"SERVO"
    Print At 2,1,"POSITIE:",Dec4 POSITIE
    
    HSerIn [DATA_IN]
    DelayMS 1  
                          
    POSITIE = 850 + (DATA_IN*5)
    Servo SERVO_MOT,POSITIE 
    DelayMS 10 
                                                             
GoTo RUN                                    

End

Het stukje van de analoge ingang is weg, het stukje HSerIn is daarvoor in de plaats gekomen. Het Print commando is ook iets aangepast, voor de rest is er niets veranderd. Op deze manier kun je de data serieel ontvangen van de pc en de servo bedienen.