Pages: [1]   Go Down
Author Topic: PROGRAMAÇÃO MOTOR DE PASSO  (Read 6349 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Galera, eu comprei um arduino 2009, mas eu não entendo nada desse tipo de programação, eu estou pesquisando mas mesmo assim ainda estou muito confuso, gostaria que voces me ajudassem com o seguinte, (é um programa muito simples mas nao consigo executar, se alguem estiver disposto a me ajudar agradeceria muito):

Preciso controlar 2 motores de passo, o programa iria fazer o seguinte:
1) Girar o primeiro motor de passo por 9 passos e depois disso ele iria parar.
2) Assim que o primeiro motor parasse, o segundo motor iria girar 19 passos e após isso iria parar

Só isso o programa é bem simples consiste em girar o primeiro motor, para-lo e em seguida girar um segundo motor e finalizar o programa, so que eu estou encontrando muita dificuldade pra fazer isso  :-/.

Como eu vou informar no programa os pinos onde os motores esteriam conectado ? (eu ja fiz os DOIS circuitos no protoboard com o ULN2003) mas agora parei nisso eu não sei COMO FAZER O PROGRAMA e QUAIS PINOS DO ARDUINO LIGAR NOS CI's

Grato
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 41
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Podes ligar em qualquer pino, desde que no program declares qual o pino que usaste, o IDE tem um exemplo para um stepper, e um potenciometro, faz isso, se funcionar, percebe melhor o código, e não deve ser dificil adicionar outro stepper, e fazer o que queres  smiley-wink
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Então eu dei um molhada em algumas programações, so que assim eu consigo ligar 2 motores mas nao consigo definir o quanto de "passos" cada um deles vai dar será que alguem pode me ajudar com isso ?

Olha como ta minha programação:

"int motorPin1 = 8;
int motorPin2 = 9;
int motorPin3 = 10;
int motorPin4 = 11;
int delayTime = 500;

void setup() {
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
}

void loop() {
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delay(delayTime);
}
"

A programação está feita, mas nesse exemplo apenas o motor vai girar sem nenhuma precisão, eu preciso definir o NÚMERO DE PASSOS QUE O MOTOR VAI DAR e a VELOCIDADE,

AJUDA  :-/
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 70
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

cara eu tenho uns programinhas pra testar isso em casa, assim que chegar lá te mando.
« Last Edit: May 06, 2010, 08:26:07 am by arilsonm » Logged

Curitiba PR, Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 259
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Amigo já viu a biblioteca disponível para isso?

http://arduino.cc/en/Reference/Stepper

você configura seus motores assim por exemplo:

Code:
include <Stepper.h>

Stepper motor1(num_passos, pino1, pino2, pino3,pino4); // num_passos, é o numero de passos que seu motor executa em 1 volta, se nao souber pode chutar
Stepper motor2(num_passos, pino1, pino2, pino3,pino4); // o numero de passos serve para calcular a velocidade


void setup()
{
    motor1.setSpeed(veloc); // seta velocidade em rpm
    motor2.setSpeed(veloc);
}

void loop()
{
      motor1.step(passos); // passos, é o numero de passos que voce deseja que o motor execute
      motor2.step(passos);
      
      delay(1000);
}
Logged

Sao Paulo - Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 268
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

A biblioteca resolve muto bem!
mas você pode fazer seu próprio código tbm, diga nos se estiver interessado!
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 70
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

     Cara essa biblioteca que Osias mostrou é o teu caminho, é simples e resolve.
     Não esqueça que você terá que amplificar o sinal através de transistores de potência (EX. TIP31) ou mosfets tipo IRF620, e uma fonte externa deverá ser usada.
Qual o transistor, qual fonte e qual o tipo de controle dependerá da especificação do teu motor e do que você quer fazer com ele.

     Esse modo de controle direto da potência (com 4 pinos, um pra cada bobina do motor)é chamado phase drive e pode ser usado se você não precisa de muito torque nem muita velocidade.
     Existe uma outra maneira de controlar motores de passo chamada Chopper ou step-dir (passo e direção)  onde se usa apenas dois pinos do uControlador, um controla os passos e o outro a direção do giro.
    A placa fica mais complicada e usa um CI tipo o L297 que é quem controla a carga, porem, com esse tipo de controladora consegue-se mais torque e velocidade.
« Last Edit: May 06, 2010, 01:46:48 pm by arilsonm » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Certo osias, me ajudou bastante agora somente algumas perguntas para finalizar ^^

1) No código que você me passou os dois motores trabalham juntos ou seja enquanto um deles anda por exemplo 10 passos o outro motor ao mesmo funciona por exemplo dando 15 passos, mas o que eu preciso é exatamente o oposto, eu preciso que o motor 1 de 10 passos e somente após que o primeiro motor dar os 10 passos o segundo motor ligue dando outros 15 passos (os motores nao podem trabalhar ao mesmo tempo)

2) o meu motor tem 200 passos se na linha dos passos eu colocar o número negativo na frente, por exemplo: motor2.step(-40) o motor vai girar no outro sentido ? se não for isso como eu faço para ele girar no sentido oposto

3) pelo que vi na programação, após isso o arduino iria executar um LOOP ou seja aposs 1000 de delay, os motores iriam fazer a mesma operação e isso nao pode acontecer, por exemplo após o segundo motor dar X passos ele teria que encerrar o programa, se eu colocar delay = 0 isso acontece ?


obrigado pela atenção
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 70
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

na questão:
 1 O programa do Osias faz  oque você quer, ou seja executa a primeira instrução até o fim,
motor1.step(passos);
depois de dar todos os passos executa a segunda instrução,
motor1.step(passos)


na questão:
2 Acredito que sua suposição esteja certa pois pelo exemplo na pagina da biblioteca não há restrições em se usar números negativos e parece algo lógico, mas também, dá pra testar;

na questão:
3 você tem razão, estando dentro do loop vai ficar repetindo com o codigo como está, você deveria criar funções e chamar estas a partir do seu programa.  

colocando 0 de delay você estária acelerando o loop e não interrompendo.
você não quer descrever melhor o que você quer fazer pra gente ter idéia de como lhe ajudar?
Você disse que quer que faça esse movimento 1 vez só, mas nunca mais vai fazer?
Não volta ao estado inicial?
Não há interação com o usuário?
Em que momento executar o procedimento?
Você pode começar os testes usando leds ligados aos pinos do arduino(em série com resistores de 1k), se colocar velocidades bem baixas vai ver os leds piscando em sequência é bem legal smiley      
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 1
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

então arilson, obrigado pela atenção, aqui é o BRENO mas estou respondendo da conta de um amigo.

o que eu quero fazer é o seguinte:

Toda hora eu vou precisar mudar o numero de passos do MOTOR 1, ou seja ele vai executar uma vez o programa com por exemplo 12 passos, depois que o programa terminar o usuário iria na própria programação do arduino e mudaria o valor de passos do primeiro motor, por exemplo 25 passos após mudar o número de passos no programa o usuário iria dar um UPLOAD no programa e a programação que o OSIAS me passou iria se repitir mas agora com outro valor de passo no MOTOR 1, ou seja o programa não poderia executar um LOOP pois toda hora que os motores executassem a tarefa com por exemplo 10 passos, o usuario teria que mudar o valor no proprio programa do arduino. O único problema é que esses passos que o MOTOR 1 irá dar não são passos previamente definidos eles são passos aleatórios ou seja, não posso colocar no programa um número certo de passos, toda vez eu precisarei mudar o número de passos a partir do programa do arduino e não pode fazer LOOP, resumindo, o programa tem que executar uma única vez a programação e após isso eu irei mudar o número de passos no programa e dar um NOVO UPLOAD para executar o programa, mas agora com um novo valor de passos


--> só mas uma duvida, qual o valor em RPM que eu coloco no programa para os motores de passo ? eu que decido esse valor ou tem algum específico

--> para eu testar o programa com os leds qual o valor da velocidade eu coloco ? Uns 5 RPM ?

Obrigado pela atenção
Logged

Curitiba PR, Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 259
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Breno, para que o programa execute apenas uma vez, e não faça mais nada até um reset físico, você deve colocar as funções dentro apenas do setup.

Funciona assim, o setup executa apenas uma vez, quando você liga o controlador, logo em seguida ele executa o loop, e ao terminar ele volta ao inicio do loop e fica executando sempre.

Deixando o loop() vazio, ele não fará "nada" até que você resete o controlador.

ficaria assim:

Code:
include <Stepper.h>

Stepper motor1(num_passos, pino1, pino2, pino3,pino4); // num_passos, é o numero de passos que seu motor executa em 1 volta, se nao souber pode chutar
Stepper motor2(num_passos, pino1, pino2, pino3,pino4); // o numero de passos serve para calcular a velocidade


void setup()
{
    motor1.setSpeed(veloc); // seta velocidade em rpm
    motor2.setSpeed(veloc);

    motor1.step(passos); // passos, é o numero de passos que voce deseja que o motor execute
    motor2.step(passos);
}

void loop()
{
}
 

Só por curiosidade, quando você manda compilar, o Arduino gera um código parecido com esse:

Code:
void main()
{  
   setup();

   while(1)
   {
      loop();
    }
}

Logged

Curitiba PR, Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 259
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Só respondendo suas outras perguntas,

se você colocar valor negativo para os passos, ele irá girar no sentido ao contrário sim,

o RPM você define de acordo com a velocidade que você quer, para testar com leds, vai experimentando... diminui a velocidade até você ver claramente... 5 RPM talvez fique bem lento, mas começa dae e vai testando.
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 70
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Agora tu resolve, isso vai funcionar pra entender, porem a grande vantagem do Arduino é justamente processar informações autonomamente, sem precisar de um computador, mas pra começar tá muito bom, boa sorte!
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nossa valeu mesmo, voces ajudaram muito agora so mais uma perguintinha e eu finalizo meu projeto xD:


O meu motor de passo tem 6 fios (é um motor unipolar) eu ja consigui distinguir os dois lados:

Lado 1 (3 Fios): Preto, Vermelho, Azul
Lado 2 (3 Fios): Amarelo, Branco, Laranja

só que tem um problema eu sei que de cada lado existe 1 fio comum (onde eu vou ligar esse fio na alimentação) mas eu nao to conseguindo identificar esses fios comuns e o pior eu não consigui achar nenhum datasheet do meu motor =/ (comprei ele usado)

e outra depois que eu identificar os 2 fios comuns os outros 4 fios é so eu ligar nas saidas do ULN2003 ou eu preciso identificar o fio A no lado 1 e o fio A no lado 2 ?
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 70
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Breno pra identificar os comuns faça assim,
com um multimetro meça a resistência entre os fios
Preto e vermelho
Preto e azul
vermelho e azul

Ex (vamos dizer que cada bobina do seu motor tem 15R)
então você deve ler algo assim:
Preto e vermelho 15R
Preto e azul 15 R
vermelho e azul 30 R
O preto é o teu comum, percebe que quando mede pelo preto tem a resistência de apenas uma bobina?
Agora é só repetir pro outro grupo de fios.
Busque por um esquematico de motor de passo que vai entender oque estou falando, agora a ordem das bobinas só testando são 24 combinações possiveis:-/  
Espero que você esteja com sorte smiley

Logged

Pages: [1]   Go Up
Jump to: