Skocz do zawartości

Arduino UNO, sterowanie robotem - skrócenie programu


Miczki16

Pomocna odpowiedź

Dzień dobry, mam pytanie czy można jakoś skrócić ten program?

#include <Servo.h>

Servo top;
Servo bottom;
Servo right;
Servo left;

int pos[3];
unsigned long oldTimer[1];

void setup()
{
  pos[0]=30; pos[1]=90; pos[2]=20; pos[3]=90;
  top.attach(5);
  bottom.attach(9);
  right.attach(10);
  left.attach(6);
}
void loop()
{
 
  top.write(pos[0]);
  bottom.write(pos[1]);
  right.write(pos[2]);
  left.write(pos[3]);
  delay(1000);


  cz1:                  // jedź

  unsigned long timer1 = millis();
  if(timer1 - oldTimer[0] >= 10)
  {
    oldTimer[0] = timer1;
    top.write(pos[0]);
    bottom.write(pos[1]);
    left.write(pos[3]);
    pos[0]++; pos[1]++; pos[3]++;
    if(pos[0] == 100) top.detach();
    if(pos[1] == 180) {top.attach(5); pos[0]=100; pos[1]=180; pos[3]=100; goto cz2;}
    if(pos[3] == 100) left.detach();
  }

  goto cz1;

  cz2:                  // do przodu

  unsigned long timer2 = millis();
  if(timer2 - oldTimer[0] >= 10)
  {
    oldTimer[0] = timer2;
    right.write(pos[2]);
    pos[2]++;
    if(pos[2] == 70) {pos[2]=70; goto cz3;}
  }

  goto cz2;

  cz3:                  // chwyć

  unsigned long timer3 = millis();
  if(timer3 - oldTimer[0] >= 15)
  {
    oldTimer[0] = timer3;
    top.write(pos[0]);
    pos[0]--;
    if(pos[0] == 40) {pos[0]=40; goto cz4;}
  }

  goto cz3;

  cz4:                 // do tyłu

  unsigned long timer4 = millis();
  if(timer4 - oldTimer[0] >= 10)
  {
    oldTimer[0] = timer4;
    right.write(pos[2]);
    pos[2]--;
    if(pos[2] == 20) {pos[2]=20; right.detach(); goto cz5;}
  }

  goto cz4;

  cz5:                // obrót o 180

  unsigned long timer5 = millis();
  if(timer5 - oldTimer[0] >= 10)
  {
    oldTimer[0] = timer5;
    bottom.write(pos[1]);
    pos[1]--;
    if(pos[1] == 0) {pos[1]=0; right.attach(10); goto cz6;}
  }

  goto cz5;

  cz6:               // do przodu

  unsigned long timer6 = millis();
  if(timer6 - oldTimer[0] >= 10)
  {
    oldTimer[0] = timer6;
    right.write(pos[2]);
    pos[2]++;
    if(pos[2] == 70) {pos[2]=70; goto cz7;}
  }

  goto cz6;

  cz7:              // puść

  unsigned long timer7 = millis();
  if(timer7 - oldTimer[0] >= 15)
  {
    oldTimer[0] = timer7;
    top.write(pos[0]);
    pos[0]++;
    if(pos[0] == 100) {pos[0]=100; goto cz8;}
  }

  goto cz7;

  cz8:            // do tyłu

  unsigned long timer8 = millis();
  if(timer8 - oldTimer[0] >= 10)
  {
    oldTimer[0] = timer8;
    right.write(pos[2]);
    pos[2]--;
    if(pos[2] == 20) {pos[2]=20; goto cz9;}
  }

  goto cz8;

  cz9:          // do przodu;

  unsigned long timer9 = millis();
  if(timer9 - oldTimer[0] >= 10)
  {
    oldTimer[0] = timer9;
    right.write(pos[2]);
    pos[2]++;
    if(pos[2] == 70) {pos[2]=70; goto cz10;}
  }

  goto cz9;

  cz10:         // chwyć

  unsigned long timer10 = millis();
  if(timer10 - oldTimer[0] >= 15)
  {
    oldTimer[0] = timer10;
    top.write(pos[0]);
    pos[0]--;
    if(pos[0] == 40) {pos[0]=40; goto cz11;}
  }

  goto cz10;

  cz11:        // do tyłu

  unsigned long timer11 = millis();
  if(timer11 - oldTimer[0] >= 10)
  {
    oldTimer[0] = timer11;
    right.write(pos[2]);
    pos[2]--;
    if(pos[2] == 20) {pos[2]=20; goto cz12;}
  }

  goto cz11;

  cz12:        // obrót do 0

  unsigned long timer12 = millis();
  if(timer12 - oldTimer[0] >= 10)
  {
    oldTimer[0] = timer12;
    bottom.write(pos[1]);
    pos[1]++;
    if(pos[1] == 180) {pos[1]=180; goto cz13;}
  }

  goto cz12;

  cz13:      // do przodu

  unsigned long timer13 = millis();
  if(timer13 - oldTimer[0] >= 10)
  {
    oldTimer[0] = timer13;
    right.write(pos[2]);
    pos[2]++;
    if(pos[2] == 70) {pos[2]=70; goto cz14;}
  }

  goto cz13;

  cz14:           // puść

  unsigned long timer14 = millis();
  if(timer14 - oldTimer[0] >= 15)
  {
    oldTimer[0] = timer14;
    top.write(pos[0]);
    pos[0]++;
    if(pos[0] == 100) {pos[0]=100; goto cz15;}
  }

  goto cz14;

  cz15:             // do tyłu

  unsigned long timer15 = millis();
  if(timer15 - oldTimer[0] >= 10)
  {
    oldTimer[0] = timer15;
    right.write(pos[2]);
    pos[2]--;
    if(pos[2] == 20) {pos[2]=20; goto cz16;}
  }

  goto cz15;

  cz16:            // do przodu

  unsigned long timer16 = millis();
  if(timer16 - oldTimer[0] >= 10)
  {
    oldTimer[0] = timer16;
    right.write(pos[2]);
    pos[2]++;
    if(pos[2] == 70) {pos[2]=70; goto cz17;}
  }

  goto cz16;

  cz17:          // chwyc

  unsigned long timer17 = millis();
  if(timer17 - oldTimer[0] >= 15)
  {
    oldTimer[0] = timer17;
    top.write(pos[0]);
    pos[0]--;
    if(pos[0] == 40) {pos[0]=40; goto cz18;}
  }

  goto cz17;

  cz18:        // do tyłu

  unsigned long timer18 = millis();
  if(timer18 - oldTimer[0] >= 10)
  {
    oldTimer[0] = timer18;
    right.write(pos[2]);
    pos[2]--;
    if(pos[2] == 20) {pos[2]=20; goto cz5;}
  }

  goto cz18;
}

 

Edytowano przez Gieneq
Link do komentarza
Share on other sites

6 minut temu, 99teki napisał:

- goto <etykieta>, co to za język, Pascal ?

Normalnie na Ardu tego mozna uzywac, ale raczej wszyscy odradzaja bo ponoc wiecej to problemu robi niz pomaga...zwykle C to ma..

Co do skrocenia kodu to widze ze duzo tablic uzywasz ze "sztywnymi" indeksami...jesli sie da to mozna uzyc petli for i przewinac np. 5 razy to samo zmieniajac indeks i juz bedzie krocej..

Edytowano przez farmaceuta
  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

15 minut temu, farmaceuta napisał:

Normalnie na Ardu tego mozna uzywac, ale raczej wszyscy odradzaja bo ponoc wiecej to problemu robi niz pomaga...zwykle C to ma..

Co do skrocenia kodu to widze ze duzo tablic uzywasz ze "sztywnymi" indeksami...jesli sie da to mozna uzyc petli for i przewinac np. 5 razy to samo zmieniajac indeks i juz bedzie krocej..

Dzięki wszystkim za odpowiedź. Spróbuję coś wymyślić z skróceniem programu. Czym można w takim razie zastąpić instrukcję goto? 

Link do komentarza
Share on other sites

9 minut temu, Miczki16 napisał:

Czym można w takim razie zastąpić instrukcję goto? 

Nie uzywaniem jej...😉 Tak musisz rozplanowac kod zeby Ci to nie bylo potrzebne...kod leci z gory do dolu i tak piszesz zeby dobrze bylo ..oczywiscie mozesz tworzyc funkcje, uzywac takich slow jak "return"break"continue"...to duzo upraszcza...a co ten kod wogole robic ma??

Link do komentarza
Share on other sites

1 minutę temu, farmaceuta napisał:

Nie uzywaniem jej...😉 Tak musisz rozplanowac kod zeby Ci to nie bylo potrzebne...kod leci z gory do dolu i tak piszesz zeby dobrze bylo ..oczywiscie mozesz tworzyc funkcje, uzywac takich slow jak "return"break"continue"...to duzo upraszcza...a co ten kod wogole robic ma??

Program ma sterować serwami napędzającymi robota. Robot ma wykonywać zaprogramowane ruchy. 

Link do komentarza
Share on other sites

3 minuty temu, Miczki16 napisał:

Program ma sterować serwami napędzającymi robota. Robot ma wykonywać zaprogramowane ruchy. 

Ruchy maja byc plynne czy dynamiczne? Rozumiem ze o jakies okreslone czasy tak...i tak w kolko?

Link do komentarza
Share on other sites

Wywalić etykiety, tablicować warunki, użyć funkcji zamiast makaronu. Będę miał chwilę to zrobię przykład. 

Link do komentarza
Share on other sites

1 minutę temu, farmaceuta napisał:

Ruchy maja byc plynne czy dynamiczne? Rozumiem ze o jakies okreslone czasy tak...i tak w kolko?

Ruchy mają być płynne i powtarzać sie. 

Link do komentarza
Share on other sites

1 minutę temu, _LM_ napisał:

Wywalić etykiety, tablicować warunki, użyć funkcji zamiast makaronu. Będę miał chwilę to zrobię przykład. 

Ok, dzięki 🙂. Bym był wdzięczny za przykład. 

 

Link do komentarza
Share on other sites

1 minutę temu, Miczki16 napisał:

Ruchy mają być płynne i powtarzać sie. 

Hmm...mam taki przyklad do led na millis() dowolna ilosc led/interwalow i po niewielkich modyfikacjach bylo by dla Ciebie...tylko ta plynnosc...jesli serwa ruszaja sie pojedynczo to super, jesli nie to trzeba by do tablicy wrzucic pojedyncze wartosci polozenia serwa a to zezre troche ramu...

Link do komentarza
Share on other sites

2 minuty temu, farmaceuta napisał:

Hmm...mam taki przyklad do led na millis() dowolna ilosc led/interwalow i po niewielkich modyfikacjach bylo by dla Ciebie...tylko ta plynnosc...jesli serwa ruszaja sie pojedynczo to super, jesli nie to trzeba by do tablicy wrzucic pojedyncze wartosci polozenia serwa a to zezre troche ramu...

Problem w tym, że serwa poruszają się kilka na raz. 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.