Se você está buscando aprender como controlar um motor de passo com Arduino, este post é para você. Nele, exploraremos desde o princípio de funcionamento dos motores de passo até a montagem do circuito e a programação necessária para controlar o motor de forma eficiente e precisa.
Vamos abordar os materiais que você precisará, como realizar as conexões adequadas, e como utilizar a biblioteca Stepper.h do Arduino para programar o motor. Além disso, explicaremos em detalhes o funcionamento do motor de passo no contexto do Arduino.
Princípio de funcionamento do Motor de Passo
Um motor de passo é um dispositivo eletromecânico que converte impulsos elétricos em movimentos mecânicos discretos. Diferente de outros tipos de motores, o eixo de um motor de passo não gira continuamente; em vez disso, ele se move em pequenos incrementos, ou “passos”, à medida que impulsos elétricos são aplicados às suas bobinas em uma sequência específica.
A rotação do eixo de um motor de passo é diretamente influenciada pelos pulsos de entrada aplicados a ele. Cada pulso elétrico faz com que o eixo avance uma determinada quantidade de graus, conhecida como “ângulo de passo”. A direção de rotação do eixo é determinada pela sequência em que os pulsos são aplicados às bobinas do motor, enquanto a velocidade de rotação é controlada pela frequência desses pulsos. O número total de passos (pulsos) aplicados ao motor determina o ângulo de rotação final.
Uma das principais vantagens de um motor de passo é sua capacidade de ser controlado com alta precisão em um sistema de circuito aberto. Em um controle de circuito aberto, não é necessário monitorar constantemente a posição do eixo, pois esta pode ser determinada simplesmente pelo número de pulsos enviados ao motor. Isso elimina a necessidade de caros sistemas de feedback, como codificadores ópticos, tornando o motor de passo uma solução eficiente e econômica para aplicações que requerem posicionamento preciso.
Se você quer se aprofundar no funcionamento e nas aplicações dos motores de passo, recomendo a leitura do post “O que é motor de passo? Funcionamento, tipos e como testar”, que explica de forma detalhada o que são esses dispositivos e como eles podem ser utilizados em diversos projetos eletrônicos.
Materiais Necessários
Para controlar um motor de passo com Arduino, você precisará dos componentes listados abaixo:
Além dos itens mencionados acima, você também precisará ter a Arduino IDE instalada em seu computador ou uma conta cadastrada na Arduino Cloud.
Circuito Motor de Passo com Arduino
A maneira mais simples de conectar um motor de passo unipolar ao Arduino é utilizando o driver ULN2003, que possui o chip ULN2003A integrado. Este CI contém sete transistores Darlington, sendo equivalente a ter sete transistores TIP120 em um único pacote. Ele suporta até 500 mA por canal, com uma queda de tensão interna de aproximadamente 1V quando está em operação.
Para alimentar o motor de passo, utilize os pinos de +5V e GND do Arduino. No esquema de ligação, você encontrará as cores dos fios do motor correspondendo às bobinas. É sempre uma boa ideia conferir o datasheet do motor 28BYJ-48 para obter informações detalhadas sobre a pinagem e o funcionamento.
Para que o motor funcione corretamente com o código que iremos apresentar, conecte os pinos do driver ULN2003 ao Arduino seguindo a ordem abaixo:
- IN1 ao pino 8 do Arduino
- IN2 ao pino 9 do Arduino
- IN3 ao pino 10 do Arduino
- IN4 ao pino 11 do Arduino
Ao final, o circuito de ligação do motor ao Arduino Uno ficará conforme mostrado abaixo:
Seguindo essas etapas, você estará pronto para controlar o motor de passo diretamente pelo Arduino, realizando movimentos precisos e repetitivos.
Programação Motor de Passo com Arduino
O ambiente de programação Arduino facilita o controle de motores de passo através de uma biblioteca específica.
Para começar a utilizá-la, adicione-a ao seu projeto no Editor Arduino, acessando a barra de menu superior: Ferramentas > Gerenciador de Bibliotecas > Stepper.
Depois, copie o código de exemplo abaixo para controlar o motor de passo com o Arduino:
#include <Stepper.h> const int stepsPerRevolution = 2048; //Inicializa a biblioteca utilizando as portas de 8 a 11 para ligação 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 horário a 90 graus for (int i = 0; i<=3; i++) { myStepper.step(-512); delay(2000); } //Gira o motor no sentido anti-horário a 120 graus for (int i = 0; i<=2; i++) { myStepper.step(682); delay(2000); } //Gira o motor no sentido horário, aumentando a //velocidade gradativamente for (int i = 10; i<=60; i=i+10) { myStepper.setSpeed(i); myStepper.step(40*i); } delay(2000); }
O código acima faz com que o motor de passo gire no sentido horário quatro vezes, em ângulos de 90 graus cada, depois no sentido anti-horário três vezes, em ângulos de 120 graus cada. Por fim, o motor gira no sentido horário, aumentando gradativamente a velocidade. Após uma pausa de 2 segundos, o processo se reinicia automaticamente.
Caso você esteja utilizando um Arduino Motor Shield, confira este post sobre como conectar o Motor de Passo 28BYJ-48 com o Arduino Motor Shield L293D para uma abordagem alternativa.
Funcionamento
Controlar um motor de passo com Arduino é uma maneira eficiente de realizar movimentos precisos e controlados em projetos de automação e robótica. O Arduino envia sinais elétricos sequenciais para o motor, fazendo com que seu eixo gire em pequenos incrementos, ou “passos”. Cada passo corresponde a uma rotação específica do eixo, permitindo um controle exato da posição e da velocidade do motor.
A biblioteca Stepper.h do Arduino simplifica o processo de controle do motor de passo. Essa biblioteca fornece funções prontas que permitem definir a quantidade de passos por revolução, a velocidade do motor e a direção de rotação. Com ela, você pode programar o Arduino para mover o motor de forma precisa, determinando quantos graus ele deve girar e em qual direção.
Quando o código é executado, o Arduino envia sinais para as bobinas do motor de passo através de um driver, como o ULN2003, que amplifica os sinais e garante que o motor receba a corrente necessária. Dependendo da sequência de sinais enviados, o motor pode girar no sentido horário ou anti-horário, além de poder variar a velocidade de rotação.
Se você tiver dúvidas, sugestões ou experiências para compartilhar, fique a vontade para deixar um comentário abaixo. E para não perder nenhum conteúdo como este, não deixe de nos seguir no Instagram.
Como eu faço para o motor ficar apenas girando, na mesma velocidade, sem parar?
Olá Eduardo,
Para isso com motores de passo você pode utilizar esta biblioteca: https://github.com/bblanchon/ArduinoContinuousStepper/
Abraços!
Vinícius – Equipe MakerHero
Como consigo armazenar a posição do motor em uma EEPROM?
Olá!
Temos este post aqui falando sobre armazenamento de dados na EEPROM: https://www.makerhero.com/blog/wachdog-e-eeprom-do-arduino/
Dependendo da aplicação acredito que não seria uma boa ideia, pois a EEPROM possui um limite finito de escritas conforme diz o post.
Abraços!
Vinícius – Equipe MakerHero
Boa tarde, estou tendo dificuldades em fazer o motor de passo se mover para o ângulo de 90 graus esperar 2 segundos e retornar ao inicio.
Alguém poderia me auxiliar?
Olá Guilherme,
Basicamente você usaria os comandos myStepper.step(-512); e delay(2000); para girar 90 graus e depois o comando myStepper.step(512); para voltar à posição inicial.
Abraços!
Vinícius – Equipe MakerHero
Olá, pessoal! Tudo bem?
Qual seria a velocidade máxima do motor de passo e que eu poderia colocar no programa?
Outra dúvida, seria possível eu ter uma resposta, um retorno, feedback do motor de passo? Por exemplo, um número de quantas voltas ele deu ou algo do tipo?
Desde já agradeço! 🙂
Olá Beatriz!
A velocidade máxima vai depender do motor, do programa e da carga que tem no motor, você pode ir testando e ver a maior velocidade que sua aplicação aceita.
Em termos apenas de código e de variável, o máximo seria 2147483647 que pode ser colocado (variável do tipo long).
Quanto a receber feedback do motor de passo não é possível sem algum outro componente, caso não haja perda de passos, é possível saber pelo número de passos que o motor deu. Esse motor tem 4096 passos/volta.
Abraços!
Vinícius – Equipe MakerHero
Uma pergunta: o esquemático mostra o +5V do Arduino ligado ao pino -5V do Driver, e o GND do Arduino ligado ao pino +12V do Driver. É isso mesmo? O driver ULN2003 não precisa de alimentação 12V? Se precisa, qual o jeito certo de fazer esta ligação? Tenho uma fonte chaveada de 12V e um stepdown regulável pra 5V, então não teria problemas quanto a isso!
Olá Vinicius!
A indicação ali na verdade é + e -, indicando positivo e negativo da alimentação e a marcação 5-12V quer dizer que o driver aceita entradas entre 5 a 12 V.
Ele pode ser alimentado com qualquer tensão DC entre 5 e 12 V, e a ligação deve respeitar o + e – da polaridade.
A ligação é essa mesma que mostra o esquemático.
Abraços!
Vinícius – Equipe MakerHero
nossa agora desanimei ;
e tudo em inglês ? , não entendo bolufas nenhuma , achei que era mais pratico a programação
Algum de vcs tem algo mais pratico pra iniciante , pq nao tenho tempo pra fazer faculdade , apesar de me interessar muito e ja ate comprei motor , driver e outros .
Obrigado pela Atenção
Silvio G. Sousa
Olá Silvio,
Temos esse post aqui no nosso blog: https://www.makerhero.com/blog/programacao-arduino-portugues-brasil/
Que fala justamente sobre a “tradução” dos comandos para português
Abraços!
Vinícius – Equipe MakerHero
Pessoal.
Uma duvida que eu tou é como deixar o motor do arduino sempre na mesma posicao quando ligar? visto que ele nao tem feedback? precisaria de um sensor adicional para isso?
Em maquinas seria como fazer o home do motor.
Olá Luiz,
Sim, é preciso um sensor adicional para isso.
Até por isso em máquinas a perda de passo nos motores é um problema tão crítico, pela falta de feedback.
Abraços!
Vinícius – Equipe MakerHero
Ola boa tarde, queria saber a ligação de um motor de 4 fios. obrigado
Olá Roberto,
Vai depender muito do tipo de motor (servo, de passo, DC..) que está sendo utilizado.
Abraço!
Rosana – Equipe MakerHero
Adilson parabéns pela explicação
Pergunta:
Se faltar energia no momento em que o motor de passo estiver trabalhando e parar no meio do percurso da CNC…
quando o sistema reiniciar, como garantir que o motor reconhecer o ponto zero de repolso?
Olá Ricardo!
No void setup(), inclua a instrução com a posição que deseja que o servo esteja ao iniciar o programa.
Abraço!
Rosana – Equipe MakerHero
Adilson parabéns pela aula!
Considere que o motor de passo fique em zero grau e gira 120 reais para direita e esquerda.
Se faltar energia enquanto faz a rotina e parou no ponto +80 graus.
Quando reiniciar o sistema, eu preciso garantir que comece sempre do ponto zero.
O que devo programar para iniciar partindo do ponto zero?
Adilson, parabéns pela explicação.
Ajude-me na seguinte situação.
Programar o motor de passo. Partindo do (zero) 0° teremos:
Se o comando for HIGH, gira 120° para diteita;
Se o comando for LOW gira 120° esquerda, e finaliza aguardando novo comando.
Esta é a rotina deste motor.
Se durante o movimento faltar energia e parar em qualquer ponto…
Como posso fazer ele retornar no ponto zero 0° quando o sistema for reiniciado?
Note que é importante que comece e depois terminar a tarefa no zero 0°.
Conto com sua ajuda,
Muitissimo obrigado!
Tentei fazer um alimentador de animais, mas no primeiro grão que ele enrosca, o motor já patina e não entrega e ração. Alguma ideia de um motor mais forte, que não tem esse problema de patinar, que ao mesmo tempo não seja muito grande?
Olá Paulo,
Dá uma olhadinha nos motores de passo NEMA. Eles são um pouco maiores, mas acredito que atendem o que você deseja.
Abraço!
Rosana – Equipe MakerHero
Como fazer um radar com o Motor de Passo + Driver Uln2003 Arduino? Comprei mas não consigo programar ele.
Tenho um motor de passo unipolar de impressora (PM55L – 048 – HP69) e não consigo de forma alguma fazê-lo funcionar; já tentei com o driver l298n e tb com esse driver do seu tutorial mas nada acontece. Não sei se é a sequência dos fios das bobinas que não estou sabendo fazer mas, já inverti os fios e nada.
Daniel,
As chances de serem as sequências de fios são bem grandes. Caso estejam errados, podem girar estranho ou nem girar.
Abraços!
Diogo – Equipe MakerHero
Boa tarde!
Tenho alguns motores de passo de impressoras. Uns tem 4 fios e outros tem 6. Será que é possível controlar dessa forma? Percebi que esse motor de passo usado na explicação, tem um módulo drive … seria necessário ter um para o controle dos motores? Uma ponte h l298 ou um motor shield l293d controlaria!?
Luivan,
Sim, você vai precisar de um driver para fazer o controle desses motores.
Abraços!
Diogo – Equipe MakerHero
Bom dia amigo, desejo montar uma mini cnc onde o eixo de cima só vai subir e descer 10mm para furar os buracos, o eixo X vão andar até 25cm e o y 15cm… Vc teria algo nesse sentido? Que possa me servir de base…
Roldão,
Você pode dar uma olhada nesse shield: https://www.makerhero.com/produto/cnc-shield-v3-para-arduino-impressora-3d/
Abraços!
Diogo – Equipe MakerHero
Olá, estou tentando fazer este circuito, mas quando energizo, dois leds ( A,C) começam a piscar e emitir sinal sonoro, o que pode ser?
Muito bom!
Como posso antes de iniciar o comando do motor de passo coloca-lo numa posição especifica?
No setup, adicione o comando myStepper.step(Aqui você coloca a posição desejada);
Abraços!
Diogo – Equipe MakerHero
eu fiz assim, sempre que liga ele vai para o ajuste, basta mudar o valor de ajuste inicial. isso serve para testar se gira para os dois lados também.
#include // motor de teste “28BYJ-48” com uln2003 alimentado externamente
CustomStepper stepper(4, 5, 6, 7, (byte[]){8, B1000, B1100, B0100, // mude caso sejam diferentes os pinos 4, 5, 6, 7.
B0110, B0010, B0011, B0001, B1001}, 2048, 12, CW); // mude caso seja diferente no seu motor para 4096 ou 4077
int rotate1 = 0;
boolean rotatedeg = 0;
boolean crotate = 0;
int botao0 = 10; // mude caso sejam diferentes os pinos
int botao1 = 11; // mude caso sejam diferentes os pinos
int botao2 = 12; // mude caso sejam diferentes os pinos
void setup()
{
pinMode (botao0, INPUT_PULLUP);
pinMode (botao1, INPUT_PULLUP);
pinMode (botao2, INPUT_PULLUP);
stepper.setRPM(12); // max 20, é recomendado usar um teclado numerico para definir os valores da variavel setRPM, recomendado 12, caso tenha problemas 6
stepper.setSPR(2048); // mude caso seja diferente no seu motor
rotate1=0;
// para entrar no primeiro parametro ou segundo, substituir a gosto do teste
// é recomendado usar botoes para definir os estados da variavel rotatel a seguir, mas comece pelo ajuste sempre
// nesta configuração ira entrar no ajuste e parar
}
void loop()
{
if (digitalRead (botao0) == LOW)
{
rotate1 = 0;
}
//____________________________________________________________________________________
if (digitalRead (botao1) == LOW)
{
rotate1 = 1;
}
//____________________________________________________________________________________
if (digitalRead (botao0) == LOW)
{
rotate1 = 2;
}
//____________________________________________________________________________________
if (stepper.isDone() && rotate1 == 0) // nesta configuracao fara um movimento bobo para um lado e o outro
{
stepper.setDirection(CW);
stepper.rotateDegrees(1); // mude o valor de ajuste para o angulo desejado caso tenha um mpu 6050
stepper.setDirection(CCW);
stepper.rotateDegrees(1); // mude o valor de ajuste para o angulo desejado caso tenha um mpu 6050
rotate1 = 3; // 0 = Juste, 1 = executar o primeiro, 2 = executar o segundo e 3 = parar
}
if (stepper.isDone() && rotate1 == 1)
{
stepper.setDirection(CW);
stepper.rotateDegrees(360); // mude o valor de ajuste para o angulo desejado, pode ser substituido por: stepper.rotate(1); para numero de voltas, onde 1 = uma volta
rotate1 = 3;
}
if (stepper.isDone() && rotate1 == 2)
{
stepper.setDirection(CCW);
stepper.rotateDegrees(360); // mude o valor de ajuste para o angulo desejado
rotate1 = 3;
}
stepper.run();
}
Olá pessoal. Estou precisando de um programa para o Arduino Uno para controlar o Stepper Motor JK57HS76-2804 que contenha o seguinte: Potenciômetro para controle de velocidade e 4 sensores indutivos NPN para controlar o sentido de rotação do motor.
Quem estiver disposto fazer este programa, entra em contato. E-mail [email protected]
Professor estou com duvida, tenho uma webcam yoosee, de uso residencial quando ela liga , o motor ocorre travamento, aonde pode estar o problema no motor ou na placa?
tente a velocidade, se estiver alta ele trava, comece em 6 e vá subindo no teste
Boa tarde Adilson da Felipeflop, estou fazendo um Display de mesa que gira 90º e dá uma parada de 10 segundos, daí gira mais 90° e para por mais 10 segundos, no sentido horario. O prato que gira tem 4 produtos que são mostrados a cada giro, estes produtos são separados por uma placa de pvc. Portanto só vemos o produto que está na frente, quando gira vem o proximo produto. Ví pelos comentários que houve erros nesse código apresentado. Quero saber se vou poder esse código no meu caso. Desde já agradeço a atenção.
Rene,
É possível usá-lo sim. Basta você alterar com o tipo de giro que deseja 😉
Abraços e cuide-se com o COVID-19!
Diogo – Equipe MakerHero
Como se chegou aos valores de -512 e 682??
Estou tentando escrever um código simples que em um motor rotaciona 90° no sentido horário ao clicar no botão b1 e rotacionar 90° no sentido anti-horário clicando num botão 2.
Em meu projeto tenho um Motor de Passo 28BYJ-48. Ele gira 120 graus, dependendo da minha programação: pra direita ou pra esquerda. Ele gira 120 graus perfeitamente, mas quando eu desligo o Motor de Passo ele para eu outro ponto. O meu problema é que o Motor de Passo não para no mesmo ponto. Como eu resolvo isso?
Edson,
Você está usando o mesmo código do post?
Abraços!
Diogo – Equipe MakerHero
Tenho uma dúvida: Só posso usar os pinos 8, 9, 10 e 11 porque? E se eu quizer ligar 3 motores num Arduino mega 2560 que tem uma abundância de pinos, então não vou conseguir?
Sergio,
Você pode usar outros pinos sem problema, mas não deve esquecer de alterar os pinos na programação!
Abraços!
Diogo – Equipe MakerHero
Boa noite Adilson,
Sou iniciante do Arduíno e programação, gostaria de fazer uma pequena programação igual a desse tutorial, porém incluindo dois botões. Um botão para rodar no sentido horário (1/2 volta) e para; e o outro botão para o sentido anti-horario, também em meia volta e depois para. Cada aperto de botão o motor da meia volta e para. Já tentei com pequena aulas no YT. Mas não estou conseguindo concluir… Poderia me ajudar ?
Bruno,
Sugiro que você leve sua dúvida para o nosso fórum, lá é mais fácil de prestar ajuda 🙂
Abraços!
Diogo – Equipe MakerHero
E como que faz para controlar 3 motores sendo 2 girando no mesmo sentido e 1 girando pra frente por 10 segundos e pra traz por 10 segundos,. pois a biblioteca stepper só funciona com 1 motor de passo.
Dayner,
Você pode usar o shield do link abaixo com os respectivos drivers:
https://www.makerhero.com/produto/cnc-shield-v3-para-arduino-impressora-3d/
Com ele você tem a opção de controlar até 4 motores de passos.
Abraços!
Diogo – Equipe MakerHero
Ótima explicação estou estudando no curso de eletrotécnica .fiquei muito interessado neste assunto .
Olá, Hemersom!
Que bom que curtiu! Continue explorando esse universo maker! 🙂
Abraços!
Diogo – Equipe MakerHero
boa tarde me chamo Alessandro
Vcs teriam algo para controle motor passo nema 17, tenho um projeto braço robotico com o uso de nema17.
Quero fazer a programação dele via computador ou potenciometro e gravar estas posições no eeprom arduino. É possivel
ola Adilson, estou tentando fazer um seguidor solar 2 eixos com dois motores de passo e arduino mega, poderia me dar uma luz como faço pra ligar os dois drives no arduino mega.
Olá, posso programar para ele fazer 30 movimentos de poucos cm de acordo com um time? Depois de pronto a placa arduíno fica limitado a apenas 1 produto, ou seja se eu quiser fazer igual mais vezes , será 1 placa dessas p cada 1?
Olá, Anderson,
É possível sim fazer esses movimentos. Você precisa montar isso no código 🙂
Temos um post sobre controlar vários servos: https://www.makerhero.com/blog/como-usar-modulo-pwm-servo-16-canais/
Abraços!
Diogo – Equipe MakerHero
olá gostaria de saber se esse driver que veio com o motor pode ser usado no arduino mega também, se o seu codigo fonte pode ser usado no mega também
Olá Yuri,
Sim, pode ser usado também o Arduino Mega.
Abraço!
Rosana – Equipe MakerHero
Como se sabe que -512 eh 90 graus? ou que 682 eh 20 graus? Agradecia se mostrasse como, para que tambem possamos explicar aos outros.
teria códigos para controlar 3 motor de passo deste modelo com Joystick 3 eixos?
Olá Emanuel,
Não temos um código pronto para o que você precisa. Mas você pode adaptar o código deste tutorial para sua necessidade, sem problemas.
Abraço!
Rosana – Equipe MakerHero
É possível conectar a esta mesma placa de drive um motor de 4 fios?, e o programa seria o mesmo?
Olá,
Vai depender do modelo de motor que está usando.
Abraço!
Rosana – Equipe MakerHero
Bom dia
Queria programar um só motor de passo para uma operação repetida, para acoplar a um dispositivo mecânico.
O motor de passo com alguma força.
O que eu preciso comprar para ter esse funcionamento, na porta de saída de um PC?
agradeço
Olá,
Veja esses dois tutoriais, acho que podem te ajudar:
https://www.makerhero.com/blog/controlando-motor-de-passo-5v-28byj-48-com-motor-shield/
https://www.makerhero.com/blog/motor-dc-arduino-ponte-h-l298n/
Abraço!
Rosana – Equipe MakerHero
Preciso do conjunto completo para conectar no PC, cabo, fonte, o que mais?
Olá,
Vai precisar também de um Arduino e um driver para motor (como sugerido nos tutoriais)
Abraço!
Rosana – Equipe MakerHero
MESTRE BOM DIA, PARABENS PELA PAGINA , GOSTARIA DE SABER SE PODE AJUDAR
PRECISO MUDAR A ROTAÇAO DO MOTOR VIA PROGRAMAÇAO, MAS JA NO SETUP
ESSE E O PROGRAMA
#include
#include
byte const enablePin = 8;
AccelStepper stepper(AccelStepper::FULL3WIRE, 1, 3, 6);
void setup()
{
pinMode (enablePin, OUTPUT);
digitalWrite (enablePin, LOW);
stepper.setMaxSpeed(20000.0);
stepper.setAcceleration(19000);
pinMode(12, INPUT_PULLUP);
pinMode(12, LOW);
stepper.setSpeed(20000.0);
}
void loop()
{
while (digitalRead(12) == LOW) stepper.runSpeed();
{
stepper.setCurrentPosition(0);
}
stepper.runToNewPosition(10000);
stepper.setMaxSpeed(20000.0);
stepper.setAcceleration(2000.0);
delay(100);
}
Olá Kleber,
Acredito que isso só seja possível no loop.
Abraço!
Rosana – Equipe MakerHero
Voce esta alimentando o motor através do arduino diretamente , pode ferrar o arduino . Acho que alimentação do motor deve ser feita de forma independente através de uma fonte de 5V.
A especificação do motor esta incompleta , falta a sequencia de energização das bobinas
Olá Flávio!
Depende da corrente que o motor vai exigir.
Abraços!
André – Equipe MakerHero
Show, gostaria de obter para um controlador drive 488
Olá Alvimar!
Você pode comprar neste link:
https://www.makerhero.com/produto/driver-motor-de-passo-a4988/
Abraços!
André – Equipe MakerHero
Olá, sou novato na utilização do arduino, mas gostaria de saber se é essa mesma conexão é valida para um motor de passo bipolar, senão, poderia disponibilizar o código e o esquema de ligação?
Oi Adilson, tudo bem?
O código funcionou muito bem, melhor até que os exemplos da própria biblioteca.
O que gostaria de entender são os parâmetros:
myStepper.step(682);
myStepper.step(-512);
Como chegou nestes valores? Tinha tentado (120) e (-120) pensando que eram referente aos graus, mas não ia e nem mudava o sentido. Precisava dessa explicação pra montar uma aula (citando vocês nas referências).
Obrigada!
Eu perguntei e eu mesmo vou responder (risos).
Usei uma regra de 3 para descobrir
Se para 90 graus temos 512, para 30:
x = (512*30) / 90
x = 171 (aproximado)
Para uma volta completa, usamos 2048 e damos o sentindo com sinal (-).
Obrigada pelo post.
Olá Gedeane!
Obrigado por nos referenciar nas suas aulas!
Abraços!
André – Equipe MakerHero
Me interessei pelo programa. ..
Olá Francisco!
Ficamos bem felizes em saber que o nosso trabalho ajuda as pessoas 🙂
Sugiro você por em prática as coisas, só pondo a mão na massa que se aprende de verdade!
Abraços!
André – Equipe MakerHero
Boa noite. Gostaria de saber se voce poderia me ajudar a fazer a comunicação do dispositivo android com o motor de passo do arduino. Estou fazendo um trabalho em minha casa e gostaria de fazer um alimentador para gato automatizado, podendo ser acionando de onde eu estiver. Grato,
Olá Denis!
Acho que a melhor forma seria através de um módulo bluetooth.
Dê uma olhada nesse tutorial:
https://www.makerhero.com/blog/tutorial-arduino-bluetooth-hc-05-mestre/
Abraços!
André – Equipe MakerHero
perfeito
muito bom para entender os passos de programação
Olá Francisco!
Ficamos bem felizes em saber que o nosso trabalho ajuda as pessoas 🙂
Abraços!
André – Equipe MakerHero
Olá. estou com um trabalho da faculdade e estou tendo com um problema não tenho muita experiencia com Arduíno e motor de passo. no meu trabalho quero usar o motor de passo para fazer um mini portão eletrônico consegui criar o comando de abrir e fechar o portão. o que eu não consigo é a partir desse comando criar um botão que quando pressionado abra e se pressionado novamente feche teria como ajudar desde já agradeço. segue o comando que fiz .
#include //biblioteca para controle de motor de passo
#define in1 8 //entrada 1 do ULN2003
#define in2 9 //entrada 2 do ULN2003
#define in3 10 //entrada 3 do ULN2003
#define in4 11 //entrada 4 do ULN2003
const int stepsPerRevolution = 200;
Stepper myStepper(stepsPerRevolution, in1, in3, in2, in4);
void setup()
{
// set the speed at 120 rpm:
myStepper.setSpeed(120);
} //end setup
// — Loop Infinito —
void loop()
{
delay(2000);
for (int i = 0; i <= 26; i++)
{
myStepper.step(-stepsPerRevolution); //ABRE
}
delay(2000);
for (int i = 0; i <= 26; i++) //fecha
{
myStepper.step(stepsPerRevolution);
delay(20);
}
delay(1000);
} //end loop
Olá Lucas!
Parece que no seu código está faltando a biblioteca!
Abraços!
André – Equipe MakerHero
Boa noite,
Porque a constnte “stepsPerRevolution” está com valor igual a 500 no código?
Não deveria ser 4096?
Muito Obrigado,
Olá Cleder!
É o número de passos por volta do motor utilizado no exemplo. Dependendo de quantos passos por volta tem o seu motor você altera o valor ali.
Abraços!
André – Equipe MakerHero
Olá André,
Muito obrigado pela resposta.
Mas queria somente confirmar quantos passos tem o motor de passo 28BYJ-48 (que é o motor do post) porque estou usando um igual a este.
No datasheet está meio estranho, mas achei que fosse 4096.
Abs,
Olá Cleder!
É que tem a redução do motor junto, que deve ser considerada. O motor tem 64 passos com uma redução de 1:64. Aí fica 64 *64 que dá 4096 por volta.
Estamos aí pra resolver essas dúvidas mesmo 🙂
Abraços!
André – Equipe MakerHero
Para aqueles que estiverem com dificuldades com o sentido de rotação:
No meu conjunto, não sei se por diferenças de fabricação do stepper motor ou do driver, funcionou tudo OK com a seguinte ligação:
IN1-pin8
IN2-pin10
IN3-pin9
IN4-pin11
Show de bola. Muito fácil de entender.
Olá Marcelo!
Ficamos muito felizes em saber que nosso trabalho realmente ajuda as pessoas!
Você já viu o nosso fórum? É um espaço aberto onde todos podem colaborar. Lá você pode postar seus projetos, tirar suas dúvidas, ajudar outras pessoas e contribuir para a comunidade 🙂
https://www.makerhero.com/forum/
Abraços!
André – Equipe MakerHero
Ola comprei o Driver para motor de passo, o Gerador de sinal que tenho só tem 2 saídas, como fazer funcionar nesse driver uln 2003? no Diver tem 4 entradas. Obrigado.
E possível através de botões do visual basic para um servo motor 360º em 60º/90ª120ª(cada botão coloca uma posição)?
Obrigado, pelo o conhecimento transmitido, com certeza todos que tiverem acesso ao seu conteúdo ficaram satisfeito.
Gostaria de saber qual a rotação máxima em RPM desse motor (sem carga ou baixa carga),para controlar usando um Arduino (Motor de Passo 28BYJ-48).
Testei o código e depois de alguns tropeços, finalmente o “bichinho” andou e voltou. Mas está LONGE de ser preciso. O 28BYJ-48 perde vários passos durante o percurso. Fazer duas voltas completas iguais para o 28BYJ-48 é algo impossível. Para brincar e aprender, serve… nada mais que isso.
Boa Tarde,
Gostaria de saber se consigo fazer esse controle com algum modulo wifi arduino?
Caro Adilson Thomsen, estou usando o NodeMCU como faço para realizar esta ligação, daria para você passar quais GPIO devo utilizar.
Boa noite.
Obrigado pelo artigo..
eu estou carregando o código e não apresenta erros na IDE mas o motor de passos não da um sinal de vida..eu liguei conforme o diagrama posta aqui..
É possível ligar um motor de passo bipolar (4fios) ao MotorShild L293D ?
Olá. Gostaria de saber mais ou menos qual a maior velocidade que consigo nesse motor.
O que preciso é que ele de uma volta completa em 1s. Ele vai?
Nessa programação o tempo q ele fica parado e de 2 segundos para retornar os movimentos, para aumentar esse tempo é só alterar o delay? Como faço? Obrigado e boa tarde
Boa tarde . Usei este codigo tentado montar um controle de válvula que atua de 0 a 100 % de um registro aberto, podendo regular a abertura da válvula de 10 em 10%. Vocês poderiam com código agradeço desde já
oi amigos, estou fazendo um elevador de andares utilizando uma shield Ponte H e um sensor ultrassonico, alguma sugestao de como fazer a programação?
Eu consigo simular um motor de passo no tinkercad ou em outra ferramenta?
boa tarde, estou iniciando com arduino e montei esse vosso projeto com o motor de passo e deu tudo certo funciona certinho.
a minha duvida é que testei outras programas e nenhum funcionada ceto o motor vibra mais nao giro só esse programação de voces da certo me podem ajudar porque nos outros so treme?
Boa noite,
Precisei usar esse motor para fazer uma catraca de seleção em uma esteira, porém toda vez que a peça da esteira encostava na parte que o motor movimentava o motor de passo mudava o seu percurso. O seja qualquer coisa que o motor de passo encoste e impeça a movimentação dele o percurso muda, gira para outro sentido. Como faço pra resolver isso?
Qual é o peso máximo que esse motor consegui movimentar? Você sabe?
A minha pergunta vai ser um pouco diferente das que foram feitas aqui, o se eu quisesse, sei que não é a função dele, mas mantê-lo com um giro constante como de um moto CC, como deveria ser feito a ligação dele? E mais ainda como poderia implementá-lo manualmente, sem ajuda do arduino?
Filipe preciso fazer esse projeto em assembly, vc conhece algum site q ajude nesse linguagem?
caso vc conheça poderia me ajudar a entender como ficaria esse acionamento em assembly
boa tarde amigos.
tou montando um prototipo de uma makina e consegui desenvolver este sketck.
nele o motor parte de um ponto inicial, vai e volta e da a volta completa voltando ao ponro inicial novamente
e sempre executa isso quando e precionado um botao de start.
porem preciso por um reed-switch pra ser o ponto de partida inicial caso ele rode saindo da posicao certa. poderiam me ajudar nisso ? tou um pouco perdido em conseguir fazer esta parte.
tudo que aprendi foi apenas em pesquisas em sites e vendo video aulas. mas nao estou conseguindo fazer esta parte. obrigado
#include
int B = A2; // botao
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);
pinMode(B, INPUT);
}
void loop() {
int VB = digitalRead(B); // VB valor botão
if (VB == 1){
myStepper.step(400);
delay(100);
myStepper.step(-400);
delay(100);
myStepper.step(400);
delay(100);
myStepper.step(-2448);
delay(0);
}
}
Excelente Tutorial!
Como posso fazer ele girar continuamente? Qual seria o comando?
Em meu projeto preciso fazer ele girar continuamente no sentido horário ao pressionar o botão1 e anti-horário ao pressionar o botão2.
Poderia me ajudar?
Olá, quero fazer um velocimetro com o motor de passo no painel e sensor hall na roda do carro, como posso montar o esquema eletrico e a linguagem? obrigado
ola, estou fazendo um projeto de tcc em quer deveria usar um portão na maquete comandado por Bluetooth, usando o motor de passo, gostaria que ele começasse desligado e quando recebesse o comando ligasse, e quando recebesse o segundo comando fechasse , alguém poderia me ajudar?
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!
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?
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: [email protected]
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.
ola pode sim, na linha seguinte
Stepper myStepper(stepsPerRevolution, 8,10,9,11);
altere conforme a ordem para nao ter problemas e caso queira usar as portas de 0 a 3 certifique-se de tirar os conectores das portas 0 e 1 pois estao interligadas no microcontrolador e sao usadas para comunicacao serial TX e RX ou seja ao gravar um codigo ou usar a Serial.begin() essas portas que sao usadas entao cuide para nao ter conflito
como faço para mudar os ângulos
preciso de ajuda
obigado
Também quero saber!!
myStepper.step(VALOR);
Dentro do parênteses indique o valor desejado:
Onde 2048 = 360°, depois faça a regra de três pra movimentar o ângulo desejado.
– Valores positivos – sentido horário,
– valores negativos – sentido anti-horário.
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
inverta a polaridade dos fios do motor.
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.
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 ( https://www.makerhero.com/pd-3cc1a3-placa-wemos-d1-r2-wifi-esp8266.html?ct=&p=1&s=1 )
O que acha?
olá, preciso fechar a malha desse projeto, tem como?
Boa tarde, gostaria de saber se necessita usar mesmo 3 portas PWM? ou foi escolhidas aleatoriamente e posso usar portas normais?
obrigado desde já!
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?
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.
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
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.
ola, este tutorial me ajudou bastante.
quero saber se é possivel colocar um dispay lcd 16×2, para mostrar o avanço do motor
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
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 MakerHero
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.
Outra possibilidade, é utilizar 4 demultiplex 74151, e controlar 15 motores de passos, utilizando 8 saídas do arduíno.
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
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.
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
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.
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!
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
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 ).
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? =/
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 🙂
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!
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
Gostaria de saber qual capacitor ceramico vai no shied do ULN 2003 esse de 5V
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.
Ele usa o Fritzing
Boa tarde Kelleni,
Muito obrigado, ficamos realmente felizes em ajudar. 🙂
O software que utilizamos para o circuito é o Fritzing: http://fritzing.org/home/
Abraço!
Adilson – Equipe MakerHero
Olá… Gostaria de saber o esquema de alimentação para esse driver em 12v.
Será que seria possível controlar o ângulo de rotação com um teclado numérico?
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!
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 MakerHero
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
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.
Bom dia,
Vamos revisar essa ligação e testar, já que esse post foi feito à um bom tempo.
Abraço e obrigado!
Adilson – Equipe MakerHero
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.
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!
Olá,
Como faço para adicionar nessa Programação um potenciometro para apenas ligar e desligar o motor.
Obrigada desde já.
Boa tarde Luana,
Você pode fazer um IF simples para parar o motor quando o potenciômetro estiver com um determinado valor (abaixo de 50, por exemplo), mas creio que você terá melhores resultados se usar a biblioteca CustomStepper. Dê uma olhada neste link, por favor: http://www.arduinoecia.com.br/2014/04/controlando-motor-de-passo-28byj-48.html
Abraço
Adilson – Equipe MakerHero
Para declarar o potenciômetro usando essa biblioteca eu sigo o mesmo esquema que na biblioteca ?
Eu preciso ter o potenciômetro no meu esquema por mais que a programação faça tudo sozinho.
Como faço pra usando essa biblioteca,meu motor gire em sequência 45° até fechar em 360°.
E depois gire 360° direto.
Só consigo com que ele gire 45° uma vez depois 360° 3 vezes
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.
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 MakerHero
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! [email protected] muito obrigado, kit excelente
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
Obrigado Raphael !
Abraço
Adilson – Equipe MakerHero
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á.
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 MakerHero
Olá Carlos…. Estou com o mesmo problema.
Conseguiste resolver?
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.
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.
Amigo, vc conseguiu fazer esse projeto, eu estou iniciando agora e estou montando um projeto similar, comprei o módulo de relógio e um motor de passo como dessa matéria, ainda não chegaram para eu testar mas estou com dúvidas de como fazer o motor funcionar em determinados horários na programação, se já tiver realizado e puder compartilhar o código q utilizou eu agradeço.
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();
}
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();
}
}
Parabéns !!!
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
como fazer a programação do arduino para ligar e desligar um motor de 12vc (motor bamba de agua ).
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 MakerHero
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);
}
Boa tarde,
Tente usar a biblioteca CustomStepper : http://playground.arduino.cc/Main/CustomStepper
Adilson – Equipe MakerHero
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;’.
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.
Olá MakerHero, 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 😀
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á
Boa tarde Thaina,
O programa deste post inverte o sentido de rotação do motor, você só precisa fazer as adaptações para o seu projeto.
Abraço.
Adilson – Equipe MakerHero
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?
Bom dia Juliano,
Obrigado. Com o motor adequado e alguns sensores, é possível sim.
Abraço !
Adilson – Equipe MakerHero
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.
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 MakerHero
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?
Bom dia João
Tente usar a biblioteca CustomStepper :
http://playground.arduino.cc/Main/CustomStepper
Abraço.
Adilson – Equipe MakerHero
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);
}
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 MakerHero
Olá Tiago, me tira uma dúvida? Olhei em alguns sites e vi os valores de 500 e de 200 para “const int stepsPerRevolution”, mas isso não deveria ser a quantidade de passos por uma volta? Tipo, o motor possui 64 passos segundo o datasheet, e mesmo com a redução que é de 1/64, não dá esses valores… Não entendo o motivo deles estarem sendo usados…
Amigo do MakerHero. 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);
}
}
Boa noite Guilherme,
Tente acrescentar mais alguma condição no IF para que o segundo botão seja ignorado.
Abraço.
Adilson – Equipe MakerHero
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.
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 MakerHero
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º…
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.
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
Boa noite Lili,
Tente a biblioteca Customstepper. Ela tem a função de rotacionar apenas por determinados angulos.
Abraço.
Adilson – Equipe MakerHero
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º
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
Boa noite Jorge,
Por favor verifique se não é algum outro problema, pois com o código desse post funcionou normalmente.
Grato.
Adilson – Equipe MakerHero
Estou com o mesmo problema. Comprei 3 motores + controlador e nenhum rotaciona no sentido anti-horário.
Consegui arrumar da seguinte forma:
IN 1 – Porta 8
IN 2 – Porta 11
IN 3 – Porta 9
IN 4 – Porta 12
Assim, o motor consegue tirar corretamente para os dois lados.
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
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
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.
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.
Boa tarde, gostaria de saber se voce pode me ajudar no meu tcc com a parte do circuito eletrico.
desde ja agradeço
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 MakerHero
Gostaria de saber como faço para controlar mais de um motor de passo utilizando botões com o arduino
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 MakerHero
valeu MakerHero
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
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.
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!
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();
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 MakerHero
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);
}
Gostaria de agradecer ao Adílson também, quase me esquecia. Hehe
Boa noite George,
🙂 Valeu, estamos à disposição.
Abraços !
Adilson – Equipe MakerHero
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.
Boa tarde Marcos,
Talvez você precise de algum circuito auxiliar. O que eu tenho com relação ao ULN2003 é o datasheet, nesse link :
http://www.ti.com/lit/ds/symlink/uln2003a.pdf
Abraço !
Adilson – Equipe MakerHero
O motor de passo só funciona se tiver o Drive Uln2003?
Olá Reynan. Você pode usar outro controlador para o motor de passo, necessariamente não precisa ser o Uln2003.
Abraço!
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!
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!
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…
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
Olá Roni. Tentou alterar a quantidade de passos que o motor dá? Lembrando que Ângulo do Passo: 5,625° e Taxa de velocidade de variação: 1/64.
Abraço!
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
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
Olá Lucas, peço que confira as ligações que você fez pois este post foi testado várias vezes e não acontecia isto. Caso o problema persista entre em contato por e-mail. Abraço!
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
Olá Lucas, peço que confira as ligações que você fez pois este post foi testado várias vezes e não acontecia isto. Caso o problema persista entre em contato por e-mail. Abraço!
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 [email protected]
Olá Marcone. Sim está funcionando normalmente mas neste caso você teria que estudar como fazer esta alteração, infelizmente não temos recursos para disponibilizar códigos para todas as dúvidas.
Abraço e boa sorte!
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 [email protected]
Olá Marcone. Sim está funcionando normalmente mas neste caso você teria que estudar como fazer esta alteração, infelizmente não temos recursos para disponibilizar códigos para todas as dúvidas.
Abraço e boa sorte!
o que esse programa fara o meu motor fazer?
o que esse programa fara o meu motor fazer?
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?
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!
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?
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!
Amigo, sua percepção me salvou, mas no caso 2048 são 360 graus, então use 1/4 de 2048 que vc terá 90 graus. Abraços
Eu coloquei assim e está igual um relógio… preciso
#include
const int stepsPerRevolution = 512;
//Inicializa a biblioteca utilizando as portas de 8 a 11 para
//ligacao ao motor
Stepper myStepper(stepsPerRevolution, 4,5,6,7);
void setup()
{
//Determina a velocidade inicial do motor max = 20
myStepper.setSpeed(22); // max 22
}
void loop()
{
//Gira o motor no sentido horario a 90 graus
for (int i = 0; i<=3; i++)
{
// (2048 = 360 / 1536 = 270 / 1024 = 180 / 512 = 90)
myStepper.step(2048);
delay(2000);
}
}
e no outro coloquei assim, testem pls… abraço.
#include
CustomStepper stepper(4, 5, 6, 7, (byte[]){8, B1000, B1100, B0100,
B0110, B0010, B0011, B0001, B1001}, 4096, 12, CW);
int rotate1 = 0;
boolean rotatedeg = 0;
boolean crotate = 0;
int i;
void setup()
{
stepper.setRPM(10); // max 15, é recomendado usar botoes para definir os estados da variavel setRPM
stepper.setSPR(4096);
rotate1=0; // para entrar no primeiro parametro ou segundo, substituir a gosto do teste
// é recomendado usar botoes para definir os estados da variavel rotatel
// 0 para o primeiro, 1 para executar o segundo, 2 para parar
// nexta configuração ira entrar no primeiro if e parar
}
void loop()
{
if (stepper.isDone() && rotate1 == 0)
{
stepper.setDirection(CW);
stepper.rotate(1);
rotate1 = 2; // 0 para loop infinito, 1 para executar o segundo, 2 para parar
}
if (stepper.isDone() && rotate1 == 1)
{
stepper.setDirection(CCW);
stepper.rotate(2);
rotate1 = 2; // 0 para executar o primeiro, 1 para loop infinito, 2 para parar
}
stepper.run();
}
O código foi corrigido Lafaiete. Confira agora.
Abraço!
Resolvemos o problema inicial que tinha no código. Testamos e está aprovado.
Abraço!
Obrigado pela alternativa aabb. Iremos verificar o problema no código e corrigiremos.
Abraço!
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??
Olá Elaine. Tente rodar o código fornecido pelo “aabb” nos comentários abaixo. Se funcionar entre em contato e iremos substituir o código atual.
Abraço!
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??
Olá Elaine. Tente rodar o código fornecido pelo “aabb” nos comentários abaixo. Se funcionar entre em contato e iremos substituir o código atual.
Abraço!
Ótimo, foi o que me esclareceu nessa minha empreitada. Obrigado.
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.
Olá Galdir. A declaração da biblioteca stepper.h está antes da void setup. Confere?
olá.
meu motor não gira no sentido anti-horário. será q está com defeito?
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!
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));
}
Obrigado pela alternativa aabb. Iremos verificar o problema no código e corrigiremos.
Abraço!
Resolvemos o problema inicial que tinha no código. Testamos e está aprovado.
Abraço!
o que h´ade errado nesse código que não funciona?
Lafaiete não tivemos nenhum problema com este código amigo. Confira as ligações e conexões de seu projeto.
Caso tenha encontrado algum erro no código por favor nos informe.
Abraço!
O código foi corrigido Lafaiete. Confira agora.
Abraço!