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

sketch, který vznikl před posledním komentářem od kiRRow » 31 črc 2019, 15:49

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);                       
                 };         
         } 
      }            
          
jo a srandu si nedělám, jenom jsem zrovna nevěděl kudy kam :oops: díky za trpělivost

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

Máš to napsané (nezkoušel jsem to nahrávat do arduina a ověřovat) podle mě správně. Jen jak už říkal gilhad ... dodržuj struktůru kódu ! už hned při psaní kódu! lépe se v tom orientuje a hledají chyby.

Uplně ten samý kód co jsi poslal, akorát je upraven vzhledově ... a reading jsem trošku poupravil definici/deklaraci

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
int reading;

// 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() {
  /*TOHLE JE ZAČÁTEK BLOKU KDE OŠETŘUJI TLAČÍTKO*/
  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
    /*TADY SE ZAČÍNAJÍ DÍT VĚCI PŘI STISKNUTÍ/PUŠTĚNÍ TLAČÍTKA, NÁSLEDNĚ SE VYUŽIJÍ POZDĚJI V PROGRAMU*/
      buttonState = reading;   // zapamatuju si novy stav
    }
  }
  /*TOHLE JE KONEC BLOKU KDE OŠETŘUJI TLAČÍTKO*/

  /*TOHLE JE ZAČÁTEK BLOKU KDE NA ZÁKLADĚ DŘÍVE ZJIŠTĚNÝCH INFORMACÍ OBSLUHUJI SERVO*/
  // a tady (treba) budu neco delat
  if (buttonState == HIGH) { // tlacitko bylo stisknuto

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

  }
  /*KONEC BLOKU KDE SE OBSLUHUJE SERVO*/
}
a mimochodem ... pos += 1 se dá zapsat jako pos++ ... stejně jako pos-=1 se dá zapsat jako pos--

Dej vědět, jestli se povedlo stiskem a držením tlačítka servo rozvrtě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 » 01 srp 2019, 19:32

děkuju kiRRow za komentář v posledním sketchi, bude mi to sloužit jako učivo a určitě nejen mě. Jen by mě zajímalo, jak asi vypadá sketch o x-tisících řádcích, vyznat se v tom musí být opravdu kumšt ! Díval jsem se , jak se sketche mají správně psát, no moc jsem toho nenašel, snad používat "selský rozum" a šedé buňky mozkové všeobecně.
Tady dávám zpětnou vazbu, jak to dopadlo :
Sketch jsem nahrál do Arduina a při 1x stisknutí tlačítka servo jelo tam a zpět 2x, pak zůstalo stát ve výchozí pozici. Při držení tlačítka se servo vrtělo tak dlouho, jak jsem držel tlačítko a při pustění tlačítka dokončilo cyklus, jako bych 1x stisknul tlačítko, taky pak zůstalo ve výchozí pozici.

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 01 srp 2019, 21:42

jak by to bylo, kdyby se ve sketchi servo po stisknutí tlačítka vrtělo nějakou dobu, například 30 sekund ? a po dalším stisknutí zase stejnou dobu atd.? děkuju

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 01 srp 2019, 23:07

nebude v tom hrát úlohu millis ? Protože : Funkce millis() se využívá například tam, kde je třeba čekat, ale není žádoucí, aby byl přerušen chod programu.?
a taky reading, kterému přiřadím čas 30 s ?

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 » 01 srp 2019, 23:20

Podivej se, jak spravne psat Cckove programy, sketch je jenom zasterka pro C++/G++, plati pro ne to same.

Jinak samozrejme pouzivat funkce, komentare, pripadne i vlastni knihovny (*.cpp *.h) a hlavne rozumny editor (Arduino IDE je v podstate notepad s menu na spousteni prekladace - nikoli poradny editor)

Ja pouzivam VIM (uznavam, ze to je pro novacka cerna magie, ale pro me je to nejlepsi editor, co jsem kdy videl), jini treba Visual Studio, nebo Eclipse, nebo proste programatorsky editor (ci IDE) pro C++

bud napises program v poradnem editoru zvlast, [: pak spustis arduino IDE, prelozis, pripadne nahrajes, mozna po ceste i opravis trivialni preklepy, vypnes arduino IDE spustis poradny editor ... :]

nebo si v arduino ide das v nastaveni "pouzivat externi editor" - pak to IDE neumi editovat a pri zmene souboru ho nacte znovu - a normalne to vedle editujes v necem rozumnem (ne, Word neni nic rozumneho, ani Excel, ani PowerPoint :lol: ) a po kazde zmene ulozis (a arduino IDE to znovu nacte)

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 srp 2019, 00:06

asi jsme si nerozuměli, moje předchozí dva příspěvky nebyly psány jako sketch, ale jako dotaz.
No, ale zase na druhou stranu, rád se podívám na editory co používají profíci . Díky

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 » 02 srp 2019, 00:10

millis v tom bude hrat ulohu, reading je stav tlacitka, cili do nej nebudes strkat cas.

Schvalne si zkus procist a promyslet (a treba i vyzkouset) a znovu procist a promyslet, dokud to nebude zcela zrejme tohleto:

http://micro-corner.gilhad.cz/blog/Adru ... ouse2.html

(je to o necem jinem, nez servech, ale mist vkladani stisku tlacitek a pohybu mysi muzes dat treba prave ta serva, ci cokoli jineho)


a pak pripadne ponekud slozitejsi variantu

http://micro-corner.gilhad.cz/listings/ ... 3.ino.html

V podstate je tam vsechno, co potrebujes a par veci navic - pokud pochopis, jak si tam pracuju zvlast s tlacitky a zvlast s tim, co se po jejich stisku deje, tak mas v podstate vyhrano

Ja tam (z pochopitelnych duvodu) umoznuju jen jednu akci naraz, ale da se prerusit (v te trojce, pozadavek stop_me to zastavi v nejakem rozumnem miste a samozrejme by se dalo delat i vic tech akci soubezne, nebo treba vsechny naraz (kdyby si ty jednotlive automaty drzely state v sobe a neblokovaly se navzajem a volaly se v loop vsechny - ty co by mely state nulovy by nedelaly zrovna nic))

Dokud mas jen jedno servo, tak je ti to celkem jedno, nemuze se vrtet obema smery naraz. Pokud bys chtel nejen vrtet, ale treba vrtet jednou pomalu a jednou rychle, nebo jet jednou sem a podruhe tam, tak neni problem to dat do ruznych "automatu"

---

Jo, je to cteni a lusteni na dlouhe zimni vecery, i kdyz to nema x-tisic radku, jenom x-set radku, tak jsou tam pouzite trochu pokrocilejsi techniky bez varovani.

Jestli chces, tak si to doma postav a hraj si, tim to asi nejsnaz pochopis. HW je podrobneji popsan tady: http://robodoupe.cz/2018/drobnicky-006- ... e-klikacu/ (aneb KlikiMouse1), dal se nemeni (jen jsem ty plandaci propojky nadhradil dratem v tomto stylu - akorat se to nevypali, neb tam netecou 3A, ale tak 20mA max)

Obrázek

Jo a varovani - samozrejme se to cte odspodu, teda nejdriv setup() - trivialni, pak loop() a ta vola vsechno to nahore - trida Base (uplne nahore) nedela nic, ale rika, jak maji vypadat deti a co maji poskytovat - takze co umi pracovat s Base, to umi pracovat i s ditetem a to dite mu jde podstrcit misto Base a nic nepozna ( viz napr. radky 212, 278 a 279)

A tu komentare // {{{ a // }}} jsou znacky pro VIM, kde mi zacina a konci jaky blok, ktery muze zabalit/rozbalit, abych mel kod porad na jednu obrazovku. (Taky dobry trik - zadny samostatny celek by nemel byt tak velky, aby se na obrazovku nevesel, jinak vetsinou stoji za to ho rozdelit na mensi samostatne casti

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 » 02 srp 2019, 15:33

Pokud chceš, aby se ti servo po stisknutí tlačítka vrtělo 30sekund, budeš si muset do nové proměnné uložit čas, kdy servo začlo pracovat. Budeš muset použít i jiný cyklus než "for" a to cyklus "do while". Cyklus for je vhodný pro operace u kterých je znám počet cyklů, které mají proběhnout. Cyklus "do while , nebo while do" je vhodný pro neznýmá počet cyklů a bude se vykonávat dokud bude platná podmínka.

1) ošetření už máme teda za sebou ...
2) tlačítko bylo stisknuto ? uložím si tedy čas, kdy se tak stalo
3) vrť servem dokud je rozdíl mezi právě teď a časem kdy bylo stisknuto tlačítko menší než 30s (30000ms)

(taky bude třeba trochu pozměnit způsob jakým se mění "pos" ... já bych si asi udělal proměnnou "step" a v ní držel hodnotu 1 nebo -1 ... tento step bych potom přičítal k pos ... pokud zjistím, že pos >= 180, tak změním step na -1 a pokračuji v přičítání záporného čísla ... stejně jako když zjistím že pos <= 0, tak změním step na 1)

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 07 srp 2019, 15:43

pánové nevím si rady, zkouším co mi napsal kiRRow, ale ty podmínky ne a ne dát dohromady, tady je co jsem zpitvořil, kompilátor to sice sežral, ale výsledek je ...0. Doufám , že aspoň bod 2) je ok, no bod 3) nevím a dál jsem se ani nedostal :roll: tady je nefunkční sketch :

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

                          // hodnota = proměnná
                          
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
int reading;
int step = 1;  // PŘIDÁNO

// 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 
long aktualniTime; //aktualni cas - PŘIDÁNO


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() {
  /*TOHLE JE ZAČÁTEK BLOKU KDE OŠETŘUJI TLAČÍTKO*/
  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
    /*TADY SE ZAČÍNAJÍ DÍT VĚCI PŘI STISKNUTÍ/PUŠTĚNÍ TLAČÍTKA, NÁSLEDNĚ SE VYUŽIJÍ POZDĚJI V PROGRAMU*/
      buttonState = reading;   // zapamatuju si novy stav
    }
  }
  /*TOHLE JE KONEC BLOKU KDE OŠETŘUJI TLAČÍTKO*/

  /*TOHLE JE ZAČÁTEK BLOKU KDE NA ZÁKLADĚ DŘÍVE ZJIŠTĚNÝCH INFORMACÍ OBSLUHUJI SERVO*/
  // a tady (treba) budu neco delat
                // tlacitko bylo stisknuto
  buttonState = HIGH;  {                            
       
  if(pos) 
             //vrť servem dokud je rozdil mezi pravě teď a časem kdy bylo stisknuto tlačítko menší než 30s
      if(aktualniTime == millis < 30000){ 
                 // čas stisknutí 
       aktualniTime = millis(); //aktuální čas
               // 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);
    };

  }
  /*KONEC BLOKU KDE SE OBSLUHUJE SERVO*/
}
}
jsem z toho dost zklamaný, a to mi věřte :oops:

Odpovědět

Kdo je online

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