サーボ付きステッパーの走行

私は自動ボックスキャリアであるプロジェクトをやっています。それは場所からボックスを保持し、その隣に移動します。 cncの仕事の種類。場所は固定されているだけで、注文を実行する必要があります。私は整数の配列を送信し、メインループのスイッチでそれらを管理したい。例えば

  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;

私の注文配列になります。ここには実行したいコードがあります。 arduinoステッパーとサーボにコードをアップロードすると、注文までうまくいく[8]。その命令にいつ来たのか。最初のサーボを30度にしてから0にし、クリック音が始まります。その後、ステッパーは残りのステップを実行していません。

#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;

*/



}

ありがとう。

0
thisStep が配列の長さよりも大きいためではないでしょうか?ループに if(thisStep> 10)thisStep = 0; を追加してみてください。
追加された 著者 Al.,

1 答え

ここで問題となるのは、10バイトの配列を持っていることです。これはうまくいきます。ループ内で停止したり、配列内にいることを確認したりすることはありません。

これが永遠に実行されるはずであれば、ループの最後に次のような行を追加することができます:

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

(-1の配列を持つため-1、0から9まで、sizeofは10を返します)

これは最初からやり直します。

1
追加された