Stránka 2 z 27

Re: Mini CNC osa Z

Napsal: 19 kvě 2019, 20:06
od kiRRow
LEDse ti nerozsvítí, protože neukládáš do proměnné, kterou testuješ, aktuální pozici motoru.

Re: Mini CNC osa Z

Napsal: 19 kvě 2019, 20:14
od Hanz
aktuální pozice motoru int pos = 0; //proměnná obsahující pozici motoru (úhel natočení)
je to tak ?

Re: Mini CNC osa Z

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

Re: Mini CNC osa Z

Napsal: 20 kvě 2019, 11:38
od kiRRow
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 ?

Re: Mini CNC osa Z

Napsal: 20 kvě 2019, 18:23
od Hanz
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

Re: Mini CNC osa Z

Napsal: 20 kvě 2019, 18:58
od gilhad
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 :))

Re: Mini CNC osa Z

Napsal: 20 kvě 2019, 19:17
od Hanz
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);  
  }
  }

Re: Mini CNC osa Z

Napsal: 21 kvě 2019, 01:23
od gilhad
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
}

Re: Mini CNC osa Z

Napsal: 22 kvě 2019, 19:47
od Hanz
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

Re: Mini CNC osa Z

Napsal: 28 kvě 2019, 19:40
od Hanz
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