Mini CNC osa Z

Odpovědět
kiRRow
Příspěvky: 145
Registrován: 07 kvě 2019, 07:03
Reputation: 2
Bydliště: Opava

Re: Mini CNC osa Z

Příspěvek od kiRRow » 29 říj 2019, 16:05

buttonState // tady ukládáme načtený stav na začátku loopu
lastButtonState // tady ukládáme načtený stav po kontrole, jestli už se to ustálilo, nebo ne
lastTrueButtonState // tady ukládáme načtený stav při kontrole, když už víme, že je to ustálené, ošetřené

Pokud tlačítko kmitá, dochází k tomu že v buttonState a lastButtonState jsou rozdílné stavy a to způsobuje, že se neustále aktualizuje lastDebounceTime. Tím dochází k nesplnění podmínky, která testuje, jestli od poslední změny uběhl debounceDelay. Pokud ano, právě načtený stav je porovnán s poslední známou ošetřenou hodnotou, jestli došlo ke změně. Pokud ke změně došlo, testuje se jestli se to změnilo na stav HIGH, pokud ano, víme že tlačítko nepřeskakuje, dále jeho stav se změnil a navíc změnil se z nestisknutého na stiknuté - provede se tedy přičtení mode. A ten chybjející řádek pak už jen uloží do lastTrueButtonState právě vyhodnocený stav. Dokud to tlačítko nepustíš a opět nestiskneš, už nedochází ke změnám vůči lastTrueButtonState a podmínky se přeskakují.
Minule nám to fungovalo i bez toho pamatování ošetřeného stavu, proto, že jsme po prvním stisku zaměstnali procesor vrtěním serva, tím pádem jsi to tlačítko stihnul pustit a nebralo ho to jako trvale stiské tlačítko.

boolean verzus int ... boolean je nejmenší jednotka paměti a obsahuje jen hodnoty 0/1 ... false/true ... naprosto ideální pro uchování informace, která nabývá pouze dvou hodnot. (stisklé/nestisklé tlačítko)
int je 16bitové číslo a v paměti procesoru zabírá 2bajty. Je vhodnější pro ukládání větších čísel v rozsahu cca 32.000 - -32.000.

Jen tak pro představu :
boolean buttonState = false;
boolean lastButtonState = false;
boolean lastTrueButtonState = false;
tohle zabere v procesoru tolik místa : 000

int buttonState = false;
int lastButtonState = false;
int lastTrueButtonState = false;
tohle zabere v procesoru tolik místa : 000000000000000000000000000000000000000000000000

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 30 říj 2019, 16:13

dobrý den, děkuju kiRRow za vysvětlení a vězte, že pokud napíšete knihu / pokud jste ji už napsal dejte prosím vědět /, tak si ji okamžitě koupím. :D A pokud jsme u knih , velice blízko je ke kopírování a tisku kodů. Nemůžu přijít jak okopírovat sketch např. do wordu, abych nerozhodil formátování, hlavně to barevné formátování. Vždycky to pak musím barvit slovo od slova. Je jedno jestli kopíruju z IDE nebo z fora. Máte nějaký fígl, radu, tip ? :?: děkuju

kiRRow
Příspěvky: 145
Registrován: 07 kvě 2019, 07:03
Reputation: 2
Bydliště: Opava

Re: Mini CNC osa Z

Příspěvek od kiRRow » 30 říj 2019, 18:32

Proč do wordu ??? Vytisknout ten kód jde rovnou z arduina. Formátování se to rozhází na bílých znacích (mezera, tabulátor) ... obzvlášť pokud jsi něco odsadil mezerema, něco tabulátorem a máš nastavenou jinačí šířku tabulátoru ve wordu, než v arduino IDE.
Barvy ti ze sketche zmiznou ve wordu VŽDY. Barvy v kódu budeš mít jen tehdy, otevřeš-li ho v programu, který tomu kódu rozumí. Takový program má takzvaný KEYWORDS soubor ve kterém jsou vypsány všechny slovíčka a pod jakou barvou se mají zobrazit.

Jinak dneska jsem si na tebe vzpoměl. Bratr řešil problém s počítáním válečků pomocí optického senzoru. Když mu propadl jeden váleček, tak senzor zabral 3-5x. (jasnej debounce zákmitů) A navíc když se mu ten váleček zaseknul před tím senzorem, tak mu to počítalo pořád dokola (jasnej případ jak se ti přepínal ten mode, když jsi držel čudlík).

A knihu o arduinu už napsal Zbyšek Voda ... je perfektní.

gilhad
Příspěvky: 384
Registrován: 07 bře 2018, 11:22
Reputation: 4

Re: Mini CNC osa Z

Příspěvek od gilhad » 31 říj 2019, 02:00

Jo a pochopitelne to musis tisknout NEproporcionalnim pismem, jinak se ti to nezarovna nikdy. (takove pismo se pozna, ze ma stejne siroka vsechna pismena, kuprikladu i I a W ) https://cs.wikipedia.org/wiki/Neproporc ... p%C3%ADsmo

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 14 lis 2019, 10:52

dobrý den, s tiském kodů jsem moc nepokročil některé z netu jdou vytisknout bez změny formátování a barev písma, ale zbytek jako v minulém komentáři. Mám doma pc s Win7, ale ve Win10 to prý jde zkopírovat, tisknout přímo z nabídky myši.

No , vrátím se zpět k poslednímu kodu s variacemi blikání Led - otázka - jak by vypadal kod , když po stisknutí tlačítka by Led blikaly např. 10x nebo 15x a počet blikání by se dal v jednotlivých mode měnit ? Vím, že je potřeba použít cykly ( např. for ). Musím vytvořit novou proměnnou nebo použít stávající a dosadit do for ? kde bude v kodu umístěna, aby to fungovalo ? Jak to prosím bude ? děkuji

kiRRow
Příspěvky: 145
Registrován: 07 kvě 2019, 07:03
Reputation: 2
Bydliště: Opava

Re: Mini CNC osa Z

Příspěvek od kiRRow » 14 lis 2019, 17:08

Cykly nejsou zrovna nejšťastnější řešení. Program ti teď pracuje tak, že si pamatuje v jakém je módu a číhá na situaci, kdy je třeba změnit stav ledek. Tento stav je potom vždy na konci programu zapsán do výstupních pinů. Šel bych cestou, že bych si pamatoval kolik mám udělat změn stavu ledek. Pokaždé, kdybych provedl změnu, tak bych z tohoto čísla odečetl jedničku. Když bych dosáhnul toho, že se bude rovnat 0, tak změním mode na 0 (tím se ledky zhasnou). Je nutno si uvědomit, že rožnutí ledek je jedna operace, zhasnutí je druhá. Pokud to má bliknout 10x tak musí proběhnout 20 operací, nebo hlídat jen jednu změnu. Číslo s počtem operací je nutno nastavit v momentě kdy zjistíš, že tlačítko je zmáčknuto, ale ne drženo ... v podstatě tam kde přičítáš mode. Tam si i můžeš nastavit to, že při mode 3 se provede jiný počet operací než při mode 4.

commar
Příspěvky: 19
Registrován: 26 úno 2019, 15:20
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od commar » 15 lis 2019, 12:13

Pro tisk zkuste použít PSPAD, http://www.pspad.com/cz/download.htm,
teď nemám možnost to ověřit, ale mám za to že mi vždy zachovat formátování i barvy a to i při tisku...

kiRRow
Příspěvky: 145
Registrován: 07 kvě 2019, 07:03
Reputation: 2
Bydliště: Opava

Re: Mini CNC osa Z

Příspěvek od kiRRow » 15 lis 2019, 16:48

no nejprve ať si vytiskne od Zbyška knížku o arduinu :) ... lidi, to má bejt pomalu bible řádu arduinářů ...

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 15 lis 2019, 21:36

dobrý den, děkuji za info o PSPAD, uvidím jestli ho budu používat.
"Bibli" arduináře od Zbyška Vody a týmu HW kitchen mám.
zkusil jsem kod pro počítání bliknutí, ale pořád mi něco utíká :oops: :cry:

přidáno LedCounter - počítadlo bliknutí

Kód: Vybrat vše

#define TLACITKO 2   // číslo pinu TLACITKA
#define LED1  10    // číslo pinu LED1 zelená
#define LED2  11    // číslo pinu LED2 červená

int LedCounter = 0;   // proměnná počítání bliknutí

boolean buttonState = false;  //nejnovější hodnota načtená ze vstupního pinu
boolean lastButtonState = false;  // předchozí hodnota načtení ze vstupního pinu
boolean lastTrueButtonState = false;  // předchozí hodnota ošetřeného tlačítka

// 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
unsigned long lastDebounceTime = 0;  // čas posledního změny výstupního pinu
unsigned long debounceDelay = 50;  // čas debounce prodlevy 

byte mode = 0;    // 0 - Vypnuto, 1 - Zapnuto, 2 - Blikání rychlé, 3 - Blikání pomalé, 4 - Blikání střídavé

unsigned long aktualniMillis;   //aktualní čas
unsigned long predchoziMillis1;   // předchozí čas pro rychle blikání
unsigned long predchoziMillis2;   // předchozí čas pro pomalé blikání
unsigned long predchoziMillis3;   // předchozí čas pro střídavé blikání

boolean led1svetlo;   //  pomocná proměnná led1svetlo
boolean led2svetlo;   //  pomocná proměnná led2svetlo

 
void setup() {
  
  pinMode(LED1, OUTPUT);  // pin pro LED1 nastaven jako výstup
  pinMode(LED2, OUTPUT);  // pin pro LED2 nastaven jako výstup
  pinMode(TLACITKO, INPUT);  // pin pro TLACITKO nastaveno jako vstup

  Serial.begin(9600);   // konfigurace rychlosti seriového portu
  while (!Serial) {    ; // čekaní na připojení seriového portu, pry nezbytné pouze u desky Leonardo
  }   
  Serial.println("Seriovy port aktivni");  // První výpis na seriový port
}

void loop(){
   
  /*TOHLE JE ZAČÁTEK BLOKU KDE OŠETŘUJI TLAČÍTKO*/
  buttonState = digitalRead(TLACITKO);  // přečtení stavu tlačítka    
  if (buttonState != lastButtonState) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
    lastDebounceTime = millis();
  }                             

  if ((millis() - lastDebounceTime) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    if (buttonState != lastTrueButtonState) {  // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem           
     if(buttonState == true) { 
      
      if(led1svetlo == true) {         // hlídání jednoho stavu proměnné
        LedCounter = 20;                // nastavený počet bliknutí
        LedCounter = LedCounter --;        // odečtení jednoho bliknutí
        if(LedCounter = 0) led1svetlo = false;         // když je počítání na nule, tak jsou ledky vypnuty
        
      }
         mode++; // přičte k MODE hodnotu 1 
         if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluje
      } 
       lastTrueButtonState = buttonState;  // uložím si nový pravý ošetřený stav tlačítka           
    } 
  }   
  
 lastButtonState = buttonState; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym stavem, zda se to mezi tim nezmenilo
                       
  if(mode == 0) {
    // ******* LED1, LED2 vypnuto ********    
     led1svetlo = false;  // zhasni LED1              
     led2svetlo = false;  // zhasni LED2
     Serial.println("LED1,LED2 vypnuto");  // výpis na seriový monitor                   
   }
   
  if(mode == 1) {
    // ******* LED1, LED2 zapnuto  ********       
     led1svetlo = true;  // rožni LED1     
     led2svetlo = true;  // rožni LED2
    
     Serial.println("LED1,LED2 zapnuto");  // výpis na seriový monitor                
   }
    
  if(mode == 2) {
    // ******* LED1,LED2 blikání rychlé  *******        
  aktualniMillis = millis();  //podívám se na hodinky - aktuální čas  
    if(aktualniMillis - predchoziMillis1 > 200) {  // nejprve si zjistím jestli je čas něco provést, uběhlo už 200ms od poslední akce?         
     if (led1svetlo) {                 
          led1svetlo = false;  // zhasnu LED1
          led2svetlo = false;  // zhasnu LED2
          } else {
            led1svetlo = true;  // rožnu LED1
            led2svetlo = true;  // rožnu LED2
            }
            predchoziMillis1 = aktualniMillis;   // v tento čas jsem provedl poslední akci
    }       
     Serial.println("LED1,LED2 blikání rychlé");  // výpis na seriový monitor
  }
     
  if(mode == 3) { 
  // ******* LED1,LED2 blikání pomalé  *******
  aktualniMillis = millis();  //podívám se na hodinky - aktuální čas  
    if(aktualniMillis - predchoziMillis2 > 500) {  // nejprve si zjistím jestli je čas něco provést, uběhlo už 500ms od poslední akce?  
     if (led2svetlo) {          
          led1svetlo = false;  // zhasnu LED1
          led2svetlo = false;  // zhasnu LED2
          } else {
            led1svetlo = true;  // rožnu LED1
            led2svetlo = true;  // rožnu LED2
            }
            predchoziMillis2 = aktualniMillis;   // v tento čas jsem provedl poslední akci 
  } 
  Serial.println("LED1,LED2 blikání pomalé");  // výpis na seriový monitor
 }
    
  if(mode == 4) { 
  // ******* LED1,LED2 blikání střídavé  *******   
  aktualniMillis = millis();  //podívám se na hodinky - aktuální čas
  if(aktualniMillis - predchoziMillis3 > 300) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 300ms ?
    led1svetlo = !led1svetlo; // do proměnné led1svetlo zapíšu její negovanou hodnotu, tj. svítila-li LED1 tak zhasne, byla-li zhaslá rožne se
    led2svetlo = !led1svetlo; // do proměnné led2svetlo zapíšu negovanou hodnotu led1svetlo, tj. pokud LED1 svítí chci LED2 zhaslou a naopak
    predchoziMillis3 = aktualniMillis;   // v tento čas jsem provedl poslední akci 
    Serial.println("LED1,LED2 blikání střídavé");  // výpis na seriový monitor
  }
 } 
  digitalWrite(LED1,led1svetlo);  // aktualizace stavu LED1, zápis proměnné led1svetlo na výstupní pin 10
  digitalWrite(LED2,led2svetlo);  // aktualizace stavu LED2, zápis proměnné led2svetlo na výstupní pin 11   
 
}

kiRRow
Příspěvky: 145
Registrován: 07 kvě 2019, 07:03
Reputation: 2
Bydliště: Opava

Re: Mini CNC osa Z

Příspěvek od kiRRow » 16 lis 2019, 08:34

Takhle si při změně mode nastavíš počet operací :

Kód: Vybrat vše

         mode++; // přičte k MODE hodnotu 1
         if (mode == 3) {
            LedCounter = 20; // provede se 20 / 2 operací = 10
         }
         if (mode == 4) {
            LedCounter = 10; // provede se 10 / 2 operací = 5
         }
         if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluje
Takhle vypadá potom upravený mode 3 :

Kód: Vybrat vše

  if(mode == 3) { 
  // ******* LED1,LED2 blikání pomalé  *******
  aktualniMillis = millis();  //podívám se na hodinky - aktuální čas  
    if(aktualniMillis - predchoziMillis2 > 500) {  // nejprve si zjistím jestli je čas něco provést, uběhlo už 500ms od poslední akce?
    if(LedCounter > 0) {  // mám ještě blikat, nebo už jsem bliknul dostkrát ??
     if (led2svetlo) {          
          led1svetlo = false;  // zhasnu LED1
          led2svetlo = false;  // zhasnu LED2
          } else {
            led1svetlo = true;  // rožnu LED1
            led2svetlo = true;  // rožnu LED2
            }
            predchoziMillis2 = aktualniMillis;   // v tento čas jsem provedl poslední akci
            LedCounter--; // odečtu z čítače jednu změnu
    } 
  } 
  Serial.println("LED1,LED2 blikání pomalé");  // výpis na seriový monitor
 }

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: KamilV a 2 hosti