Mini CNC osa Z

Odpovědě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 » 07 srp 2019, 16:11

Tebe mi seslal sám Pán Bůh, aby si ověřil, jestli nekecám, když tvrdím, že mám zlatou trpělivost ...

----

Tohle jako znamená co ? ... proč je tam ta složená závorka ?

Kód: Vybrat vše

buttonState = HIGH;  {    
Tímto chtěl básník říct co ? ... že pokud je pos cokoliv jiného než NULL/FALSE ? ... a kam utekla složená závorka ? ... nebo jsi ji pro jistotu napsal o řádek výš ?

Kód: Vybrat vše

  if(pos) 
??? Pokud aktualniTime rovná se millis menší 30000 ..... ani nevím jak tohle vůbec přečíst

Kód: Vybrat vše

if(aktualniTime == millis < 30000){ 
Cykly FOR jsou vhodnější pro přesně známý počet cyklů ... a budou cyklovat i dávno po tom co vyprší oněch 30s. Měly by být nahrazeny cyklem WHILE. Ten je vhodnější, protože bude cyklovat a cyklovat dokud bude splněna podmínka.

Kód: Vybrat vše

    for (pos = 0; pos <= 180; pos += 1) {
      myservo.write(pos);
      delay(15);
    };

    for (pos = 180; pos >= 0; pos -= 1) {
      myservo.write(pos);
      delay(15);
    };
Prostuduj si jak se píšou podmínky : https://arduino.cz/pokrocilejsi-struktu ... ka-wiring/
a jak pracují cykly : https://arduino.cz/seriova-komunikace-a-cykly/

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, 16:20

děkuju a velice děkuju za tu obrovskou trpělivost, ale čím víc toho chci, tím větší mám v hlavě chaos !

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 » 07 srp 2019, 18:45

Kód: Vybrat vše

if(kiRRowTrpelivost == TRUE) {
  goToHeaven();
}

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 08 srp 2019, 17:10

zdravím, zatím jsem podle vzoru vytvořil cyklus do while ?!

Kód: Vybrat vše

 /*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;                              
       aktualniTime = millis(); //aktuální čas
       
               // nejake vrteni servama
               
       // TOHLE ZMĚŇ NA DO WHILE  !!!   
    pos=0;      
    do{   // Zatím co na pin2 je přivedeno 5V a zároveň pozice motoru je menší než 180
      (digitalRead(2) == HIGH && pos < 180);
      pos++; // zvyš pozici serva
      myservo.write(pos); // a následně zapiš na servo
      delay(15); // počkej 15ms
     } while (pos=180);
     // konec while 
     
    pos=180;
    do{  // Zatím co na pin3 je přivedeno 5V a zároveň pozice motoru je větší než 0
      (digitalRead(2) == HIGH && pos > 0);
      pos--; // sniž pozici serva
      myservo.write(pos); // a následně zapiš na servo
      delay(15); // počkej 15ms
     } while (pos=0);
     // konec while

  }
  /*KONEC BLOKU KDE SE OBSLUHUJE SERVO*/
mám to správně ? pokusím se pak dosadit zbytek jak píše v bodech trpělivý Bůh kiRRow , za to velké díky 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 » 08 srp 2019, 17:36

Kód: Vybrat vše

if(je stisknuto tlačítko??){
  příkazy, které si zapamatují čas, kdy bylo tlačítko stisknuto
}

/* podmínka = od toho času, kdy bylo tlačítko stisknuto, uběhlo méně než 30000ms ?? 
(Pokud ano, udělej jeden cykl, pokud ne, ukonči cyklování a pokračuj dále v programu) */
while (podmínka) {  
  if(zkontroluji si jestli je pozice 0 nebo méně){
    nastavím step na 1
  }
  if(zkontroluji si jestli je pozice 180 nebo více){
    nastavím step na -1
  }
  k pozici motoru přičtu step
  nějaký ten delay, aby se to stihlo natočit
}
a teď to zkus doplnit :D

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 14 srp 2019, 09:41

zdravím všechny, od kiRRow jsem dostal nápovědu - doplňovačku, velké Děkuju ! , ale opět kiRRow nezklamu. Nevím . Sketch je sice zkompilovaný, ale servo se nechce vrtět po stisknutí tlačítka těch 30s. Vytvořená nová proměnná buttonTime, taky proměnná step - tady snad jen tuším proč ? vůbec si nejsem jistý, ale doplnil jsem. No a v doplňovačce postrádám příkaz na vrťení serva tedy myservo.vrite(pos) ? Četl a studoval na netu po chvilkách, ale do palice to asi nedostávám. Na doporučení od gilhad, kterému taky moc moc děkuju , jsem se díval na klikaču atd. No výsledek posuďte a prosím o další nakopnutí, sic už jsem samá modřina nejen od Vašeho nakopávání, ale i proto, jak mlátím palicí o zeď :roll:

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 tlačítka
int lastButtonState = LOW;     // předchozí hodnota načtení ze vstupního pinu tlačítka
int reading;                   // stav tlacitka
int step;                      // souvisí s cyklováním ? jak ?

                 // 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 buttonTime;               // čas začátku stisknutí tlačítka tj. začátek vrtění serva


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
  
                   // je stisknuto tlačítko??
  if(buttonState == HIGH){ 
                   // příkazy, které si zapamatují čas, kdy bylo tlačítko stisknuto
  lastDebounceTime = millis();   
}

/* podmínka = od toho času, kdy bylo tlačítko stisknuto, uběhlo méně než 30000ms ?? 
(Pokud ano, udělej jeden cykl, pokud ne, ukonči cyklování a pokračuj dále v programu) */

                // podmínka
while (millis()- buttonTime <= 30000) { 
                // zkontroluji si jestli je pozice 0 nebo méně
  if(pos <= 0);
   {
    step=+1;     // nastavím step na 1
  }
               // zkontroluji si jestli je pozice 180 nebo více
  if(pos >= 180);
   {
    step=-1;     // nastavím step na -1
  }
  pos+=step;     // k pozici motoru přičtu step
  delay(15);     // nějaký ten delay, aby se to stihlo natočit
}

  /*KONEC BLOKU KDE SE OBSLUHUJE SERVO*/
}
hodně si vážím Vaší podpory , dí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 » 14 srp 2019, 09:50

Teď jsem ještě předělal strukturu stránek, aby se líp vkládaly obrázky a výpisy, takže se některé adresy změnily (a Klikaču3 má pořád nedodělaný text a navíc pár nesmyslných obrázků z testování), takže tady jsou nové odkazy na ty články a když tak se dá proklepat přez hlavní index -

http://micro-corner.gilhad.cz/blog/Ardu ... ouse3.html

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

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 » 14 srp 2019, 16:36

Kód: Vybrat vše

int step;                      // souvisí s cyklováním ? jak ?
Ukládáš do ní hodnotu jednoho kroku serva ... když do ní vložíš kladné číslo servo se bude točit na jednu stranu, se zápornou hodnotou se bude točit na druhou stranu. Pracuješ sní potom tak, že ji přičteš k pozici motoru ( pokud přičítáš záporné číslo, tak odčítáš). Můžeš tam dát i větší číslo než 1, servo pak bude dělat větší kroky na jeden cyklus.

Kód: Vybrat vše

pos = pos + step;
myservo.write(pos);
Bylo by dobré už v setupu do této proměné uložit nějakou hodnotu. Teď máš nastavenou výchozí pozici motoru 0, takže při testování jestli je už motor v krajní pozici dojde k nastavení step na 1. Ale pokud bys měl výchozí pozici třeba 90, step by zůstal 0 a motor by se netočil ani na jednu stranu ... respektive točil, ale nulovými kroky.

Kód: Vybrat vše

  if(buttonState == HIGH){ 
                   // příkazy, které si zapamatují čas, kdy bylo tlačítko stisknuto
  lastDebounceTime = millis();   
}
Přepisuješ si špatnou proměnou, lastDebounceTime slouží pro zapamatování si času posledního zákmitu tlačítka. Ty si chceš uložit čas stisku tlačítka, takže to musíš uložit do buttonTime

Kód: Vybrat vše

    step=+1;     // nastavím step na 1
tady velký pozor ... pokud to napíšeš takhle bez mezer, nemusí to kompilátor správně pochopit. Stačí step = 1

Kód: Vybrat vše

    step=-1;     // nastavím step na -1
to samé zde ... kompilátor to třeba veme jako step = step - 1. Správně je to step = -1;

Kód: Vybrat vše

pos+=step;
Tohle je správné použití operátoru += ... kompilátor to veme jako pos = pos + step ... ale opět mezery (pro jistotu) ... mno a přesně mezi tenhle příkaz a to delay co je za ním příjde onen myservo.write(pos);

a poslední chyba je opět špatné odsazování programátorských znaků ... pokud příkaz IF začíná na 4sloupečku, tak ta uzavírací závorka } taky příjde na 4 sloupeček. Schválně si to porovnej, co se ti čte lépe a v čem bys raději někomu jinému hledal chyby. Bude se nám oběma pracovat lépe.

Kód: Vybrat vše

if(1){
	if(2){
		if(3){
			kod
			kod
			kod
		}
	} else {
		if(4){
			kod
			kod
				if(5){
					kod
					kod
				}
			kod
		}
	kod
	}
}
verzus

Kód: Vybrat vše

if(1){
	if(2){
	if(3){
	kod
	kod
	kod
}
} else {
		if(4){
	kod
	kod
			if(5){
				kod
				kod
		}
			kod
	}
kod
}}

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 » 14 srp 2019, 17:56

jo a ještě tady ...

Kód: Vybrat vše

  if(zkontroluji si jestli je pozice 0 nebo méně){
    nastavím step na 1
  }
  if(zkontroluji si jestli je pozice 180 nebo více){
    nastavím step na -1
  }
mám tam někde napsané v zadání té podmínky středníky ?

Kód: Vybrat vše

  if(pos <= 0);
   {
    step=+1;     // nastavím step na 1
  }
               // zkontroluji si jestli je pozice 180 nebo více
  if(pos >= 180);
   {
    step=-1;     // nastavím step na -1
  }
proč je tam máš ?

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

  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
  
                   // je stisknuto tlačítko??
  if(buttonState == HIGH){ 
                   // příkazy, které si zapamatují čas, kdy bylo tlačítko stisknuto
  lastDebounceTime = millis();   
}
všude tady jinde je nemáš

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 16 srp 2019, 12:36

dobrý den, děkuji za podporu s Vaší pomoci jsem dal dohromady sketch, ve kterém se vrtí servo určený čas tj. 30 sekund po stisknutí tlačítka a pak opět čeká na stisk tlačítka, které je ošetřeno proti jeho zákmitům.
Snad jen : - servo se začne vrtět hned po nahrání do Arduina a teprv potom čeká na stisk tlačítka
- servo se zastaví ihned po uběhnutí daného času v jakékoliv poloze a nedojede např. do výchozí polohy 0 nebo 180, ale to si asi už moc vymýšlím - času je dost, tak pohledám jak to vyřešit. Tady je trochu učesaný sketch, jak mi radili gilhad a kiRRow.

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 tlačítka
int lastButtonState = LOW;     // předchozí hodnota načtení ze vstupního pinu tlačítka
int reading;                   // stav tlacitka
int step = 1;                      // ukládá se do ní hodnotu jednoho kroku serva

// 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 buttonTime;               // čas začátku stisknutí tlačítka tj. začátek vrtění serva


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) {   // je stisknuto tlačítko??
    buttonTime = millis();     // příkazy, které si zapamatují čas, kdy bylo tlačítko stisknuto
  }

  /* podmínka = od toho času, kdy bylo tlačítko stisknuto, uběhlo méně než 30000ms ??
    (Pokud ano, udělej jeden cykl, pokud ne, ukonči cyklování a pokračuj dále v programu) */
   while (millis() - buttonTime <= 15000) {    // podmínka
    
      if (pos <= 0) {     // zkontroluji si jestli je pozice 0 nebo méně
           step = 1;        // nastavím step na 1
      }   pos += step;     // k pozici motoru přičtu step
           myservo.write(pos);     // natočení serva na pozici
            delay(10);     // nějaký ten delay, aby se to stihlo natočit

      if (pos >= 180) {    // zkontroluji si jestli je pozice 180 nebo více
           step = -1;        // nastavím step na -1
      }   pos += step;       // k pozici motoru přičtu step
           myservo.write(pos);     // nastavení serva na pozici
            delay(10);     // nějaký ten delay, aby se to stihlo natočit
  }

  /*KONEC BLOKU KDE SE OBSLUHUJE SERVO*/
}
Hledal jsem na netu , jak psát sketche, jak odsazovat, ale nic jsem nenašel, možná jsem špatně zadával dotaz na net ?
Kde tyhle informace najít ? Děkuju
Pozn. čas ve sketchi je jen 15000, protože se servo vrtí tam 1x a zpět 1x a časy se tedy sčítají - měřil jsem vrtění a upravil jej. ;)

Odpovědět

Kdo je online

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