Você está na página 1de 4

Projetos

Controle de Servomotores
através da Interface LPT

O
servomotor é um mecanismo Recomendo ao leitor que desejar se
Damos continuidade neste ar- eletromecânico utilizado em aprofundar mais sobre o funcionamento
tigo à utilização da placa Interface diversas aplicações, as mais de um servomotor, acessar o site www.
comuns sendo em antenas pa- mecatronicaatual.com.br, onde encontra-
LPT (porta paralela), desta vez ire-
rabólicas e aeromodelos, pois a precisão rá bons artigos sobre servomotores.
mos controlar servomotores. de controle que este mecanismo atinge é Observe a figura 2, onde temos o
considerada boa. diagrama de tempo dos sinais aplicados
Esta precisão é devida à largura dos a um servo.
Clóvis Magoga pulsos e à duração entre esses pulsos A variação em Pulse Width, ou tama-
aplicados à sua entrada. Na figura 1 temos nho do pulso, está entre 1 ms até 2 ms
a foto de um servomotor, lembrando que (milissegundos ), o que equivale dizer
conforme a precisão de um servo, mais que, ao aplicarmos um pulso de 1 ms, o
caro ele é. Por outro lado, existem servo- eixo irá deslocar o braço do servo para
motores que têm engrenagens metálicas a extremidade esquerda. Ao aplicarmos
para trabalharem com cargas maiores. 1,5 ms, o braço do servo irá até a posição
Os servomotores são divididos em central e ao aplicarmos 2 ms, o braço irá
cinco partes, sendo: O gabinete ou a caixa todo para a direita, e intervalos entre 1
plástica, a placa de controle do motor, as e 2 ms irão colocar o braço do servo nas
engrenagens, o motor e o potenciômetro. posições intermediárias.
Analisando-se cada uma delas torna-se Compreendido o funcionamento de
fácil entender como é o funcionamento um servomotor, e o sinal necessário para
do servomotor. atingir os demais pontos de rotação através
Um sinal é aplicado à placa de contro- da largura do pulso, passaremos agora a
le, o eixo do motor está conectado meca- tratar do software que envia e recebe sinais
nicamente a um conjunto de engrenagens da placa Interface LPT apresentada na edi-
que além de dar a força ao mecanismo, ção nº 437 da revista Saber Eletrônica.
também gira um potenciômetro ao qual Este trabalho com os sinais de entrada
realimenta o circuito elétrico, colocando e saída da porta LPT pode ser feito através
o motor na sua posição de acordo com o de diversas linguagens de programação,
pulso aplicado. mas qual é a melhor? Esta pergunta é

F1.Foto do servomotor
aberto e fechado.

38 I SABER ELETRÔNICA 441 I Outubro 2009

SE441_servomotores.indd 38 21/10/2009 10:07:44


s
constante entre vários técnicos, porém a controle preciso do tempo, mostraremos O módulo modINI.bas é um módulo
resposta é simples: A melhor linguagem de que isso não é uma verdade. que pode controlar algumas funções
programação para este caso é a que você O que ocorre realmente é que resulta extremamente importantes em nosso
mais domina. na falta de precisão do controle do tempo projeto futuro, que são: a possibilidade
Existem no mercado diversos mi- baseia-se no fato do programa que gerencia de gravar, apagar e alterar as informações
crocontroladores ou CIs dedicados ao este procedimento não ser utilizado corre- em um arquivo .INI, estas funções têm
controle de servomotores, porém usar o tamente. Nos primeiros testes que realizei, como principal aplicação a gravação de
computador traz um desafio maior, não usei laços de tempo, tais como “for next, movimentos dos servos para serem repe-
só pelo controle do mecanismo em si, mas while…” do e os pulsos eram gerados de tidos automaticamente, os quais veremos
pelo emprego de uma CPU que, além de forma incorreta. Foi pesquisando no pró- futuramente. No momento, iremos nos
controlar o servomotor, pode controlar prio site da Microsoft, que encontrei uma ater a controlar os servos motores.
ao mesmo tempo uma gama de outros solução interessante para o controle total Vejamos a linha de programa abaixo
dispositivos de uma esteira automatizada, de tempo em milisegundos, lembrando (prepare-se para adquirir conhecimentos
por exemplo. que a página está em inglês, e por isto re- importantes!):
Alguns técnicos podem argumentar forço a necessidade do técnico de eletrônica 1. Private Declare Function QueryPer-
que a utilização do clock do computador conhecer este idioma, pois a internet possui formaceCounter Lib “kernel32”
rodando Windows não é precisa. Nesta um bom material de referência, porém a (lpPerformaceCounter As LAR-
montagem mostramos que é possível, in- maioria está em inglês. GE_INTEGER) As Long
clusive usar o clock interno do computador Como todo projetista sabe, nem sempre 2. Private Declare Function QueriPer-
de forma precisa. escolher um exemplo e colocá-lo em prática formacerequency Lib “Kernel32”
O fato de estarmos utilizando a porta funciona corretamente. Na primeira tenta- (lpFrequency as LARGE_INTER-
paralela ao invés de uma saída USB para tiva, perdi horas tentando fazer o sistema GER) as Long
o controle está vinculado a dois fatores. O funcionar, mas a minha insistência preva- Essas duas linhas são o segredo de
primeiro revela que é comum empregar leceu e encontrei a forma certa de fazer o executarmos com precisão o controle de
máquinas já um pouco usadas em labo- programa enviar pulsos entre 1 e 2 ms. tempo no VB6. A primeira delas linha
ratórios e também em fábricas onde os Todo o funcionamento começa com (1), acessa um TEMPORIZADOR de alto
computadores ficam reservados somente dois arquivos, ou módulos acrescentados desempenho mais conhecido como ( HPC
para uma determinada função. Estes ao VB6, e a uma função, API, facilmente - High Performace Counter ), o qual tem uma
computadores, em sua maioria, possuem utilizável no Visual Basic 6, um deles nos excelente precisão da qual precisamos. Ao
a porta paralela. Quanto ao segundo fator, já conhecemos que é a DLL inpout32.dll e utilizar esta API estaremos usando o sinal
ele está no baixo custo do desenvolvimen- o módulo inpout4v.bas, o qual controla a de CLOCK ( não da placa CPU ) e sim do
to, não necessitando dos CIs conversores nossa interface para a porta paralela. O próprio Microprocessador.
de sinais seriais. outro arquivo é o módulo modINI.bas, Quando empregamos o sinal de
Como o nosso intuito é ensinar a utili- ambos encontrados na internet sem pro- CLOCK da placa CPU, temos uma baixa
zação, o técnico poderá migrar o conceito blemas que está disponibilizado no site resolução, ou precisão na contagem de
para diversos outros tipos de meios de da Revista Saber Eletrônica, bem como o tempo, na ordem de 0,055 segundos ou
comunicação, até mesmo wireless. programa DEMO deste projeto. 1/18 de um segundo, a instrução que
O primeiro passo do programa consiste Não vamos discorrer aqui sobre a DLL trabalha dessa maneira é a API “timeGet-
em gerar um sinal através da porta para- inpout32 e nem sobre o módulo inpou- Time”. Outra vantagem é que, quando
lela, que varie de 1 a 2 ms, isso em cada t4v.bas, pois ambos já foram abordados possuímos um microprocessador mais
um dos 8 bits. Considerando-se a fama do na edição 437, porém falta tratar sobre rápido, o tempo definido de execução
Windows e dos executáveis oriundos do o módulo modINI.bas e da API nosso da função não se altera, e sim temos um
VisualBasic não é boa no que se refere ao principal objetivo. aumento da precisão.
Para ficar mais claro, se usássemos
uma determinada contagem de tempo,
utilizando o sincronismo de relógio
(clock com a “timeGetTime”) para placa
CPU, ao ajustarmos o programa em um
P4 de 2,8 GHz o programa funcionaria
bem. Já ao colocarmos em um micro de
velocidade diferente, o programa perde-
ria precisão ou apresentaria uma falha
total do programa.
Quanto à segunda linha (2) esta aciona
um contador, o qual por sua vez aciona
F2. Diagrama de tempo dos sinais um temporizador com milésimos de se-
aplicados a um servomotor.

Outubro 2009 I SABER ELETRÔNICA 441 I 39

SE441_servomotores.indd 39 21/10/2009 10:07:45


Projetos

gundos. Ou seja, podemos controlar a fre-


quência com a qual o tempo será medido,
ou seja a cada 1 ms iremos contar 20 s, isso
com precisão HPC. O princípio desta API
é o mesmo da descrita na linha (1).
Com estas explicações adicionais
é possível entender como programar
em VB6, um contador de tempo de alta
precisão. Por este motivo, recomendo
ao leitor que, ao ouvir críticas de uma
determinada linguagem de programação,
leve em consideração a experiência do
programador que faz a crítica, pois nem
sempre o mesmo que critica fez todos os
testes para poder afirmar a verdade do
que afirma. O mesmo conselho serve para
a escolha de microcontroladores.
Todo o código-fonte do programa F3. Tela de abertura
do software.
encontra-se disponível no site www.sa-
bereletronica.com.br, ou pode ser pedido
através do meu e-mail clovis.magoga@ Val (valor)” o sinal de acordo com tempo indicar o endereço da porta LPT disponível
hotmail.com em “ms” definido. no microcomputador, no lado esquerdo de
Para melhor compreensão do pro- No box 4, temos a rotina final de envio cada barra deslizante temos a indicação da
grama, passarei box 1 algumas linhas e dos pulsos em “ms” diretamente a inter- posição de cada servo e à direita a frequên-
explicarei as suas funções. face LPT Port. cia em “ms” enviada ao servo.
Estas linhas têm como objetivo “ati- Até aqui o leitor encontra o conteúdo
var” a função que disponibiliza os sinais principal do programa sobre a geração Conclusão
de tempo necessários para nossa aplica- de pulsos em milissegundos. Existem as O leitor poderá baixar este programa
ção. Uma vez ativas e disponibilizadas, rotinas extras para o interfaceamento, do próprio site da Saber Eletrônica, ou
as variáveis do sistema de tempo, vamos mas a idéia principal está apresentada entrar em contato com o autor. A opera-
escrever a rotina que irá gerar os milisse- nestas linhas de código, onde ele poderá
gundos necessários ao acionamento dos implementar qualquer rotina de controle Box 2
servos, conforme o box 2. de tempo com boa precisão. Public Sub TempoemMs(duracao As Long)
Com este código temos uma referên- Agora que sabemos como gerar o ‘Rotina de duração de tempo
cia confiável de tempo, e começaremos a pulso de 2 ms, vamos conectar o pino de Dim curStart As LARGE_INTEGER
escrever a rotina de tempo, chamado de sinal do servomotor em um dos pinos da Dim curEnd As LARGE_INTEGER
Dim curFreq As LARGE_INTEGER
TempoemMS. porta da placa Interface LPT, lembrando
Dim WaitTop As Long
Depois do tratamento da função re- que o servo deve estar conectado à uma QueryPerformanceFrequency curFreq
ferente à medição do tempo, podemos fonte de alimentação. QueryPerformanceCounter curStart
acessar a mesma simplesmente chaman- Na tela da figura 3 temos a tela de WaitTop = curStart.lowpart + Int(duracao
do TempoemMs, em qualquer ponto do abertura do software desenvolvido por * 3,38)
Do
programa como mostrado no exemplo mim para o projeto.
QueryPerformanceCounter curEnd
do box 3. Na figura 4 temos à disposição os Loop Until curEnd.lowpart >= WaitTop
A rotina apresentada no box 3 pode- controles dos servos através de barras des- End Sub
mos enviar para a porta LPT “out dados, lizantes. No campo “endereço” devemos

Box 1 Box 3

‘Declarações Private Sub envia_lpt()


Private Type LARGE_INTEGER Dim ValeurTemp
lowpart As Long ValeurTemp = Valor
highpart As Long Out Dados, Val(Valor)
End Type Valor = Empty
Private Declare Function QueryPerformaceCounter Lib “kernel32” (lpPerformaceCounter As TempoemMs Temps
LARGE_INTEGER) As Long Out Dados, Val(valor)
Private Declare Function QueriPerformacerequency Lib “Kernel32” (lpFrequency as LARGE_IN- Valor = ValeurTemp
TERGER) as Long End Sub

40 I SABER ELETRÔNICA 441 I Outubro 2009

SE441_servomotores.indd 40 21/10/2009 10:07:45


F4. Tela de controle dos
servomotores.

cionalidade do software aqui descrita é tos automaticamente, além da inclusão


básica, e será disponibilizado em futuro do controle de mais 8 servos, resultando
não muito distante um programa muito um total de 16 servos. Pretendo também
mais completo. Com opções de gravar a implementar a função de controle de

a
posição dos servos para repetir movimen- webcam e acesso remoto. E
Box 4

Private Sub HScroll_Change(Index As Temps = Tempo(i + 1)


Integer) If i = 0 Then
rotmax = 18 ‘Definir valor entre 15 e 30 Valor = 1
( definição do tempo em que o servo irá End If
ficar ativo ) TempServo = 2 * 1000 ‘ Valor If i = 1 Then
em MS ( define a frequência em MS no Valor = 2
caso 2ms) End If
Timer3.Interval = TempServo If i = 2 Then
For i = 0 To 7 Valor = 4
If Not IsNumeric(AngleServo(i).Text) Then End If
AngleServo(i) = “0” If i = 3 Then
End If Valor = 8
If AngleServo(i).Text <> “” Then End If
angle = AngleServo(i).Text If i = 4 Then
If AngleServo(i).Text > 90 Then Valor = 16
angle = 90 End
End If If
If AngleServo(i).Text < -90 Then If i = 5
angle = -90 Then
End If Valor = 32
AngleServo(i).Text = angle End If
End If If i = 6 Then
SensiServo(i) = 1 Valor = 64
If AngleServo(i).Text <> HScroll(i).Value End If
Then If i = 7 Then
AngleServo(i).Text = HScroll(i).Value Valor = 128
a = Abs((-90 + (0 - (HScroll(i).Value * End If
SensiServo(i))))) Timer1.Enabled = True
Tempo(i + 1) = 5 + (a * (rotmax / 180)) Timer3.Enabled = True
‘ Divide X por 180 (x/180) , X defini a End If
MAXIMA rotação do servo Next I
Labelms(i).Caption = Tempo(i + 1) / 10 End Sub
Tempo(i + 1) = Tempo(i + 1) * 100

Outubro 2009 I SABER ELETRÔNICA 441 I 41

SE441_servomotores.indd 41 21/10/2009 10:07:46

Você também pode gostar