Arne Basic 2k - Experiência 6 - Controle de motor de passo


A proposta

Nesta sexta experiência demonstrarei como  utilizar o Arne Basic 2k no controle de um motor de passo do tipo unipolar (6 ou 5 fios).  E como já é de costume, primeiro acho interessante mostrar um pouco da teoria para em seguida apresentar a parte prática.

A teoria

Os motores de passo são amplamente difundidos no mundo da eletrônica / mecatrônica / microrobótica. Sua precisão, aliada a sua força (torque) fazem deste motor um excelente “posicionador”. Eles estão presentes em impressoras, pequenos CNC’s, mesas “XY”, etc. Por estas e muitas outras razões, os motores de passo também são utilizados em pequenos e médios robôs. Alguns dos robôs que publiquei na revista Mecatrônica Fácil, como o ADR-2ADR-3 e o Desenhista,  utilizaram motores de passo para se locomover.

Para operar um motor de passo do tipo unipolar, é necessário “ligar” e “desligar” (chaveamento) suas bobinas em uma seqüência correta. A freqüência com que estas bobinas são “chaveadas” determinará a velocidade de giro do motor. Para fazê-lo girar em sentido contrário devemos inverter a seqüência de chaveamento. Veja a tabela abaixo, nela descrevo a seqüência para operar um motor de passo unipolar de seis fios (duas bobinas independentes).

Tabela - Seqüência para chaveamento


Seqüência de Passos
1 2 3 4 ...1...
Bobina 1 1 1 0 0 1
Bobina 2 0 0 1 1 0
Bobina 3 1 0 0 1 1
Bobina 4 0 1 1 0 0

Os valores iguais a “1” equivalem à bobina ligada e os valores iguais a “0” equivalem à bobina desligada. A analise da tabela é feita do “passo 1” para o “passo 4”. A partir desse ponto a operação é repetida para manter o motor em funcionamento. Lembrando que a maioria dos motores necessitam de mais de 70 passos para uma volta completa. Quanto mais passos para uma volta o motor necessitar, mais preciso o mesmo será.

Para fazer o motor girar em sentido contrário, devemos fazer a analise inversa na tabela. O primeiro passo passa a ser o de número “4” e o último o de número “1”. Esta operação é repetida até conseguirmos o número de voltas desejado.

Infelizmente não existe uma padronização entre os fabricantes de motores de passo, que nos permita através de um código de cores identificar as ligações de suas bobinas internamente. Para isso é necessário que você, de posse de um multímetro na posição de leitura de resistências, faça uma analise de seu motor. A figura abaixo demonstra como isso deve ser feito.

Em um motor de 6 fios, as bobinas vão se apresentar separadas. Neste caso um valor resistivo maior medido entre dois pontos mostrará as "pontas" da bobina. Um valor igual a metade do valor encontrado para as "pontas" mostrará a "tomada central" da bobina (center tap). É neste ponto que a tensão de alimentação do motor deve ser ligado.

Já motores de 5 fios são um pouco mais complicados de se determinar, pois os fios das tomadas centrais de ambas as bobinas estão ligados internamente. Porém o conceito é o mesmo.


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 gira o motor no sentido horário, a chave S2 gira o motor no sentido anti-horário e a chave S3 pára o motor. Para esta experiência é recomendável o uso de uma fonte de 12VDC com 1A no mínimo de corrente. O motor de passo deve ser do tipo, unipolar com 5 ou 6 fios, tensão de bobina 12VDC. Os com 4 fios não servem nesta experiência. Cuidado com motores muito grandes, pois estes geralmente consomem uma corrente grande. Prefira os menores para realizar esta experiência, já que independente do tamanho a forma de controle será sempre a mesma.

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. Este exemplo mostra alguns recursos do compilador, além do básico da programação BASIC. Vamos em frente com nossas experiências!!! Como diria o sr. Miagui - "Daniel San!!! Começou a aprender karatê ontem e já quer ser faixa preta?!?! Primeiro ralar bastante... depois ganha primeira faixa... vermelha né!!!" ehehehehe

Código fonte:
'*******************************************************************************
'* Programa TESTE_STEPMOTOR_ARNEBASIC2K.BAS
'* Desenvolvido por Márcio José Soares
'* para do Arne Basic 2k
'*
'* Obs.: Este programa foi desenvolvido para testar o uso de um motor de passo
'* com o Arne Basic 2k. Veja o circuito em www.arnerobotics.com.br
'*
'* S1 gira horário
'* S2 gira anti-horário
'* S3 pára motor
'*
'* O motor de passo usado nesta experiência é do tipo unipolar!!!
'*
'* Para ligar o motor ao Arne Basic 2k é necessário um drive de corrente!!!
'* Veja o circuito no site para saber mais!!!!
'*******************************************************************************
 
'*******************************************************************************
'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
 
Config Debounce = 30                    'tempo para debounce das chaves = 30 ms
 
'*******************************************************************************
'Variáveis globais
Dim Sentido As Byte                     'sentido de giro
Dim Motortab(4) As Byte                 'tabela para controle do motor
Dim Ponteiro As Integer                 'posição do ponteiro na tabela
 
'*******************************************************************************
'Liga pinos de I/O's a "nomes" mais fáceis ao entendimento humano ;-)
Motor Alias Portb                       'porta de controle do motor
S1 Alias Pind.0                         'pino de entrada para chave 1
S2 Alias Pind.2                         'pino de entrada para chave 2
S3 Alias Pind.4                         'pino de entrada para chave 3
 
'*******************************************************************************
'Declaração das subrotinas
Declare Sub Check_tec()
Declare Sub Direita()
Declare Sub Esquerda()
Declare Sub Para()
 
'*******************************************************************************
'Início do programa
Waitms 500                              'aguarda 0,5 segundo
 
Sentido = 0                             'motor parado
Ponteiro = 1
Motortab(1) = &B00000101                'tabela de controle para motor
Motortab(2) = &B00001001
Motortab(3) = &B00001010
Motortab(4) = &B00000110
 
Call Para()
 
'*******************************************************************************
'Laço principal... faz eternamente
Do
 
   Call Check_tec()                     'chama rotina para ver se tem tecla
 
   Select Case Sentido
      Case 1 : Call Direita()           'gira motor a direita
      Case 2 : Call Esquerda()          'gira a esquerda
      Case 3 : Call Para()              'pára motor
      Case Else : Call Para()           'qualquer outro valor, pára
   End Select
 
Loop
 
 
'*******************************************************************************
'Subrotina para verificar se alguma tecla foi pressionada
'S1 gira a direita
'S2 gira a esquerda
'S3 pára motor
Sub Check_tec()
 
   Debounce S1 , 0 , Mdir               'desvia se zero
   Debounce S2 , 0 , Mesq               'desvia se zero
   Debounce S2 , 0 , Mpara              'desvia se zero
   Goto Fim                             'desvia para fim da subrotina
 
'avisa que deve girar a direita
Mdir:
Sentido = 1
Goto Fim                                'desvia para fim
 
'avisa que deve girar a esquerda
Mesq:
Sentido = 2
Goto Fim                                'desvia para fim
 
'avisa que deve girar a esquerda
Mpara:
Sentido = 3
 
'Label para sair da função
Fim:
End Sub
 
'*******************************************************************************
'Subrotina para girar motor a direita
Sub Direita()
 
   Motor = Motortab(ponteiro)           'coloca valor da tabela no port
   Incr Ponteiro                        ' incrementa ponteiro
   If Ponteiro = 5 Then                 'se chegou no fim
      Ponteiro = 1                      'retorna valor
   End If
 
End Sub
 
'*******************************************************************************
'Subrotina para girar a esquerda
Sub Esquerda()
 
   Motor = Motortab(ponteiro)
   Decr Ponteiro                        'decrementa valor
   If Ponteiro = 0 Then                 'se chegou ao fim
      Ponteiro = 4                      'retorna valor
   End If
 
End Sub
 
'*******************************************************************************
'Subrotina para parar motor
Sub Para()
 
   Motor = &B00000000                   'zera porta e para motor
 
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.