Close

Prosím o pomoc: Řízení tří serv s náhodným časovým spouštěním.

Úvodní stránka Fórum Hardware Arduino Prosím o pomoc: Řízení tří serv s náhodným časovým spouštěním.

Označeno štítky: ,

  • Toto téma obsahuje celkem 6 odpovědí. Do diskuze (3 diskutující) se naposledy zapojil uživatel posjirka a poslední změna proběhla před 8 roky a 3 měsíci.
Aktuálně je na stránce zobrazeno 7 příspěvků - 1. až 7. (celkem z 7)
  • Autor
    Příspěvky
  • #5751
    Pavel Truhlar
    Účastník

    Dobrý den,

    prosím o pomoc s řízením tří serv, kdy random by mělo být pouze časové zapínání serv pro daný cyklus. Takže situace, kdy se náhodně spouštějí serva a nevadilo by, kdyby se jednou za čas klidně spustili dvě nebo tři najednou. Zatím mám tento kod a serva se spouští pouze postupně za sebou. Jsem začátečník s arduinem. Děkuji za každou radu.

    #include <Servo.h>

    Servo servo1;
    Servo servo2;
    Servo servo3;

    int pos = 0;

    void setup() {

    servo1.attach(8);
    servo2.attach(10);
    servo3.attach(12);
    }

    void loop() {

    for (pos = 0; pos <= 0; pos += 1) {

    servo1.write(pos);
    delay(1500);
    }
    for (pos = 120; pos >= 0; pos -= 1) {
    servo1.write(pos);
    delay(15);
    }

    for (pos = 0; pos <= 0; pos += 1) {
    servo2.write(pos);
    delay(1500);
    }
    for (pos = 120; pos >= 0; pos -= 1) {
    servo2.write(pos);
    delay(15);
    }

    for (pos = 0; pos <= 0; pos += 1) {
    servo3.write(pos);
    delay(1500);
    }
    for (pos = 120; pos >= 0; pos -= 1) {
    servo3.write(pos);
    delay(15);
    }

    }

    #5780
    piticko
    Účastník

    co vymyslet nějaký takový kód:

    vygeneruj náhodné číslo z pinu A1 od 0 do 1023
    čekej vygenerovaný čas A1 (pro delší čas si lze pomoct matikou)
    vygeneruj náhodné číslo z pinu A0 od 1 do 3
    když bude číslo 1->udělej něco se servem1
    když bude číslo 2->udělej něco se servem2
    když bude číslo 3->udělej něco se servem3
    …a znova

    #5781
    posjirka
    Účastník

    já bych použil 3 generované random proměnné.
    1. by mi určovala které serva mají reagovat (1.bit bylo servo 1, 2 bit servo 2, 3bit servo 3)
    2. proměnná by mi řešila nastavení (úhel) pro tyto serva
    3. proměnná by mi generovala délku prodlevy k dalšímu kroku.

    #5786
    piticko
    Účastník

    …a teď ještě vyřešit to, aby se pohybovaly i dvě serva najednou…jak na to?

    #5796
    posjirka
    Účastník

    nechápu dotaz. Jak jsem psal vygeneruj náhodnou proměnnou a urči si např. že 1, bit bude aktivita serva 1. 2. bit aktivace serva 2, 3. bit aktivace serva 3.
    V kodu je to ještě jednodušší

    #include <Servo.h>

    Servo servo1;
    Servo servo2;
    Servo servo3;

    int random1 = 0; // promenna kam se ulozi nahodne cislo – cislo serva
    int random2 = 0; // promenna kam se ulozi nahodne cislo – novz uhel
    int random3 = 0; // promenna kam se ulozi nahodne cislo – prodleva

    …. nastaveni pinu atd.

    random1 = random(0, 16); // vzgeneruj noahodne cislo pro pocet serv
    random2 = random(0, 180); // vzgeneruj noahodne cislo pro uhel serva
    random3 = random(200, 1000); // vzgeneruj noahodne cislo pro delay
    if (bitRead(random1, 1) == 1 )
    {
    servo1.write(random2);// uprav stav serva 1
    }

    delay(random3); // pauya

    #5799
    piticko
    Účastník

    Jo tak. Jsem nechápal moc ten první bit. Budu muset někde nastudovat… Ta možnost sepnutí náhodného počtu serv je teď mimo mne. Ale pokud bys měl energii spáchat jednoduchý prográmek např. s LEDkama, budu rád (možná nejen já).

    #5845
    posjirka
    Účastník

    trochu se zpožděním ale přeci:

    // náhodné říze 3 serv
    // v1
    // místo serv bude řešením výpis stavu 3 proměnných na seriový port.
    // by JP 2016
    //
    
    int servo1 = 0; // uhel natočeníserva 1
    int servo2 = 0; // uhel natočeníserva 2
    int servo3 = 0; // uhel natočeníserva 3
    int uhel = 0; // novz uhel natočení
    int pauza = 0; // doba pauzy před další změnou
    int vyber = 0; // pomocná promměná pro výběr , které servo se bude měnit
    
    void setup() {
      Serial.begin(9600); // inicializace seriove komunikace
      randomSeed(analogRead(A0)); // generátor náhodných čísel začne od čísla == aktuální hodnota na portu A0
    }
    
    void loop() {
      // generovaní náhodných hodnot
      //----------------------------
      // novy uhel natočení serv
      uhel = random(0, 180);
      // výběr serv pro změnu
      vyber = random(0, 127);
      // délka pauzy v ms
      pauza = random(200, 1000);
      
      // uprava hodnot natočení serv
      //----------------------------
      // když 0. bit proměnné "výber" bude rovný 1 aktualizuj hodnotu "servo1"
      if (bitRead(vyber,0) == 1) {
        servo1 = uhel; 
      }
      // když 1. bit proměnné "výber" bude rovný 1 aktualizuj hodnotu "servo2"
      if (bitRead(vyber,1) == 1) {
        servo2 = uhel; 
      }
      // když 2. bit proměnné "výber" bude rovný 1 aktualizuj hodnotu "servo3"
      if (bitRead(vyber,2) == 1) {
        servo3 = uhel; 
      }
      
      // výpis proměnných a stavu serv
      //------------------------------  
      Serial.print("Servo 1 : ");
      Serial.print(servo1);
      Serial.println(" st.");
      Serial.print("Servo 2 : ");
      Serial.print(servo2);
      Serial.println(" st.");
      Serial.print("Servo 3 : ");
      Serial.print(servo3);
      Serial.println(" st.");
      Serial.print("Vyber : ");
      Serial.print(vyber);
      Serial.print(" = ");
      Serial.println(vyber, BIN);
      Serial.print("Pauza : ");
      Serial.print(pauza);
      Serial.println(" ms");
      
     // oddělovač 
     //----------
      Serial.println("****************************");
      delay(pauza);   // čekání na další změnu
    }
Aktuálně je na stránce zobrazeno 7 příspěvků - 1. až 7. (celkem z 7)
  • Pro reakci na toto téma se musíte přihlásit.