Problema com motor de passo.

Ola pessoal tranquilo? estou tentando ter controle total sobre o motor de passo, e venho tendo o seguinte problema.

#include <Stepper.h>

const int stepsPerRevolution = 64;  
Stepper myStepper(stepsPerRevolution, 8,9,10,11);            

void setup() {
    myStepper.setSpeed(3600);
    pinMode(3,OUTPUT);
    pinMode(4,OUTPUT);
    digitalWrite(3,1);
    digitalWrite(4,1);
}

void loop() {
  int i,j,ligado;
 
   while(digitalRead(3)==0)
   {
     ligado=digitalRead(3);
      for(i=0;i<64;i++)
      {
        for(j=0;j<64;j++)
       {  
         if(digitalRead(3)==0)
            return;
          myStepper.step(1);
          delay(2);
         
       }
      }
      delay(500);
    }
  while(digitalRead(4)==0)
  {
    for(i=0;i<32;i++)
    {
       for(j=0;j<64;j++)
       {
         if(digitalRead(4)==0)
           return;
          myStepper.step(-1);
          delay(2);
       }
    }
  delay(500);
  }
}

1-meu intuito é apertar o botão, e ele começar a girar(tanto faz se vai ser pelo botão 3 ou 4 a logica vai ser a mesma), o que acontece eh que as vezes eu aperto ele funciona e eu aperto de novo ele para, (tudo ok até ai era o que eu queria) porem as vezes ele não funciona, ouvi que tem alguma coisa haver com delay nao sei ao certo, se alguem puder me ajudar.

Tanto quanto vejo, o problema está no delay(500)...

Não achas 3600 RPM uma velocidade um pouco exagerada para um motor de passo? Porque não 150 ou algo do género?

o 3600 ali só estava testando brincando mesmo, ele não interfere no caso =/ :grin:

maykids: o 3600 ali só estava testando brincando mesmo, ele não interfere no caso =/ :grin:

Porquê? Já tiraste do código? Sabes o que aquela instrucão faz? 3600 RPM está já na gama de turbinas e motores de avião. Ao colocares aquela instrucão ali, o teu código, sempre que tentas dar um passo, envia um pulso ridiculamente pequeno (para um motor de passo) para as bobinas do motor fazendo com que o motor não funcione como deve.

Ta ok, testei com 200 e continua a mesma coisa, eu aperto o botao as vezes ele funciona as vezes nao =/, alguma outra dica? obrigado :)

Os pinos que configuraste estão correctos?

Como estás a ligar o motor de passo ao Arduino?

#include <Stepper.h>

const int stepsPerRevolution = 64;
Stepper myStepper(stepsPerRevolution, 8,9,10,11);

void setup() {
myStepper.setSpeed(5);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
digitalWrite(3,1);
digitalWrite(4,1);
}

void loop() {

myStepper.step(100);
delay(1000);
myStepper.step(-100);
delay(1000);
}

Com este sketch vês algo acontecer?

Já viste o motor mexer?

Oh amigo, desculpa, acho que você não entendeu minha duvida. com aquele meu código la, ele funciona, (inclusive com esse que você passou não funcionou), que que acontece, esse é um problema que eu venho tendo inclusive quando mexo com LEDS, eu coloco esses whiles, para ler os dois botoes, e ai como o void loop() fica passando, as vezes ele não pega que eu apertei o botão. queria saber se tem um jeito de resolver isso. aquele meu código funciona, porem as vezes eu tenho que apertar duas vezes pra ele pegar. ta ficando uma estrutura desse jeito botao 3 se tiver apertado (gire horario) se botao 3 for pressionao durante os passos(emergencia) pare botao 4 se tiver apertado (gire anti horario) se botao 4 for pressionado durante os passos(pare)

Enquanto estás a correr os ciclos for, o motor não liga puto ao botão...

Mas tu queres que o motor ande enquanto o botão estiver pressionado ou que comece a andar quando o botão é pressionado e pare quando é pressionado de novo?

isso , quando eu aperto o botão, ele começa a funcionar e se eu apertar esse botão enquanto ele esteja funcionando ele pare, ele faz tudo isso, o problema é que as vezes ele não funciona, ta faltando alguma otimização no codigo, isso acontece muito comigo quando mexo com LEDS, faço varios botoes para acender determinado LED, e as vezes tenho que apertar 2 3 vezes pra lampada acender. tipo como se eu precisa-se de um thread pra pode fazer varias coisas ao mesmo tempo.

Não... tu tens condicões que se excluem... Isso não facilita.

void loop() {
unsigned char previous_button = 1, frente = 0, temp = 0; 

if ((temp = digitalRead(3)) != previous_button){
      frente = temp; 
} //se houve uma mudanca anda para a frente. 

if (frente == LOW) { //parece-me que os teus botões são activos em baixo.
   myStepper.step(1);
}

previous_button = temp; 
}

Se houver uma mudanca de estado no botão, o motor ou anda para a frente ou para. Não precisas de ter aqueles ciclos todos. Algo que tens de ter cuidado é em garantir que os botões não fazem bounce.

Este código deve funcionar para andar num sentido. Ao adicionares o código para andar no outro tens de adicionar mais umas condicões, mas não deve ser muito complicado. Nota que o que é importante é avaliares o botão a cada ciclo do loop para não perderes nenhum evento.

Já que falas em threads, este problema notar-se-ia num sistema com threads também uma vez que tu estás a correr um ciclo e não um yield para deixar a outra thread correr.

Olá...

Também não entendi o objetivo dos loops que estão no teu código (os while e for).

Quando usamos entradas digitais (botões ou sensores), Delays longos (e agora eu incluo os loops ]:)) atrapalham bastante a interação, pois enquanto o arduino esta no delay (ou no loop) "tudo para".

No início eu tive problemas com a livraria, então resolvi ver como a coisa funciona, passo a passo, e escrevi o código abaixo (coisa de novato :%).

//Set Pins for Motor 2
int mLeftP1 = 8;
int mLeftP2 = 9;
int mLeftP3 = 10;
int mLeftP4 = 11;
//Set Pins for Motor 1
int mRightP1 = 4;
int mRightP2 = 5;
int mRightP3 = 6;
int mRightP4 = 7;

int mLeftNextStep = 1;
int mRigthNextStep = 1;

int mDelayTime = 10;
unsigned long mLastTime; 

void setup(){
  Serial.begin(9600);
  Serial.println("Let's Play");
  
  //Set Pins for Motor Left
  pinMode(mLeftP1, OUTPUT);
  pinMode(mLeftP2, OUTPUT);
  pinMode(mLeftP3, OUTPUT);
  pinMode(mLeftP4, OUTPUT);
  
  //Set Pins for Motor Right
  pinMode(mRightP1, OUTPUT);
  pinMode(mRightP2, OUTPUT);
  pinMode(mRightP3, OUTPUT);
  pinMode(mRightP4, OUTPUT);
}

void loop(){ 
  if (Serial .available() > 0){
    char inChar = (char) Serial.read(); 
    if (inChar == '1'){
        //forward
      mLeftNextStep = MotorCCW(mLeftNextStep, mLeftP1, mLeftP2, mLeftP3, mLeftP4);
      mRigthNextStep = MotorCW(mRigthNextStep, mRightP1, mRightP2, mRightP3, mRightP4);
    }
    else if(inChar == '2'){//backward
      mLeftNextStep = MotorCW(mLeftNextStep, mLeftP1, mLeftP2, mLeftP3, mLeftP4);
      mRigthNextStep = MotorCCW(mRigthNextStep, mRightP1, mRightP2, mRightP3, mRightP4);
    }
    else if(inChar == '3'){//left
      mLeftNextStep = MotorCW(mLeftNextStep, mLeftP1, mLeftP2, mLeftP3, mLeftP4);
      mRigthNextStep = MotorCW(mRigthNextStep, mRightP1, mRightP2, mRightP3, mRightP4);
    }
    else if(inChar == '4'){//right
      mLeftNextStep = MotorCCW(mLeftNextStep, mLeftP1, mLeftP2, mLeftP3, mLeftP4);
      mRigthNextStep = MotorCCW(mRigthNextStep, mRightP1, mRightP2, mRightP3, mRightP4);
    }
    else if(inChar == '0') {//Stop
      MotorStop(mLeftP1, mLeftP2, mLeftP3, mLeftP4);
      MotorStop(mRightP1, mRightP2, mRightP3, mRightP4);}
    else
      Serial.println("Bad Command");
  }
}

void MotorStop(int mPin1, int mPin2, int mPin3, int mPin4){
  digitalWrite(mPin4, LOW);
  digitalWrite(mPin3, LOW);
  digitalWrite(mPin2, LOW);
  digitalWrite(mPin1, LOW);
}

int MotorCW(int Step, int mPin1, int mPin2, int mPin3, int mPin4){  
  switch(Step){
    case 1:
      digitalWrite(mPin4, HIGH);
      digitalWrite(mPin3, LOW);
      digitalWrite(mPin2, LOW);
      digitalWrite(mPin1, LOW);
      break;
    case 2:
      digitalWrite(mPin4, LOW);
      digitalWrite(mPin3, HIGH);
      digitalWrite(mPin2, LOW);
      digitalWrite(mPin1, LOW);
      break;
    case 3:
      digitalWrite(mPin4, LOW);
      digitalWrite(mPin3, LOW);
      digitalWrite(mPin2, HIGH);
      digitalWrite(mPin1, LOW);
      break;
    case 4:
      digitalWrite(mPin4, LOW);
      digitalWrite(mPin3, LOW);
      digitalWrite(mPin2, LOW);
      digitalWrite(mPin1, HIGH);
      break;
  }

  if (Step == 4)
    Step = 1;
  else
    Step++;
    
    return Step;
}

int MotorCCW(int Step, int mPin1, int mPin2, int mPin3, int mPin4){
  switch(Step) {
    case 4:
      digitalWrite(mPin4, LOW);
      digitalWrite(mPin3, LOW);
      digitalWrite(mPin2, LOW);
      digitalWrite(mPin1, HIGH);
      break;
    case 3:
      digitalWrite(mPin4, LOW);
      digitalWrite(mPin3, LOW);
      digitalWrite(mPin2, HIGH);
      digitalWrite(mPin1, LOW);
      break;
    case 2:
      digitalWrite(mPin4, LOW);
      digitalWrite(mPin3, HIGH);
      digitalWrite(mPin2, LOW);
      digitalWrite(mPin1, LOW);
      break;
    case 1:
      digitalWrite(mPin4, HIGH);
      digitalWrite(mPin3, LOW);
      digitalWrite(mPin2, LOW);
      digitalWrite(mPin1, LOW);
      break;
  }
  
  if (Step == 1)
     Step = 4;
   else
     Step--;
     
   return Step;
}

int HalfMotorCW(int Step,int mPin1, int mPin2, int mPin3, int mPin4){
  switch(Step) {
    case 1:
      digitalWrite(mPin4, HIGH);
      digitalWrite(mPin3, LOW);
      digitalWrite(mPin2, LOW);
      digitalWrite(mPin1, LOW);
      break;
    case 2:
      digitalWrite(mPin4, HIGH);
      digitalWrite(mPin3, HIGH);
      digitalWrite(mPin2, LOW);
      digitalWrite(mPin1, LOW);
      break;
    case 3:
      digitalWrite(mPin4, LOW);
      digitalWrite(mPin3, HIGH);
      digitalWrite(mPin2, LOW);
      digitalWrite(mPin1, LOW);
      break;
    case 4:
      digitalWrite(mPin4, LOW);
      digitalWrite(mPin3, HIGH);
      digitalWrite(mPin2, HIGH);
      digitalWrite(mPin1, LOW);
      break;
    case 5:
      digitalWrite(mPin4, LOW);
      digitalWrite(mPin3, LOW);
      digitalWrite(mPin2, HIGH);
      digitalWrite(mPin1, LOW);
      break;
    case 6:
      digitalWrite(mPin4, LOW);
      digitalWrite(mPin3, LOW);
      digitalWrite(mPin2, HIGH);
      digitalWrite(mPin1, HIGH);
      break;
    case 7:
      digitalWrite(mPin4, LOW);
      digitalWrite(mPin3, LOW);
      digitalWrite(mPin2, LOW);
      digitalWrite(mPin1, HIGH);
      break;
    case 8:
      digitalWrite(mPin4, HIGH);
      digitalWrite(mPin3, LOW);
      digitalWrite(mPin2, LOW);
      digitalWrite(mPin1, HIGH);
      break;
  }
  
  if (Step == 1)
     Step = 4;
   else
     Step--;
     
   return Step;
}

int HalfMotorCCW(int Step,int mPin1, int mPin2, int mPin3, int mPin4){
  switch(Step) {
    case 8:
      digitalWrite(mPin4, HIGH);
      digitalWrite(mPin3, LOW);
      digitalWrite(mPin2, LOW);
      digitalWrite(mPin1, HIGH);
      break;
    case 7:
      digitalWrite(mPin4, LOW);
      digitalWrite(mPin3, LOW);
      digitalWrite(mPin2, LOW);
      digitalWrite(mPin1, HIGH);
      break;
    case 6:
      digitalWrite(mPin4, LOW);
      digitalWrite(mPin3, LOW);
      digitalWrite(mPin2, HIGH);
      digitalWrite(mPin1, HIGH);
      break;
    case 5:
      digitalWrite(mPin4, LOW);
      digitalWrite(mPin3, LOW);
      digitalWrite(mPin2, HIGH);
      digitalWrite(mPin1, LOW);
      break;
    case 4:
      digitalWrite(mPin4, LOW);
      digitalWrite(mPin3, HIGH);
      digitalWrite(mPin2, HIGH);
      digitalWrite(mPin1, LOW);
      break;
    case 3:
      digitalWrite(mPin4, LOW);
      digitalWrite(mPin3, HIGH);
      digitalWrite(mPin2, LOW);
      digitalWrite(mPin1, LOW);
      break;
    case 2:
      digitalWrite(mPin4, HIGH);
      digitalWrite(mPin3, HIGH);
      digitalWrite(mPin2, LOW);
      digitalWrite(mPin1, LOW);
      break;
    case 1:
      digitalWrite(mPin4, HIGH);
      digitalWrite(mPin3, LOW);
      digitalWrite(mPin2, LOW);
      digitalWrite(mPin1, LOW);
      break;
  }
  
  if (Step == 1)
     Step = 4;
   else
     Step--;
     
   return Step;
}

Sobre o resto, não há mais nada a acrescentar ao que o bubulindo já falou.