Super “servo motor de passo” com arduino? - Aula 2


Super “servo motor de passo” com arduino? Isso mesmo! Continuando a série sobre motor de passo e arduino, vamos transformar nosso motor retirado da sucata em um “SERVO MOTOR DE PASSO”, capaz de realizar posicionamento, e mantê-lo de forma autônoma. Confira o primeiro vídeo da série: Motor de passo: começando com baixo custo - Aula 1.


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:


2 comentários:

  1. Olá Prof. Fernando K. Estou curtindo seus vídeos.
    Quebrando 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.

    ResponderExcluir
  2. ola colega, esta dando erro ao carregar para o arduino o code podes me ajudar?obrigado

    ResponderExcluir

Tecnologia do Blogger.