Mini CNC osa Z

Odpovědět
Hanz
Příspěvky: 262
Registrován: 25 dub 2019, 23:52
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od Hanz » 21 čer 2019, 16:28

zatím mám tohle : https://www.youtube.com/watch?v=3RgvqhAMa8I
a tady sketch :

Kód: Vybrat vše

#include <Servo.h>

int buttonPin = 2;
int servoPin = 9;
int buttonState = 0;
int directionState = 0;
Servo servoOne;
int pos = 0;
int led1 = 11; //první červená led
int led2 = 10; //druhá zelená led


void setup() {
  servoOne.attach(9);
  servoOne.write(directionState);
  pinMode(buttonPin, INPUT);
  pinMode(led1, OUTPUT); //nastavení pin 11 jako výstup
  pinMode(led2, OUTPUT); //nastavení pin 10 jako výstup
  digitalWrite(led1, pos<5);
  digitalWrite(led2, pos>175);
}

void loop() {
  buttonState = digitalRead(buttonPin);
  if (directionState == 0) {
    if (buttonState == HIGH) {
      directionState = 1;
      for (pos = 0; pos < 180; pos = pos + 1 )
    {
        servoOne.write(pos);
        delay(5);
      digitalWrite(led1, pos<5);
      digitalWrite(led2, pos>175);  
      }
    }
  } else if (directionState == 1) {
    if (buttonState == HIGH) {
      directionState = 0;
      for (pos = 180; pos > 1; pos = pos - 1)
   {
        servoOne.write(pos);
         delay(5);
      digitalWrite(led1, pos<5);
      digitalWrite(led2, pos>175);   
      }
    }
  }
}
pořád mi to nezastavuje v jakékoliv poloze při stisknutí tlačítka ?!

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Mini CNC osa Z

Příspěvek od kiRRow » 21 čer 2019, 22:11

Co koukám, tak jsi napsal, že to nemá zastavovat při stisku tlačítka ...

napsal jsi že pokud directionstate je nula ... tak se otestuje button state, pokud je ten vyhodnocen jako jedna, tak se spustí cyklus který natočí servo jedním směrem ... jinak pokud je directionstate jedna, otestuje se buttonstate a pokud je vyhodnocen jako jedna, tak se spustí cyklus který točí servem v opačném směru ...

pokud chceš aby se motor nějak zastavil, budeš muset otestovat na začátku každého cyklu zda-li ho něco zastavit chce a pokud ano, tak se cyklus musí přerušit

----- edit -----

navíc až se ti to podaří pochopit (takový to jak si člověk řekne : "aháááá"), za pár minut zpráskneš ten kód, protože pak už to fakt půjde rychlej ... tak narazíš na problém, že se to chová jako by jsi to tlačítko stisknul několikrát ... to bude způsobeno zákmity na tlačítku ... řeší se to buď kondenzátorem, nebo programem ( testuješ to tlačítko po delší dobu a několikrát )

Hanz
Příspěvky: 262
Registrován: 25 dub 2019, 23:52
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od Hanz » 25 čer 2019, 01:17

zdravím, kondenzátor 470uF v zapojení mám, je tam hlavně k vyrovnání odběru Serva z usb napájení. Ohlídat zákmity tlačítka mě nenapadlo a taky moc dobře nevím jak ?!

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Mini CNC osa Z

Příspěvek od kiRRow » 25 čer 2019, 15:58

V Arduino IDE, v příkladech je sketch jménem debounce ( https://www.arduino.cc/en/Tutorial/Debounce )
a tady je to dokonce česky ( https://arduino.cz/arduino-zaklady-funkce-debounce/ )

Hanz
Příspěvky: 262
Registrován: 25 dub 2019, 23:52
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od Hanz » 25 čer 2019, 22:06

Děkuju za informace o debounce, já jsem taky nezahálel a pár příkladů ošetření zákmitů našel. Musím je nastudovat a pokusit je aplikovat v mé lepenici. Doufám, že jsou použitelné ? Tady jsou ty příklady :
https://arduino8.webnode.cz/news/lekce- ... -tlacitka/
https://navody.arduino-shop.cz/zaciname ... citko.html
Při chvíli je sestavím a otestují, líp se to naučí.

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od gilhad » 26 čer 2019, 00:06

Použitelné jsou (teda, některé až po zahrnutí komentářů), ale já k tomu přistupuju trochu jiným způsobem.

Pokud zjistím stisknutí (puštění) tlačítka, tak si zapamatuju čas a ROVNOU začnu požadovanou akci. Další vstupy od tlačítka mě budou zajímat až poté, co doběhne debouncing. (V příkladech je tomu naopak - nejdřív řeší debouncing, až se to uklidní, tak případně provedou akci podle aktuálního stavu).

Můj důvod je ten, že debouncing nějakou dobu trvá (a v hodně špatném případě to může být i delší, než lidská akce, tedy klidně i pár desetin sekundy - i to jsem v praxi potkal), ale to, že se hodnota tlačítka změnila, znamená, že stisknuto BYLO a teď jen nějakou dobu dává chaotická data, než se usadí. Takže klidně akci zahájit můžu hned a čekat až se to ustálí mezitím/potom.

Pro blikání LEDkou je to celkem fuk, jestli se rozsvítí hned při stisku, nebo jestli chvíli čeká (jako v těch příkladech), až tlačítko spolehlivě přestane kmitat a rozsvítí se až pak, tedy klidně po jasně viditelné pauze. Ale pokud to používám jako ovladač na něco reálného (nebo třeba jako vstup pro hry), tak chci reakci ihned, jakmile je jasné, že se stav změnil (což je už po první změně) a debouncing jen slouží k potlačení zákmitů a tedy falešných hodnot.

Takže s mojím přístupem je lag naprosto minimální (LEDka se rozsvítí okamžitě při stisku) a jen je omezeno, jak rychle po sobě můžu klikat (déle než debouncing). (Například v první verzi klikimouse simulovaná myš udělala 25 akcí, než doběhl debouncing tlačítka - s postupem z těch příkladů by celou tu dobu čekala, ne až bude jasno, že tlačítko bylo stisknuto (to je jasné při prvním kontaktu) ale než bude jasné, že to blbé tlačítko už nekmitá. A to samé s jeho puštěním - že bylo puštěno je jasné hned při první ztrátě kontaktu, ale než dokmitá, tak to trvá z hlediska mikroprocesoru asi tak věčnost nebo dvě.)

Viz třeba
http://robodoupe.cz/2018/drobnicky-006- ... e-klikacu/
http://micro-corner.gilhad.cz/blog/Ardu ... ouse2.html
http://micro-corner.gilhad.cz/blog/Ardu ... ouse3.html

Hanz
Příspěvky: 262
Registrován: 25 dub 2019, 23:52
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od Hanz » 29 čer 2019, 17:19

otázečka k Debounce - možná to bude znít divně ?! debounce stačí napsat na tlačítko a led jen jednou ? jako tady : https://arduino.cz/arduino-zaklady-funkce-debounce/, nebo když mám více led, napsat na každou zvlášť ? Případně napsat Debounce na všechno co mi stisknutí tlačítka má zapnout/vypnout ?

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od gilhad » 29 čer 2019, 21:31

Je to docela jednoduché - problém je, že tlačítko při stisknutí (či puštění) jednoduše nesepne (či rozepne) stylem furt nula a pak furt jednička, ale často po stisknutí sepne, odskočí, sepne, odskočí a takhle chvilku cviší, dokud neskončí v setrvalém stavu.

Jako když pustíš míč na zem, tak taky chvilku poskakuje, než zůstane nakonec klidně ležet. Jen to trvá trochu kratší dobu (nějaké pidizlomky sekundy, podle konstrukce, razance stisknutí, letu ptáků a všech ostatních náhodných ptákovin).

Problém je v tom, že arduino je docela rychlé (16 000 000 instrukcí za sekundu) a tak ty odskoky tlačítka snadno "zahlédne" a bere to, že někdo hodně rychle kliká a pouští, protože má na tom pinu střídavě nuly a jedničky. Což je sice hezké, ale pomalý člověk chce, aby když na to tlačítko hamptne jednou, tak to Arduino vyhodnotilo jako jednu akci. Takže je potřeba to nějak zařídit, aby ty drobné rychlé odskoky Arduino ignorovalo.

Buď harwarově (dá se tam kondík s odporem a tomu chvilku (pidizlomek sekundy) trvá, než se nabije dost, aby mu to Arduino uznalo jako jedničku a pak mu zase chvilku trvá, než se vybije, aby mu to Arduino uznalo jako nulu a kdyže se ta chvilka nastaví správně, tak se mezitím to tlačítko stihne uklidnit a Arduino čte jen jeden přechod mezi nulou a jedničkou a všichni jsou šťastní.

Má to ale nevýhodu v tom, že je to potřeba složitě vyladit, aby ten kondík zdržoval dost na to, aby se tlačítko uklidnilo ale zase ne moc, aby to z pohledu člověka bylo pomalé. A měnit několikrát kondíky a odpory je práce, kterou si lidi celkem rádi odpustí, když to jde udělat i bez zbytečných součástek navíc.

Takže se prostě Arduinu "nějak" naprogramuje, že když se to tlačítko zmáčkne, tak se jeho poskakování chvilku ignoruje, dokud se neuklidní - to je zase softwarová metoda. (To "nějak" jde udělat spoustou nejrůznějších způsobů, každý má nějaké výhody a/nebo nevýhody, takže si to každý dělá jak potřebuje, nebo umí, nebo odněkud opíše)

To je ten debouncing.

Nějakých diod se to vlastně vůbec netýká, diody jsou fajn, neposkakujou.

Týká se to jen toho, že když se debouncing neudělá, nebo neudělá dost dobře, tak na jedno stisknutí tlačítka může Arduino registrovat (a tudíž i obsloužit) těch stisknutí víc (jak to poskakuje), což pak vede k nejrůznějším problémům, podobně jako když usneš s rukou na klávesnici a pak tam máš dlouhou řádku písmenka.

Takže pokud třeba Arduinem ovládáš diodu, na jedno stisknutí ji rozsvítíš a na druhé zhasneš, tak pokud jsi neudělal ošetření tlačítka, tak na jedno stisknutí prstem Arduino "uvidí" těch stisknutí několik, strašně rychle za sebou a tak několikrát tu diodu rozsvítí a zhesne (jedna změna na stisknutí). Nebo když má na stisknutí tlačítka pootočit motorkem a "uvidí" těch stisknutí deset, tak s ním logicky taky desetrát pootočí. Nebo když má na jedno stisknutí poslat jedno písmenko na Serial (a tedy na tvojí obrazovku), tak na deset rychlých stisknutí (jek to tlačítko poskakuje) jich prostě pošle deset, a ty, jako uživatel se jen divíš, kde se jich tolik vzalo.

----

Takže to, co potřebuješ je ošetřit debouncingem to odskakování u každého použití každého tlačítka, co k Arduinu připojíš. Aby na jedno stisknutí/puštění tlačítka Arduino vidělo jen jednu změnu. Pak ti věci, které závisí na počtu stisknutí tlačítka budou fungovat správně.

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Mini CNC osa Z

Příspěvek od kiRRow » 29 čer 2019, 23:22

Jinak ... cože se to v podstatě vlastně snažíš stvořit ?

Hanz
Příspěvky: 262
Registrován: 25 dub 2019, 23:52
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od Hanz » 02 črc 2019, 20:25

prvotní dotaz byl, jak zobrazit polohu serva pomocí led, to bylo u cnc osy Z, ale Arduino mě tak uchvátilo, že se snažím mu porozumět a snažím se honaučit programovat. A protože jsem zelenáč potřebuju poradit - velké DĚKUJU Vám všem !!! No a jak se tak probírám příklady a jak je skládám na kontaktním poli, přicházím na problémy, které se objevují. Asi tak na vysvětlení. Hanz

Odpovědět

Kdo je online

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