Stepper - camera slider

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
ace9987
Příspěvky: 3
Registrován: 14 srp 2017, 15:07

Stepper - camera slider

Příspěvek od ace9987 » 14 srp 2017, 20:15

Zdravim vsetkych nadsencov arduina :)
potreboval by som poradit .. som uplny ale uplny amater a chcel by som sa nieco nove naucit.
Nejak sa mi podarilo podla navodov z celeho sveta zosuladit nejaky ten moj program ale uz som v koncoch a vo vela veci neviem ako dalej.
Skor ako tu vlozim ten moj kod chcem povedat, ze by som si chcel spravit taky kamerovy slider prepojeny cez BT a Android aplikaciu.
Moj problem je v tom ze neviem ako nastavim, ze ked sa stlaci tlacidlo tak motor spravy niekolko otacok spat az kym tlacidlo bude vypnute.
Dalsí problem mam v rychlosti motora .. ... snazil som sa zmenit rychlost cez aplikaciu ale... stale narazim na ten isty problem ze hodnotu z aplikacie mi nezoberie a motor mi len pipne ... potrebujem to nejako ulozit v premennej.
Opat jeden z problemov : ak stlacim tlacidlo v aplikacii /a/ aby sa mi siel motor v pravo az kym nenarazi na tlacidlo resp. vlavo ked stalcim /r/.

Za pomoc velmi pekne dakujem .. :) :) a nesetrite ma kritikou lebo chcem sa zo skolkara stat skolakom v programovani a chcem sa dozvediet v com robim chyby :)
A tu je ten moj program :

Kód: Vybrat vše

const int in1 = 4;
const int in2 = 5;
const int in3 = 6;
const int in4 = 7;

#define RX 11
#define TX 10
#define pinLED 13

#include <SoftwareSerial.h>

SoftwareSerial bluetooth(TX, RX);
int rychlost = 1;
int rychlost1 = 0;
int tlacidlo = 2;
//
int uhol = 360;
int statustlacidla = 0;


void setup() {
    bluetooth.begin(9600);

    pinMode(pinLED, OUTPUT);
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);
    pinMode(in3, OUTPUT);
    pinMode(in4, OUTPUT);
    pinMode(tlacidlo, INPUT_PULLUP);
    char bluetoothData;
}

void loop() {
    // proměnná pro ukládání dat z Bluetooth modulu
    char bluetoothData;
    statustlacidla = digitalRead(tlacidlo);
    if (digitalRead(tlacidlo) == HIGH) {
        digitalWrite(pinLED, HIGH);
    } else {
        digitalWrite(pinLED, LOW);
    }

    if (bluetooth.available()) {
        bluetoothData = (bluetooth.read());

        if (bluetoothData == 'l') {
            for (int i = 0; i < (uhel * 1 / 6); i++) {
                rotaceProtiSmeru();

                digitalWrite(in1, LOW);// vypnutie motora  
                digitalWrite(in2, LOW);
                digitalWrite(in3, LOW);
                digitalWrite(in4, LOW);
            }
        }

        if (bluetoothData == 'p') {// 64 stupnova otacka
            for (int i = 0; i < (uhel * 1 / 6); i++) {// 64 stupnova otacka 
                rotacePoSmeru();

                digitalWrite(in1, LOW);// vypnutie motora  
                digitalWrite(in2, LOW);
                digitalWrite(in3, LOW);
                digitalWrite(in4, LOW);

            }

            digitalWrite(in1, LOW);// vypnutie motora  
            digitalWrite(in2, LOW);
            digitalWrite(in3, LOW);
            digitalWrite(in4, LOW);
        }
        if (bluetoothData == 'a') {// pohyb po doraz vlavo
            for (int i = 0; i < (uhel * 64 / 45); i++) {// 64 stupnova otacka a i je mensie ako tlacidlo a tam je high
                rotaceProtiSmeru();

                digitalWrite(in1, LOW);// vypnutie motora  
                digitalWrite(in2, LOW);
                digitalWrite(in3, LOW);
                digitalWrite(in4, LOW);
            }
        }
        if (bluetoothData == 'r') {// pohyb poo doraz vpravo
            for (int i = 0; i < (uhel * 64 / 45); i++) {// 64 stupnova otacka 
                rotacePoSmeru();

                digitalWrite(in1, LOW);// vypnutie motora  
                digitalWrite(in2, LOW);
                digitalWrite(in3, LOW);
                digitalWrite(in4, LOW);
            }
        }

        if (bluetoothData == 'c') {// pohyb vpravo po doraz

        }
        if (bluetoothData == 'd') {// pohyb vlavo po doraz

        }
        if (bluetoothData == 'x') {// play

        }
        if (bluetoothData == 'y') {// pauza

        }
        if (bluetoothData == 'z') {// stop

        }
    }
    delay(100);
}

// krátká pauza mezi kontrolami komunikace Bluetooth modulu



void rotacePoSmeru() {
    statustlacidla = digitalRead(tlacidlo);
    if (statustlacidla == LOW) {

        krok1();
        krok2();
        krok3();
        krok4();
        krok5();
        krok6();
        krok7();
        krok8();
    } else {
        krok8();
        krok7();
        krok6();
        krok5();
        krok4();
        krok3();
        krok2();
        krok1();
        krok0();
    }
}

void rotaceProtiSmeru() {
    statustlacidla = digitalRead(tlacidlo);
    if (statustlacidla == LOW) {
        krok8();
        krok7();
        krok6();
        krok5();
        krok4();
        krok3();
        krok2();
        krok1();
    } else {
        krok1();
        krok2();
        krok3();
        krok4();
        krok5();
        krok6();
        krok7();
        krok8();
        krok0();
    }
}


void krok0() {
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
    delay(rychlost);
}

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);
}

zbysek
Site Admin
Příspěvky: 125
Registrován: 22 úno 2017, 15:18

Re: Stepper - camera slider

Příspěvek od zbysek » 16 srp 2017, 21:15

Motory se vám nějakým způsobem podařilo rozchodit? Třeba nějakým jednoduchým programem, který s nimi jenom otáčí?
Jaký je to typ motoru? Můžete napsat URL na motory?
Jak máte motor k Arduinu připojený? Můžete poslat foto zapojení?

zbysek
Site Admin
Příspěvky: 125
Registrován: 22 úno 2017, 15:18

Re: Stepper - camera slider

Příspěvek od zbysek » 16 srp 2017, 21:17

Jinak mě napadá, že možná motor bzučí, protože máte mezi změnami stavů tlačítka moc malou hodnotu. Zkuste zvýšit dobu čekání mezi jednotlivými kroky.

Wojta
Příspěvky: 184
Registrován: 22 črc 2017, 16:39

Re: Stepper - camera slider

Příspěvek od Wojta » 17 srp 2017, 07:38

A pokud nebude motor chodit vůbec, bude jen pípat, může to být i nedostatkem proudu. Některé moduly pro ovládání krokáčů mají trimr na nastavení proudu, pak byste si musel pohrát s tím - asi ne, vy to máte řízené nějak napřímo, že?Každopádně bych začal nejdřív testem motoru jak píše Zbyšek.

ace9987
Příspěvky: 3
Registrován: 14 srp 2017, 15:07

Re: Stepper - camera slider

Příspěvek od ace9987 » 20 srp 2017, 11:37

Dakujem za odpovede, motor mam rozbehnuty funguje mi len neviem cyklu for napisat, ze ked dostane tlacidlo pullop high tak sa ma zmenit smer. Vzdy ako dostane impulz tak sa.zmeni ale.ako.nahle.pustim.tak pokracuje cyklus for .
28BYJ-48 Stepper

zbysek
Site Admin
Příspěvky: 125
Registrován: 22 úno 2017, 15:18

Re: Stepper - camera slider

Příspěvek od zbysek » 20 srp 2017, 15:28

Zkusím vám poradit programem. Přesně ale z popisu nechápu, co je váš problém. Můžete se prosím vyjadřovat trochu přesněji?
Pochopil jsem, že chcete otáčet motorem jedním směrem a při stisku tlačítka tento směr změnit.
Mohlo by to vypadat třeba takto:

Kód: Vybrat vše

///////// MOTOR STUFF ///////////
byte motorPins[4] = {4, 5, 6, 7}; // pole s piny, kde je připojený motor
boolean direction = LOW;          // směr otáčení
int step = 0;                     // aktuální krok otáčení motoru (0-7) 

// kroky motoru
byte steps[8][4] = {
  {1,0,0,0},
  {1,1,0,0},
  {0,1,0,0},
  {0,1,1,0},
  {0,0,1,0},
  {0,0,1,1},
  {0,0,0,1},
  {1,0,0,1}  
};

int delayBetweenSteps = 100;      // čekání mezi kroky

//////// BUTTON STUFF /////////
byte button       = 8;            // pin, kde je připojené tlačítko
byte lastButtonState    = LOW;    // stav tlačítka v předchozím průchodu


void setup() {
  for(int i = 0; i <= 3; i++){
    pinMode(motorPins[i], OUTPUT);
  }

  pinMode(button, INPUT);

  Serial.begin(9600);
}

void loop() {
  Serial.print("Step ");
  Serial.print(step);
  Serial.print(" direction ");
  Serial.println(direction);
  
  for(int pinNum = 0; pinNum <= 3; pinNum++){
    digitalWrite(motorPins[pinNum], steps[step][pinNum]);  
  }

  if(direction){
    step += 1;
    if(step == 8){
      step = 0;
    } 
  }
  else{
    step -= 1;
    if(step == -1){
      step = 7;
    }    
  }

  byte buttonState = digitalRead(button);
  if(buttonState != lastButtonState){
    if(buttonState == HIGH){
      direction = !direction; // otočení směru
    }

    lastButtonState = buttonState;
  }

  delay(delayBetweenSteps);
}
V tomto případě by bylo ideální ošetřit stisk tlačítka pomocí přerušení, ale toto by pro začátek mělo stačit.

ace9987
Příspěvky: 3
Registrován: 14 srp 2017, 15:07

Re: Stepper - camera slider

Příspěvek od ace9987 » 21 srp 2017, 07:13

ďakujem za program. ospravedlnujem sa písal som to na mobile a dost nezrozumitelne som to napisal .Chcel by som aby moj program ked nastavim v app v mobile (prepojene cez BT) smer pohybu a rychlost motoru. Po stlacení tlacidla play sa spustil motor tym smerom ktorym som nastavil a bud po dorazove tlacidlo alebo sa zmeni smer otacania motoru a prejde na druhu stranu slidera opat po dorazove tlacidlo .

Dufam ze je to uz kusok zrozumitelne :

Velmi pekne dakujem :)

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 0 hostů