Kontinuální otáčení NEMA17

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Uživatelský avatar
kiRRow
Příspěvky: 1313
Registrován: 07 kvě 2019, 07:03
Bydliště: Opava

Re: Kontinuální otáčení NEMA17

Příspěvek od kiRRow » 07 dub 2025, 16:02

A máš jistotu, že ten motor, když je zastavován pomocí senzoru, tak se vždy zastaví ve správném místě ? Já pokud potřebuji udělat přesně jednu otočku, tak raději počítám kroky, kolik jich je třeba udělat a senzor používám pro automatickou kalibraci, kontrolu, popř automatickou korekci. Se setrvačnýma silama se dá pobojovat pomocí akcelerace/deakcelerace.

Ale jak se říká, co funguje, to neopravuj.

AstroMiK
Příspěvky: 649
Registrován: 08 pro 2017, 19:05

Re: Kontinuální otáčení NEMA17

Příspěvek od AstroMiK » 07 dub 2025, 16:09

Nemám teď správný motor, abych mohl vyzkoušet driver.
Opravdu netuším, proč ty piny MS1 až MS3 musíš mít nastavené jako vstupní.


Program jsem tedy upravil a VYZKOUŠEL podle posledního zadání.

V předchozí verzi jsem ale měl chybu.
Blok příkazů, které se měly vykonávat po zastavení, se sice vykonával po zastavení, ale furt dokola.
To asi nebude ten zamýšlený účel.
Doplnil jsem tam proto ještě jednu značku, která umožní vykonat blok příkazů jen 1x po každém zastavení.

Ovládání tedy bude takové, že se tlačítkem roztočí motor.
Tlačítko se musí držet tak dlouho, než čidlo perforace přejde do HIGH.
Kratší stisk sice motorem pootočí, ale když čidlo zůstane v LOW, tak se po uvolnění tlačítka motor zastaví.
Blok příkazů "po zastavení" se v tomto případě nevykoná - to je myslím správně.

Když bude stisk dostatečně dlouhý na to, aby se čidlo perforace přepnulo do HIGH,
může se tlačítko uvolnit a motor bude pokračovat v automatickém otáčení tak dlouho, než ho čidlo zastaví signálem LOW.
Pak se 1x vykoná blok příkazů "po zastavení".

Kód: Vybrat vše

// prirazeni pinu - jsem musel zmenit, protoze je uz osazena DPS
#define pin_STEP              3
#define pin_tlacitko          10
#define pin_cidlo             8
#define pin_DIR               2
#define pin_ENABLE            9
#define pin_SLEEP             4           
#define pin_MS1               7           
#define pin_MS2               6           
#define pin_MS3               5          

// globalni promenne
bool tocit_motorem = false;                        // false = po zapnuti napajeni motor stoji
bool blokuj_prikazy = false;                       // prikazy "po zastaveni" se vykonaji jen 1x


void setup(void)
  {
    pinMode(pin_tlacitko, INPUT_PULLUP);           // tlacitko spina proti GND, rozepnute je v HIGH
    pinMode(pin_cidlo, INPUT);                     // cidlo dava LOW nebo HIGH (LOW zastavuje motor)
    pinMode(pin_STEP , OUTPUT);                    // krokovani motoru

    pinMode(pin_DIR , OUTPUT);                     // smer otaceni
    digitalWrite(pin_DIR, HIGH);

    pinMode(pin_ENABLE , OUTPUT);                  // spusteni napajeni do motoru
    digitalWrite(pin_ENABLE, LOW);

    pinMode(pin_SLEEP , OUTPUT);                   // probudit motor
    digitalWrite(pin_SLEEP, HIGH);

    pinMode(pin_MS1 , INPUT_PULLUP);               // ??? mikrostepovaci piny ...
    pinMode(pin_MS2 , INPUT_PULLUP);
    pinMode(pin_MS3 , INPUT_PULLUP);
    digitalWrite(pin_MS1, HIGH);                   // ... nastavit podle potreby
    digitalWrite(pin_MS2, HIGH);
    digitalWrite(pin_MS3, HIGH);
  
  }

void loop(void)
  {
    if (digitalRead(pin_cidlo) == LOW)             // LOW signal od cidla ...
      {
        
        tocit_motorem = false;                     // ... zastavuje motor
        if (blokuj_prikazy == false)              // blok prikazu, ktere se maji vykonat po zastaveni se vykona jen 1x od kazdeho rozbehu
          {
            //  ************ 
            //   prikazy provadene po zastaveni
            //  ************ 
             blokuj_prikazy = true;                // dokud se motor znova nerozjede, predchozi blok prikazu se vykonavat nebude
          }    
      }
    else                                           // cidlo odjelo mimo perforaci (stav HIGH)
      {
        blokuj_prikazy = false;                    // tim se odblokuje vykonani bloku prikazu po dalsim zastaveni 
      }


    if (digitalRead(pin_tlacitko) == LOW)          // stisk spousteciho tlacitka ...
      {
        tocit_motorem = true;                      //  ... zapina motor
                                                   // Tlacitko ma vyssi prioritu nez cidlo, takze dokud bude stisknute,
                                                   //   motor se bude tocit i v pripade, ze cidlo perforace bude pozadovat zastaveni
      }


    if (tocit_motorem == true)                     // kdyz se ma motor tocit, vykona se jeden (mikro)krok
      {
        digitalWrite(pin_STEP, HIGH);
        delayMicroseconds(50);                     // pauzy upravit na pozadovanou rychlost otaceni (vetsi cislo = pomalejsi otaceni)
        digitalWrite(pin_STEP, LOW);
        delayMicroseconds(50);
      }

  }

Uživatelský avatar
kiRRow
Příspěvky: 1313
Registrován: 07 kvě 2019, 07:03
Bydliště: Opava

Re: Kontinuální otáčení NEMA17

Příspěvek od kiRRow » 07 dub 2025, 16:17

tohle je fakt blbost ...

Kód: Vybrat vše

    pinMode(pin_MS1 , INPUT_PULLUP);         //pin je jako vstup s pull up rezistorem
    pinMode(pin_MS2 , INPUT_PULLUP);	  
    pinMode(pin_MS3 , INPUT_PULLUP);
    digitalWrite(pin_MS1, HIGH);                   //tohle v pinu zapne pull up rezistor (který je zaplý)
    digitalWrite(pin_MS2, HIGH);			  //takže ten high signal je vlastně připojený pull up rezistor
    digitalWrite(pin_MS3, HIGH);
dej tam tohle ...

Kód: Vybrat vše

    pinMode(pin_MS1 , OUTPUT);                 //pin je jako output
    pinMode(pin_MS2 , OUTPUT);
    pinMode(pin_MS3 , OUTPUT);
    digitalWrite(pin_MS1, HIGH);                   //jeho vystup je skutečny high signal
    digitalWrite(pin_MS2, HIGH);
    digitalWrite(pin_MS3, HIGH);

hafca
Příspěvky: 119
Registrován: 23 říj 2017, 23:05

Re: Kontinuální otáčení NEMA17

Příspěvek od hafca » 07 dub 2025, 16:38

Dík oběma za pomoc, začínám z toho blbnout.

S tím počítáním kroků jsem to měl. Problém je v tom, že jak je film starý a seschlý, případně se slepkou nebo vypáleným políčkem, tak nikdy nezastaví úplně přesně. Výsledkem je roztřesený film. Asi bude částečně chyba i v ozubeném podávacím kolu. Mám ho jen vytištěné a obyčejný i když zkalibrovaný Ender3v2 není zrovna etalon přesnosti. Proto to zkouším s indikací podle perforace.
Ty výstupy tam tak mám, nevím kde jsem k tomu přišel. :shock:

@ AstroMiK
Asi jsem špatně napsal jak to má fungovat. Tlačítko slouží jen na spuštění celého automatu. To znamená, jeden stisk a pak už to běží samo, dokud nevypnu napájení. Po stisku by měl motor najít první díru v perforaci, zastavit, udělat fotku , rozjet se, najít další díru v perforaci, zastavit atd..

Uživatelský avatar
kiRRow
Příspěvky: 1313
Registrován: 07 kvě 2019, 07:03
Bydliště: Opava

Re: Kontinuální otáčení NEMA17

Příspěvek od kiRRow » 07 dub 2025, 17:27

no astromik je měl nastavené jako LOW ... pravděpodobně se stalo to, že vlivem změny mikrokrokování jsi nedokázal ten motor rozběhnout, protože jsi mu posílal kroky příliš moc rychle na tohle nastavení ...

no právě u automatu bych jel asi nějak takhle ...

Kód: Vybrat vše

setup :
  krok 1a - pokud na senzoru nic nemám, jedu velmi pomalinku dopředu až na něm něco mám
  krok 1b - něco na senzoru mám, popojedu vzad pár kroku a provedu krok 1a
  krok 2 - provedu přesně odsledovaný počet kroků správným směrem abych byl na tzv pozici 0 a přitom furt měl něco na tom senzoru (snímá v nějakém rozsahu, že ...)
  konec kalibrace ... nastavím si první počet kroků na jednu otočku

loop :
  stisk tlacitka bude jen prepinat motorBezet = !motorBezet

  pokud motor ma bezet
    a pocet kroku je větší než nula
       provedu krok, odečtu si ho
    nebo pocet je nula
       pokud je senzor aktivni a vim ze se mi to nerozhodilo moc
         provedu prikazy a nakonci nastavim pocet kroku na další otočku
       senzor aktivni neni, provedu kalibraci jako v setupu
ještě k tomu, když to chce člověk nechat běžet o samotě ... raději i počítat pokusy o rekalibraci, po třetím neuspěšném raději ať to pípá, než vesele likviduje starý film

hafca
Příspěvky: 119
Registrován: 23 říj 2017, 23:05

Re: Kontinuální otáčení NEMA17

Příspěvek od hafca » 07 dub 2025, 17:55

Tady se popojíždět zpátky nedá. To ozubené kolo to popotahuje z cívky přes okénko kde se fotí. Potom to jede přes čidlo a navíjí se na prázdnou cívku. Odkaz je na první verzi posunu.
https://youtu.be/k0cO5Mfsd00

AstroMiK
Příspěvky: 649
Registrován: 08 pro 2017, 19:05

Re: Kontinuální otáčení NEMA17

Příspěvek od AstroMiK » 07 dub 2025, 19:43

Tak snad poslední verze:
Tlačítko má teda jen funkci spuštění hlavní smyčky a až do vypnutí napájení je nepužité.
Motor se točí pořád.
Když se na čidle objeví LOW a zároveň je povolené fotografování, fotografování se vykoná.
Pak se fotografování zakáže až do doby, kdy čidlo zahlásí HIGH.
HIGH na čidle fotografování povolí, ale ještě nevykoná. K tomu dojde až při dalším LOW na čidle.
V okamžiku fotografování asi bude potřeba motor na chvilku zastavit aby film neodjel během osvitu- to se provede nějakou pauzou.

Kód: Vybrat vše

// prirazeni pinu - jsem musel zmenit, protoze je uz osazena DPS
#define pin_STEP              3
#define pin_tlacitko          10
#define pin_cidlo             8
#define pin_DIR               2
#define pin_ENABLE            9
#define pin_SLEEP             4           
#define pin_MS1               7           
#define pin_MS2               6           
#define pin_MS3               5          


// globalni promenne
bool blokuj_prikazy = false;                       // fotografovani se vykona jen 1x po stavu LOW na cidle


void setup(void)
  {

    pinMode(pin_tlacitko, INPUT_PULLUP);           // tlacitko spina proti GND, rozepnute je v HIGH
    pinMode(pin_cidlo, INPUT);                     // cidlo dava LOW nebo HIGH (LOW zastavuje motor)
    pinMode(pin_STEP , OUTPUT);                    // krokovani motoru

    pinMode(pin_DIR , OUTPUT);                     // smer otaceni
    digitalWrite(pin_DIR, HIGH);

    pinMode(pin_ENABLE , OUTPUT);                  // spusteni napajeni do motoru
    digitalWrite(pin_ENABLE, LOW);

    pinMode(pin_SLEEP , OUTPUT);                   // probudit motor
    digitalWrite(pin_SLEEP, HIGH);

    pinMode(pin_MS1 , OUTPUT);                     // mikrostepovaci piny ...
    pinMode(pin_MS2 , OUTPUT);
    pinMode(pin_MS3 , OUTPUT);
    digitalWrite(pin_MS1, HIGH);                   // ... nastavit podle potreby
    digitalWrite(pin_MS2, HIGH);
    digitalWrite(pin_MS3, HIGH);


    while (digitalRead(pin_tlacitko) == HIGH) ;    // na teto radce se bude cekat, nez dojde ke stisku tlacitka (LOW = pokracuj dal)
                                                   //   pak uz je tlacitko az do vypnuti napajeni zbytecne 
  
  }


void loop(void)
  {
    if (digitalRead(pin_cidlo) == LOW)             // prvni LOW signal od cidla provede fotografovani
      {
        if (blokuj_prikazy == false)               // blok prikazu, ktere se maji vykonat po prvnim zjisteni LOW stavu na cidle
          {
            //  ************************* 
            //  ***   FOTOGRAFOVANI   ***
            //  ************************* 
            delay(1000);                           // pozastaveni motoru na provedení zaznamu (aby film neujel behem osvitu)
            
            blokuj_prikazy = true;                 // nez se objevi HIGH signal na cidle, dalsi fotografovani se nebude provadet
          }    
      }
    else
      {
        blokuj_prikazy = false;
      }

    digitalWrite(pin_STEP, HIGH);                  // jeden impulz do motoru (motor se toci porad)
    delayMicroseconds(50);                         // pauzy upravit na pozadovanou rychlost otaceni (vetsi cislo = pomalejsi otaceni)
    digitalWrite(pin_STEP, LOW);
    delayMicroseconds(50);
    
  }

hafca
Příspěvky: 119
Registrován: 23 říj 2017, 23:05

Re: Kontinuální otáčení NEMA17

Příspěvek od hafca » 07 dub 2025, 20:07

Mrzí mě to, ale někde je chyba. Motor po stisku tlačítka jen cvakne, stojí a periodicky cvaká a fotí.

AstroMiK
Příspěvky: 649
Registrován: 08 pro 2017, 19:05

Re: Kontinuální otáčení NEMA17

Příspěvek od AstroMiK » 07 dub 2025, 20:23

Změnil jsem ti tam ty piny MS1 až MS3 na OUTPUT, jak psal kiRRow.
Dobře, tak si je přepni zpátky na INPUT_PULLUP jestli to teda pomůže.

Jinak mi to tady běží na stole bez problémů.
(místo motoru mám LEDku, zpomalil jsem si impulzy a místo foťáku mám druhou LED)


video:
https://youtu.be/8K2dzX3GFgk

hafca
Příspěvky: 119
Registrován: 23 říj 2017, 23:05

Re: Kontinuální otáčení NEMA17

Příspěvek od hafca » 07 dub 2025, 20:51

Ty piny tam jsou jak už jsem napsal.
Dík za tvůj čas, ale pusť to z hlavy, něco z toho co se tu psalo určtě nějak zužitkuji.

Odpovědět

Kdo je online

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