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 » 24 črc 2019, 00:38

děkuju za připomínky.Čitelnost mých sketchů, když se na ně zpětně dívám, je dost bídná a chaotická ! Slibuju, že se na to v budoucnu taky zaměřím.
Taky jsem si všiml, že ... //chod serva pouze když je nový stav tlačítka označen jako HIGH
Pořád nad tím přemýšlím co psal kiRROW, že se výsledek operace uloží. Ano pokud odstraním všechno, co souvisí s fór, zůstane tohle :

Kód: Vybrat vše

if ((millis() - lastDebounceTime) > debounceDelay) {
        // Ať už je načtená hodnota jakákoliv, byla tam déle než debounce prodleva, 
        // berme ji tedy jako aktuální stav:/code]
        
         //ten stav se má uložit - a ukládá se tady :
        [code]    // načtené hodnoty uložte. V příští smyčce bude označeno jako lastButtonState:
    lastButtonState = reading;/code]
    
   // pak teprve přichází řada na Servo. Pochopil jsem správně ?
   // Omlouvám se za code, píšu z tabletu, tak doufám že bude ok.

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

Re: Mini CNC osa Z

Příspěvek od gilhad » 24 črc 2019, 06:12

Aby se mi hodnota digitalRead() nemenila v cyklu, i kdyz to treba zrovna kmita, tak ji nactu jen jednou - do reading - a dal pracuju s touto hodnotou, co byla na zacatku cyklu:

Kód: Vybrat vše

   int reading = digitalRead(buttonPin);
Pak tam jsou dve ruzne veci, ktere se tak nejak prolinaji:

nejdriv musim zjistit, zda mi to nekmita dost dlouho:

Kód: Vybrat vše

    if (reading != lastButtonState) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
        lastDebounceTime = millis();
    };
    .....
    lastButtonState = reading; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym reading, zda se to mezi tim nezmenilo
(ze si lastButtonState ukladam az na konci nevadi, protoze s nim stejne nikde jinde nepracuju. Klidne by se dal ulozit jeste pred tema teckama a nic by to neovlivnilo - pokud bych ho pak nekde nepotreboval pouzit teda, coz tady nepotrebuju)


a pokud to nekmita uz dost dlouho, tak muzu neco delat:

Kód: Vybrat vše

    if ((millis() - lastDebounceTime) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota

       if (reading != buttonState) {  // Pokud se stav tlačítka změnil
            buttonState = reading;   // zapamatuju si novy stav 
            // a tady (treba) budu neco delat
            .....
       };  

    };
a to neco delat by melo byt:

Kód: Vybrat vše

            // a tady (treba) budu neco delat
            if (buttonState == HIGH) { // tlacitko bylo pusteno
                 // nejake vrteni servama
            };
pricemz nejake vrteni servama je:

Kód: Vybrat vše


                 // nejake vrteni servama
                 for (pos = 0; pos <= 180; pos += 1) { 
                     myservo.write(pos);              
                     delay(15);                     
                 };
            
                 for (pos = 180; pos >= 0; pos -= 1) { 
                     myservo.write(pos);              
                     delay(15);                       
                 };
cili to Servo prijde na radu mezi zjistovanim, zda to kmita a ulozenim posledni zname hodnoty, ale prijde na radu jen, pokud se zjistilo, ze to uz nekmita.

(ackoli by to samozrejme mohlo byt i obracene, ze se nejdriv ulozi ten lastButtonState a pak az se osetruji serva.)

----
Jinak kazda slozitejsi vec (a spousta trivialnich veci taky) se da udelat nekolika ruznymi zpusoby -
napr. kiRRow resi debouncing tak, ze pokud se zmeni hodnota, tak ceka tak dlouho, az se prestane menit a zustane tak delsi dobu a to pak bere jako spravny vysledek a na jeho zaklade jedna.

Ja naopak beru jako spravny vysledek hned prvni zmenu hodnoty a jednam, zatimco nejakou dobu vstup ignoruju, dokud se neustali a teprve pak jsem ochoten prijmout nekdy dalsi zmenu.

Oboji ma sve vyhody a nevyhody - kiRRow nema problem, pokud tlacitko obcas na mzik ztrati (nebo ziska) kontakt, protoze se mu pak ustali a hodnota je stejna jako predtim. Cenou za to je, ze nez zacne reagovat, tak musi chvili cekat na ustaleni tlacitka. (a v extremnim pripade, pokud mu to zakmitava furt, tak se nikdy nedocka)

Ja naopak beru, ze kdyz se hodnota zmenila, tak to znamena, ze tlacitko se hnulo a jednam okamzite - tim ziskam extremne kratkou latenci a muzu udelat spoustu veci, nez se tlacitko umravni. Cenou za to je, ze zasumena tlacitka, ktera si "jen tak" obcas propusti falesny signal beru jako platne stisky a pusteni, cili nemam takovou odolnost proti ruseni. (a v extremnim pripade, pokud mi to zakmitava furt to beru jako hodne rychly autorepeat a furt na to reaguju)

Takze on eventualne nedostane signal nikdy, zatimco ja dostanu neomezene mnozstvi signalu - zalezi na aplikaci, co je prijatelnejsi reakce na chybu. (Ja to pouzivam pro hry a podobne, takze okamzita reakce a autorepeat/kulomet je pro me prijatelnesi nez odolnost proti ruseni, ztraty rychlych stisku a prodleva v reakci )

A samozrejme jde vymyslet i jine varianty, treba, ze se po zmene pevnou chvili ceka a pak se rozhodne podle aktualni hodnoty - bud je stejna a slo jen o ruseni, nebo je jina a slo o stisk, s tim, ze v extremnim pripade je celkem nahodne, zda vyjde stisk, ci ne, ale proste s tak blbym tlacitkem je to stejne asi fuk, protoze si dela co chce a nebudeme blokovat, dokud se samo neopravi.

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

Re: Mini CNC osa Z

Příspěvek od kiRRow » 25 črc 2019, 16:49

Takovýhle zápis programu už jsi někdy viděl ??? Uměl bys takhle myslet a sám něco podobného sestrojit ?
https://ctrlv.cz/I3th
https://cs.wikipedia.org/wiki/Algoritmus


---- jen tak pro legraci
Strašně mi tenhle styl myšlení připomíná jeden vtip, kdy žena pošle svého muže, který je programátor do obchodu. A říká mu : "Kup 10 rohlíků a kdyby měli vajíčka, tak kup 30". Příjde programátor do obchodu a povídá : "Dobrý den, máte vajíčka ?". "Ano máme". "Tak mi dejte prosím 30 rohlíků." :lol:
-----

uplně vidím jak mu to šrotuje v tý hlavě xD

Kód: Vybrat vše

int Rohlíky = 10;
if(vajíčka==TRUE){
	Rohlíky = 30;
}
void kupRohlíky(Rohlíky);

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

Re: Mini CNC osa Z

Příspěvek od gilhad » 25 črc 2019, 19:25

Jo, toho jsme meli na skole plno :) Ale to asi bylo na Hanz

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 26 črc 2019, 20:32

zdravím pánové, v hlavě mi to šrotovalo, to ano, ale pro rohlíky jsem nešel :D dával jsem dohromady poznámky od gildad. a od kiRRow, kterým fakt děkuji za nápovědy. No tady je výsledek :

Kód: Vybrat vše

#include <Servo.h>     //zahrnutí knihovny pro ovládání servo motoru
Servo myservo;         //každý motor má svou instanci třídy Servo
int buttonPin = 3;    // číslo pinu tlačítka

int pos = 0; //proměnná obsahující pozici motoru (úhel natočení)
int buttonState; //nejnovější hodnota načtená ze vstupního pinu
int lastButtonState = LOW; // předchozí hodnota načtení ze vstupního pinu


// Následné proměnné jsou typu long, jelikož čas měřený v milisekundách se 
//rychle změní na větší číslo, jež nemůže být uloženo v int
long lastDebounceTime = 0; // čas posledního změny výstupního pinu
long debounceDelay = 50; // čas debounce prodlevy 
                                           
void setup() {
    myservo.attach(9);   //servo je připojeno na pin 9
    pinMode(buttonPin, INPUT);  //nastavení tlačítka jako vstup
          
    myservo.write(pos);  // nastavení počátečního stavu serva
}

void loop() {
    int reading = digitalRead(buttonPin);
    
     if (reading != lastButtonState) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
        lastDebounceTime = millis();
    };
    
   lastButtonState = reading; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym reading, zda se to mezi tim nezmenilo
   
     if ((millis() - lastDebounceTime) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota

       if (reading != buttonState) {  // Pokud se stav tlačítka změnil
            buttonState = reading;   // zapamatuju si novy stav 
            // a tady (treba) budu neco delat
                        if (buttonState == HIGH) { // tlacitko bylo pusteno
                
                  // nejake vrteni servama
                 for (pos = 0; pos <= 180; pos += 1) { 
                     myservo.write(pos);              
                     delay(15);                     
                 };
            
                 for (pos = 180; pos >= 0; pos -= 1) { 
                     myservo.write(pos);              
                     delay(15);                       
                 };         
      
       }
      }
     }
    }       
akorát jsem musel tohle :

Kód: Vybrat vše

lastButtonState = reading;
přesunout tam, kde to teď je, protože na konci sketche mi servo nechodilo ?
Je to prosím nyní ošetřeno, jak má být ? díky

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

Re: Mini CNC osa Z

Příspěvek od kiRRow » 28 črc 2019, 09:06

Tohle :

Kód: Vybrat vše

if (buttonState == HIGH) { // tlacitko bylo pusteno
                
                  // nejake vrteni servama
                 for (pos = 0; pos <= 180; pos += 1) { 
                     myservo.write(pos);              
                     delay(15);                     
                 };
            
                 for (pos = 180; pos >= 0; pos -= 1) { 
                     myservo.write(pos);              
                     delay(15);                       
                 };         
      
}
příjde až po tomhle :

Kód: Vybrat vše

int reading = digitalRead(buttonPin);
    
     if (reading != lastButtonState) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
        lastDebounceTime = millis();
    };
    
   lastButtonState = reading; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym reading, zda se to mezi tim nezmenilo
   
     if ((millis() - lastDebounceTime) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota

       if (reading != buttonState) {  // Pokud se stav tlačítka změnil
            buttonState = reading;   // zapamatuju si novy stav 
       }
     }
pak tě potká další záludnost a to je dlouhý stisk tlačítka, vyřešíš to rozšířením podmínky (je tlačítko HIGH a zároveň nebylo HIGH v minulé kontrole)

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 28 črc 2019, 21:52

Děkuju kiRRow za informaci o záludnosti s delším stiskem tlačítka mj. k tomu jsem je ještě nedostal. Ale zajímalo by mě, kde je chyba v upraveném sketchi ? Jestli se dívám dobře, tak je upravený , jak píše kiRRow v připomínce ... tohle...příjde až po tomhle...? Nebo se mýlím ? Sketch je tedy upravený ok ?

Kód: Vybrat vše

if (reading != lastButtonState) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
        lastDebounceTime = millis();/code]
// Tady zato bych rozšířil podmínku, protože potom je opět porovnání poslední změny , souhlas?

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

Re: Mini CNC osa Z

Příspěvek od kiRRow » 29 črc 2019, 18:39

Ty jsi to napsal tak, že podmínku pro práci se servem a samotnou práci se servem si vložil do IFu, který náleží části programu, která ošetřuje tlačítko. Když to poskládáš za sebe, tak jak jsem psal, tak nejprve dojde k ošetření tlačítka, na základě toho se nastaví proměnná ( a nemusí být jen jedna, může jich být hromada - můžeš si například pamatovat jak dlouho už tlačítko držíš, nezbytná nutnost, když chceš aby se jedním tlačítkem daly naklikat i tisícové hodnoty). Tohle je jeden samostatný blok programu.
Druhý blok programu obsluhuje servo ... sbírá informace, které mu uložil první blok programu a podle nich pracuje.

Jinak teď to je napsaný tak, že pouze při stisknutém tlačítku bude servo konat činnost ... a to točit se z jedné krajní pozice do druhé.

------
edit

Já se ti ani nedivím ... ono je to v tom debounce sketchi tak napsaný, že ovládáni LEDky je vnořeno do toho ošetření tlačítka ... ale nastavení výstupu na LOW nebo HIGH je v podstatě jen zápis do proměné ... je to speciální proměná ve které si procesor pamatuje stavy výstupů/vstupů, stejně jako třeba změna výstupu na vstup, opět jen zápis do proměné ... taky speciálka, procesor si zde pamatuje jestli je nožička vstup nebo výstup ... všechny tyhle jednoduchý úkony se tam dají nacpat ...
Jenže to vrtění servem je už časově náročnější ... a postupem času bude tato část kódu bobnat a měnit se ... proto je už lepší a časem nutnost, tohle dostat mimo vyhodnocování tlačítka.

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 30 črc 2019, 16:46

zdravím , nemůžu se nějak vymotat a upravit sketch jak mi píše kiRRow. dokonce jsem šel 2x pro rohlíky :lol: Jak to mám udělat, abych se dostal mimo podmínku se s točením serva ? :roll: sketch jsem překopával, ale vždycky skončil tam, kde jsem minule začínal, servo jezdilo tam a zpět 2x.

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

Re: Mini CNC osa Z

Příspěvek od kiRRow » 31 črc 2019, 15:49

kiRRow píše:
28 črc 2019, 09:06
Tohle :

Kód: Vybrat vše

if (buttonState == HIGH) { // tlacitko bylo pusteno
                
                  // nejake vrteni servama
                 for (pos = 0; pos <= 180; pos += 1) { 
                     myservo.write(pos);              
                     delay(15);                     
                 };
            
                 for (pos = 180; pos >= 0; pos -= 1) { 
                     myservo.write(pos);              
                     delay(15);                       
                 };         
      
}
příjde až po tomhle :

Kód: Vybrat vše

int reading = digitalRead(buttonPin);
    
     if (reading != lastButtonState) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
        lastDebounceTime = millis();
    };
    
   lastButtonState = reading; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym reading, zda se to mezi tim nezmenilo
   
     if ((millis() - lastDebounceTime) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota

       if (reading != buttonState) {  // Pokud se stav tlačítka změnil
            buttonState = reading;   // zapamatuju si novy stav 
       }
     }
To už si snad děláš srandu, ne ??? ... Tu horní část kódu zkopíruješ za tu spodní část kódu a celý to vložíš do loop(){} ... Pak se ti při stisknutém tlačítku bude servo točit ze strany na stranu ... a nezapomeň si nadefinovat i zbývající proměnné

Odpovědět

Kdo je online

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