MICROCONTROLADORES PIC - PRÁTICA - PARTE 2
CONTROLE DE SERVOS



O SERVO - UM POUCO DE TEORIA


Os servos são dispositivos muito empregados no fascinante mundo da mecatrônica. O fato é que, de todos os elementos capazes de converter energia elétrica em "movimento" mecânico, o servo é o que permite uma maior gama de aplicações. Podemos emprega-los na construção de braços mecânicos, usa-los como simples caixas de redução para locomoção de pequenos robôs, tratamento e controle de alavancas, entre outras.

Sua simplicidade de operação aliada as suas características mecânicas, permite seu emprego na “micro-robótica” para fins didáticos com muita facilidade.

Na figura abaixo você pode ver a estrutura de um servo básico. Ele é constituído de um motor, um dispositivo de realimentação e um sensor de posição (geralmente um potenciômetro). É o dispositivo de realimentação que permite que a “alavanca” seja colocada na posição desejada, de acordo com a "resposta" do sensor de posição. Assim um servo permite transformar sinais elétricos em movimentos proporcionais. Isso porque existe uma “proporcionalidade” entre os sinais que são levados ao servo e a posição da alavanca. 


De acordo com a largura do pulso (sinal) recebido, o servo irá posicionar sua “alavanca”. Estes pulsos têm largura pré-determinada que variam de 1x10-3 segundos a 2x10-3 segundos, aproximadamente, com espaçamentos de 20x10-3 segundos, dependendo do fabricante. Sendo assim, podemos posicionar sua alavanca simplesmente variando a largura do pulso (sinal) a ser enviado.


Nota: É importante conhecer o servo a ser empregado em um determinado projeto para o seu sucesso e uma consulta ao fabricante poderá ajudar neste sentido. Muitos projetos podem simplesmente não funcionar adequadamente pela simples troca de um servo, previamente indicado.


O CIRCUITO PRÁTICO

Na figura abaixo temos o circuito que será utilizado em nosso exemplo prático. O PIC pode controlar o servo sem o uso de transistores ou outros driver’s de potência. Ou seja, poderíamos inserir um servo em cada porta livre de nosso PIC, aumentando e muito as possibilidades do exemplo proposto.


Este circuito deve preferencialmente ser montado em um pront-o-board, placa padrão ou outro que proporcione rapidez e flexibilidade.

Para ligar o servo você poderá usar uma “barra de pinos” com 3 elementos, por exemplo, e para ajudar nas ligações, na figura abaixo você tem a descrição e disposição dos fios no conector dos servos de algumas marcas como Futaba e Hobbico.



Caso o servo que você tem em mãos não seja do tipo mensionado aqui, siga a seguinte regra: geralmente os fabricantes dispõem a cor vermelha para o positivo, preta para o negativo, reservando o branco ou amarelo ou ainda uma outra cor para o sinal. Em caso de dúvida consulte o fabricante ou distribuidor mais próximo.


O PROGRAMA

O programa de controle do servo pode ser visto na listagem abaixo. O programa faz com que o PIC envie pulsos conforme a chave pressionada: S1 permite posicionar a alavanca à direita, S2 posiciona a alavanca à esquerda e S3 centraliza a alavanca.

Listagem - Código fonte 

;**************************************************************
;* Controle para servos
;*
;* Marcio Jose Soares - 28/12/2002
;**************************************************************
;

;**************************************************************
;definições do programa
;**************************************************************
    radix dec ;padrão->valores decimal
    __CONFIG _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC ;configura bits

#include <P16F84A.INC> ;inclui arquivo

PICRES equ 0x00      ;endereço de reset
PICINT equ 0x04      ;endereço de interrupções
PICRAM equ 0x0C      ;endereço da RAM
SERVO  equ 0         ;i/o do motor
CHV1   equ 1         ;i/o da chave para mover a direira
CHV2   equ 2         ;i/o da chave para mover a esquerda
CHV3   equ 3         ;i/o da chave para mover ao centro
DIR    equ 0x01      ;valor direita (aprox. 1ms na rotina de temp.)
ESQ    equ 0X03      ;valor esquerda (aprox. 2ms na rotina de temp.)
CENT   equ 0x02      ;valor centro (aprox. 1,5ms na rotina de temp.)

;
;**************************************************************
;variáveis do programa
;**************************************************************

    org PICRAM

T1  res 1    ;variável para temporizador
T2  res 1    ;variável para temporizador
POS res 1    ;variável para guardar posição atual do servo

;
;**************************************************************
;área do reset
;**************************************************************

    org PICRES ;reset
    goto inicio ;desvia do endereco 0x04 - interrupção

;
;**************************************************************
;area das interrupções
;**************************************************************

    org PICINT     ;toda interrupção aponta para este endereço
    retfie         ;retorno de interrupção

;
;**************************************************************
;inicio do programa
;**************************************************************

inicio:

    movlw 0x00     ;ajuste para os bits INTCON
    movwf INTCON   ;desabilita ints
    clrf  PORTA    ;limpa portas
    clrf  PORTB
    bsf   STATUS,RP0 ;seleciona banco 1 para options e tris
    movlw 0x0E       ;ajusta os bits em A como saída
    movwf TRISA      ;exceto RA1, RA2 e RA3, entradas para chaves
    movlw 0x00       ;ajusta os bits em B como saída
    movwf TRISB      ;não usados
    bcf   STATUS,RP0 ;volta ao banco 0... (padrão do reset)
    movlw CENT       ;prepara para posicionar o servo no centro
    movwf POS        ;guarda posição
    goto  servo      ;chama subrotina para mover servo

;
;**************************************************************
;loop principalo do programa
;**************************************************************

loop:

    call TECLA ;verifica Tecla

servo:

    bsf  PORTA,SERVO ;liga pulso
    call Tservo      ;aguarda tempo do pulso
    bcf  PORTA,SERVO ;desliga pulso
    call T20ms       ;aguarda 20ms

    ;aqui poderiam ser inseridos novos servos    

    goto loop        ;faz infinitamente

;
;**************************************************************
;subrotina para testar tecla
;**************************************************************

TECLA:

    nop     ;perde 3 ciclos
    nop
    nop

    btfss PORTA,CHV3 ;testa chave 3
    goto  TC3        ;pressionada

    nop     ;perde 3 ciclos
    nop
    nop

    btfss PORTA,CHV2 ;testa chave 2
    goto  TC2         ;pressionada

    nop     ;perde 3 ciclos
    nop
    nop

    btfss PORTA,CHV1  ;testa chave 1
    goto  TC1         ;pressionada

    goto  TC0         ;nenhuma chave pressionada

;
;**************************************************************
;subrotina para mover servo
;**************************************************************

TC1:

    nop     ;perde 3 ciclos
    nop ;
    nop

    movlw DIR ;carrega com valor direita
    movwf POS
    goto  TC0 ;


TC2:

    nop     ;perde 3 ciclos
    nop
    nop

    movlw ESQ ;carrega com valor esquerda
    movwf POS
    goto  TC0 ;

TC3:

    nop     ;perde 3 ciclos
    nop
    nop

    movlw CENT ;carrega com valor centro
    movwf POS

TC0:

    return     ;retorna

;
;**************************************************************
;Prepara temporização do servo - pulso e 20ms de espera
;**************************************************************

Tservo:

    movf  POS,W     ;carrega W com POS
    movwf T1        ;carrega T1 com W

    goto  car_1     ;inicia temporização

T20ms:

    movlw 0x18      ;carrega W com 20ms
    movwf T1        ;carrega T1 com W

    goto  car_1     ;inicia temporização

;
;**************************************************************
;subrotina para temporização
;**************************************************************

car_1:

    movlw 0xff   ;carrega W com 255
    movwf T2     ;carrega T2 com 255

dec_1:

    decfsz T2,1  ;decrementa T2
    goto   dec_1 ;255 x T1 vezes
    decfsz T1,1  ;decrementa T1

    goto   car_1 ;volta a carregar T2
    retlw  0x00 ;retorna

;
;**************************************************************
;fim do programa
;**************************************************************

    end


Após pressionar uma chave o servo é mantido na posição indicada. Você poderá, como exercício, modificar a posição da “alavanca” de acordo com a chave, ou ainda utilizar as técnicas demonstradas em Controle PWM com PIC via software para montar um circuito que permita o controle proporcional da mesma com apenas 2 chaves. 

Você também aumentar o número de servos controlados enviando-lhes os pulsos necessários para seu posicionamento, bastando para isso alterar a sub-rotina “servo”. Você pode aplicar este novo circuito proposto no controle de um robô manipulador (braço mecânico), por exemplo.


CONCLUSÂO

O controle de servos com o uso de microcontroladores é bem simples. Espero ter ajudado com mais este exemplo.


Material para o circuito

Semicondutores

CI1 – PIC16F84A/4MHz – microcontrolador
D1 – Led comum


Resistores (1/8 Watt, 5%)

R1 – 1 k – Marrom, preto e laranja
R2, R3, R4 – 4K7 – Amarelo, violeta e vermelho
R5 – 330R – Laranja, laranja e marron


Capacitores

C1, C22 – 33pF – cerâmico
C3 – 100nF – cerâmico
C4 - 220 uF/16V - eletrolítico


Diversos

4 - chaves “push-botton”
1 – crystal 4MHz
1 – servo padrão Futaba
Pront-o-board ou placa padrão para a montagem, fios para ligação, etc (veja esquema)





Copyright deste conteúdo reservado para Márcio José Soares e protegido pela Lei de Direitos Autorais LEI N° 9.610, de 19 de Fevereiro de 1998. É estritamente proibida a reprodução total ou parcial do conteúdo desta página em outros pontos da internet, livros ou outros tipos de publicações comerciais ou não, sem a prévia autorização por escrito do autor.