Stránka 1 z 3

Pantový stolek

Napsal: 19 dub 2019, 23:49
od Wrchi
Zdravím vás.
Můžete mi prosím pomoct se zapojením a naprogramováním?
Vyrabím pantový stolek, kvůli focení hvězd. Podoba je tady https://imgur.com/a/dAOIhfd
S čím si ale nevím rady je zapojení a naprogramování desky. Mám použitý Arduino UNO R3, krokový motorek 28BYJ-48 s driverem ( https://www.gme.cz/krokovy-motor-ridici-modul )
Nikdy předtím jsem s tímhle nedělal.
Povedlo se mi ale jen rozchodit motorek a měnit rychlost podle návodu https://navody.arduino-shop.cz/navody-k ... river.html
Chtěl bych ale mít zapojené dvě tlačítka (přepínače). Jedním přepínačem bych chtěl motorek zapnout a měnit směr otáčení a druhým přepínačem bych chtěl měnit rychlost. Jako příklad je tohle video https://www.youtube.com/watch?v=KryNwpZH5zs
Hledám už to pár dní ale nikde jsem zatím nenašel zapojení vodičů a kód pro mé komponenty.
Díky za případné rady.

Re: Pantový stolek

Napsal: 20 dub 2019, 02:31
od gilhad
Ten levy prepinac ma imho uprostred zem, kterou pripojuje bud doleva, nebo doprava na piny, kde je INPUT_PULLUP. Ktery pin vrati pri cteni nulu, tam je to prepojene, uprostred vraci oba dva jednicku. Pravy prepinac je mozna pouze vypinac mezi zemi a tretim pinem s INPUT_PULLUP a podle toho jestli je na pinu 0 nebo 1, tak jede pomalu, nebo rychle.

Podle prepinace v tom prikladu poustis bud jen cast s rotacePoSmeru() nebo cast s rotaceProtiSmeru() (nebo ani jednu, kdyz je uprostred a ma stat).

Vypinacem nastavujes rychlost na 1, nebo 2 a cekani v loop nedelas vubec a delas tam nikoli 512 kroku (dokola), ale jen jeden krok, takze celou otocku o 360 stupnu udelas po asi 512 pruchodech loop();

Kód: Vybrat vše


void loop() {

  if (digitalRead(pinVypinac)) {
     rychlost=2; // pomalu
     } else {
        rychlost=1; // rychle
     };
  
  //  rotace o 1 krok = 1 volání
  // funkce rotacePoSmeru() či rotaceProtiSmeru()
  if (digitalRead(pinVlevo)==0) {
    rotacePoSmeru();
  }
  if (digitalRead(pinVpravo)==0) {
    rotaceProtiSmeru();
  }
}

Re: Pantový stolek

Napsal: 20 dub 2019, 08:52
od Wrchi
Takže černé vodiče s přepínačů jsou propojené a zapojené do GND. Jednotlivé zelené jsou pak zapojené do analogových vstupů 5,4,3 ?(nevím, nejde to pořádně poznat z toho videa). Navíc jsou ještě všechny zelené přes odpory propojené a zapojené do 5V ? (taky to nejde úplně poznat).

Re: Pantový stolek

Napsal: 20 dub 2019, 09:05
od gilhad
Ono je celkem jedno na ktere volne piny pripojist ty zelene, pro ten prepinac smeru je pak oznacis jako pinVlevo a pinVpravo, pro rychlost pinVypinac. Odpory k +5V netreba, pokud to das jako INPUT_PULLUP (pouzijou se vnitrni pullup odpory Arduina pro pritazeni k +5V) , nikoli jen INPUT . At uz pouzijes Dneco, nebo Aneco, tak je pouzijes jako digitalni, cili digitalRead.

Re: Pantový stolek

Napsal: 20 dub 2019, 15:25
od Wrchi
No zatím tomu zase tak uplně nerozumím tak musím pomaleji :)
Zapojení by bylo asi takhle jestli to chápu?
zapojení.jpg
Tenhle základní kód bych pak upravil s tím co si napsal ty nahoře.

Kód: Vybrat vše

// 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 = 360;

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

Re: Pantový stolek

Napsal: 20 dub 2019, 16:16
od AstroMiK
Vyzkoušený to nemám, ale asi to mělo být nějak takhle:

Kód: Vybrat vše

// 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;

const int pinVypinac = A5;
const int pinVlevo   = A3;
const int pinVpravo  = A4;

unsigned int rychlost;


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

  pinMode(pinVypinac, INPUT_PULLUP);
  pinMode(pinVlevo  , INPUT_PULLUP);
  pinMode(pinVpravo , INPUT_PULLUP);




}

void loop()
  {
    if (digitalRead(pinVypinac))    rychlost=2; // pomalu (rozpojeny kontakt)
    else                            rychlost=1; // rychle (sepnuty kontakt)
  
    //  rotace o 1 krok = 1 volání
    // funkce rotacePoSmeru() či rotaceProtiSmeru()
    if (digitalRead(pinVlevo) == 0)
      {
        rotacePoSmeru();
      }
    if (digitalRead(pinVpravo) == 0)
      {
        rotaceProtiSmeru();
      }
  

  }

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




A co se týče schématu, tak tam přece není možné připojit na kontakt z jedné strany +5V a z druhé GND!
Při jeho sepnutí by došlo ke zkratu.

V příloze je opravené schéma:
zapojení2.gif

Re: Pantový stolek

Napsal: 20 dub 2019, 22:04
od Wrchi
No na tom video příkladu to má právě zapojené s těma odporama na 5V. Ale teď už to chápu, jak si psal, že když se použije INPUT_PULLUP, tak už se to nemusí propojovat. Púvodně jsem myslel, že to musí být i tak propojené bez těch odporů.
Vyzkoušel jsem to zapojit a nahrát kód a je to přesně to co jsem potřeboval. Vše funguje jak má s přepínáním směru i rychlostí otáček :) Moc díky za pomoc :)! Určitě se to bude hodit i dalším astro fotografům :) Pak sem hodím výslednou podobu pantového stolku.

Re: Pantový stolek

Napsal: 21 dub 2019, 12:24
od gilhad
nejen astrofotografům :)

Ono je to docela obvyklý manévr kdekoli použít tlačítka proti zemi a INPUT_PULLUP (ostatně proto to tam výrobce čipu zadrátoval).

Jinak ono obecně pomáhá se naučit programovat, protože pak člověk chápe co dělá a proč a může s důvěrou ve výsledek upravovat cizí programy (které řeší něco jiného) a ukázkové kódy (které jsou většinou samy o sobě celkem na nic, ale ukazují, jak používat různé (často i všechny) funkce nějakého modulu a předpokládají, že laskavý čtenář si z nich vezme inspiraci a napíše si to po svém, na míru vlastnímu problému - nikdo nepotřebuje otáčet krokovým motorem o 360 stupňů tam a zpátky se sekundovými pauzami, ale spousta lidí potřebuje točit krokovými motory nějak a tady vidí, jak je přimět udělat pár kroků tam a pár zpět a jak měnit rychlost a zbytek už si dotvoří)

Re: Pantový stolek

Napsal: 29 dub 2019, 23:45
od Wrchi
Tak stolek je téměř hotový. Čekám jen na montáž foťáku a pak už jen na jasnou oblohu. Když to teď různě zkouším, tak ještě řeším rychlost toho pomalého otáčení. Mám nastavenou zatím pomalou rychlost na 6. Číslo 5 by už byla rychle a 7 pomalu. Když budu ale potřebovat ještě rychlost něco mezi tím. Je na to lepší funkce Delay, DelayMicroseconds nebo mikro kroky?

Re: Pantový stolek

Napsal: 30 dub 2019, 09:09
od HrAd
Názornou odpověď hlavně s ohledem na omezení nežádoucího chvění najdeš cca od času 1 min v následujícím videu.
https://youtu.be/tRoT3qpndbU?t=57

Mimochodem spoustu informací včetně výpočtů, plánků, zapojení HW a SW je k nalezení pod termíny "barn door" + "mount" nebo + "tracker" různě doplněná o hesla motorized, arduino viz. třeba tady. Nicméně chválim snahu udělat si to po svém a hlavně tomu porozumět ;)

Bodla by nějaká fotka mechaniky a hlavně se nezapomeň pochlubit výsledkem, tj. fotkami hvězd :)

EDIT:
pro další experimenty s omezením otřesů = omezení rozklepanosti fotek bude potřeba lepší driver, proč, jak na to a co zvolit? Inspirace níže:
test TL Smoother a srovnání A4988 vs. DRV8825
srovnání driveru TMC2100 vs. DRV8825 vs. A4988 při reálném nasazení na video pojezdu