LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: fabio.sales em 02 de Junho de 2011, 13:36

Título: Motores de Passo
Enviado por: fabio.sales em 02 de Junho de 2011, 13:36
Bom dia pessoal sou novo aq no forum, então me ajudem a resolver essa.
Minha intenção é controlar 2 motores de passo simultaneamente, pois usarei em um robo controlado por controle remoto(TV).
Uso a biblioteca #include <Stepper.h> padrão do arduino, mas o problema é que ela só controla um motor por vez e não os dois ao mesmo tempo. ALGUEM TEM A SOLUÇÂO?!!!
Título: Re: Motores de Passo
Enviado por: xiserre em 02 de Junho de 2011, 14:07
ve aqui:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1272236261 (http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1272236261)
Título: Re: Motores de Passo
Enviado por: fabio.sales em 02 de Junho de 2011, 15:50
Muito bom essa biblioteca vlw.
Mais uma duvida. quais funções nessa biblioteca servem para controlar a direção e colocar para rodar os motores? Grato e desculpe minha leiguisse.
Título: Re: Motores de Passo
Enviado por: xiserre em 02 de Junho de 2011, 15:54
da uma vista de olhos.. se es demasiado leigo para veres quais as funcoes, nao vejo como consigas fazer alguma coisa com elas..
Título: Re: Motores de Passo
Enviado por: fabio.sales em 02 de Junho de 2011, 18:14
as funções eu consigo ver só não saquei ainda onde é que ele da o comando da direção e se é o motor1.run() que da o comando de rodar o motor.
Minha duvida agora é como especificar a direção e o andar.
Título: Re: Motores de Passo
Enviado por: senso em 02 de Junho de 2011, 18:15
Entendes ingles?
Título: Re: Motores de Passo
Enviado por: xiserre em 02 de Junho de 2011, 18:49
ao que parece, basta meter um numero negativo e ele anda noutra direcçao
Título: Re: Motores de Passo
Enviado por: fabio.sales em 02 de Junho de 2011, 18:49
O suficiente! Dei uma estuda e estou usando esse codigo exemplo da propria biblioteca.
Mas o motor apenas vibra! >:(


#include <AccelStepper.h>

// Define some steppers and the pins the will use
AccelStepper stepper1; // Defaults to 4 pins on 2, 3, 4, 5
AccelStepper stepper2(4, 6, 7, 8, 9);
AccelStepper stepper3(2, 10, 11);

void setup()

    stepper1.setMaxSpeed(200.0);
    stepper1.setAcceleration(100.0);
    stepper1.moveTo(24);
   
    stepper2.setMaxSpeed(300.0);
    stepper2.setAcceleration(100.0);
    stepper2.moveTo(1000000);
   
    stepper3.setMaxSpeed(300.0);
    stepper3.setAcceleration(100.0);
    stepper3.moveTo(1000000);
}

void loop()
{
    // Change direction at the limits
    if (stepper1.distanceToGo() == 0)
   stepper1.moveTo(-stepper1.currentPosition());
    stepper1.run();
    stepper2.run();
    stepper3.run();
}
Título: Re: Motores de Passo
Enviado por: xiserre em 02 de Junho de 2011, 19:12
e tens os pinos ligados pela ordem certa?
uma vista rapida pelo teu codigo e tens as declaraçoes dos motores mal feitas
Título: Re: Motores de Passo
Enviado por: senso em 02 de Junho de 2011, 19:22
Pinos repetidos para diferentes motores e tal, é normal que não funcionem bem..
Estás a ligar os motores directo no Arduino?
Título: Re: Motores de Passo
Enviado por: fabio.sales em 02 de Junho de 2011, 19:29
ok!Já resolvi o primeiro problema que era rodar o motor. A questão da ordem estava erra mesmo, pois, na biblioteca padrão do arduino a ordem é uma e nessa biblioteca a ordem é outra. responde a questão do amigo que disse que o codigo estava errado na declaração(esse codigo é o codigo exemplo da biblioteca #include <AccelStepper.h>).
Agora o problema esta na aceleração que eu não consigo mudar a velocidade, coloco todos os valores mas continua no mesmo ritimo. :(
Título: Re: Motores de Passo
Enviado por: senso em 02 de Junho de 2011, 19:30
Ele pede mesmo floats na aceleração e maxSpeed?
Título: Re: Motores de Passo
Enviado por: fabio.sales em 02 de Junho de 2011, 19:31
Não! estou usando o CI (ULN 2803) mas não estou repetindo os pinos no codigo não o primeiro valor é para definir quantos fios tem o motor( ou passos).
Título: Re: Motores de Passo
Enviado por: fabio.sales em 02 de Junho de 2011, 19:33
o site que explica a biblioteca que uso é:
http://www.open.com.au/mikem/arduino/AccelStepper/classAccelStepper.html#e79c49ad69d5ccc9da0ee691fa4ca235 (http://www.open.com.au/mikem/arduino/AccelStepper/classAccelStepper.html#e79c49ad69d5ccc9da0ee691fa4ca235)
Título: Re: Motores de Passo
Enviado por: senso em 02 de Junho de 2011, 19:46
AccelStepper stepper1; // Defaults to 4 pins on 2, 3, 4, 5
AccelStepper stepper2(4, 6, 7, 8, 9);
AccelStepper stepper3(2, 10, 11);

O motor 1 e 3 partilham o pino 2, o motor 1 e 2 partilham o pino 4, logo tem sobre-posição.
Título: Re: Motores de Passo
Enviado por: fabio.sales em 02 de Junho de 2011, 19:52
Acho que esta errado!Pelo que eu entendi a primeira declaração no vetor é para indicar quantos fios ou pinos será usado nesse motor:
AccelStepper stepper1; // Defaults to 4 pins on 2, 3, 4, 5
AccelStepper stepper2(4, 6, 7, 8, 9);
AccelStepper stepper3(2, 10, 11);

motor 1 usara 4 pinos são eles(2,3,4,5)
motor 2 usara 4 pinos são eles(6,7,8,9)
motor 3 usara 2 pinos são eles(10,11)
  ;)
Título: Re: Motores de Passo
Enviado por: StarRider em 11 de Junho de 2011, 02:55
Bom dia pessoal sou novo aq no forum, então me ajudem a resolver essa.
Minha intenção é controlar 2 motores de passo simultaneamente, pois usarei em um robo controlado por controle remoto(TV).
Uso a biblioteca #include <Stepper.h> padrão do arduino, mas o problema é que ela só controla um motor por vez e não os dois ao mesmo tempo. ALGUEM TEM A SOLUÇÂO?!!!

Boas,

Sabes qual é a melhor solução ? ESQUECER esse tal arduino e manipular o uC usando os registos do mesmo !!!!

Ok, sei que não contribui em nada para resolver o teu problema ... mas hoje apeteceu-me bater no arduino ;)

Mover um stepper com o ULN 2803 é estupidamente fácil, basta meia dúzia de linhas de código ... aqui fica um exemplo
que serve para controlar 4 motores usando duas portas (16 pins), mas que pode ser facilmente encurtado para usar
somente uma porta e controlar 2 steppers.


Código: [Seleccione]
/*===================================================================================
Project : FFBox
Date    : 16-01-2003
Author  : Paulo d'Almeida
Comments: Stepper driver for AVR
====================================================================================*/

//----- Local vars
//
char Seqindex0=0,Seqindex1=0,Seqindex2=0,Seqindex3=0;
unsigned char SeqMaskLOW[4] = {0b00001001 ,0b00001010 ,0b00000110 ,0b00000101};
unsigned char SeqMaskHI[4] = {0b10010000 ,0b10100000 ,0b01100000 ,0b01010000};

//==============================================================================
//----- Funcs

//------------------------------------------------------------------------------
//
// Stepper 0 - PORTC - LOW_NIBLE
// Stepper 1 - PORTC - HI_NIBLE
// Stepper 2 - PORTA - HI_NIBLE
// Stepper 3 - PORTA - LOW_NIBLE
//
void Stepper_Step(char astepper,unsigned char dir)
{
   if (astepper==0)         
      Stepper0_Step(dir);
   else if (astepper==1)
      Stepper1_Step(dir);
   else if (astepper==2)
      Stepper2_Step(dir);
   else if (astepper==3)
      Stepper3_Step(dir);
}
//------------------------------------------------------------------------------
void Stepper0_Step(unsigned char dir)
{
   if (dir)   // DIR_CW > 0
   Seqindex0++;
else
   Seqindex0--;

if (Seqindex0<0)
   Seqindex0=3;
else if (Seqindex0>3)
   Seqindex0=0;                                                 

   PORTC = (PORTC & 0xf0) | SeqMaskLOW[Seqindex0];

}
//------------------------------------------------------------------------------
void Stepper1_Step(unsigned char dir)
{
   if (dir)   // DIR_CW > 0
   Seqindex1++;
else
   Seqindex1--;

if (Seqindex1<0)
   Seqindex1=3;
else if (Seqindex1>3)
   Seqindex1=0;                                                 

   PORTC = (PORTC & 0x0f) | SeqMaskHI[Seqindex1];
}
//------------------------------------------------------------------------------
void Stepper2_Step(unsigned char dir)
{
   if (dir) //DIR_CW > 0
   Seqindex2++;
else
   Seqindex2--;

if (Seqindex2<0)
   Seqindex2=3;
else if (Seqindex2>3)
   Seqindex2=0;                                                 

   PORTA = (PORTA & 0x0f) | SeqMaskHI[Seqindex2];
}
//------------------------------------------------------------------------------
void Stepper3_Step(unsigned char dir)
{
   if (dir) //DIR_CW > 0
   Seqindex3++;
else
   Seqindex3--;

if (Seqindex3<0)
   Seqindex3=3;
else if (Seqindex3>3)
   Seqindex3=0;                                                 

   PORTA = (PORTA & 0xf0) | SeqMaskLOW[Seqindex3];
}
//------------------------------------------------------------------------------
//
void Steppers_Unenergize(void)
{
/*
   PORTC = (PORTC & 0xf0);
   PORTC = (PORTC & 0x0f);
   PORTA = (PORTA & 0x0f);
   PORTA = (PORTA & 0xf0);
*/
   PORTC = 0x00;
   PORTA = 0x00;
}       
//------------------------------------------------------------------------------
//
void Stepper_BatchStep(char astepper,char dir, int steps)
{     
char acel=50;

while(steps && acel) {
    steps--;                         
    Stepper_Step(astepper,dir);
           delay_ms(4);
            acel--;
}
while(steps) {
steps--;                         
Stepper_Step(astepper,dir);
                delay_ms(2);
}
}
//------------------------------------------------------------------------------



Abraços,
PA

Título: Re: Motores de Passo
Enviado por: fabio.sales em 14 de Junho de 2011, 12:53
Bom dia.
Realmente é facil controlar o Motor usando o ULN 2803. Vlw pelo codigo, mas manipular é dos menores problemas, o meu maior problema é controlar a velocidade de um motor sem afetar a velocidade de um outro motor. Essa parte do meu projeto sera aplicada ao movimento de um carro, que apenas usara dois motores de passo para isso. Grato pela a ajuda.
Título: Re: Motores de Passo
Enviado por: StarRider em 20 de Junho de 2011, 13:12
Bom dia.
Realmente é facil controlar o Motor usando o ULN 2803. Vlw pelo codigo, mas manipular é dos menores problemas, o meu maior problema é controlar a velocidade de um motor sem afetar a velocidade de um outro motor. Essa parte do meu projeto sera aplicada ao movimento de um carro, que apenas usara dois motores de passo para isso. Grato pela a ajuda.

Boas fabio,

Para controlar a velocidade tens que usar um temporizador e avançar um passo a uma determina frequência,  frequência essa que
controlas manipulando o duty de um timer.

Ou seja, configuras um timer e usar o interrupt da comparação para fazer avançar um passo do motor, se a velocidade de
cada motor for diferente entre si tens que usar dois comparadores.

O código para fazer avançar um passo que vais usar dentro do interrupt deve ser compacto e directo, por isso o melhor é
mesmo manipular as portas (como no meu exemplo) em vez de usar a lib do arduino.

Mesmo usando o arduino podes sempre usar código de mais baixo nível para controlar e manipular os registos do AVR

Abraços,
PA
Título: Re: Motores de Passo
Enviado por: fabio.sales em 27 de Junho de 2011, 19:40
vou tentar fazer isso. vlw. ;)