Controlando um Motor de Passo 5v com Arduino

Controlando um Motor de Passo 5v com Arduino

Neste tutorial vamos explicar como conectar um Motor de Passo 28BYJ-48 5v ao Arduino Uno usando um driver ULN2003. A montagem e programação do Arduino é muito simples, mas vamos explicar primeiro o que é um motor de passo.

Princípio de funcionamento de um motor de passo

Um motor de passo é um dispositivo electromecânico que converte os impulsos elétricos em movimentos discretos mecânicos. O eixo de um motor de passo gira em incrementos discretos quando os impulsos de comando eléctricos são aplicados a ele na sequência correta.

A rotação dos motores tem várias relações diretas a estes pulsos de entrada aplicados. A sequência dos impulsos aplicados está diretamente relacionada com a direção de rotação do eixo do motor, a velocidade de rotação do motor com a frequência dos impulsos de entrada e o comprimento de rotação com o número de impulsos de entrada. Ou seja, Para controlar o motor de passo precisa-se aplicar tensão a cada um a das bobinas em uma sequência específica.

Uma das vantagens mais significativas de um motor de passo é a sua capacidade de ser controlado com precisão num sistema de circuito aberto. Controle de circuito aberto significa que nenhuma informação de feedback sobre a posição é necessária. Este tipo de controle elimina a necessidade de caros sistemas de detecção, tais como codificadores ópticos. Sua posição é conhecida simplesmente através do controle dos impulsos de entrada.

Circuito Arduino Motor de Passo ULN2003

Conectando o Motor de Passo ao Arduino

A maneira mais simples de fazer interface com um motor de passo unipolar com Arduino é a utilização do chip ULN2003A, presente no driver ULN2003. Este CI contém sete transistores Darlington e é como se houvesse sete transistores TIP120 tudo em um pacote, suportando até 500 mA por canal e com uma queda de tensão interna de cerca de 1V quando ligado.

Alimente o motor de passo com +5V e o GND provenientes do Arduino.  Abaixo você pode conferir um esquema de ligação das bobinas e cores dos fios do motor de passo. Para mais informações confira o Datasheet 28BYJ-48.

Para utilizar o motor com o programa que vamos mostrar, conecte-o ao Arduino na seguinte sequência:

  • IN1 ao pino 8 do Arduino
  • IN2 ao pino 9 do Arduino
  • IN3 ao pino 10 do Arduino
  • IN4 ao pino 11 do Arduino

O circuito de ligação do motor ao Arduino Uno ficará assim:

Circuito Arduino Uno Motor de Passo 5V

 

Controle de Motor de Passo com Arduino

O ambiente de programação Arduino vem com uma biblioteca de funções para controlar um motor de passo. Para utilizar a biblioteca, baixe no Editor Arduino na barra de menu superior: Sketch > Import Library > Stepper. Copie o código de exemplo abaixo para controlar o motor de passo com Arduino:

#include <Stepper.h> 

const int stepsPerRevolution = 500; 
 
//Inicializa a biblioteca utilizando as portas de 8 a 11 para 
//ligacao ao motor 
Stepper myStepper(stepsPerRevolution, 8,10,9,11); 
 
void setup() 
{ 
 //Determina a velocidade inicial do motor 
 myStepper.setSpeed(60);
} 
 
void loop() 
{ 
 //Gira o motor no sentido horario a 90 graus
 for (int i = 0; i<=3; i++)
 {
 myStepper.step(-512); 
 delay(2000);
 }
 
 //Gira o motor no sentido anti-horario a 120 graus
 for (int i = 0; i<=2; i++)
 {
 myStepper.step(682); 
 delay(2000);
 }

 //Gira o motor no sentido horario, aumentando a
 //velocidade gradativamente
 for (int i = 10; i<=60; i=i+10)
 {
 myStepper.setSpeed(i);
 myStepper.step(40*i);
 }
 delay(2000); 
}

O programa acima fará com que o motor de passo gire no sentido horário 4 vezes em ângulos de 90 graus, depois 3 vezes no sentido horário, em ângulos de 120 graus, e por último vai girar o motor e aumentar a velocidade gradativamente. Depois de 2 segundos, o processo é reiniciado.

Se você tiver um Arduino Motor Shield, confira este post sobre Como conectar o Motor de Passo 28BYJ-48 com Arduino Motor Shield L293D.

Gostou? Dê uma nota para este post nas estrelas abaixo. Confira em na loja virtual FILIPEFLOP este produto e mais outros componentes eletrônicos.

11
Controlando um Motor de Passo 5v com Arduino
178 votos, 4.78 classificação média (95% pontuação)

Formado em Ciência da Computação pela Universidade de Mogi das Cruzes, atualmente responsável pelo departamento técnico da FILIPEFLOP.

Compartilhe este Post

154 Comentários

  1. Roberto Dias - 22 de abril de 2017

    Olá..
    É possível estabelecer tempos para acionamento do motor? Por exemplo:
    No tempo 10s motor gira 30º na velocidade de 2s
    No tempo 15s motor gira 180º na velocidade de 5s
    etc..
    Agradeço a ajuda!

  2. gabriel - 13 de abril de 2017

    estou fazendo um projeto de tcc e preciso de um programa, meu projeto é uma esteira seletora com eletro imã, que separa peças de metal e plastico , se for metal ele vai indetificar pelo sensor indutivo e tirar pra algum recipiente, se for plastico ira passar reto , alguem pode ajuda?

  3. marcio - 16 de março de 2017

    Olá galera!
    Estou precisando muito da ajuda de vocês para esse projeto, realizei todas as recomendações postadas aqui, mas nenhuma obteve sucesso.
    Meu problema é o seguinte, meu motor de passo esta travado, ele vibra mas não gira. O que deve estar acontecendo. Se alguém poder me ajudar ficarei muito agradecido.
    Meu email: marcio18812@outlook.com

  4. Yasmin Bárbara - 12 de março de 2017

    Boa noite, gostaria de tirar uma dúvida: Eu posso alterar os pinos? No caso, utilizar do 0 ao 3? Ou essa pinagem é especifica da biblioteca?
    Abraços.

  5. DINIS - 5 de fevereiro de 2017

    como faço para mudar os ângulos
    preciso de ajuda
    obigado

  6. Paulo Lopes - 15 de dezembro de 2016

    Boa tarde
    É possivel alguém ajudar?

    Recebi ontem da china um jeep telecomandado, mas quando carrego no comando para baixo o carro vai para a frente e vice versa, apesar de já ter reclamado e ir receber o reembolso, como posso resolver esta questão?

    Obg

  7. Kethllen Crislânia - 12 de dezembro de 2016

    Bom dia, amigo. Gostaria de saber como você desenhou o motor e o driver, pois estou precisando urgentemente para o meu TCC e não achei no Fritzing. Obrigada.

  8. Erick - 27 de novembro de 2016

    Boa tarde.
    Gostaria de trabalhar em um projeto que tenha um webservice sem utilizar cabo de rede e que gire um motor de passo.

    Pesquisei aqui e pensei em trabalhar parecido com esse projeto do post porem com essa placa ( http://www.filipeflop.com/pd-3cc1a3-placa-wemos-d1-r2-wifi-esp8266.html?ct=&p=1&s=1 )

    O que acha?

  9. robson - 3 de novembro de 2016

    olá, preciso fechar a malha desse projeto, tem como?

  10. matheus - 26 de setembro de 2016

    Boa tarde, gostaria de saber se necessita usar mesmo 3 portas PWM? ou foi escolhidas aleatoriamente e posso usar portas normais?

    obrigado desde já!

  11. Weslley - 10 de agosto de 2016

    Olá poderia me dizer se posso ligar o mesmo motor em outras portas. Preciso colocar um display e não estou conseguindo. Quando coloco o motor em outros pinos ele não faz dois sentidos. Poderia me ajudar?

  12. Gustavo Lourenço - 7 de junho de 2016

    Boa noite,

    Gostaria de saber se seria possível fazer com que esse driver aguentasse a 24V apenas trocando o CI. Preciso conectá-lo a um motor que trabalha com essa tensão e gostaria de aproveitar o driver.

    Obrigado.

  13. Adalberto - 7 de abril de 2016

    Boa Noite a Todos!!

    tenho esse motor juntamente com o Drive e estou usando o Raspberry Pi 2 , não estou conseguindo fazer a rotação em 120 graus alguem pode me ajudar por favor ! Motor esta ligado Gpio no Raspberry

    Obrigado

    • Bruno Dias - 31 de maio de 2016

      Estou com o mesmo problema, acho que o motor que é muito ruim mesmo, o meu também não gira 120 graus, tenho que ajudar com a mão. pode ser a alimentação também estou usando os 5v do arduino, pode ser que com 12 melhore. nao fiz o teste.

  14. lucas - 28 de fevereiro de 2016

    ola, este tutorial me ajudou bastante.
    quero saber se é possivel colocar um dispay lcd 16×2, para mostrar o avanço do motor

  15. Everton JS - 4 de fevereiro de 2016

    Olá pessoal, sei que a postagem é meio antiga, mas vim parar aqui por que estou verificando a viabilidade de uma ideia com o Arduíno….

    Poderiam me dizer quantos motores de passo um único arduíno conseguiria comandar? Somente um será acionado a cada vez, mas seria possível por exemplo 10 motores?

    Obrigado!

    Everton

    • FILIPEFLOP - 11 de fevereiro de 2016

      Bom dia Everton,

      Não fizemos testes com tantos motores de passo, mas creio que você possa fazer isso com a biblioteca Stepper ou Customstepper do Arduino. Recomendo apenas utilizar alimentação externa para os motores.

      Abraço!

      Adilson – Equipe FILIPEFLOP

    • Heber - 16 de outubro de 2016

      Everton, sua duvida ja deve ter sido esclarecida, mas vou deixar aqui para que outros possam encontrar
      acredito que daria sim , sem utilizar 40 pinos para dez motores. Estou incluindo esta opção agora em meu TCC de mecatrônica.
      o que estou fazendo é ligar 2 motores em 4 portas do PIC, destas portas saem 2 fios de cada, um para cada ULN (vc pode escolher entre bifurcar a saida da porta lógica ou do ULN) para encurtar os cabos utilizei dois modulos ULN e com dois outros pinos do pic e transistores, escolho qual modulo será ligado e uso as mesmas 4 portas para os dois, só que apenas um recebe o sinal porque o outro está desligado.
      caso faça com um modulo apenas, é só usar os dois transistores para lig/desl os fios COM de cada motor.

  16. cristiano - 20 de janeiro de 2016

    Bom dia, gostava que me pudessem ajudar nas ligações de um motor dc ligado ao arduino com um servo motor, isto porque tou tentando fazer um carro telecomandado atraves de arduino e android.
    É possivel ajudarem com as ligações??
    Obrigado !!!
    Abraço

    • João Wiciuk - 12 de fevereiro de 2016

      Cristiano, não é recomendável ligar um motor DC diretamente ao Arduino, pois este geralmente não pode fornecer a potência necessária nesses casos, podendo vir até mesmo a queimar. Pesquise sobre a Ponte H, a forma correta de controlar motores DC utilizando Arduino.

  17. Toledo - 19 de dezembro de 2015

    Opa, mto boa essa página! Estou com uma dívida: é normal o motor esquentar tanto a ponto de não dar para tocar nele? Fiz a ligação como mostra figura e copiei o código sem fazer nenhuma alteração e mesmo assim ele ficar extremamente quente após algum tempo.
    Obrigado

    • Joseph - 28 de dezembro de 2015

      Toledo, comprei o mesmo motor de passo e não conseguia funcionar.

      Em comentário mais embaixo cita que a ligação está errada no desenho e realmente está (os pinos 9 e 10 estão trocados), a ligação que funcionou foi:

      IN1 ao pino 8 do Arduino
      IN2 ao pino 9 do Arduino
      IN3 ao pino 10 do Arduino
      IN4 ao pino 11 do Arduino

      Não houve problema com o código. Acertando a ligação, funcionou sem problema.

      • Toledo - 28 de dezembro de 2015

        Opa, vlw, Joseph. Já tinha lido seu comentário mais abaixo afim de ver se tinha mais alguém com esse problema e tentei oq vc flou, tbm achei que o código estava estranho mas enfim…Tentei dos dois jeito e esquentou mto em ambos, por isso perguntei.

        Msm assim, obrigado pela resposta!

  18. sun hin - 3 de dezembro de 2015

    Preciso de um help seu em programação.
    To a fazer o meu Tcc e apresentação dia 11 quinta que vem to apanhar uma porrada na programação fera
    To a usar o Arduíno uno
    O meu Tcc é o mapeamento através de web CAM (por exemplo seguir o movimento de objeto )
    Eu estou usar:
    \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    Um servo motor no plano Y (tem que girar 0 a 180 também e depois volta pro inicio)
    linguagem do servo “Aonde fica a Web Cam”
    ‪#‎include‬
    Servo myservo; // create servo object to control a servo
    // twelve servo objects can be created on most boards
    int pos = 0; // variable to store the servo position
    void setup()
    {
    // pinMode(6,OUTPUT);
    // digitalWrite(6,1);
    myservo.attach(9); // attaches the servo on pin 9 to the servo object
    }
    void loop()
    {
    for(pos = 0; pos =0; pos-=1) // goes from 180 degrees to 0 degrees
    {
    myservo.write(pos); // tell servo to go to position in variable ‘pos’
    delay(10); // waits 15ms for the servo to reach the position
    }
    }
    \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    Um motor de passo no plano X ( tem que girar 0 a 180 e volta para mesma posição )
    minha programação do motor de passo
    /* Exemplo de Ligacao
    * ——————–
    * Arduino – Modulo
    * ——————–
    GND GND
    VCC VCC
    PINO 08 08
    PINO 09 09
    PINO 10 10
    PINO 11 11
    */
    int motorPin1 = 7; // arduino pino 7 segue 8 do ULN2003A e sai bobina 4 azul
    int motorPin2 = 8; //arduino pino 8 segue 9 do ULN2003A e sai bobina 3 Amarelo
    int motorPin3 = 12; //arduino pino 12 segue 10 do ULN2003A e sai bobina 2 Verde
    int motorPin4 = 13; //arduino pino 13 segue 11 do ULN2003A e sai bobina 1 Vermelho
    int delayTime =15;//tempo de giro
    int Y =180 ;
    //int X =0;
    int X =180;
    //int Y =180 ;
    //int Y =0 ;
    String inputString = “”; // a string to hold incoming data
    boolean stringComplete = false; // whether the string is complete
    void setup()
    {
    Serial.begin(9600);
    pinMode(motorPin1, OUTPUT);
    pinMode(motorPin2, OUTPUT);
    pinMode(motorPin3, OUTPUT);
    pinMode(motorPin4, OUTPUT);
    // reserve 200 bytes for the inputString:
    inputString.reserve(200);
    //trocar o inicio de 0 a 180 e de 180 a 0
    giraesquerda(180);
    giradireita(180);
    // giraesquerda(0);
    // giradireita(0);
    }
    void sobe(int graus)
    {
    }
    void desce(int graus)
    {

    }
    void giraesquerda(int quatropassos) {
    for (int i = 0 ; i <= quatropassos; i ++) {//apenas alterou se o incremento de i=+1 para i++
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, HIGH);

    delay(delayTime);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, HIGH);
    delay(delayTime);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin4, LOW);
    delay(delayTime);
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin4, LOW);
    delay(delayTime);
    }
    }
    void giradireita(int quatropassos)
    {
    for (int i = 0 ; i <= quatropassos; i += 1) {
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin4, LOW);
    delay(delayTime);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin4, LOW);
    delay(delayTime);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, HIGH);
    delay(delayTime);
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, HIGH);
    delay(delayTime);
    }
    }
    void loop()
    {
    serialEvent(); //call the function
    if (stringComplete) {
    Serial.println(inputString);
    // clear the string:
    inputString = "";
    stringComplete = false;
    }
    //giros do motor de passos
    //ver este laço para o giro
    if (X180)
    {
    giradireita(1);
    }
    if (Y180)
    {
    desce(1);
    }
    //termina aqui os giros
    //Duplicidade do laço de repeticao inicializacao por =
    if (X>180)
    {
    giradireita(1);
    }
    if (Y320)
    {
    desce(1);
    }
    //termina aqui os giros

    }
    void serialEvent() {
    while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    X=inChar;
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar == ‘\n’) {
    stringComplete = true;
    }
    }
    }
    \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    vou t mandar o link que to a seguir pra você ter mais ou menos uma ideia do que eu estou a falar
    Acompanha o quarto numero vídeo para ter uma ideia
    http://aleksandarkrstikj.com/
    Ai esta mano
    A ideia é o seguinte como vou interligar na logica os três componentes a Web,servo motor e o motor de passo.

    por favor

  19. Marcelo Sobrinho - 29 de novembro de 2015

    Cara. Gostaria de saber quanto a motor de passo, eu sei que é um dos melhores motores para precisão, mas em relação a velocidade. Eles são rápidos é ideia para um carinho… ou recomendam outro tipo de motor(levando em consideração a precisão ).

  20. Jéssica - 28 de novembro de 2015

    To quebrando a cabeça aqui e ainda não consegui entender porque você usou o valor stepsPerRevolution = 500.
    Tenho o mesmo motor que vc usou no tutorial. Pelo que eu entendi no datasheet e nas informações que pesquisei, esse motor tem 64 passos por revolução. Então de onde veio o valor 500? =/

    • Rafael - 29 de dezembro de 2015

      Esse motor tem um “Gear ratio” de 64 , e um “Stride Angle 5.625°”
      steps = Numero de steps em uma Revolucao * Gear ratio .
      steps= (360°/5.625°)*64″Gear ratio” = 64 * 64 =4096

      tambem nao sei de onde veio o 500 :)

  21. john paulo - 17 de novembro de 2015

    ola boa tarde!
    eu comprei um motor desse de passo e ele não esta funcionando o que posso fazer? o codigo deu certo mais é o motor mesmo que não esta girando! espero respostas obrigado!

  22. Lukas Ribeiro - 16 de novembro de 2015

    Olá pessoal, gostaria de saber se pode colocar um comando para o motor parar de rodar msm no meio da rotação e dps mandar ele continuar, e se tb é possível fazer com que o motor rode apenas uma vez assim que atingir um ponto que eu quero? Obrigado

  23. Filipe Soares da Silva - 7 de novembro de 2015

    Gostaria de saber qual capacitor ceramico vai no shied do ULN 2003 esse de 5V

  24. kelleni Vaikuntha - 6 de novembro de 2015

    Olá, seus tutoriais me ajudaram a fazer um projeto na faculdade, muito obrigada.
    Gostaria de saber qual software vc usa para fazer os esquemas do arduino.

  25. João - 21 de outubro de 2015

    Olá… Gostaria de saber o esquema de alimentação para esse driver em 12v.

  26. Nicolas - 18 de outubro de 2015

    Será que seria possível controlar o ângulo de rotação com um teclado numérico?

  27. Olavo - 7 de outubro de 2015

    Olá Filipe!
    Cara teu mateiral é muito bacana, parabéns.
    O problema nesse post sáo as ligações, o bug é no esquema , as ligações de 1N2 e 1N3 estão invertidas!
    1N2 vai na porta 9 e o 1N3 na 10. funciona direitinho com esse código.

    Abraçao!

    • FILIPEFLOP - 7 de outubro de 2015

      Bom dia Olavo,

      Obrigado. O programa está correto. Foi o mesmo programa que utilizamos para testar e gravar o vídeo.

      Abraço!

      Adilson – Equipe FILIPEFLOP

      • Olavo - 7 de outubro de 2015

        Bom dia Adilson,

        Sim, notei isso, no vídeo e na foto os fios estão ligados corretos, Mas a imagem que voces postaram do esquema elétrico estão com estes fios invertidos e montando como está este esquema o motor trava, recebe comandos inversos e esquenta demais. pf, de uma verificada.

        Abração,

        Olavo

      • Joseph - 28 de dezembro de 2015

        Olá, o código está correto, mas a ligação do esquema realmente está errado.

        Os pinos 9 e 10 estão trocados, a ligação que funcionou foi citada pelo Olavo.

        IN1 ao pino 8 do Arduino
        IN2 ao pino 9 do Arduino
        IN3 ao pino 10 do Arduino
        IN4 ao pino 11 do Arduino

        Não houve problema com o código. Acertando a ligação, funcionou sem problema.

  28. Jerson Joseph - 20 de setembro de 2015

    Pessoa queria uma ajuda tenho que fazer um Motor de passo unipoar – configuração Half Step – sentido horário, tudo isso programando pelo Arduino 1.0.6 e simulando no Simulide , por favor queria toda a programação.

  29. Karla Fernandes - 1 de setembro de 2015

    Bom dia,

    A sequência correta é : Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

    A sequência de vocês não estava permitindo o motor girar no sentido anti-horário. Trocando a sequência irá corrigir o problema. =)

    Abraço!

  30. Luana - 28 de agosto de 2015

    Olá,
    Como faço para adicionar nessa Programação um potenciometro para apenas ligar e desligar o motor.
    Obrigada desde já.

  31. Jhonatan xavier - 28 de agosto de 2015

    amigo, eu gostaria de saber se posso ligar 3 motores desses no arduino, e se eu posso montar uma mine CNC só pra testes com esses motores e um arduino UNO.

    • FILIPEFLOP - 28 de agosto de 2015

      Bom dia Jhonatan,

      Teoricamente sim, mas talvez fique um pouco “apertado” no Arduino Uno, principalmente se você precisar colocar mais algum sensor, botôes, etc.

      Abraço

      Adilson – Equipe FILIPEFLOP

  32. Gustavo - 6 de agosto de 2015

    meu kit chegou a menos de 24 horas, peguei o motor de passo para testar, com essa programação e fazendo tudo exatamente igual, mas o motor só executa a ultima volta completa, o resto ele só treme e não reage, quero uma ajuda nisso, defeito ou não? entrem em contato por favor! gustavosoares3@hotmail.com muito obrigado, kit excelente

    • Raphael Peruzzolo - 14 de agosto de 2015

      Tive o mesmo problema no início e foi resolvido diminuindo a velocidade do stepper. Com o stepsPerRevolution = 500, acima de 40 o motor começa a dar algumas “travadas” e a partir de 45 ele já não gira. stepsPerRevolution e stepSpeed são inversamente proporcionais, mas ainda não entendi a exata relação entre eles. Espero ter ajudado. Abraço

  33. Carlos - 16 de julho de 2015

    Boa tarde. Gostaria de saber se é possível, como em um servo motor, criar um ponto no motor de passo para que ele se inicialize sempre em uma determinada posição sem a necessidade de sensor de posição.
    Agradeço desde já.

    • FILIPEFLOP - 16 de julho de 2015

      Boa tarde Carlos,

      O motor de passo funciona de forma diferente do servo. Quando você liga o motor de passo, ele assume a posição atual como “zero”. Você até consegue movimentar o motor de passo determinando o angulo, mas para setar a posição inicial seria indicado um sensor de posição.

      Abraço.

      Adilson – equipe FILIPEFLOP

    • Bárbara - 1 de outubro de 2015

      Olá Carlos…. Estou com o mesmo problema.
      Conseguiste resolver?

  34. leonardo - 25 de junho de 2015

    Colega, estou fazendo um projetinho com motor de passo e quando ligo o sistema preciso iniciar ele sempre na mesma posição (mesmo ângulo), tu sabe como faço isso por software? uso a mesma eletronica que vc usou.

  35. Chiclete - 23 de junho de 2015

    Ola,
    sou iniciante no mundo do arduino, comecei a estudar linguagem C e C ++, comprei o UNO e vários sensores, tenho interesse em fazer um alimentador automático para os cachorros da minha esposa, como recomendado devemos alimentá-los duas vezes ao dia, a tarde e a noite, gostaria que o motor girasse 10º por vez e em determinado horário. Desde já agradeço.

  36. Renato - 28 de abril de 2015

    Preciso de ajuda
    Gostaria de comandar o MOTOR DE PASSO 5V com RFid RC522, que o codigo de acesso do Rfid gire no sentido horario e delay 3000 gire sentido anti horario ,tem como fazer isso? esse meu codigo esta errado?

    #include
    #include
    #include
    //Define os parametros de ligacao do motor de passo
    CustomStepper stepper(4,5,6,7);

    #define SS_PIN 10
    #define RST_PIN 9
    // Definicoes pino modulo RC522
    MFRC522 mfrc522(SS_PIN, RST_PIN);
    // Leds indicadores acesso liberado ou negado
    int led_liberado = 2;
    int led_negado = 3;

    char st[20];

    void setup()
    {
    pinMode(led_liberado, OUTPUT);
    pinMode(led_negado, OUTPUT);
    Serial.begin(9600); // Inicia a serial
    SPI.begin(); // Inicia SPI bus
    mfrc522.PCD_Init(); // Inicia MFRC522
    Serial.println(“Aproxime o seu cartao do leitor…”);
    Serial.println();

    //Define a velocidade do motor
    stepper.setRPM(12);
    //Define o numero de passos por rotacao
    stepper.setSPR(1800);
    }

    void loop()
    {
    // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent())
    {
    return;
    }
    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial())
    {
    return;
    }
    //Mostra UID na serial
    Serial.print(“UID da tag :”);
    String conteudo= “”;
    byte letra;
    for (byte i = 0; i < mfrc522.uid.size; i++)
    {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
    conteudo.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
    conteudo.concat(String(mfrc522.uid.uidByte[i], HEX));
    }
    Serial.println();
    Serial.print("Mensagem : ");
    conteudo.toUpperCase();

    if (conteudo.substring(1) == "41 C1 D9 0E")
    {
    Serial.println("Cartao1 – Acesso liberado !");
    Serial.println();
    delay(2000);
    //Define o sentido de rotacao (CW = Horario)
    stepper.setDirection(CW);
    stepper.rotate(90);
    delay(2000);
    stepper.setDirection(CCW);
    stepper.rotate(90);
    digitalWrite(led_liberado, LOW);
    }
    if (conteudo.substring(1) == "87 4B DC 8A")
    {
    Serial.println("Cartao2 – Acesso negado !!!");
    Serial.println();
    // Pisca o led vermelho
    for (int i= 1; i<5 ; i++)
    {
    digitalWrite(led_negado, HIGH);
    delay(200);
    digitalWrite(led_negado, LOW);
    delay(200);
    }
    }
    //Comando obrigatorio para funcionamento da biblioteca
    stepper.run();
    }

    • Bruno Jonko Duarte - 29 de abril de 2015

      Ta ai renato, agora para de vadiagem e vamos continuar a maquete.

      #include
      #include
      #include

      #define SS_PINO 53
      #define RST_PINO 5
      #define intervalo 1000

      /*Numero de passo por volta*/
      #define rotacaoCompleta 64

      long int ultimaLeitura = 0;
      /*Tempo em mili segundos*/

      /*Cria um objeto cartão do tipo MFRC522*/
      MFRC522 cartao(SS_PINO, RST_PINO);

      /*Valor do chaveiro*/
      long int RFID = 0;

      /*Valor que deve estar no RFID*/
      #define codigo 6541193

      /* Faz a inicialização da Biblioteca*/
      Stepper motor(rotacaoCompleta, 8,9,10,11);

      /*Função que liga o motor*/
      void ativaMotor(int codigoRFID, int CodigoSetado)
      {
      if(codigoRFID == CodigoSetado)
      {
      /*sentido anti-horario*/
      for (int i = 0; i < 64; i++)
      {
      motor.step(rotacaoCompleta);
      }
      /*sentido horario*/
      for (int i = 0; i = intervalo)
      {
      if (cartao.PICC_IsNewCardPresent())
      {
      if ( cartao.PICC_ReadCardSerial())
      {
      String conteudo = “”;
      /*Faz a leitura serial do cartão e grava dentro de conteudo*/
      for (byte i = 0; i < cartao.uid.size; i++)
      {
      conteudo.concat(String(cartao.uid.uidByte[i]));
      conteudo.concat(String(cartao.uid.uidByte[i], HEX));
      }
      /*Convertendo do tipo String para o tipo int*/
      RFID = conteudo.toInt();
      ativaMotor(RFID, codigo);
      }
      }
      ultimaLeitura = millis();
      }
      }

    • Darlles Nunes - 10 de maio de 2015

      Renato estou precisando de um código do mesmo jeito do que você quer montar, você ja conseguiu?
      se tiver conseguido tem como me passa o código…
      att Darlles Nunes

  37. phillip - 13 de abril de 2015

    como fazer a programação do arduino para ligar e desligar um motor de 12vc (motor bamba de agua ).

    • FILIPEFLOP - 22 de maio de 2015

      Boa noite Phillip,

      Existem várias possibilidades. Você pode simplesmente ligar os botões no Arduino, e controlar as saídas, como também adicionar um módulo DS1307 (relógio), e ligar e desligar a bomba em horários específicos.

      Aqui no blog temos tutoriais para utilização desses componentes.

      Abraço.

      Adilson – Equipe FILIPEFLOP

  38. Bruno Ananias - 7 de abril de 2015

    Olá estou fazendo um alimentador automático para cães e estou montando o projeto com um motor de passo + um RTC. O programa está girando o motor na hora programada, o problema é que ao concluir a volta 2 das luzes do stepper continuam ligadas. Daí queria saber se é possível desligar o stepper após as voltas programadas.

    Segue o código para entendimento.

    //Programa Alimentador de Cães Automático
    //Autor: Bruno Ananias

    #include
    #include
    #include “RTClib.h”

    const int stepsPerRevolution = 64;
    Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

    int hora;
    int minuto;
    int segundo;

    RTC_Millis rtc;

    void setup () {

    myStepper.setSpeed(200);

    Serial.begin(57600);
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.begin(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));

    }

    void loop () {
    DateTime now = rtc.now();

    hora = now.hour();
    minuto = now.minute();
    segundo = now.second();

    if(((hora == 07) && (minuto == 00) && (segundo == 00)) || ((hora == 12) && (minuto == 00) && (segundo == 00))){
    Serial.println(“Girando Motor!”);
    for (int i = 0; i < 32; i++){
    myStepper.step(64);
    }

    }

    Serial.print(now.day(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.year(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();

    Serial.println();
    delay(1000);
    }

  39. Lucas - 4 de abril de 2015

    Não estou conseguindo rotacionar anti-horário.
    O programa aparenta não ler o sinal negativo. Já tentei multiplicar por -1, criar variável diferente, e nada. Será a verão da IDE? É a mais atual perante a data de hoje.
    O meu rotaciona com ‘const int passosPorVolta = 64;’.

  40. adalton pereira pedrosa - 15 de março de 2015

    boa tarde , Felipe. amigo preciso de sua ajuda. estou com uma placa arduino mega 2560 + ramps 1.4 + lcd. já testei a placa do arduino do arduino sem a ramps e deu ok. já testei a ramps sem nada e deu ok. colocquei os drives e o motor de passo e o lcd e chamei no arduino o codigo que voce postou. não rodou. porque me diz.
    os meus motores são de 06 fios, já indiquei e separei o fio comun, no senai o professor savio disse que nos fios comuns deveria entrar energia + (12 volts coloquei) e nada me diga o que pode ser.

  41. Luccas - 9 de março de 2015

    Olá Filipeflop, eu tenho um motor de passo 28BYJ-48, queria saber como eu poderia definir a velocidade de rotação dele para 1 RPM, preciso que 360º sejam executados em exatamente 60s (ou bem proximo disso) . To fazendo uma base pra fotos de longa exposição do céu e quero controlar com meu arduino :DD

    Caso nao de pra fazer com esse driver dele, tenho um motor shield L293D :D

  42. Thaina - 3 de março de 2015

    Ola bom dia,

    Preciso inverter o sentido de rotação do meu motor e não faço a mínima ideia de como fazer. Estou fazendo um projeto que usa um projeto de outra pessoa que já esta pronto, e que faz o motor girar em um sentido, e assim uma mesa é movida com o movimento do motor.

    Porém, preciso inverter o sentido de rotação do motor para que a mesa volte a posição original.
    Já tentei mexer no programa do arduino, e nao funcionou. Gostaria de saber se tem como me ajudar, pois preciso andar com meu projeto e não estou conseguindo resolver esse problema “básico”.

    Thainá

  43. JULIANO NOVAES - 9 de fevereiro de 2015

    Olá Pessoal! Muito Legal Esse Site e Muito Interessante o Conteúdo e Interação Com Os Usuários.

    Sou Novo No Assunto e Não Conheço Muito Sobre Arduíno. Sou Fotógrafo e Gostaria De Criar Um Prato Giratório Comandado Eletricamente Para Fotografar Objetos 360 Graus, Ou Seja, Girar Um Prato Com o Objeto e Realizar Disparos Da Câmera a Cada 10 Gruas. É Possível Criar Um Prato Giratório Com Essas Caracteristicas Utilizando Um Arduíno Para Controlar o Motor?

  44. Fabio Sanchez - 10 de dezembro de 2014

    Muito legal seu Post… Contudo tenho uma dúvida:
    É possível ligar vários (10 a 20) motores de passo em uma única placa (fazendo o mesmo movimento sempre para um lado) onde estes motores dariam uma ou duas voltas a cada 3 horas?
    Sou leigo no assunto e estou me interessando bastante pelo assunto.
    Obrigado e parabéns pelo Blog.

    • FILIPEFLOP - 5 de janeiro de 2015

      Oi Fábio,

      Nunca vi nenhuma ligação desse tipo, mas talvez para o seu caso seja mais indicado trabalhar com servo motores, utilizando uma porta do Arduino para cada motor e alimentando cada um com uma fonte externa. É só uma hipótese, já que eu não tenho detalhes do seu projeto. :-)

      Abraço !

      Adilson – Equipe FILIPEFLOP

  45. joao - 12 de novembro de 2014

    Olá,
    Tenho uma duvida… Esse programa consegue controlar o motor de passo com movimentos discretos ( pequenos ângulo, ex: 1º, 2º) ?
    se sim, isso é possível por causa do conjunto código fonte + drive? ou somente o código fonte?

  46. Tiago Fernandes - 6 de novembro de 2014

    Boa Dia
    estou a desenvolver um projeto em que utilizo um motor de passo, mas nao consigo por o motor a dar uma volta completa.
    podem me ajudar?

    #include

    const int stepsPerRevolution = 360; // define os passos por volta

    // Definindo os pinos de comunicação
    // (8 e 9 de um lado, 10 e 11 do outro)
    Stepper myStepper(stepsPerRevolution, 8,9,10,11);

    void setup() {
    //definindo velocidade (80 RPM):
    myStepper.setSpeed(80);
    // Inicializa a serial port
    Serial.begin(9600);
    }
    //inicia o loop de repetição girando vamos definir para girar em sentido horário e anti horário
    void loop() {
    // rotação em sentido horario clockwise
    Serial.println(“clockwise”);
    myStepper.step(stepsPerRevolution);
    delay(150);

    // anti horário counterclockwise
    Serial.println(“counterclockwise”);
    myStepper.step(-stepsPerRevolution);
    delay(150);

    }

    • FILIPEFLOP - 20 de novembro de 2014

      Bom dia Tiago,

      Veja se o valor dessa linha corresponde ao número de passos do motor que você possui :

      const int stepsPerRevolution = 360; // define os passos por volta

      Grato.

      Adilson – Equipe FILIPEFLOP

  47. Guilherme Carvalho. - 24 de outubro de 2014

    Amigo do filipeflop. Bem estou começando a utilizar o Arduíno, e não tenho muita pratica, estou desenvolvendo o projeto de uma cancela com motor de passo, com base em um código encontrado em outro site, eu montei uma logica, com dois botões, uma gira 90° e o outro volta 90°, mas não estou conseguindo intertravar os dois botões, para quando um for acionado, o outro só acione quando o motor terminar o ciclo de 90°. Se poder me ajudar agradeço desde já. Abaixo segue o código.
    #include
    int pinobotao_ah = 3;
    int pinobotao_h = 2;
    int passos = 511;
    int leitura = 0;
    int leitura2 = 0;
    const int stepsPerRevolution = 500;
    Stepper myStepper(stepsPerRevolution, 8,9,10,11);
    void setup()
    {
    pinMode(pinobotao_h, INPUT);
    pinMode(pinobotao_ah, INPUT);
    myStepper.setSpeed(60);
    }
    void loop()
    {
    leitura = digitalRead(pinobotao_h);
    if (leitura != 0)
    {
    myStepper.step(-passos);
    }
    leitura2 = digitalRead(pinobotao_ah);
    if(leitura2 != 0)
    {
    myStepper.step(passos);
    }
    }

    • FILIPEFLOP - 24 de outubro de 2014

      Boa noite Guilherme,

      Tente acrescentar mais alguma condição no IF para que o segundo botão seja ignorado.

      Abraço.

      Adilson – Equipe FILIPEFLOP

      • Guilherme Carvalho. - 25 de outubro de 2014

        Bom dia Adilson.
        Vou te incomodar outra vez, estou tentando fazer com que assim que o botão seja acionado o motor só gire 90°, é pare independente se o botão continue pressionado, mas não estou conseguindo o motor fica girando direto. O que eu posso fazer? Muito obrigado, pela ajuda.

        • FILIPEFLOP - 3 de novembro de 2014

          Boa tarde Guilherme,

          Crie um “loop” que não faz nada (sem comandos) enquanto o botão estiver sendo pressionado, assim o motor vai continuar se movimentando até os 90 graus que você precisa.

          Abraço.

          Adilson – Equipe FILIPEFLOP

        • Tales C. Dantas - 9 de março de 2015

          Crie um flag e sete ele apenas quando o botão for acionado, faça uma lógica que toda vez que este flag mudar de valor seu motor se mova 90º…

  48. Diego - 22 de outubro de 2014

    Boa Noite,
    Preciso conversar com você sobre uma programação bem grande com 7 motores de passo, utilizando um
    arduino ATMEGA2560 que comprei de vocês.
    Poderia me auxiliar com a programação?
    Você tem email para conversarmos e combinar valores?
    Obrigado.

  49. Lili - 22 de outubro de 2014

    Boa tarde a todos,
    Gostaria de saber se é possível controlar a rotação por ângulo com esse programa, ou seja, em vez dele gira por 0.5s ele gira por 30º, por exemplo.

    Desde já agradeço

    • FILIPEFLOP - 24 de outubro de 2014

      Boa noite Lili,

      Tente a biblioteca Customstepper. Ela tem a função de rotacionar apenas por determinados angulos.

      Abraço.

      Adilson – Equipe FILIPEFLOP

    • Tales C. Dantas - 9 de março de 2015

      A quantidade de passos que vc setou lá no código equivale a quantidade de passos necessários para uma volta completa do motor, não sei se é gambiarra ou não, mas divida este número por 360 e vc verá quantos passos equivale a 1º

  50. Jorge - 19 de outubro de 2014

    Ola
    Recentemente comprei 3 motor 28BYJ-48 com o ULN2003 para um projeto, mas ele não roda anti-horário a não se se eu mudar a saída dos pinos do motor
    Ex:
    Stepper myStepper(passosPorVolta, 8, 9, 10, 11);
    código como esta o tutorial

    No meu caso teria que ser assim
    Stepper myStepper(passosPorVolta, 8, 9, 10, 11); //Horário

    Stepper myStepper(passosPorVolta, 8, 11, 10, 9); // Anti-Horario
    E os passo não volta ao ponto de origem
    Poderia me ajudar ?
    Grato

  51. FilipeEngComp - 15 de outubro de 2014

    Bom Dia, estou com um grande problema, preciso ligar o motor de passo, porém não no arduino. Funciona do mesmo jeito ? Montamos um circuito quase igual só que com o CI ULN2803, também temos o 2003, o que fazer ? rs tem foto do circuito para nos ajudar? Precisamos disso pra ontem… pois temos uma apresentação quinta, e sem o motor funcionar, não tem projeto :/
    Obrigado

  52. Filipe - 15 de outubro de 2014

    Bom Dia, estou com um grande problema, preciso ligar o motor de passo, porém não no arduino. Funciona do mesmo jeito ? Montamos um circuito quase igual só que com o CI ULN2803, também temos o 2003, o que fazer ? rs tem foto do circuito para nos ajudar? Precisamos disso pra ontem… pois temos uma apresentação quinta, e sem o motor funcionar, não tem projeto :/
    Obrigado

  53. Fábio - 31 de agosto de 2014

    Caro amigos que possam me ajudar, estou querendo fazer um projeto simples, tenho 10 leds em sequencia e gostaria de acender um led atraves de um botao por bluetooth e em seguida pressionar novamente o botão e passar para outro led, lembrando que tem que apagando o primeiro e acendendo o próximo.

    • Fábio Ramos - 27 de setembro de 2014

      Xará, me desculpe pelo duro golpe que irei lhe aplicar com as próximas palavras: já experimentou raciocinar?

      É tão ofensivo para quem lê quando alguém pede para dizer como fazer tudo sem precisar raciocinar, quanto te fazer essa pergunta assim, dessa maneira direta.

      A maior parte da diversão da vida, é aprender.

  54. matheus - 22 de agosto de 2014

    Boa tarde, gostaria de saber se voce pode me ajudar no meu tcc com a parte do circuito eletrico.
    desde ja agradeço

    • FILIPEFLOP - 23 de agosto de 2014

      Boa tarde Matheus,

      Podemos ajudar você com problemas pontuais, como dúvida em alguma parte do código que apresentamos no blog, ou na ligação dos componentes.

      Abraço.

      Adilson – Equipe FILIPEFLOP

  55. Matheus - 19 de agosto de 2014

    Gostaria de saber como faço para controlar mais de um motor de passo utilizando botões com o arduino

    • FILIPEFLOP - 19 de agosto de 2014

      Boa noite,

      Você pode utilizar o programa do post, criando comandos para os outros motores. ONde você tem essa linha :

      Stepper myStepper(passosPorVolta, 8, 9, 10, 11);

      você pode criar mais uma para o segundo motor :

      Stepper myStepper2(passosPorVolta, 2, 3, 4, 5);

      E utilizar essa mesma nomenclatura (myStepper2) para os outros comandos :

      myStepper2.setSpeed(60);

      E assim por diante.

      Abraço !

      Adilson – Equipe FILIPEFLOP

  56. Alex Muller - 6 de agosto de 2014

    Bom dia amigos,

    Tenho um projeto mas estou remando por falta de conhecimento, alguém poderia dar uma ajuda?
    Estou fazendo um equipamento para enrolar linha em um carretel, com debanador, o que preciso:
    Curso do motor de passo é de 25cm em loop;
    Parar sempre no mesmo ponto;
    Ligar um motor 220v quando iniciar;
    Ligar dois switches: um para parada de emergencia e o outro para finalizar o processo onde cada um liga uma luz diferente, 220v ou pode ser Led;
    Botão de pulso para iniciar o processo.
    Vi que tem vários projetos, mas ao tentar juntar todos no mesmo sistema eu me perco!
    Vi o projeto dos switches, do motor de passo e da lâmpada, porêm precisa de mais duas portas para controlar os 25cm que eu não sei como ligar!
    Adquiri de vocês a placa Arduino Leonardo e o drive com motor acima (tenho tbm motores de impressoras Hp se necessário), tenho em mãos contator, switches, botão de pulso, resistores, transistores, relé, placa de CI, acredito ter tudo para montar o sistema, só me falta o conhecimento de programação e ligação na placa de CI

  57. George - 29 de maio de 2014

    Olá, gostaria de saber como deve ser o código de programação para que quando eu aperte um botão o arduino inicie a rotação, quando aperto novamente o mesmo botão ele pare, quando aperto novamente o mesmo botão ele inicie a rotação em outro sentido, quando aperto o botão novamente ele pare, quando aperto novamente ele volte para o outro sentido novamente e assim sucessivamente. Sei que posso estar sendo incômodo solicitando esse tipo de coisa, mas eu tentei programar e não consegui então procurei algo parecido na internet mas não encontrei nada. Desde já agradeço.

    • filipeflop - 9 de julho de 2014

      Olá,
      Você pode colocar para ler o botão com o comando “digitalRead” e depois uma sequencia de comandos “if()” de acordo com suas condições e brincar com o comando “myStepper.step()”.
      Abraço!

      • George - 8 de agosto de 2014

        Fiz como você me aconselhou, Filipe, entretanto eu não consigo criar mais condições de valores para serem lidos além de 1 e 0 para o “digitalRead”. E eu preciso que ele entenda que quando eu apertar o botão pela segunda vez o comando “digitalRead” leia 2 e ele inicie a rotação em sentido anti-horário e quando aperte pela terceira vez o comando “digitalRead” leia 2 e ele pare mais uma vez e que depois da terceira, apertando uma quarta vez ele volte ao valor 0 para o número de vezes que o botão foi pressionado, para que ele volte a fazer tudo novamente. Olha o que eu fiz (neste caso quando eu ligo o motor ele já inicia no sentido horário):

        #define pin1 8
        #define pin2 10
        #define pin3 9
        #define pin4 11

        #define delaytime 8

        int Botao = 2;
        int EstadoBotao = 0;
        void setup() {

        pinMode(pin1, OUTPUT);
        pinMode(pin2, OUTPUT);
        pinMode(pin3, OUTPUT);
        pinMode(pin4, OUTPUT);
        pinMode(Botao, INPUT);
        }

        void loop(){
        EstadoBotao = digitalRead(Botao);
        if (EstadoBotao == 0){
        forward();
        }
        if (EstadoBotao == 1){
        step_OFF();

        • FILIPEFLOP - 11 de agosto de 2014

          Boa tarde George,

          Creio que o que você precisa é criar um contador de 1 a 4 (ou 0 a 3, fica à seu critério), para que a cada vez que o botão seja pressionado ele tome uma ação, ficaria mais ou menos assim, usando o comando switch…case :

          EstadoBotao = digitalRead(botao);
          contador = contador+1;
          switch(contador)
          {
          case 1:
          //Move motor para frente
          break;
          case 2:
          //Para o motor
          break;
          case 3:
          //Move motor sentido contrario
          break;
          case 4;
          //para motor
          contador = 0;
          break;
          }

          Abraço

          Adilson – Equipe FILIPEFLOP

          • George - 18 de agosto de 2014

            Filipe, muito obrigado pela sua paciência e sua ajuda, seus conselhos foram fundamentais para o meu projeto, o qual finalmente concluí. No fim das contas a programação ficou da seguinte forma:

            #define pin1 8 //Pinos do Arduinos conectados ao motor.
            #define pin2 10
            #define pin3 9
            #define pin4 11

            #define delaytime 8

            const short int ButtonPin = 2; //Botao conectado ao pino 2.
            int CurrentState; //Armazena o estado atual do botao.
            int LastState = 0; //Armazena o ultimo estado do botao.
            int short count = 0; //Armazena o numero de vezes que o botao foi pressionado.
            void setup()
            {
            //Programa os pinos como saidas.
            pinMode(pin1, OUTPUT);
            pinMode(pin2, OUTPUT);
            pinMode(pin3, OUTPUT);
            pinMode(pin4, OUTPUT);
            Serial.begin(9600); //Inicia a comunicacao com o computador.
            pinMode(ButtonPin,INPUT); //Programa o botao como entrada.
            }
            void loop()
            {
            Serial.println(count); //Informa quantas vezes o botao foi pressionado.
            CurrentState = digitalRead(ButtonPin); //Le o estado do botao.
            if(CurrentState != LastState)
            {
            if(CurrentState == 1) //Se o botao e pressionado
            //Aumenta em 1 a contagem
            {
            count++;
            }
            }
            LastState = digitalRead(ButtonPin);
            if (count >= 4) //Zera a contagem depois de pressionar o botao 4 vezes.
            count = 0;

            if (count == 0)
            forward(); //Motor inicia movimento no sentido horario

            if (count == 1)
            step_OFF(); //Motor para

            if (count == 2)
            backward(); //Motor inicia movimento no sentido anti horario

            if (count == 3)
            step_OFF(); //Motor para
            }

            Em outra aba ficaram os seguintes comandos:

            void Step_A(){
            digitalWrite(pin1, HIGH);//turn on coil 1
            digitalWrite(pin2, LOW);
            digitalWrite(pin3, LOW);
            digitalWrite(pin4, LOW);
            }
            void Step_B(){
            digitalWrite(pin1, LOW);
            digitalWrite(pin2, HIGH);//turn on coil 2
            digitalWrite(pin3, LOW);
            digitalWrite(pin4, LOW);
            }
            void Step_C(){
            digitalWrite(pin1, LOW);
            digitalWrite(pin2, LOW);
            digitalWrite(pin3, HIGH); //turn on coil 3
            digitalWrite(pin4, LOW);
            }
            void Step_D(){
            digitalWrite(pin1, LOW);
            digitalWrite(pin2, LOW);
            digitalWrite(pin3, LOW);
            digitalWrite(pin4, HIGH); //turn on coil 4
            }
            void step_OFF(){
            digitalWrite(pin1, LOW); //power all coils down
            digitalWrite(pin2, LOW);
            digitalWrite(pin3, LOW);
            digitalWrite(pin4, LOW);
            }

            //these functions run the above configurations in forward and reverse order
            //the direction of a stepper motor depends on the order in which the coils are turned on.
            void forward(){//one tooth forward
            Step_A();
            delay(delaytime);
            Step_B();
            delay(delaytime);
            Step_C();
            delay(delaytime);
            Step_D();
            delay(delaytime);
            }

            void backward(){//one tooth backward
            Step_D();
            delay(delaytime);
            Step_C();
            delay(delaytime);
            Step_B();
            delay(delaytime);
            Step_A();
            delay(delaytime);
            }

          • George - 18 de agosto de 2014

            Gostaria de agradecer ao Adílson também, quase me esquecia. Hehe

          • FILIPEFLOP - 19 de agosto de 2014

            Boa noite George,

            :-) Valeu, estamos à disposição.

            Abraços !

            Adilson – Equipe FILIPEFLOP

  58. Marcos Menezes - 14 de maio de 2014

    Boa noite, gostaria de esclarecer algo antes de comprar o motor,. Vou usa um outro microcontrolador com corrente de ate 20mA, é possivel?? Teria alguma tabela relacionando os valores nas entradas do CI com o funcionamento do motor? Pois vou programar em Assembly. Muito obrigado pela ajuda.

  59. Controlando motor de passo 5V 28BYJ-48 com motor shield | Blog FilipeFlop - 16 de dezembro de 2013

    […] no blog, neste post, já falamos sobre como controlar um motor de passo 5v utilizando o driver de controle […]

  60. Reynan - 27 de novembro de 2013

    O motor de passo só funciona se tiver o Drive Uln2003?

  61. FilipeFlop - 18 de novembro de 2013

    Olá Matheus. O post do modo que está funcionou normalmente com as configurações colocadas. Já com esta alteração que sugeriu não cheguei a testar. Confira um post semelhante do blog parceiro nosso e veja se consegues resolver. (http://www.arduinoecia.com.br/2013/11/ligando-motor-de-passo-28byj-48-e.html)
    Fico no aguardo do seu feedback.
    Abraço!

  62. FilipeFlop - 18 de novembro de 2013

    Olá Matheus. O post do modo que está funcionou normalmente com as configurações colocadas. Já com esta alteração que sugeriu não cheguei a testar. Confira um post semelhante do blog parceiro nosso e veja se consegues resolver. (http://www.arduinoecia.com.br/2013/11/ligando-motor-de-passo-28byj-48-e.html)
    Fico no aguardo do seu feedback.
    Abraço!

  63. jose - 4 de novembro de 2013

    kara, tenho fonte de 12volts+ arduino uno+ uln 2003+ cabos…porém não funcionou nada. Liguei tensão positiva (fonte 12volts) no pino 9 do uln 2003 e no pino 8 negativo (fonte12volts) na nas saidas do uln 2003 liguei o motor e nada funcionou….da uma força na ligação do motor e arduino…

  64. roni - 15 de setembro de 2013

    o código funcionou mas eu preciso que esse motor so gire 90º e parre de rodar como eu faço vocês podem me ajudar
    obrigado

  65. roni - 15 de setembro de 2013

    o código funcionou mas eu preciso que esse motor so gire 90º e parre de rodar como eu faço vocês podem me ajudar
    obrigado

  66. lucas - 11 de setembro de 2013

    nao estou conseguindo fazer o motor girar, toda vez que eu ligo o modulo uln2003a na alimentação de 5V ele sofre uma queda brusca,que até o LED indicador da fonte de alimentação fica fraco.gostaria de saber uma solução para isso

  67. lucas - 11 de setembro de 2013

    nao estou conseguindo fazer o motor girar, toda vez que eu ligo o modulo uln2003a na alimentação de 5V ele sofre uma queda brusca,que até o LED indicador da fonte de alimentação fica fraco.gostaria de saber uma solução para isso

  68. marcone barbosa - 3 de setembro de 2013

    ola amigo fucinou bem?gostaria controlar esse motor com dois botoes?para gira o motor a direita e depois a equerda?onde posso encontra esse circuito mas o codigo?se poder me ajudar agradeço?tenho placa do motor.;arduino e atmega?cone_barbosa@hotmail.com

  69. marcone barbosa - 3 de setembro de 2013

    ola amigo fucinou bem?gostaria controlar esse motor com dois botoes?para gira o motor a direita e depois a equerda?onde posso encontra esse circuito mas o codigo?se poder me ajudar agradeço?tenho placa do motor.;arduino e atmega?cone_barbosa@hotmail.com

  70. Henrique - 22 de agosto de 2013

    o que esse programa fara o meu motor fazer?

  71. Henrique - 22 de agosto de 2013

    o que esse programa fara o meu motor fazer?

  72. Marco - 18 de agosto de 2013

    Olá, como vão. Também tive problemas em sentido anti-horário usando o Stepper do Arduino (horário tudo bem). Acho que isto acontece porque ele faz uma energização com as bobinas opostas, que nem sempre impulsiona o motorzinho para frente. A solução, até então que tenho, é fazer o programa controlar full-step (1/2/3/4/1/2/…), half-step (1-2/2-3/3-4/4-1/1-2…) ou até fouth-step (1/1-2/2/2-3/3/3-4/4/1-4/1/1-2…) invertendo a ordem para o anti-horário (aí funciona legalzinho!!!)

    A speed maxima que tenho também é 7. Qualquer valor acima disso, o motor ‘estola'; usando o código direto, é conveniente um delay de 5msec…

    Outra coisa que percebi (e testei) é que usando a biblioteca do arduino (stepper), tenho uma necessidade de 2040 passos por volta (testei com 2039, 2041, 2048… mas é 2040 mesmo!)… Mesmo considerando 1/4 step, é muito mais que os 1/64 de volta da datasheet.

    Isso me leva a crer que no 4-step, temos 360/ (5.625º / 64), que nos dá… 4096 steps por revolução… Estranho, né!? Estou divagando? porque se são 360º de rotação em 1/4-step e estou usando 1/2-step, temos 2048 – valor muito próximo ao que obtive acima. Por um lado acho bom, é extremamente preciso; porém alguns projetos podem ter necessidade de serem revistos.

    Comentários?

    • FilipeFlop - 19 de agosto de 2013

      Obrigado pelo o teu comentário Marco!
      Testamos o código do jeito que está e funcionou, mas ao alterar a velocidade de rotação o movimento anti-horário não ocorreu. Vamos deixar então o seu comentário para fomentar a discussão. Abraço!

  73. Marco - 18 de agosto de 2013

    Olá, como vão. Também tive problemas em sentido anti-horário usando o Stepper do Arduino (horário tudo bem). Acho que isto acontece porque ele faz uma energização com as bobinas opostas, que nem sempre impulsiona o motorzinho para frente. A solução, até então que tenho, é fazer o programa controlar full-step (1/2/3/4/1/2/…), half-step (1-2/2-3/3-4/4-1/1-2…) ou até fouth-step (1/1-2/2/2-3/3/3-4/4/1-4/1/1-2…) invertendo a ordem para o anti-horário (aí funciona legalzinho!!!)

    A speed maxima que tenho também é 7. Qualquer valor acima disso, o motor ‘estola'; usando o código direto, é conveniente um delay de 5msec…

    Outra coisa que percebi (e testei) é que usando a biblioteca do arduino (stepper), tenho uma necessidade de 2040 passos por volta (testei com 2039, 2041, 2048… mas é 2040 mesmo!)… Mesmo considerando 1/4 step, é muito mais que os 1/64 de volta da datasheet.

    Isso me leva a crer que no 4-step, temos 360/ (5.625º / 64), que nos dá… 4096 steps por revolução… Estranho, né!? Estou divagando? porque se são 360º de rotação em 1/4-step e estou usando 1/2-step, temos 2048 – valor muito próximo ao que obtive acima. Por um lado acho bom, é extremamente preciso; porém alguns projetos podem ter necessidade de serem revistos.

    Comentários?

    • FilipeFlop - 19 de agosto de 2013

      Obrigado pelo o teu comentário Marco!
      Testamos o código do jeito que está e funcionou, mas ao alterar a velocidade de rotação o movimento anti-horário não ocorreu. Vamos deixar então o seu comentário para fomentar a discussão. Abraço!

  74. FilipeFlop - 5 de agosto de 2013

    O código foi corrigido Lafaiete. Confira agora.
    Abraço!

  75. FilipeFlop - 5 de agosto de 2013

    Resolvemos o problema inicial que tinha no código. Testamos e está aprovado.
    Abraço!

  76. FilipeFlop - 28 de julho de 2013

    Obrigado pela alternativa aabb. Iremos verificar o problema no código e corrigiremos.
    Abraço!

  77. Elaine Correa Acosta - 13 de julho de 2013

    olá galera tentei rodar este codigo mas deu erro nesta instrução clockwise, como não tenho muita experiencia não soube resolver alguem tem alguma ideia de como resolver??

  78. Elaine Correa Acosta - 13 de julho de 2013

    olá galera tentei rodar este codigo mas deu erro nesta instrução clockwise, como não tenho muita experiencia não soube resolver alguem tem alguma ideia de como resolver??

  79. Eder Renato - 11 de julho de 2013

    Ótimo, foi o que me esclareceu nessa minha empreitada. Obrigado.

  80. Galdir Damasceno (@galdir) - 9 de junho de 2013

    Não funciona. A declaração do stepper tem que ser antes do setup, e essa modificação faz o código compilar, mas o código só esta fazendo rodar em um sentido.

  81. Manoel - 23 de maio de 2013

    olá.

    meu motor não gira no sentido anti-horário. será q está com defeito?

    • FilipeFlop - 26 de maio de 2013

      Olá Manoel. Recomendamos revisar as ligações e seu código. Se puder testar com outro motor seria interessante, assim poderias tirar esta conclusão.
      Abraço e boa sorte!

    • aabb - 13 de junho de 2013

      Manoel, tive o mesmo problema com esse código.

      Segue abaixo que vai funcionar!!

      Motor Connections
      The Arduino should be connected to the ULN2003 driver board as shown below:
      5V+ connect to +5V
      5V- connect to 0V (Ground)
      IN1: to Arduino digital input pin 8
      IN2: to Arduino digital input pin 9
      IN3: to Arduino digital input pin 10
      IN4: to Arduino digital input pin 11

      Driving the Motor
      You should drive the motor by enabling the pins in an 8-phase order as shown to the left (Clockwise movement):
      Drive IN4 only
      Drive IN4 and IN3
      Drive IN3 only
      Drive IN3 and IN2
      etc.
      For anti-clockwise motion, simply follow the sequence in reverse

      Example Code
      // This Arduino example demonstrates bidirectional operation of a
      // 28BYJ-48, using a ULN2003 interface board to drive the stepper.
      // The 28BYJ-48 motor is a 4-phase, 8-beat motor, geared down by
      // a factor of 68. One bipolar winding is on motor pins 1 & 3 and
      // the other on motor pins 2 & 4. The step angle is 5.625/64 and the
      // operating Frequency is 100pps. Current draw is 92mA.
      ////////////////////////////////////////////////

      //declare variables for the motor pins
      int motorPin1 = 8; // Blue – 28BYJ48 pin 1
      int motorPin2 = 9; // Pink – 28BYJ48 pin 2
      int motorPin3 = 10; // Yellow – 28BYJ48 pin 3
      int motorPin4 = 11; // Orange – 28BYJ48 pin 4
      // Red – 28BYJ48 pin 5 (VCC)

      int motorSpeed = 1200; //variable to set stepper speed
      int count = 0; // count of steps made
      int countsperrev = 512; // number of steps per full revolution
      int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

      //////////////////////////////////////////////////////////////////////////////
      void setup() {
      //declare the motor pins as outputs
      pinMode(motorPin1, OUTPUT);
      pinMode(motorPin2, OUTPUT);
      pinMode(motorPin3, OUTPUT);
      pinMode(motorPin4, OUTPUT);
      Serial.begin(9600);
      }

      //////////////////////////////////////////////////////////////////////////////
      void loop(){
      if(count < countsperrev )
      clockwise();
      else if (count == countsperrev * 2)
      count = 0;
      else
      anticlockwise();
      count++;
      }

      //////////////////////////////////////////////////////////////////////////////
      //set pins to ULN2003 high in sequence from 1 to 4
      //delay "motorSpeed" between each pin setting (to determine speed)
      void anticlockwise()
      {
      for(int i = 0; i = 0; i–)
      {
      setOutput(i);
      delayMicroseconds(motorSpeed);
      }
      }

      void setOutput(int out)
      {
      digitalWrite(motorPin1, bitRead(lookup[out], 0));
      digitalWrite(motorPin2, bitRead(lookup[out], 1));
      digitalWrite(motorPin3, bitRead(lookup[out], 2));
      digitalWrite(motorPin4, bitRead(lookup[out], 3));
      }

  82. Lafaiete - 25 de abril de 2013

    o que h´ade errado nesse código que não funciona?

Deixe uma resposta