LusoRobótica - Robótica em Português

Robótica => Tutoriais => Tópico iniciado por: TigPT em 11 de Outubro de 2008, 20:15

Título: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: TigPT em 11 de Outubro de 2008, 20:15
Hoje vamos ver como ligar um Stepper Motor, ao Arduino Diecimila (http://loja.lusorobotica.com/microcontroladores/10-arduino-duemilanove-com-atmega328.html) utilizando o EasyDriver v3 para ficar a saber como o controlar.

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg90.imageshack.us%2Fimg90%2F7485%2Ftmpphpbln9wdgh0.jpg&hash=8ee4edb837929d3d071a5b75dd35a6d013c1eaad) (http://img389.imageshack.us/my.php?image=dsc00465hl9.jpg)

Como vêm na imagem acima, é bastante fácil montar todo o circuito, tendo que recorrer apenas a 5 fios, dos quais apenas 2 do microcontrolador:

Info:

Controlo:
Alimentação:

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg262.imageshack.us%2Fimg262%2F7704%2Ftmpphp7vl9prsz4.jpg&hash=9077d8b1c8e486d6ffa639d66420f100389bfee6) (http://img385.imageshack.us/my.php?image=dsc00463iv9.jpg)

O código abaixo já tem o método step(boolean direcçao, int numero_de_steps) que permite fazer o motor andar numa dada direcção X steps, sem que vocês se tenham que preocupar com o resto do código, quem quiser aprofundar mais, é só perguntar.
Estou a desenvolver um código que permita também controlar a velocidade do motor, e fazer com que este ande em background, permitindo o Arduino Diecimila ir fazendo outro código enquanto vai dando ordens ao motor para ir andando. Para já este já vos permite fazer o motor andar sem grande esforço. Deixo mais uma imagem da montagem completa.

Ahh para esta montagem utilizei um transformador de 12V, pois não tinha de 15,4 e funcionou perfeitamente ;)

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg204.imageshack.us%2Fimg204%2F6607%2Ftmpphpt4ijfiwa3.jpg&hash=b30cc02679395ce140ffcdd9080c890fa0b514bb) (http://img407.imageshack.us/my.php?image=dsc00461fg4.jpg)

Código:
Código: [Seleccione]
/********************************************************
**         More info about the project at:             **
**  http://lusorobotica.com/index.php?topic=106.0  **
**   by TigPT         at         [url=http://www.LusoRobotica.com]www.LusoRobotica.com[/url]  **
*********************************************************/
int dirPin = 2;
int stepperPin = 3;

void setup() {
  pinMode(dirPin, OUTPUT);
  pinMode(stepperPin, OUTPUT);
}

void step(boolean dir,int steps){
  digitalWrite(dirPin,dir);
  delay(50);
  for(int i=0;i<steps;i++){
    digitalWrite(stepperPin, HIGH);
    delayMicroseconds(100);
    digitalWrite(stepperPin, LOW);
    delayMicroseconds(100);
  }
}

void loop(){
  step(true,1600);
  delay(500);
  step(false,1600*5);
  delay(500);
}
Título: Re: Stepper Motor + EasyDriver + Arduino
Enviado por: Fifas em 11 de Outubro de 2008, 22:56
mais um grande tutorial....parabéns :lol:
Título: Re: Stepper Motor + EasyDriver + Arduino
Enviado por: TigPT em 11 de Outubro de 2008, 23:01
Obrigado :D
Título: Re: Stepper Motor + EasyDriver + Arduino
Enviado por: guibot em 12 de Outubro de 2008, 02:38
parece bem nice!!  
 
sabes se o L293D funciona como controlador de motores de passo?

continua com o bom trabalho
Título: Re: Stepper Motor + EasyDriver + Arduino
Enviado por: TigPT em 12 de Outubro de 2008, 10:25
Pelo que li, podes utilizar o L293 como H-bridge para meter um stepper a ser controlado pelo Arduino, mas terás que ter 1 pin para cada fio do stepper, 4 pins.. e 2 L293, visto que cada L293 tem 2 bridges... Existe uma manha qualquer para fazeres só com 2 pins do arduino, visto que os stepps são sempre em xor, ou seja, para 2 numa posição os outros dois são o seu negado. Mas não vi bem como se fazia, porque não era o que pretendia.

Se tiveres mais interessado, diz que eu procuro saber melhor como é.  ;)
Título: Re: Stepper Motor + EasyDriver + Arduino
Enviado por: guibot em 14 de Outubro de 2008, 01:42
obrigado pela resposta
tenho aqui 2 steppers bem grandinhos sacados de um leitor de cassete, quero ver se lhes dou uso    8-)
Título: Re: Stepper Motor + EasyDriver + Arduino
Enviado por: TigPT em 14 de Outubro de 2008, 08:06
Citação de: "guibot"
obrigado pela resposta
tenho aqui 2 steppers bem grandinhos sacados de um leitor de cassete, quero ver se lhes dou uso    ;)
Título: Re: Stepper Motor + EasyDriver + Arduino
Enviado por: guibot em 14 de Outubro de 2008, 10:00
só pude dar uma olhada na diagonal.. parece bem fix!

obrigado TigPT
Título: Re: Stepper Motor + EasyDriver + Arduino
Enviado por: TigPT em 14 de Outubro de 2008, 11:31
De nada, quando fores ler, dá uma especial atenção a este link (http://arduino.cc/en/Reference/StepperBipolarCircuit) que tem tutorial para ligar através de um L293 a fazer de H-bridge e tudo ;)
Título: Re:[Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: TigPT em 22 de Janeiro de 2009, 17:08
Encontrei mais um código que pode ajudar a quem quiser mais informação sobre este stepper e o controlador.

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1231909180/1 (http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1231909180/1)

Neste caso estava a ser utilizado para controlar uma base de um telescópio para fazer acompanhamento de estrelas... acho que o tr3s está interessado nisto!
Título: Re:[Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: metRo_ em 25 de Janeiro de 2009, 12:41
Código: [Seleccione]
  for(int i=0;i<steps;i++){
    digitalWrite(stepperPin, HIGH);
    delayMicroseconds(100);
    digitalWrite(stepperPin, LOW);
    delayMicroseconds(100);
  }
Neste código a unica coisa que fazes é ligar o motor e desligar o motor o numero de passos que queres, certo?
Se tu fizeres isto, ele ia funcionar como continuo, certo? Ia estar sempre HIGH durante STEPS*100ms, correcto?

Código: [Seleccione]
  for(int i=0;i<steps;i++){
    digitalWrite(stepperPin, HIGH);
    delayMicroseconds(100);
  }
Título: Re:[Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: TigPT em 25 de Janeiro de 2009, 12:44
Código: [Seleccione]
  for(int i=0;i<steps;i++){
    digitalWrite(stepperPin, HIGH);
    delayMicroseconds(100);
    digitalWrite(stepperPin, LOW);
    delayMicroseconds(100);
  }
Neste código a unica coisa que fazes é ligar o motor e desligar o motor o numero de passos que queres, certo?
Se tu fizeres isto, ele ia funcionar como continuo, certo? Ia estar sempre HIGH durante STEPS*100ms, correcto?

Código: [Seleccione]
  for(int i=0;i<steps;i++){
    digitalWrite(stepperPin, HIGH);
    delayMicroseconds(100);
  }
Não, por ser um stepper e não um DC, tens que lhe dar stepps, um pulso para cada passo que queres que ele dê. Assim se queres que ande rápido dás pulsos rápidos, se queres que ande lento dás pulsos lentos, mas cada vez que levantas um pin a high, ele dá um passo, e depois fica à espera que venha a low para no próximo high ele dar mais um passo.

PS - São micros e não milis, e são 200 não 100.
Título: Re:[Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: metRo_ em 25 de Janeiro de 2009, 13:06
Ok, já entendi. Tens razão era micro. Outra coisa, o easydriver faz a conversão do sinal de comando do arduino num sinal de potencia para o motor e funciona como protecção, certo?
Por exemplo se eu tivesse um stepper motor que funcionasse apenas com 5V, e o fosse usar sem carga, para não ter grandes correntes, poderia fazer o controlo directamente do arduino?

Abraço

Edit: Se usa-se essa roda para mover um peso, quanto conseguiria mover? não encontrei essa informação na datasheet
Título: Re:[Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: TigPT em 25 de Janeiro de 2009, 13:14
Deves de utilizar sempre protecção para o micro, podes encontrar aqui um esquema simples para fazeres em casa com uma ponte H para controlar steppers:

http://arduino.cc/en/Reference/StepperBipolarCircuit (http://arduino.cc/en/Reference/StepperBipolarCircuit)

Quanto a força, ainda não medi, mas no datasheet fala de um momento de 54 g por cm2.

Experimentei impedi-lo de rodar com agarrando à mão parar não era com ele, pareceu-me ter bastante força. Depois quando tiver tempo para o robot digo-te com que peso ele consegue andar às costas ;)
Título: Re:[Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: metRo_ em 25 de Janeiro de 2009, 13:23
Vou ter de rever Fisica para perceber o significado desse momento de inercia lool. Mas se puderes fazer os testes, para diferentes pesos, era bom :)
Título: Re:[Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: intense em 21 de Maio de 2009, 15:30
uma pergunta o easyDriver da pa controlar ate quantos motores?
ou so da para um?
Título: Re:[Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: TigPT em 21 de Maio de 2009, 15:43
Só dá para um...
Título: Re: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: jvnvr em 21 de Maio de 2010, 21:47
Boas,
Antes de mais quero dar os parabéns pela iniciativa da lusorobotica, parabéns aos fundadores e membros pelas oportunidades de troca de conhecimentos que potenciam. A minha área de trabalho não tem muito a haver com robótica, mas recentemente comecei a interessar-me por cnc.

Tenho andado com ideias de criar uma micro cnc de 3 eixos para cortar placas de cartão, madeira, acrílico com cerca de 5mm de espessura.
Tenho investigado e visto muitos tutorials e projectos na net, youtube e afins.

Por oferecer outras possibilidades e ser opensource, pensei em fazer com arduino + easy driver + stepper motor. Uso Mac e por vezes PC, portanto software tem que ser multiplataforma.
Para começar, com 2 motores de impressoras para testar é bom... mas para passar para uns nema23 de seguida (penso igual ao do post).

As minhas dúvidas:
1. Controladores com arduino + easydriver são mais lentos/precisos que com outro tipo de controlador?
2. Onde posso comprar motores nema23 em Portugal (não encontrei na lusorobotica)? Se mandar vir de fora (Europa) onde aconselham?
3. Onde controlo 1 step, 1/2 step, 1/4 step, etc. com arduino/easydriver? Defino por software ou por hardware?

Cumprimentos
Título: Re: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: TigPT em 22 de Maio de 2010, 12:43
Bem-vindo!

1) Sendo que o ideal é a utilização de uma porta de serie por usb, vais ter tanta velocidade de comunicação com o arduino, que com outro microcontrolador qualquer. A velocidade deste para fazer algumas rotinas para controlar os steppers também será mais do que suficiente. Creio que vais estar mais limitado à velocidade dos motores do que do micro.
2) Referes-te a estes motores: http://www.sparkfun.com/commerce/product_info.php?products_id=9238 (http://www.sparkfun.com/commerce/product_info.php?products_id=9238) ?
Se sim, vê na página de distribuidores da SparkFun que há várias empresas aqui na Europa.
3) Da experiência que tive com os stepper motores, estes têm uma granulosidade mínima de um step, pelo que não poderás fazer movimentos de 1/2 e 1/4 step, mas como não é de todo uma área que conheça muito, não te dou a certeza.

Tens aqui vários projectos de CNC no fórum:
http://lusorobotica.com/search.php?cx=000416183904538598060:bqwm1z-rqvk&cof=FORID:10&ie=UTF-8&q=cnc&sa=Pesquisar (http://lusorobotica.com/search.php?cx=000416183904538598060:bqwm1z-rqvk&cof=FORID:10&ie=UTF-8&q=cnc&sa=Pesquisar)
Título: Re: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: ncarvalho em 03 de Agosto de 2011, 23:19
Viva

O código abaixo já tem o método step(boolean direcçao, int numero_de_steps) que permite fazer o motor andar numa dada direcção X steps, sem que vocês se tenham que preocupar com o resto do código, quem quiser aprofundar mais, é só perguntar.
Estou a desenvolver um código que permita também controlar a velocidade do motor, e fazer com que este ande em background, permitindo o Arduino Diecimila ir fazendo outro código enquanto vai dando ordens ao motor para ir andando. Para já este já vos permite fazer o motor andar sem grande esforço. Deixo mais uma imagem da montagem completa.

Repescando este topico queria deixar umas questões:
- As funcões step e loop aqui usadas não podem ser substituidas pelas funções integradas  Stepper(steps, pin1, pin2),     Stepper(steps, pin1, pin2, pin3, pin4), setSpeed(rpm) e step(steps)??
- Referes que estavas a estudar uma forma de dar instruções ao motor, mas libertando o arduino para realizar outras tarefas (non-blocking). Conseguiste alguma coisa que possas partilhar?


Obrigado
NCarvalho
Título: Re: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: Nunito em 03 de Março de 2015, 11:48
TigPT, que condição colocas/sugeres para ao fim de fazer os 1600 steps, fazer um break ao loop?
Título: Re: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: senso em 03 de Março de 2015, 13:55
A cada volta incrementas ou decrementas uma variavel quando for 0 ou 1600 fazes break;
Título: Re: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: TigPT em 05 de Março de 2015, 14:20
A cada volta incrementas ou decrementas uma variavel quando for 0 ou 1600 fazes break;
True
Título: Re: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: Nunito em 10 de Abril de 2015, 13:42
A cada volta incrementas ou decrementas uma variavel quando for 0 ou 1600 fazes break;
Voltando aqui a esta parte, que acabei por deixar de parte.
Tenho este código, mas o motor não está a parar, não sei o que está mal.
Código: [Seleccione]
       if(buf[i] == '1')
       {
          if( steps == 600)
         {
           break;
         }
         step(true,600);
         delay(500);
         steps = steps + 1;
       }

Título: Re: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: senso em 10 de Abril de 2015, 20:20
Imprime a variavel steps.
E essa função step que tem com argumentos true e 600, 600 é o numero de passos?
Se sim vais dar 600 passos vezes 500..
Título: Re: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: Nunito em 10 de Abril de 2015, 20:34
Imprime a variavel steps.
E essa função step que tem com argumentos true e 600, 600 é o numero de passos?
Se sim vais dar 600 passos vezes 500..
Sim, tenho os 600 como numero de passos.
Título: Re: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: senso em 10 de Abril de 2015, 20:37
E queres dar 600 passos, 500 passos ou queres dar 300000 passos?
É que a solução está mesmo ao virar da esquina, mas não vou dizer..
Título: Re: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: Nunito em 10 de Abril de 2015, 20:44
E queres dar 600 passos, 500 passos ou queres dar 300000 passos?
É que a solução está mesmo ao virar da esquina, mas não vou dizer..
:)
 
Código: [Seleccione]
       if(buf[i] == '1')
       {
          if( steps == 500)
         {
           break;
         } 
         step(true,50);
         delay(10);
         steps = steps + 1;
       }

Título: Re: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: senso em 10 de Abril de 2015, 23:38
Assim já só dá 50*500 passos, a guiar-me pelo que dizes que a função step faz.
Título: Re: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: Nunito em 11 de Abril de 2015, 10:40
Assim já só dá 50*500 passos, a guiar-me pelo que dizes que a função step faz.
Mas estás a guiar-te mal, que sinceramente nao estou a perceber o que a função step faz.
Código: [Seleccione]
void loop()
{
  step(true,1600);
  delay(500);
  step(false,1600*5);
  delay(500);


Vamos lá ver se eu entendo.
Neste código do TigPT, os 1600 que ali estão são o numero de passos, correcto?
Título: Re: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: senso em 11 de Abril de 2015, 13:26
Sei lá, pensei que a função fosse tua lol.
Posta o código tudo, eu não adivinho..
Título: Re: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: Nunito em 11 de Abril de 2015, 14:40
Sei lá, pensei que a função fosse tua lol.
Posta o código tudo, eu não adivinho..

É do TigPT, está na 1ª página :)
Título: Re: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: senso em 11 de Abril de 2015, 21:37
Essa função dá N passos, e já usa delays e um for, e recebe um int, logo não estou a ver a necessidade de voltares a enrolar a função em mais um loop e com mais delays, cada chamada á função custa-te logo 50ms que é o delay entre definir a direção e começar o loop.
Título: Re: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: Nunito em 11 de Abril de 2015, 22:05
Código: [Seleccione]
void step(boolean dir,int steps)
{
  if (steps != 1600)
  { 
  digitalWrite(dirPin,dir);
  delay(50);
  for(int i=0;i<steps;i++)
    {
    digitalWrite(stepperPin, HIGH);
    delayMicroseconds(100);
    digitalWrite(stepperPin, LOW);
    delayMicroseconds(100);
    }
   steps = steps + 1;
  }
}
Senso como disseste anteriormente, eu vou incrementar a variável steps e quando der 1600 passos, o motor pára.
Título: Re: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: homeo em 26 de Outubro de 2015, 16:17
Um trabalho muito bem explicado. Muito fácil de seguir. Quando eu terminar o meu projeto eu vou fazer upload de fotos. Obrigado.
Título: Re: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: TigPT em 26 de Outubro de 2015, 18:25
Obrigado. Qualquer dúvida avisa.
Título: Re: [Arduino]Stepper Motor + EasyDriver + Arduino
Enviado por: lua em 22 de Abril de 2016, 22:17
Olá, eu sou um novato no fórum e arduino.
Por favor, alguém me diga como sabria fazer para parar um passo para 10 min, entre rotação e volta de 180 graus? Ou seja, eu preciso do passo é transformar ininterruptamente 180, realizada em 10 min, outras 180 ° vire novamente parado 10 min ... e assim indefinidamente.
Eu entendo que você não pode usar micros (), millis () ou atraso (). Mas não como pará-lo.
Desculpe pelo meu mau Português.
e muito obrigado por qualquer ajuda
Uma saudação