Running Steppers met servo

Ik ben bezig met een project dat een automatische boxdrager is. Het zal een doos van een locatie bevatten en deze naast de doos verplaatsen. Een beetje cnc-werk. Locaties zijn gerepareerd, het hoeft alleen maar de bestellingen uit te voeren. Ik wil een array van gehele getallen verzenden en beheren in de switch onder de hoofdlus. bijvoorbeeld

  orders[0]=2;
  orders[1]=2000;

  orders[2]=3;
  orders[3]=60;

  orders[4]=1;
  orders[5]=7000;

  orders[6]=2;
  orders[7]=2000;

  orders[8]=3;
  orders[9]=90;

  orders[10]=1;
  orders[11]=2000;

zal mijn ordenreeks zijn en hier is de code die ik wil uitvoeren. Wanneer ik code upload naar Arduino-steppers en servo het prima doet tot orders [8]. Toen kwam dat bevel; de eerste servo gaat naar 30 graden en gaat dan naar 0 en het klikgeluid begint. Daarna doen steppers geen overgebleven stappen.

#include 
Servo myservo;

int distance=0;
int code =0;
int orders[10]={};
int thisStep=0;
int thisVal=1;
int pos = 0;
int currpos=90;
void setup() {
 //put your setup code here, to run once:
  Serial.begin(115200);

  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
  myservo.attach(9);

  orders[0]=2;
  orders[1]=7000;

  orders[2]=3;
  orders[3]=60;

  orders[4]=1;
  orders[5]=2000;

  orders[6]=2;
  orders[7]=2000;

  orders[8]=3;
  orders[9]=30;

  orders[10]=1;
  orders[11]=2000;

 /* orders[12]=2;
  orders[13]=5000;*/
}

void loop() {

  code = orders[thisStep];
  switch (code){
    case 1:

    go(orders[thisVal]);
    thisStep = thisStep + 2;
  thisVal = thisVal + 2;

    break;
    case 2:
     Serial.println(thisVal);
    goReverse(orders[thisVal]);
    thisStep = thisStep + 2;
    thisVal = thisVal + 2;

    break;

    case 3:
    goServo(orders[thisVal]);
    thisStep = thisStep + 2;
    thisVal = thisVal + 2;
    break;
  }

}
void go(int dist){
  digitalWrite(2,LOW);
  digitalWrite(4,LOW);
  do{
  digitalWrite(3,HIGH);
  digitalWrite(5,HIGH);
  delayMicroseconds(10);
  digitalWrite(3,LOW);
  digitalWrite(5,LOW);
  delayMicroseconds(10);
  distance = distance+1;
  Serial.println(distance);
  }while (dist>distance);
 distance=0;
 delay(500);
}
void goReverse(int dist){
  digitalWrite(2,HIGH);
  digitalWrite(4,HIGH);
  do{
  digitalWrite(3,HIGH);
  digitalWrite(5,HIGH);
  delayMicroseconds(300);
  digitalWrite(3,LOW);
  digitalWrite(5,LOW);
  delayMicroseconds(300);
  distance = distance+1;

  }while (dist>distance);
  distance=0;
  delay(500);
}

void goServo (int degree){
  myservo.attach(9);
  myservo.write(degree);

  delay(300);
   myservo.detach();
  /*if (currpos > degree)
  {
    for (pos = currpos; pos >= degree; pos -= 1) {//goes from 0 degrees to 180 degrees
     //in steps of 1 degree
       myservo.write(pos);             //tell servo to go to position in variable 'pos'
       delay(15);  
      //waits 15ms for the servo to reach the position
      }
      delay(500); 
  }
  else if (currpos < degree)
  {
    for (pos = currpos; pos <= degree; pos += 1) {//goes from 0 degrees to 180 degrees
     //in steps of 1 degree
       myservo.write(pos);             //tell servo to go to position in variable 'pos'
       delay(15);  
      //waits 15ms for the servo to reach the position
      }

  }
  currpos=degree;

*/



}

Bedankt.

0
Weet je zeker dat het niet komt doordat thisStep groter is dan de lengte van de array? Probeer toe te voegen als (thisStep> 10) thisStep = 0; aan de lus is.
toegevoegd de auteur Al., de bron

1 antwoord

Uw probleem hier is dat u een array van 10 bytes heeft, wat prima werkt, alleen dat u in uw lus niet stopt of controleert of u zich binnen die array bevindt.

Als dit voor altijd moet worden uitgevoerd, kun je aan het einde van je loop een regel als deze toevoegen:

if (thisStep > sizeof(orders)-1) thisStep = 0;

(-1 omdat je een array van 10 hebt, die van 0-9 komt, sizeof zal 10 teruggeven)

dit zal het vanaf het begin opnieuw laten beginnen.

1
toegevoegd