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 » 17 črc 2019, 16:16

moc, moc děkuji kiRRow za komentář. Přesně tohle potřebuji vědět a naučit se takhle číst, proto hledám všude možně na netu, díky.
Pokusil jsem se dát dohromady debounce pro tlačítko, ale místo Led jsem dal servo.
Otázka : je to tlačítko ošetřeno jak má být ? U led to možná poznám tak, že mi ledka vícekrát problikne,nebo neblikne při stisku tlačítka vůbec, ale jak to poznám u serva ? nechat si vypsat co se děje na seriový monitor ?
tady sketch tlačítka / debounce /+ servo :

Kód: Vybrat vše

//počáteční stav : servo v pozici 0, po stisknutí tlačítka servo jede
//tam a zpět 2x, pak se zastaví a čeká na nové stisknutí tlačítka

#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() {
  
    // Stav spínače přiřaďte do místní proměnné:
    int reading = digitalRead(buttonPin);
    
    // Zkontroluje, zda-li jste stlačili tlačítko
    // (tj. že vstup se z LOW změnil na HIGH), a od posledního zmáčknutí jste čekali
    // dostatečně dlouho na to, aby byl veškerý šum ignorován:
    
    // Pokud se spínač změnil kvůli šumu nebo stlačení:
    if (reading != lastButtonState) {
        // upravte proměnou lastDebounceTime
        lastDebounceTime = millis();
    }
    
    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:
        
        // Pokud se stav tlačítka změnil:
        if (reading != buttonState) {
            buttonState = reading;
            
            // chod serva pouze když je nový stav tlačítka označen jako HIGH  
      for (pos = 0; pos <= 180; pos += 1) { 
                                           
    myservo.write(pos);              
    delay(15);                     
  }
  for (pos = 180; pos >= 0; pos -= 1) { 
    myservo.write(pos);              
    delay(15);                       
            }
        }
    }
           
    // načtené hodnoty uložte. V příští smyčce bude označeno jako lastButtonState:
    lastButtonState = reading;
}

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 17 črc 2019, 17:41

teď jsem pořádně pročetl popis sketche od kiRRow a minule jsem měl otázku : co způsobuje , že servo zastaví ihned v poloze v jaké zrovna je. Jestli jsem to dobře pochopil, tak na vině je toto :
... // Zatím co na pin2 je přivedeno 5V ... a toto : ...// Zatím co na pin3 je přivedeno 5V...
Na pinech je napětí a tím, že stisknu tlačítko napájení přeruším nebo přivedu, / záleží, jak je to ve sketchi nastaveno ?!
Je to tak ?
mj. okomentovaný sketch jsem si vytiskl a založil do slož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 » 17 črc 2019, 18:16

Myslim, že se mýlíš.

to // Zatím co na pin2 je přivedeno 5V ... odpovídá výrazu digitalRead(2) == HIGH který říká, že při přečtení hodnoty pinu 2 se načetla hodnota HIGH (což znamená dost vysoké napětí, čili asi tak těch 5V pro zjednodušení (ve skutečnosti to reaguje od 3V výš určitě, možná i od trochu míň), zatímco LOW znamená, že je tam 0V(teda od -0.5 do 1.5V zaručeně, možná i o fous víc). To mezi tím (1.5-3V) je šedá oblast, kde výrobce nezaručuje nic a pokud možno by na ten pin nemělo takové napětí být vůbec připuštěno (pokud možno - je jasné, že při změně mezi LOW a HIGH se tam na chvilku takové napětí ocitne, ale nemělo by to být na dlouho, rozhodně ne trvale))

ALE měl bys vědět (a asi nevíš - ve smyslu "hodilo by se ti vědět"), že servo.write(pos) sice proběhne rychle (podobně jako digitalWrite(...)), ale jeho následek je trvalý (jako u digitalWrite) a to takový, že na příslušném pinu začnou běhat pulzy (a běhají, dokud se to nanestaví jinak), které servu řeknou, do jaké pozice se má natočit. Následně sice běží výpočet dál a udělá spoustu kroků, ale servo je mechanické a pomalé, tak se podle těch pulzů postupně začne natáčet na polohu pos, dokud se mu nepovede ji dosáhnout a pak ji pořád udržuje (když ho vychýlíš, tak se vrátí), dokud mu to pulzy nařizují (a ty pulzy běží furt, dokud je v programu nenastavíš jinak).

Stejně jako když máš LEDku a dáš správný digitalWrite(), tak ten pin pořád drží výstupní hodnotu a LEDka pořád svítí, i když je program už dávno někde jinde. A když dáš příslušná analogWrite(), tak ten pin pořád rychle pulzuje a LED pořád rychle bliká, takže se pomalému lidskému oku zdá, že svítí tlumeně.

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 18 črc 2019, 16:12

Děkuju gilhad za vysvětlení , našel jsem si pár informací o servu na netu,ale jak vidno nestačilo to. Mohlo mě ale napadnout, že servo je vlastně řízené impulsy vysílané s Arduina a záleží na délce trvání. Nevadí,díky za informace, budu dál studovat.
Můžete mi prosím napsat, že nemám v posledním sketchi chybu ? ( Tlačítko debounce + servo ) případně kde ? 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 » 18 črc 2019, 16:24

Servo je řízeno napětím pohybujícím se od 0V do 5V - když doněj pustíš 5V, natočí se do maximální pozice, když do něj pustíš 2,5V natočí se do polovičky atd ... arduino toto napětí generuje pomocí PWM (pulsně šířková modulace), kdy velmi rychle střídá na PINu LOG0 a LOG1 ... záleží potom na tom, jak dlouho je LOG0 vůči LOG1 (nadává se tomu střída). Čím déle je výstup ve stavu LOG1, tím vyžší napětí se zdá na výstupu být (ve skutečnosti je tam jen 0V a 5V, ale pokud budeš velmi rychle střídat 0V a 5V s 50% střídou výsledkem bude 2,5V).

Zastavení motoru ve sketchi, který jsem komentoval, opravdu způsobuje zápis té podmínky v cyklu while. Cyklus poběží do té doby, kdy je stisknuto tlačítko a zároveň motor nedosáhl krajní polohy. U takto použitého tlačítka zákmity ani nepoznáš, je to jednak proto, že servo nestíhá reagovat tak rychle a druhý důvod je čekání 15ms (během této doby veškeré zákmity spolehlivě zmiznou, ale arduino nemůže dělat nic jiného, než čekat).
Pokud by jsi po servu chtěl aby se vrtělo ze strany na stranu a stiskem tlačítka se zastavilo v aktuální poloze, druhým stiskem se zase rozvrtělo a nikde bys oněch 15ms nečekal, tak zákmity poznáš. Servo by se zdánlivě nezastavovalo (a ještě k tomu jen někdy, jindy by se tvářilo že je vše ok), protože arduino by to vyhodnotilo třeba jako 4 stisky ... pak by servo ve velmi krátké době zastavilo, rozběhlo, zastavilo a rozběhlo.

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 20 črc 2019, 16:34

děkuju za neocenitelné informace k servu, přiřadil jsem je k učení, ale vrátím se o kousek zpět, kdy jsem se snažil napsat sketch ošetření zákmitů tlačítka pomocí debounce. Sketch je ze dne 17.července 2019 . Dál jsem místo led servo. Asi nemá smysl u serva ošetřovat tlačítko debouncem. Ale i přesto můžete mi prosím napsat, zda je korektně sepsaný ? IDE ho zkompilovalo, no to neznamená, že je všechno v pořádku.

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 » 22 črc 2019, 11:59

Sorry, byl jsem na dovolené.

O tom sketchi z 17.7. :
Ošetření zákmitu je napsáno v podstatě správně. Co je špatně je to, že jsi nacpal cykly pro ovládání serva tam, kde se řeší ošetření zákmitu tlačítek. Prolistuj si zpátky téma tam, kde jsem popisoval jak se má takový program chovat pomocí člověku srozumitelných slov.

1. ošetříš zákmit tlačítka pomocí toho, že kdykoliv se změní, resetneš čas a propustíš jen to co se nezměnilo déle než debounceTime
2. když víš že se stav čudlíku změnil a trvá déle než debounceTime, tak do proměné kde je uložen 100% správný a ošetřený stav uložíš vyhodnocený a ošetřený stav tlačítka
3. až potom někde dále v programu řešíš točení serverem ... a tehdy si sáhneš do paměti, kde máš uložený právě teď aktuální, ošetřený a správný stav 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 » 23 črc 2019, 18:07

můžete mi prosím napsat, kde jsem dal ...cykly pro ovládání serva ...? vždyť natáčení serva je ve sketchi řešeno až skoro poslední ?
Vytisnul jsem si příspěvek od kiRRow, tím děkuji jemu a všem ostatním, za trpělivost ! ze 6.7.2019, kde není dobře splácáno to ošetření zákmitu ... . Přečetl ho znovu, a tam se píše jak to má fungovat. Po rozebrání odpovědi a hledání na netu "výrazů" typu - //načtení stavu tlačítka ..., vytvoření proměnné..., atd. bych měl dát dohromady sketch, který je obsažen částečně v těchto :
https://arduino.cz/arduino-zaklady-dete ... -tlacitka/
https://arduino.cz/arduino-zaklady-blik ... kce-delay/
https://navody.arduino-shop.cz/zaciname ... citko.html
https://arduino.cz/arduino-zaklady-funkce-debounce/
http://robotika.vosrk.cz/guide/arduino/lesson06/cs
Takže jsem si je vytisknul a dávám dohromady.
Jsem na správné cestě ? Souhlasíte s tím, co jsem našel ? díky

...a millis mi nedá spát !

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 » 23 črc 2019, 18:15

Kód: Vybrat vše

    // Stav spínače přiřaďte do místní proměnné:
    int reading = digitalRead(buttonPin);
    
    // Zkontroluje, zda-li jste stlačili tlačítko
    // (tj. že vstup se z LOW změnil na HIGH), a od posledního zmáčknutí jste čekali
    // dostatečně dlouho na to, aby byl veškerý šum ignorován:
    
    // Pokud se spínač změnil kvůli šumu nebo stlačení:
    if (reading != lastButtonState) {
        // upravte proměnou lastDebounceTime
        lastDebounceTime = millis();
    }
    
    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:
        
        // Pokud se stav tlačítka změnil:
        if (reading != buttonState) {
            buttonState = reading;
            
            // chod serva pouze když je nový stav tlačítka označen jako HIGH  
      for (pos = 0; pos <= 180; pos += 1) { 
                                           
    myservo.write(pos);              
    delay(15);                     
  }
  for (pos = 180; pos >= 0; pos -= 1) { 
    myservo.write(pos);              
    delay(15);                       
            }
        }
    }
           
    // načtené hodnoty uložte. V příští smyčce bude označeno jako lastButtonState:
    lastButtonState = reading;
tohle je část kódu, která se stará o programové ošetření zákmitu tlačítka ...
... cokoliv co je v for(){} tam nepatří ... včetně toho for ... patří to níže do samostatné podmínky IF, která bude testovat proměnnou buttonState ...

nejprve se provede ošetření
pak se výsledek této operace uloží
a až potom na základě tohoto uloženého výsledku je vykonávaná nějaká činnost

A ano ... jsi na správné cestě, protože jsi stím ještě neseknul. Trpělivost trpělivost a ještě jednou trpělivost ... ono pak dojde ke zlomovému bodu, kdy to člověk pochopí správně a pak to najednou jde všechno samo :)

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 » 23 črc 2019, 19:52

Mimochodem - zvykni si spravne odsazovat, co je do sebe vnorene - ten kus kodu nahore na prvni pohled vypada uplne jinak, nez jak doopravdy funguje - coz zvlaste nezkusenemu strasne zkomplikuje sanci na to se v tom vyznat.

Porovnej si prehlednost (a rychle odhadni, jestli jsou ty for v tom kterem if, nebo ne, nebo ktere ano a ktere ne, a jestli jsou pripadne do sebe nejak vnorene)

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:
        
        // Pokud se stav tlačítka změnil:
        if (reading != buttonState) {
            buttonState = reading;
            
            // chod serva pouze když je nový stav tlačítka označen jako HIGH  
      for (pos = 0; pos <= 180; pos += 1) { 
                                           
    myservo.write(pos);              
    delay(15);                     
  }
  for (pos = 180; pos >= 0; pos -= 1) { 
    myservo.write(pos);              
    delay(15);                       
            }
        }
    }

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:
        
        // Pokud se stav tlačítka změnil:
        if (reading != buttonState) {
            buttonState = reading;
            
            // chod serva pouze když je nový stav tlačítka označen jako HIGH  
            // ?!?!?! jako kde je nejaka podminka? tocime pri kazde zmene!

            for (pos = 0; pos <= 180; pos += 1) { 
                myservo.write(pos);              
                delay(15);                     
            }
            
            for (pos = 180; pos >= 0; pos -= 1) { 
                myservo.write(pos);              
                delay(15);                       
            }
            
        }
    }
Pristup "citelne a prehledne to napisu teprve az tomu budu dokonale rozumet a orientovat se v tom bez namahy" vazne neni ten nejlepsi pokud uz tomu dokonale nerozumis a neorientujes se v tom bez namahy bez ohledu na matouci upravy... a ostatne ani potom ne. A to myslim zcela vazne a ridim se tim, i kdyz (nebo prave proto, ze) moje bezne projekty mivaji bezne desetitisice az statisice programovych radku (komentare nepocitaje) a komercni nasazeni.

Odpovědět

Kdo je online

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