Por Fernando Koyanagi 1
Motor de passo como servo com comunicação serial 2
Características principais Permite comandos através da comunicação serial. Flexibilidade nas configurações do software, permitindo formas de controle variadas. Flexibilidade na montagem de hardware, permitindo variações de motores, drivers e sensores. Retorno da informação de posição real através da leitura do sensor. 3
Montagem... Continuaremos utilizando a mesma montagem anterior. Mas deixaremos somente o potenciômetro de leitura do eixo. 4
Montagem... O potenciômetro continuará funcionando como um sensor da posição atual do eixo. Para isso vamos prender o eixo do motor ao manípulo do potenciômetro. 5
Montagem... Conectaremos o potenciômetro a entrada analógica A0. O EIXO conectaremos ao pino A0 (fio roxo). A alimentação de 5V (fio verde). A referência GND (fio preto). 6
MAS ATENÇÃO!!! Antes de prender o potenciômetro sensor ao eixo, teste a montagem para verificar se a rotação está ocorrendo no sentido correto, ou seja, ao comandar um aumento de posição o motor deve girar no sentido de aumentar o potenciômetro sensor. Se a rotação estiver ocorrendo ao contrário, simplesmente inverta a polarização do potenciômetro. Como o torque do motor de passo costuma ser alto, ele pode danificar o potenciômetro sensor tentando levá-lo para uma posição que não pode ser alcançada. 7
Montagem do circuito Conexões ARDUINO, REGULADOR E MOTOR FIO Pino 2 - Arduino AZUL In_1 Pino 3 - Arduino AZUL In_2 Pino 4 - Arduino LARANJA In_3 Pino 5 - Arduino LARANJA In_4 GND - Arduino PRETO GND Saída do Regulador AMARELO +12V GND do Regulador PRETO GND Módulo L298 A+ VERMELHO Motor A A- PRETO Motor A B+ VERMELHO Motor B B- PRETO Motor B 8
Entendendo o programa ( Declarações ) 9
Código Fonte do Arduino Declarações Globais: (constantes) Começamos definindo constantes que representarão os pinos D2, D3, D4 e D5 do Arduino. Estes pinos serão os responsáveis pela transmissão da sequencia de acionamento para o driver. A constante EIXO refere-se ao pino A0 utilizado pelo potenciômetro sensor. 10
Código Fonte do Arduino Declarações Globais: (Variáveis) Agora veremos que temos novas variáveis para o controle do Servo Motor de Passo. inc_dec Armazena o incremento/decremento da posição. retardo_entre_os_passos define o retardo para mudança de passo. tolerancia define a precisão do ajuste da posição. leitura_comando armazena o valor da posição alvo recebida pelo comando. leitura_eixo armazena o valor da posição atual do eixo. passo armazena o passo atual da sequencia de passos. limite_inferior armazena o valor usado para definir a posição mínima de ajuste. limite_superior armazena o valor usado para definir a posição máxima de ajuste. comando_recebido armazena o comando recebido pela serial. recepcao_completa sinaliza se a recepção do dado foi completada. 11
Entendendo o programa ( Setup ) 12
Código Fonte do Arduino Setup() Na função setup(), ajustamos os pinos digitais como saídas, o pino analógico como entrada. Então iniciamos a função Serial. Para a recepção reservamos 200 bytes para o comando recebido (mais que suficiente). Lemos a posição inicial do eixo e executamos uma função que envia pela serial uma mensagem de configurações atuais e lista de comandos para o usuário. 13
Entendendo o programa ( mensagem ) 14
Código Fonte do Arduino Observação: A função mensagem é opcional e pode ser removida do programa, uma vez que o usuário já esteja acostumado com a lista de comandos. A função mensagem é uma série de prints, enviados pela serial para tornar mais amigável a manipulação do programa. Servindo de orientação. Ela ainda faz uma chamada à função interpretadora de comando solicitando uma leitura dos valores das variáveis. Veremos essa função mais a frente. 15
Código Fonte do Arduino Exemplo da mensagem enviada - Informações e Comandos 16
Entendendo o programa ( Loop) 17
Código Fonte do Arduino Loop(): Na função loop(), lemos novamente a posição atual do eixo e em seguida verificamos se existe alguma recepção completa de dados, usando a variável sinalizadora recepcao_completa. Se esta variável for verdadeira, passamos o controle do programa para a função interpretadora do comando. Se não houver repetimos o mesmo processo de ajuste que fizemos antes utilizando o valor contido na variável leitura_comando como alvo de ajuste e tolerancia como determinante da precisão do ajuste. 18
Código Fonte do Arduino Tolerância total (-) tolerancia (+) tolerancia Valor alvo Relembrando, para o cálculo da posição alvo incluímos um valor que indica a tolerância do posicionamento. Isso nos permitirá lidar com ruídos na leitura simplesmente aumentando a faixa alvo. 19
Entendendo o programa (girar) 20
Código Fonte do Arduino A função girar funciona da mesma forma que vimos anteriormente. girar (int direcao): A função girar receberá um parâmetro que indicará para qual lado o motor deverá girar. Este parâmetro é enviado pela avaliação dos valores que ocorre no loop, como vimos a pouco. O valor do parâmetro direcao determinará se o passo deve ser incrementado ou decrementado. Criamos essa função separadamente somente para ilustrar melhor o funcionamento do programa. Poderíamos ter incluído este código diretamente na avaliação que ocorre no loop. 21
Entendendo o programa (ajustar_passo) 22
Código Fonte do Arduino Bem como a função ajustar_passo, que a ativa as bobinas na sequencia correta. ajustar_passo(int bobina): A função ajustar_passo já é conhecida da montagem do vídeo anterior. É ela que efetivamente ativa ou desativa os pinos de controle do arduino para acionar o driver e consequentemente promover a polarização correta das bobinas do motor. Assim, ela é responsável por executar os passos determinados pelas avaliações das funções anteriores. 23
Entendendo o programa (serialevent) 24
Código Fonte do Arduino A função serialevent() é uma função do Arduino que dispara automaticamente sempre que um dado é recebido pela serial. Note que não precisamos explicitar nenhuma chamada para esta função pois, uma vez que um dado é recebido, o fluxo do programa é interrompido e esta função é chamada para manipular os dados recebidos. Fazemos isso verificando se há bytes no buffer de recepção serial do Arduino usando a função Serial.available(). Enquanto houver, armazenamos cada byte na variável caracter e adicionamos à variável comando_recebido até que um caractere de nova linha seja recebido, sinalizando o fim do comando ou até que se esgotem os bytes do buffer de recepção. 25
Entendendo o programa ( Interpretador de comandos ) Cascata de if... 26
Código Fonte do Arduino Interpretador de comandos Comando L A função interpretadora de comandos é uma coleção de verificações da primeira letra do comando recebido. Cada letra representa um comando e os dados seguintes servirão de argumentos para este comando, isso se houver. O primeiro comando é o comando L que executa uma leitura de todas as variáveis de controle e as envia para o usuários através da serial. 27
Código Fonte do Arduino Interpretador de comandos Comando T O comando T lê o restante dos bytes da variável comando, após a primeira letra e usa estes valores para ajustar o valor da variável tolerancia. Note que usamos o método.substring para cortar da segunda posição (a contagem das posições das strings começam em zero), até o comprimento total da variável comando. Para obter o comprimento usamos o método.length(). Por fim, usamos ainda o método.toint() para converter este valor em um inteiro. 28
Código Fonte do Arduino Interpretador de comandos Comando R O comando R é responsável pelo ajuste da variável retardo_entre_os_passos. Este retardo é importante para controlar a rapidez do movimento. Ela substituiu a variável velocidade que utilizamos antes (somente mudamos o nome). O argumento para esse comando é capturado da mesma forma que o comando anterior. Depois de recebido o valor, ele é verificado. O valor deste retardo não pode ser muito pequeno porque faria o motor pular passos. No nosso caso, o limite é 3 milissegundos. 29
Código Fonte do Arduino Interpretador de comandos Comandos I e S Os comando I e S servem para ajustar o valor das variáveis que controlam os limites do movimento do servo. Sendo I paro limite inferior e S para o limite superior. A recepção dos valores ocorre praticamente da mesma forma que os casos anteriores. 30
Código Fonte do Arduino Interpretador de comandos Comando M O comando M calcula o valor da posição MÉDIA entre os limites SUPERIOR e INFERIOR e atribui este valor a variável leitura_comando, tornando-se assim o alvo do ajuste. Após o comando M o servo sempre se posicionará na posição intermediária, entre a posição máxima e mínima ajustadas 31
Código Fonte do Arduino Interpretador de comandos Comandos + e - Os comandos + e - incrementam e decrementam, respectivamente, a posição do servo, em passos definidos pelo valor da variável inc_dec. O valor desta variável pode ser ajustado como um argumento destes dois comandos. Uma vez ajustada, não é necessário que se envie novamente o valor do incremento ou decremento, a menos que o intuito seja realmente altera-la. 32
Código Fonte do Arduino Interpretador de comandos Comando A O comando A é responsável pelo o AJUSTE da posição do servo. A nova posição é o argumento deste comando. Se o argumento for omitido, será considerado zero e o servo moverá para a posição mínima. 33
Novo suporte para NEMA 17... 34
Novo suporte para NEMA 17... 35
Novo suporte para NEMA 17... Arquivo STL para impressora 3D 36
Novo suporte para NEMA 17... 37
Próximo tutorial Automação de uma casa... Em www.fernandok.com Download arquivo PDF dos diagramas Download arquivo INO do código fonte 38