Close

Krokový motor

Úvodní stránka Fórum Vaše projekty Arduino Krokový motor

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

    Zdravím, našel by se někdo, kdo by mi pomohl s mým projektem?
    Mám program, který pohybuje krokovým motorkem tam a zpátky určitou rychlostí.
    A já bych potřeboval, aby po dobu stlačení tlačítka se krokový motor točil
    jinou rychlostí. Byl by někdo ochoten s tím poradit? Děkuji Šiška.

    #10331
    posjirka
    Účastník

    bez kodu ti asi nikdo neporadi. predpokladam ze tam mas nejakou promennou ktera urcuje delku mezery mezi kroky. co tak podminka jestli je stsknute tlacitko tak nasv promennou na x jinak nastav na y?

    #10339
    romansis
    Účastník

    Tady je ten kód.

    // Krokový motor a driver

    // čísla pinů pro digitální výstupy
    const int in1 = 8;
    const int in2 = 9;
    const int in3 = 10;
    const int in4 = 11;

    // proměnná pro nastavení rychlosti,
    // se zvětšujícím se číslem se rychlost zmenšuje
    int rychlost =1;
    //
    int uhel = 90;

    void setup() {
    // inicializace digitálních výstupů
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);
    pinMode(in3, OUTPUT);
    pinMode(in4, OUTPUT);
    }

    void loop() {
    // plná rotace o 360 stupňů = 512 volání
    // funkce rotacePoSmeru() či rotaceProtiSmeru()
    for(int i=0;i<(uhel*64/45);i++){
    rotacePoSmeru();
    }
    // pauza po dobu 1 vteřiny
    delay(1000);

    for(int i=0;i<(uhel*64/45);i++){
    rotaceProtiSmeru();
    }
    // pauza po dobu 1 vteřiny
    delay(1000);
    }
    // zde následují funkce pro volání jednotlivých
    // kroků pro otočení po či proti směru hodinových
    // ručiček
    void rotacePoSmeru() {
    krok1();
    krok2();
    krok3();
    krok4();
    krok5();
    krok6();
    krok7();
    krok8();
    }
    void rotaceProtiSmeru() {
    krok8();
    krok7();
    krok6();
    krok5();
    krok4();
    krok3();
    krok2();
    krok1();
    }
    // každý krok obsahuje výrobcem dané pořadí
    // pro správné spínání motoru a následnou
    // pauzu, kterou určujeme rychlost otáčení
    void krok1(){
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
    delay(rychlost);
    }
    void krok2(){
    digitalWrite(in1, HIGH);
    digitalWrite(in2, HIGH);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
    delay(rychlost);
    }
    void krok3(){
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
    delay(rychlost);
    }
    void krok4(){
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    delay(rychlost);
    }
    void krok5(){
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    delay(rychlost);
    }
    void krok6(){
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, HIGH);
    digitalWrite(in4, HIGH);
    delay(rychlost);
    }
    void krok7(){
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    delay(rychlost);
    }
    void krok8(){
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    delay(rychlost);
    }

    #10350
    posjirka
    Účastník

    prosím používejte párové značky CODE, jinak je kod špatně formátovaný a zároveń není použitelný.
    zkus tento upravený kod:

    // Krokový motor a driver
    
    #define tlacitko 2 // cislo pinu s talcitkem
    #define rychlost1 1 // prvni -standratni rychlost
    #define rychlost2 2 // rychlost pri stisku tlacitka
    
    // čísla pinů pro digitální výstupy
    const int in1 = 8;
    const int in2 = 9;
    const int in3 = 10;
    const int in4 = 11;
    
    // proměnná pro nastavení rychlosti,
    // se zvětšujícím se číslem se rychlost zmenšuje
    int rychlost =1;
    //
    int uhel = 90;
    
    void setup() {
      // inicializace digitálních výstupů
      pinMode(in1, OUTPUT);
      pinMode(in2, OUTPUT);
      pinMode(in3, OUTPUT);
      pinMode(in4, OUTPUT);
      pinMode(tlacitko, INPUT);
    }
    
    void loop() {
      if(digitalRead(tlacitko) == 0){ // kdyz je stisknuto tlacitko
        rychlost = rychlost2; // sniz rychlost  
      } else { // jinak
        rychlost = rychlost1; // pouzij normalni rychlost  
      }
      // plná rotace o 360 stupňů = 512 volání
      // funkce rotacePoSmeru() či rotaceProtiSmeru()
      for(int i=0;i<(uhel*64/45);i++){
        rotacePoSmeru();
      }
      // pauza po dobu 1 vteřiny
      delay(1000);
      
      for(int i=0;i<(uhel*64/45);i++){
        rotaceProtiSmeru();
      }
      // pauza po dobu 1 vteřiny
      delay(1000);
    }
    // zde následují funkce pro volání jednotlivých
    // kroků pro otočení po či proti směru hodinových
    // ručiček
    void rotacePoSmeru() {
      krok1();
      krok2();
      krok3();
      krok4();
      krok5();
      krok6();
      krok7();
      krok8();
    }
    void rotaceProtiSmeru() {
      krok8();
      krok7();
      krok6();
      krok5();
      krok4();
      krok3();
      krok2();
      krok1();
    }
    // každý krok obsahuje výrobcem dané pořadí
    // pro správné spínání motoru a následnou
    // pauzu, kterou určujeme rychlost otáčení
    void krok1(){
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, LOW);
      delay(rychlost);
    }
    void krok2(){
      digitalWrite(in1, HIGH);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, LOW);
      delay(rychlost);
    }
    void krok3(){
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, LOW);
      delay(rychlost);
    }
    void krok4(){
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);
      delay(rychlost);
    }
    void krok5(){
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);
      delay(rychlost);
    }
    void krok6(){
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, HIGH);
      delay(rychlost);
    }
    void krok7(){
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      delay(rychlost);
    }
    void krok8(){
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      delay(rychlost);
    }
    #10356
    romansis
    Účastník

    zdravím, když nechám zkontrolovat tento kód tak sketch hlásí chybu.
    for(int i=0;i<(uhel*64/45);i++){

    #10357
    posjirka
    Účastník

    to bohužel není muj boj. Tuto část jsem převzal z tveho kodu.
    NAUČTE SE POUŽÍVAT PÁROVÉ ZNAČKY „CODE“

    #10359
    romansis
    Účastník

    Párové značky opraveny. SUPER, změna rychlosti funguje, ale projeví se až po projetí cyklu tam a zpět. Já bych potřeboval aby reakce na tlačítko byla okamžitá. Zatím díky moc.

    #10363
    posjirka
    Účastník

    všechno jde. Jen když se dívám na to řešení je docela „not friendly“ pro tuto funkci.
    Kdyby spoužil celý krok pro otáčení a né půl kroky mohls to vše dělat ve smyčce Loop, jen posunem bitu a reagovalo by ti to kdy budeš potřebovat. Takto musíš použít před definicí proměnné příkaz „volatile“ ( https://www.arduino.cc/en/Reference/Volatile ) aby ti reagoval i v případě přerušení hlavní smyčky a nastavit přerušení na pin tlačítka ( https://www.arduino.cc/en/Reference/AttachInterrupt ). Toto přerušení přeruší hlavní program a vykoná funkci, na kterou se v definici přerušení odkazuješ. Až skončí tato funkce, smyčka hlavního programu se opět rozjede tam, kde skončila a v klidu pokračuje. Jen musíš hlídat aby se ti nezacyklila. To nastane, kdy funkce volaná přerušení trvá déle než interval mezi přerušeními. Můžeš dokonce ragovat zvlášť na na změnu stavu, na přechod na log. 0 a na přechod na log.1.

Aktuálně je na stránce zobrazeno 8 příspěvků - 1. až 8. (celkem z 8)
  • Pro reakci na toto téma se musíte přihlásit.