Então, neste projeto vamos
utilizar um motor de passo como se fosse um servo, ou seja, este será controlado
pelo arduino. Vamos usar no nosso exemplo o mesmo motor que retirei do scanner,
que mostrei na primeira aula.
Características principais
Permite um posicionamento
realmente assistido, através do sensor acoplado ao eixo do motor.
É capaz de retornar sua
posição real através da leitura do potenciômetro sensor.
Possui uma rotina simples mas
eficiente que leva a correções automáticas da posição do eixo caso pequenos
distúrbios ocorram.
Torque elevado se comparado
com a maioria dos servos de baixo custo disponíveis.
Permite criar ajustes para
movimentos angulares diversos alterando o sensor, ou simplesmente acoplando a
outro eixo.
Montagem
A montagem será praticamente a
mesma utilizada no vídeo anterior. Mas desta vez, acrescentaremos dois
potenciômetros.
Um deles servirá apenas para
que tenhamos um modo de enviar uma posição para ajuste. Neste caso, o
potenciômetro que chamaremos de COMANDO, determinará a posição do motor.
O outro funcionará como um
sensor da posição atual do eixo. Para isso vamos prender o eixo do motor ao
manípulo do potenciômetro.
Conectaremos os potenciômetros
as entradas analógicas A0 e A1.
·
O EIXO conectaremos ao pino A0 (fio roxo).
·
O COMANDO conectaremos ao pino A1 (fio laranja).
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 aumentar o potenciômetro de comando o
motor gira no sentido de aumentar o potenciômetro sensor.
Se a rotação estiver ocorrendo
ao contrário, simplesmente inverta a polarização de um dos potenciômetros.
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.
Montagem do circuito
Conexões
Código – Fonte do Arduino
Declarações Globais:
(constantes)
Começamos definindo constantes
que representarão os pinos D2, D3, D4, D4 e D5 do Arduino. Estes pinos serão os
responsáveis pela transmissão da sequencia de acionamento para o driver.
Transformamos a variável
chamada “velocidade”, em uma constante e criamos uma constante chamada
“tolerância” que será usada como um parâmetro para determinar o ajuste mínimo.
// Declaração Global de constantes que representarão os pinos do Arduino const byte INPUT_1 = 2; const byte INPUT_2 = 3; const byte INPUT_3 = 4; const byte INPUT_4 = 5; const byte SENSOR_EIXO = A0; // Potenciômetro do EIXO. const byte COMANDO = A1; // Potenciômetro usado para COMANDO da posição do servo. //Variáveis globais
Declarações Globais:
(Variáveis)
Declaramos 3 variáveis globais
que serão responsáveis por armazenar durante todo o programa a última leitura
do comando, a última leitura do eixo e o passo atual que que se encontra o
motor, respectivamente.
//Variáveis globais int leitura_comando = 0; // Variável que armazena o valor da leitura do COMANDO. int leitura_sensor = 0; // Variável que armazena o valor da leitura do SENSOR DO EIXO. int passo = 0; //Variável que armazena o passo atual. int velocidade = 3; //Variável que determinará a velocidade do ajuste do motor
Setup()
Na função setup() ajustamos os
pinos de controle do driver como fizemos anteriormente, mas agora acrescentamos
os ajustes para os pinos de leitura dos potenciômetros, que serão ajustados
como entradas (INPUT).
void setup() { // Ajustando os pinos do Arduino para operarem como saídas digitais pinMode(INPUT_1, OUTPUT); pinMode(INPUT_2, OUTPUT); pinMode(INPUT_3, OUTPUT); pinMode(INPUT_4, OUTPUT); // Ajustando os pinos do Arduino resposáveis pela leitura dos potenciômetros pinMode(COMANDO, INPUT); pinMode(SENSOR_EIXO, INPUT); }
Loop()
Na função loop() realizamos a
leitura dos potenciômetros para obter os valores para o COMANDO e para a
posição atual do EIXO.
Comparamos estes valores para
determinar para qual direção o eixo deve se mover. No sentido de aumentar ou
diminuir o valor do potenciômetro sensor.
void loop() { //leitura do potenciometro de comando leitura_comando = analogRead(COMANDO); //leitura do potenciometro de posicao do eixo leitura_sensor = analogRead(SENSOR_EIXO); // Avaliação da direção do movimento if (leitura_sensor < leitura_comando - 5) { girar(1); //Girar o EIXO no sentido de AUMENTAR a leitura do sensor } if (leitura_sensor > leitura_comando + 5) { girar(-1); //Girar o EIXO no sentido de REDUZIR a leitura do sensor } // Aguarde para repetir delay(velocidade); }
A ideia geral é que o programa
tentará fazer com que os dois valores dos
potenciômetros sejam iguais.
No cálculo, incluímos a
constante “tolerancia” para que seja possível lidar com ruídos na leitura
aumentando a faixa alvo.
//Função para girar o motor na DIRECAO avaliada void girar(int DIRECAO) { // Girar INCREMENTANDO o PASSO if (DIRECAO > 0) { for (i = 0; i < DIRECAO; i++) { passo++; if (passo > 3) { passo = 0; } //Atualiza o passo ajustar_passo(passo); } } //Girar DECREMENTANDO o passo else { for (i = 0; i > DIRECAO; i--) { passo--; if (passo > 0 ) { passo = 3; } //Atualiza o passo ajustar_passo(passo); } } }
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.
//Função para girar o motor na DIRECAO avaliada void girar(int DIRECAO) { // Girar INCREMENTANDO o PASSO if (DIRECAO > 0) { for (i = 0; i < DIRECAO; i++) { passo++; if (passo > 3) { passo = 0; } //Atualiza o passo ajustar_passo(passo); } } //Girar DECREMENTANDO o passo else { for (i = 0; i > DIRECAO; i--) { passo--; if (passo < 0 ) { passo = 3; } //Atualiza o passo ajustar_passo(passo); } } }
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.
//Função para atualização do passo void ajustar_passo (int bobina) { switch (bobina) { //PASSO 1 case 0: digitalWrite(INPUT_1, HIGH); digitalWrite(INPUT_2, LOW); digitalWrite(INPUT_3, LOW); digitalWrite(INPUT_4, LOW); break; ///PASSO 2 case 1: digitalWrite(INPUT_1, LOW); digitalWrite(INPUT_2, HIGH); digitalWrite(INPUT_3, LOW); digitalWrite(INPUT_4, LOW); break; //PASSO 3 case 2: digitalWrite(INPUT_1, LOW); digitalWrite(INPUT_2, LOW); digitalWrite(INPUT_3, HIGH); digitalWrite(INPUT_4, LOW); break; //PASSO 4 case 3: digitalWrite(INPUT_1, LOW); digitalWrite(INPUT_2, LOW); digitalWrite(INPUT_3, LOW); digitalWrite(INPUT_4, HIGH); break; } }
Entendendo o programa
Juntando tudo
Aqui temos o motor e o
potenciômetro.
Abaixo o acoplamento.
Arquivo STL que está
disponível para download.
Aqui você vê a montagem em 3D.
Ponteiro do eixo do motor.
Versão renderizada do Solid
Works da montagem completa.
Arquivos para download:
9 Comentários
Olá Prof. Fernando K. Estou curtindo seus vídeos.
ResponderExcluirQuebrando a cabeça na minha montagem usando um nema 16 o mapeamento dos bits ficou assim:
1000
0001
0100
0010
Nisso para o motor sequenciar os passos. Além de declarar a variável i lá na variáveis globais, que estava na função
void direção.
Parabéns pelo seu trabalho e sempre continuarei acompanhando seus videos.
ola colega, esta dando erro ao carregar para o arduino o code podes me ajudar?obrigado
ResponderExcluircódigo apresenta erro dizendo que "i" não está declarado.
ResponderExcluirolá Fernando K socorre seu colega com sua arte de ensino e generosidade. esta apresentando este erro ('i' was not declared in this scope) meu muito obrigado
Excluirola Fernando blz , e possivel montar com motor DC ? desde ja agradeço por responder !!!
ResponderExcluiropa ! como consigo usar esse mesmo codigo com o drive tb6560 v2.0
ResponderExcluirestou com dificuldade no erro que esta
ResponderExcluiri nao declarada como resolvo isso alquem pode me ajudar
Olá Sr. Fernando K Me ajude por favor, tenho tido problema com o i não declarado
ResponderExcluirPessoal o problema da variável "i" é somente a forma como está sendo feita o FOR, basta declarar a variavel adicionando "int" assim:
ResponderExcluironde está "for (i = 0; i ........"
colocar: "for (int i = 0; i ........."
Abraços!