Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

Spouštění a zastavení motoru 28BYJ-48 Arduinem *vyřešeno*
Jdi na stránku 1, 2  Další
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
hafca



Založen: Jul 27, 2004
Příspěvky: 4573
Bydliště: 25km na západ od Prahy

PříspěvekZaslal: st prosinec 04 2024, 16:54    Předmět: Spouštění a zastavení motoru 28BYJ-48 Arduinem *vyřešeno* Citovat

Potřebuji spouštět a zastavovat motor 28BYJ-48+ULN2003 koncovými spínači. Motor by měl po zapnutí začít zvedat páku, která nahoře najede na koncák a motor vypne. Páka jede pomalu samočinně dolů, dole najede na koncák, který motor zapne a páka jede zase nahoru. A tak pořád dokola.
Nedokážu nastavit podmínky tak, aby se motor po nájezdu na dolní koncák zapnul.
Mohl by mi někdo poradit jak to dát dohromady?

kód:
#include <Stepper.h>

#define OUTPUT1   11               
#define OUTPUT2   10               
#define OUTPUT3   9               
#define OUTPUT4   8               
// Define the number of steps per rotation
const int stepsPerRotation = 2048; 
int switch_H  = 4; // up button
int switch_D = 5; // down button


Stepper myStepper(stepsPerRotation, OUTPUT2, OUTPUT4, OUTPUT1, OUTPUT3); 


void setup() {
 pinMode(4,INPUT_PULLUP);// push button pin as input
 pinMode(5,INPUT_PULLUP);// push button pin as input
 pinMode(2, OUTPUT);
  myStepper.setSpeed(15);  // 15 RPM

 }
void loop() {
 
  myStepper.step(stepsPerRotation); 
 
if (digitalRead(4)==LOW)

    {
              myStepper.setSpeed(0);
              delay (20);
              digitalWrite(4, HIGH);
    }
   
   
else (digitalRead(5)==LOW);

   {
            myStepper.setSpeed(15);
              digitalWrite(4, HIGH);
              delay (20);
       
     }
  } 


_________________
Kdyby Edison nevynalezl elektřinu, do teď se díváme na televizi při svíčkách.


Naposledy upravil hafca dne čt prosinec 05 2024, 19:10, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
Valdano



Založen: Jan 01, 2023
Příspěvky: 2162
Bydliště: Česká Lípa

PříspěvekZaslal: st prosinec 04 2024, 17:49    Předmět: Citovat

Úprava zdrojáku viz níže.

kód:
#include <Stepper.h>

#define OUTPUT1   11
#define OUTPUT2   10
#define OUTPUT3   9
#define OUTPUT4   8
#define SW_H      4
#define SW_D      5

const int stepsPerRotation = 2048;

Stepper myStepper(stepsPerRotation, OUTPUT2, OUTPUT4, OUTPUT1, OUTPUT3);

void setup()
{
  pinMode(SW_H,INPUT_PULLUP);
  pinMode(SW_D,INPUT_PULLUP);
  pinMode(2, OUTPUT);
  myStepper.setSpeed(15);
}

void loop()
{
  myStepper.step(stepsPerRotation);
  if (digitalRead(SW_H)==LOW) {
    // sepnul horní koncák tj. vypnout motor
    myStepper.setSpeed(0);
    delay(20);
  } else {
    if (digitalRead(SW_D)==LOW) {
      // sepnul dolní koncák tj. zapnout motor
      myStepper.setSpeed(15);
      delay(20);
    }
  }
}


Naposledy upravil Valdano dne st prosinec 04 2024, 18:05, celkově upraveno 3 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
samec



Založen: Dec 19, 2017
Příspěvky: 4773

PříspěvekZaslal: st prosinec 04 2024, 18:01    Předmět: Citovat

Valdano, o čo sa snažíš? Prepísal si nefunkčnú blbosť na funkčnú blbosť. Myslíš, že už to pôjde?

hafca, nemôžeš do vstupu zapisovať digitalWrite(4, HIGH);.
Potrebuješ ešte jednu premennu definujúcu aktuálny stav a podľa nej kontrolovať horný alebo dolný spínač. Po zadetekovaní zopnutia spínača, zmeniť stav a zapnúť alebo vypnúť motor.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Valdano



Založen: Jan 01, 2023
Příspěvky: 2162
Bydliště: Česká Lípa

PříspěvekZaslal: st prosinec 04 2024, 18:14    Předmět: Citovat

Oprava. Teď by to mělo být funkční.

Úprava zdrojáku viz níže.

Krokový motor 28BYJ-48 má 32 kroků na otáčku motoru a s převodovkou 64:1 je to 2048 kroků na otáčku výstupního hřídele.

kód:
#include <Stepper.h>

#define OUTPUT1   11
#define OUTPUT2   10
#define OUTPUT3   9
#define OUTPUT4   8
#define SW_H      4
#define SW_D      5

// řízení chodu
int chod = 0;

// počet kroků na jednu otáčku motoru
const int stepsPerRotation = 32;

Stepper myStepper(stepsPerRotation, OUTPUT2, OUTPUT4, OUTPUT1, OUTPUT3);

void setup()
{
  pinMode(SW_H,INPUT_PULLUP);
  pinMode(SW_D,INPUT_PULLUP);
  pinMode(2, OUTPUT);
  // tímto se nastavuje rychlost otáčení na 1024 RPM tj. 1024 otáček motoru za minutu
  // na převodovce 64:1 to bude 16 RPM tj. 16 otáček výstupního hřídele za minutu
  myStepper.setSpeed(1024);
  chod = 1;
}

void loop()
{
  if (chod) {
    // pokud má běžet motor volá se step(256)
    // 256 kroků (tj. 8 otáček motoru) během jednoho cyklu loop()
    // na převodovce 64:1 to bude 0,125 otáčky výstupního hřídele
    // funkce je blokující tj. čeká až motor dokončí pohyb 256 kroků
    // při rychlosti 1024RPM a při počtu 32 kroků na jednu otáčku motoru
    // bude její provedení trvat cca 256 * (60 / (1024 * 32)) tj. cca 470ms
    myStepper.step(256);
  };
  if (digitalRead(SW_H)==LOW) {
    // sepnul horní koncák tj. vypnout motor
    // páka pojede samočinně dolů bez motoru
    chod = 0;
    delay(20);
  } else {
    if (digitalRead(SW_D)==LOW) {
      // sepnul dolní koncák tj. zapnout motor
      // motor začne zvedat páku nahoru
      chod = 1;
      delay(20);
    }
  }
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
hafca



Založen: Jul 27, 2004
Příspěvky: 4573
Bydliště: 25km na západ od Prahy

PříspěvekZaslal: st prosinec 04 2024, 20:20    Předmět: Citovat

Dík za snahu, ale nefunguje to. Navíc se motor po zapnutí nerozběhne, jen "vrní".
V původním programu jsem měl pohyb motoru v pořádku. To není potřeba řešit.
Problém byl a je jen v jeho (ne)reagování na koncáky. Dokáži ho po zapnutí napájení rozběhnout a horním koncákem zastavit. Ale dolní koncák ho nespustí.

_________________
Kdyby Edison nevynalezl elektřinu, do teď se díváme na televizi při svíčkách.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
asdf



Založen: Oct 06, 2022
Příspěvky: 334

PříspěvekZaslal: st prosinec 04 2024, 20:31    Předmět: Citovat

Mě tam udivuje tahle konstrukce:
kód:
else (digitalRead(5)==LOW);
To asi má být:
kód:
else if (digitalRead(5)==LOW)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Valdano



Založen: Jan 01, 2023
Příspěvky: 2162
Bydliště: Česká Lípa

PříspěvekZaslal: st prosinec 04 2024, 21:04    Předmět: Citovat

A co tohle?

kód:
#include <Stepper.h>

#define OUTPUT1   11
#define OUTPUT2   10
#define OUTPUT3   9
#define OUTPUT4   8
#define SW_H      4
#define SW_D      5

int chod = 0;
const int stepsPerRotation = 2048;

Stepper myStepper(stepsPerRotation, OUTPUT2, OUTPUT4, OUTPUT1, OUTPUT3);

void setup()
{
  pinMode(SW_H,INPUT_PULLUP);
  pinMode(SW_D,INPUT_PULLUP);
  pinMode(2, OUTPUT);
  myStepper.setSpeed(15);
  chod = 1;
}

void loop()
{
  if (chod) {
    myStepper.step(stepsPerRotation);
  };
  if (digitalRead(SW_H)==LOW) {
    // sepnul horní koncák tj. vypnout motor
    // páka pojede samočinně dolů bez motoru
    chod = 0;
    delay(20);
  } else {
    if (digitalRead(SW_D)==LOW) {
      // samozřejmě bez toho v úvodu chybně uvedeného středníku
      // sepnul dolní koncák tj. zapnout motor
      // motor začne zvedat páku nahoru
      chod = 1;
      delay(20);
    };
  };
}


Naposledy upravil Valdano dne st prosinec 04 2024, 21:12, celkově upraveno 4 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
samec



Založen: Dec 19, 2017
Příspěvky: 4773

PříspěvekZaslal: st prosinec 04 2024, 21:06    Předmět: Citovat

asdf napsal(a):
Mě tam udivuje tahle konstrukce:
kód:
else (digitalRead(5)==LOW);
To asi má být:
kód:
else if (digitalRead(5)==LOW)
Ale veď o tom je hneď prvý komentár, Mlho. Laughing
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
samec



Založen: Dec 19, 2017
Příspěvky: 4773

PříspěvekZaslal: st prosinec 04 2024, 21:14    Předmět: Citovat

Valdano, nechceš radšej použiť to, čo funguje? To jest myStepper.setSpeed(0); a myStepper.setSpeed(15); ? Very Happy
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
asdf



Založen: Oct 06, 2022
Příspěvky: 334

PříspěvekZaslal: st prosinec 04 2024, 21:20    Předmět: Citovat

To setSpeed(0) v původním kódu taky není dobrý nápad. Kdo ví, co to udělá, protože se tam pak dělí nulou. Je to totiž naprogramováno takhle:
kód:
void Stepper::setSpeed(long whatSpeed)
{
  this->step_delay = 60L * 1000L * 1000L / this->number_of_steps / whatSpeed;
}
Ten Valdanův kód by to mohl řešit.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
asdf



Založen: Oct 06, 2022
Příspěvky: 334

PříspěvekZaslal: st prosinec 04 2024, 21:22    Předmět: Citovat

samec napsal(a):
Ale veď o tom je hneď prvý komentár, Mlho. Laughing
Aha, ten jsem nějak vynechal. Embarassed
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Valdano



Založen: Jan 01, 2023
Příspěvky: 2162
Bydliště: Česká Lípa

PříspěvekZaslal: st prosinec 04 2024, 21:23    Předmět: Citovat

samec napsal(a):
Valdano, nechceš radšej použiť to, čo funguje? To jest myStepper.setSpeed(0); a myStepper.setSpeed(15); ? Very Happy

Nechci, protože podle mého názoru je to nesprávné použití funkce setSpeed() viz citace.

Zdroj: Stepper - setSpeed()

citace:
Tato funkce nastavuje otáčky motoru v otáčkách za minutu (RPM). Tato funkce nespouští motor, pouze nastavuje rychlost, kterou se bude otáčet, když zavoláte step().

Při běhu motoru se má volat step() a při zastavení motoru se step() prostě nevolá. Navíc setSpeed(0) je chyba i vzhledem k tomu dělení nulou, které zde již zmínil asdf.

Proto mám v příkladu volání step() s podmínkou dle stavu proměnné chod, setSpeed(0) vůbec nevolám a setSpeed(15) stačí pro daný účel nastavit jen jednou v setup().

S tou poslední změnou tj. vrácením stepsPerRotation zpět na 2048 by to už mělo fungovat.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
dj_Paul



Založen: Sep 19, 2004
Příspěvky: 2495
Bydliště: Laškov

PříspěvekZaslal: čt prosinec 05 2024, 8:00    Předmět: Citovat

není popsán důvod použití arduina ale nestačila by jedna L297 + 555 ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
hafca



Založen: Jul 27, 2004
Příspěvky: 4573
Bydliště: 25km na západ od Prahy

PříspěvekZaslal: čt prosinec 05 2024, 8:06    Předmět: Citovat

Valdano napsal(a):
A co tohle?
...

Ano, tohle už funguje. Velké díky za pomoc všem.
Jen je zajímavé, že zastavování funguje až na několikátý pokus, ale rozběh hned. Ale možná je to tím, že to zatím mám na "prkénku". Uvažuji o spínání buď magnetem a jazýčkovým zátavem nebo magnet a Hallovo čidlo. Tam by asi nebylo potřeba řešit debounce.

_________________
Kdyby Edison nevynalezl elektřinu, do teď se díváme na televizi při svíčkách.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
hafca



Založen: Jul 27, 2004
Příspěvky: 4573
Bydliště: 25km na západ od Prahy

PříspěvekZaslal: čt prosinec 05 2024, 9:09    Předmět: Citovat

dj_Paul napsal(a):
není popsán důvod použití arduina ale nestačila by jedna L297 + 555 ?

Máš pravdu, je to asi s kanonem na vrabce, ale nic jiného mi nenapadlo. I vzhledem k jednoduššímu nastavení parametrů otáčení. Asi by to šlo i s ATTINY, to ale neumím vůbec.

_________________
Kdyby Edison nevynalezl elektřinu, do teď se díváme na televizi při svíčkách.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.16 sekund