Mini CNC osa Z

Odpovědět
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 » 19 kvě 2019, 20:06

LEDse ti nerozsvítí, protože neukládáš do proměnné, kterou testuješ, aktuální pozici motoru.

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 19 kvě 2019, 20:14

aktuální pozice motoru int pos = 0; //proměnná obsahující pozici motoru (úhel natočení)
je to tak ?

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 » 19 kvě 2019, 22:27

Neni. Podívej se, co tam skutečně děláš:

Do pos pri deklaraci priřadíš nulu, potom v loopu (aniž bys ji jakkoli měnil) ji porovnáš s nulou (a překvapivě je ta nula v ní menší, nebo rovná) a pak ji porovnáš se 180 (a zase je ta nula v ní menší, nebo rovná). Nikde ji neměníš, takže je pořád nula, bez ohledu na cokoli dalšího.

do proměnné led1 přiřadíš 13, v setupu pomocí ní nastavíš pin 13 jako OUTPUT, pak do ní v loop dvakrát přiřadíš true (což je tuším 1) protože pos je pořád nula a tak vždy proběhne stejnou cestou v ifu.

Pin 13 (často má připojenou led na Arduinu) v setupu nastavíš na OUTPUT (hodnotu mu nezadáš, ale defaultně to je 0) a dál už ho neměníš. Protože bez dalšího nastavování je na něm 0, tak připojená LEDka pochopitelně nesvítí.

Pin 12 přesně to samé.

v loop do serva vložíš nulu (myservo.write(0) ) a po 1.25s do něj zapíšeš 180 a po 1s to zase zopakuješ a tak pořád dokola. Nikde nezjišťuješ, v jaké je pozici, ale můžeš si být celkem jistý, že minimálně v druhém a všech dalších průchodech loop při vyhodnocování prvního ifu NENÍ v nule a při vyhodnocování druhého NENÍ ve 180 (protože Arduino udělá 16 000 000 instrukcí za sekundu a servo se z jedné pozice do druhé přesouvá docela dlouho).

Takže když to shrnu
  • pos nijak nesouvisí s pozicí serva a celou dobu je nula a nemění se
  • led1 z 13 rychle změníš na 1, ale ta hodnota nijak nesouvisí s žádnou ledkou, to samé led2
  • servu posíláš nějaké příkazy, ale jak na ně reaguje nijak nezjišťuješ
  • piny 13 a 12 nastavíš jako výstupní, ale neposíláš na ně nikdy nikde žádnou hodnotu, nemají tedy důvod se nějak měnit a pokud na ně připojíš svítivé diody proti zemi, tak nemají důvod se rozsvěcet

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 » 20 kvě 2019, 11:38

Zastav se a popřemýšlej nad tím. Začal bych tímhle :
Jak se arduino vůbec dozví, že servo reaguje na jeho příkazy a že se natočilo do požadované pozice ?
Chci aby arduino vědělo v jaké přesně pozici je servo, nebo mi stačí vědět jestli je na jednom konci, nebo na druhém ?

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 kvě 2019, 18:23

trochu jsem nad tím přemýšlel a díky za vaše nakopávání, začal jsem od začátku jen s jednou led ať svítí od polohy 0 do polohy 10. Povedlo se sketch je tady :

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 pos = 0; //proměnná obsahující pozici motoru (úhel natočení)

int led1 = 11; //první dioda


void setup()
{
myservo.attach(9); //tento motor je připojen na pin 9
pinMode(led1, OUTPUT); //nastavení funkce led1
}

void loop()
{
  for(pos = 0; pos <= 180; pos += 1) //je od úhlu 0 do úhlu 180
  {
    myservo.write(pos);  //natočení motoru na aktuální úhel
    delay(10);           //chvilka čekání než se motor natočí
  
    if (pos>5)
    digitalWrite(led1,LOW);
    if(pos<5)
    digitalWrite(led1, HIGH);
 
  } 
  for(pos = 180; pos >= 0; pos -= 1) //je od úhlu 180 zpět do úhlu 0
  {
    myservo.write(pos);  //natočení motoru na aktuální úhel
    delay(10);           //chvilka čekání než se motor natočí
  }
  }

teď vyzkouším ať se rozsvítí i led2, kterou přidám doufám, že se mi to podaří !!! mám velkou radost

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 » 20 kvě 2019, 18:58

Ještě dávej kód do tagů code (to je takový to </> tlačítko nahoře) a bude to rázem líp čitelné :)

Kód: Vybrat vše

int led1 = 11; //první dioda
(by admin kódy jsem do těch tagů přidal :))

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 kvě 2019, 19:17

přiřadil jsem i led2 a povedlo se, sic po pár pokusech, ale funguje to ! je to bomba !!! tohle mě vážně vzalo, maličkosti, ale potěší !!! Díky všem co jste mi radili jak dosáhnou cíle. Avšak, je tento sketch tak, jak má být napsaný ? nebo jde něco upravit ? a jak ? Díky Hanz

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 pos = 0; //proměnná obsahující pozici motoru (úhel natočení)

int led1 = 11; //první červená led
int led2 = 10; //druhá zelená led

void setup()
{
myservo.attach(9); //tento motor je připojen na pin 9
pinMode(led1, OUTPUT); //nastavení funkce led1
pinMode(led2, OUTPUT); //nastavení funkce led2
}

void loop()
{
  for(pos = 0; pos <= 180; pos += 1) //je od úhlu 0 do úhlu 180
  {
  myservo.write(pos);  //natočení motoru na aktuální úhel
    delay(15);           //chvilka čekání než se motor natočí
  
  if (pos>5)
    digitalWrite(led1,LOW);
  if(pos<5)
    digitalWrite(led1,HIGH);
  } 
  
  for(pos = 180; pos >= 0; pos -= 1) //je od úhlu 180 zpět do úhlu 0
  {
  myservo.write(pos);  //natočení motoru na aktuální úhel
    delay(15);           //chvilka čekání než se motor natočí
    
  if (pos<175)
    digitalWrite(led2,LOW);
  if(pos>175)
    digitalWrite(led2,HIGH);  
  }
  }

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 » 21 kvě 2019, 01:23

Používej ten CODE tag, ať se to dá číst
  • Pokud dělá co má, tak je asi napsaný "dost dobře" na to aby šel použít
  • Cokoli jde upravit, nebo napsat líp - může to být kratší, rychlejší, univerzálnější, lépe využívat použitý HW, být přenositelnější, lépe komentované, méně přeplácané, ... - akorát to nikdy nebude všechno z toho naráz, protože některé ty požadavky jdou proti sobě, takže záleží na volbě kritérií - a vždy si můžeš zvolit (a odůvodnit), jinou sadu kritérií a podle ní to upravit a "vylepšit"
Pravda je, že tady je ke zlepšování prostoru ještě dost a taky že záleží na tom, zda a na jaké úrovni to chápeš a co například je pro tebe "přehledné a jasné" a co naopak "příliš ukecané a rozplizlé" ....

Já bych rozhodně nepsal konstrukce typu

Kód: Vybrat vše

  if (pos<175)
      digitalWrite(led2,LOW);
  if(pos>175)
      digitalWrite(led2,HIGH); 
// a když je to přesně 175, tak to necháme v předchozím stavu
ale spíš

Kód: Vybrat vše

  if (pos<175) {
      digitalWrite(led2,LOW);
  } else {
      digitalWrite(led2,HIGH); 
   };
a nebo kratší

Kód: Vybrat vše

      digitalWrite(led2,pos>175);
stejně jako dávám přednost zápisu

Kód: Vybrat vše

  for (pos = 180; pos >= 0; pos--) {  //je od úhlu 180 zpět do úhlu 0
      .....
   };
před

Kód: Vybrat vše

for(pos = 180; pos >= 0; pos -= 1) //je od úhlu 180 zpět do úhlu 0
{
....
};
Pokud to jen natáčí to servo a svítí těma diodama, tak to takhle třeba funguje, ale pokud bych do toho chtěl nějak zasahovat, tak bych se rozhodně vyhnul loop() trvající řadu sekund a blokující pomocí delay() a dal bych přednost neblokující loop() trvající pár milisekund max, aby to mohlo reagovat i na nějaké řízení třeba, nebo obecně dělat něco jiného užitečného. Například něco ve smyslu:

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 pos = 0; //proměnná obsahující pozici motoru (úhel natočení)

int led1 = 11; //první červená led
int led2 = 10; //druhá zelená led

unsigned long currentMillis, lastPosMillis;
int smer; // +1 dopředu, -1 dozadu

void setup(){
    myservo.attach(9); //tento motor je připojen na pin 9
    pinMode(led1, OUTPUT); //nastavení funkce led1
    pinMode(led2, OUTPUT); //nastavení funkce led2
    pos = 0;
    smer = 1;
    currentMillis=millis();
    lastPosMillis=currentMillis;
    digitalWrite(led1, pos<5);
    digitalWrite(led2, pos>175);
    myservo.write(pos);
}

void loop() {
    currentMillis=millis();
    //  tady můžu řešit třeba čtení tlačítek, nebo další zajímavé věci, co se dějí průběžně
    
    if (currentMillis - lastPosMillis >= 15 ) {
        lastPosMillis=currentMillis;
        pos += smer; // další krok serva správným směrem
        if (pos <1 ) {
           smer = 1;
           pos=0;  // pro jistotu, ale ono to není nutné, pokud s pos nehýbu i jinde
         };
         if (pos > 179 ) {
             smer = -1;
             pos=180;  // pro jistotu, ale ono to není nutné, pokud s pos nehýbu i jinde
         };
        digitalWrite(led1, pos<5);
        digitalWrite(led2, pos>175);
        myservo.write(pos);
    }; // if ( currentMillis - lastPosMillis >= 15 )
    
    //  a tady taky můžu řešit co chci
}

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 22 kvě 2019, 19:47

natočil jsem jak ledky blikají v koncových polohách, tak se mrkněte.
odkaz :
https://www.youtube.com/watch?v=pI9DIUj ... e=youtu.be
nápad s tlačítkem se mi líbí, něco bych se zase naučil a použít tlačítko jako "start/stop" je pro mě výzva ! díky

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 kvě 2019, 19:40

vrátil jsem se k původnímu dotazu, tedy zobrazování polohy serva osy Z u mini cnc pomocí led. A nalezl odkaz na sketch, který jsem aplikoval a který funguje. Jenom jsem musel použít druhém Arduino, protože nevím jak sketch přidat do původního ?! odkaz zde : https://randomnerdtutorials.com/monitor ... d-arduino/. Vyzkoušel jsem taky variantu pomocí spínače / v mém případě kontaktu ze staré dvd mechaniky /, který jsem umístil na osu Z. Kontakt spíná napájení pro 5V relátko M4-5H a s pomocí jeho kontaktů se led rožínají - zhasínají tak, jak má napájení cívka.Taky funguje - odkaz na video : https://www.youtube.com/watch?v=Oi70rBmHqx4&t=50s
No a program,který je na prvním videu je fajn po úpravě od gilhada, ale bohužel zatím taky nevím, jak ho napasovat do sketche, aby to běželo. Díky za nápovědu

Odpovědět

Kdo je online

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