Запуск степперы з сервоприводом

Я раблю праект, які з'яўляецца аўтаматычнай каробкай апорным. Ён будзе трымаць скрынку ад месца і перамясціць яго побач з ім. Выгляд ЧПУ працы. Месца фіксаваны ён проста павінен працаваць заказы. Я хачу адправіць масіў цэлых лікаў і кіраваць імі ў перамыкачы пад асноўным цыклам. напрыклад

  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 быць больш, што даўжыня масіва? Паспрабуйце дадаць калі (thisStep> 10) thisStep = 0; да пятлі.
дададзена аўтар Al., крыніца

1 адказы

Ваша праблема ў тым, што ў вас ёсць масіў з 10 байт, які выдатна працуе, толькі тое, што ў цыкле вы не спыніць або праверыць, што вы знаходзіцеся ў межах гэтага масіва.

Калі гэта павінна працаваць вечна, вы можаце дадаць радок, як гэта ў канцы вашага цыкла:

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

(-1, таму што ў вас ёсць масіў з 10, якія з'яўляюцца 0-9, SizeOf верне 10)

гэта зробіць яго пачаць з самага пачатку зноў.

1
дададзена