Arne Basic 2k - Experiência 8 - Controle de Servos


A proposta

Nesta oitava experiência demonstrarei como utilizar Arne Basic 2k no controle de servos. E como já é de costume, primeiro acho interessante mostrar um pouco da teoria para em seguida apresentar a parte prática.

A teoria


Os servos são dispositivos muito empregados no fascinante mundo da robótica educacional. 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.

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.


A experiência

Na figura abaixo você tem o esquema elétrico proposto para esta experiência. Como você mesmo pode ver, trata-se também de um circuito extremamente simples. Eu recomendo a montagem do mesmo em uma matriz de contatos, afinal você está apenas "testando" um circuito.


A chave S1 faz o servo de rotação girar em sentido horário e avança alguns graus o servo de posição também no sentido horário. Já a chave S2 faz a mesma coisa em ambos os servos, portém no sentido anti-horário.. Para esta experiência foi usado um LED em PB2, que piscará a uma freqüência de aproximadamente 20Hz.

Para operar os servos foi utilizado uma função interna do BASCOM, que permite configurar até 14 servos e controlá-los de forma independente. Esta função utiliza o timer0 e neste caso, ao usar a função SERVO o usuário do Arne Basic não poderá utilizar o timer0.

Você pode ver o código fonte logo abaixo. Este programa é mais um excelente exemplo da estrutura da Linguagem de programação BASIC utilizada pelo compilador BASCOM-AVR. Ele mostra o recurso do compilador para o controle de servos.

Vamos em frente com nossas experiências!!! Como diria o sr. Miagui - "Daniel San!!! Vamos para Japão! A hora da verdade continua!" ehehehehe

Código:
'*******************************************************************************
'* Programa TESTE_SERVO_ARNEBASIC2K.BAS
'* Desenvolvido por Márcio José Soares
'* para do Arne Basic 2k
'*
'* Obs.: Este programa foi desenvolvido para testar o uso de servos
'* com o Arne Basic 2k. Veja o circuito em www.arnerobotics.com.br
'*
'* Servo 1 - servo de rotação
'* Servo 2 - servo de posição
'*
'* S1 gira horário servo de rotação e incrementa posição do servo de posição
'* S2 gira anti-horário servo de rotação e decrementa posição do servo de posição
'*
'*******************************************************************************
 
'*******************************************************************************
'Configs necessários ao microcontrolador
$crystal = 10000000
$regfile = "attiny2313.dat"
Config Portb = &B11111111               'todo portB é saída
Config Portd = &B11101010               'todo portD é saída, exceto PD0, PD2 e PD4
 
'*******************************************************************************
'Configura servos
Config Servos = 2 , Servo1 = PortD.6 , Servo2 = PORTD.5 , Reload = 10
 
'********************************************************************************
'Variáveis globais
dim myPOS as byte
 
'*******************************************************************************
'Liga pinos de I/O's a "nomes" mais fáceis ao entendimento humano ;-)
S1 Alias Pind.2                         'pino de entrada para chave 1
S2 Alias Pind.4                         'pino de entrada para chave 2
LED Alias PORTB.2                       'LED
 
'*******************************************************************************
'Declaração das subrotinas
Declare Sub Check_tec()
 
'*******************************************************************************
'Habilita int para usar servo
Enable Interrupts
 
'*******************************************************************************
'Início do programa
Servo(1) = 100                          'inicia girando horário
Servo(2) = 150                          'posição central
myPOS = 150
 
Waitms 500                              'aguarda 0,5 segundo
'*******************************************************************************
'Laço principal... faz eternamente
Do
 
   call Check_tec()                     'verifica teclas
   toggle LED
 
Loop
 
'*******************************************************************************
'Subrotina para verificar se alguma tecla foi pressionada
Sub Check_tec()
 
   waitms 50                            'debounce para chaves
   if S1 = 0 then                       'S1 pressionada?
      Servo(1) = 100                    'valor para giro horário
      if myPOS < 250 then               'ainda dentro do limite?
         myPOS = myPOS + 5              'incrementa posição
         Servo(2) = myPOS               'assume posição
      end if
   end if
 
   if S2 = 0 then                       'S2 pressionada
      Servo(1) = 50                     'valor para giro anti-horário
      if myPOS > 100 then               'ainda dentro do limite?
         myPOS = myPOS - 5              'incrementa posição
         Servo(2) = myPOS               'assume posição
      end if
   end if
 
End sub
 
End                                     'fim do program



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.