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
-
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?!!!
-
ve aqui:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1272236261 (http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1272236261)
-
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.
-
da uma vista de olhos.. se es demasiado leigo para veres quais as funcoes, nao vejo como consigas fazer alguma coisa com elas..
-
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.
-
Entendes ingles?
-
ao que parece, basta meter um numero negativo e ele anda noutra direcçao
-
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();
}
-
e tens os pinos ligados pela ordem certa?
uma vista rapida pelo teu codigo e tens as declaraçoes dos motores mal feitas
-
Pinos repetidos para diferentes motores e tal, é normal que não funcionem bem..
Estás a ligar os motores directo no Arduino?
-
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. :(
-
Ele pede mesmo floats na aceleração e maxSpeed?
-
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).
-
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)
-
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.
-
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)
;)
-
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.
/*===================================================================================
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
-
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.
-
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
-
vou tentar fazer isso. vlw. ;)