• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Przycisk chwilowy i włączanie silnika krokowego
#1
Cześć, 
próbuję przycisk chwilowy wykorzystać do włączania/wyłączania silnika krokowego. Wykorzystuję zestaw uno. Jedyny pomysł jaki mi przychodzi to zasilać silniczek 5V 28BY-48 z pinu cyfrowego wyjścia, który mogę oprogramować tak aby włączał się lub wyłączał kiedy użyję przycisku. Niestety przypuszczam, że nie jest to dobry sposób bo silniczek nie chce się włączać choć jestem pewny, że na pin prawidłowo się włącza i wyłącza. Zapomniałem dodać, że przyciski jest z diodą podświetlającą, którą tez steruję z jednego pin cyfrowego.
Z góry dziękuję za podpowiedź.
 
Odpowiedź
#2
Wiesz że silniczek krokowy ma ciut więcej wyprowadzeń niż +5V i GND i ot tak z jednego pinu cyfrowego bezpośrednio raczej nie zadziała (nie wnikam ile w ogóle prądu pobiera, ale pewnie też za dużo dla Atmegi, tyle dobrze że nie uszkodziłeś atmegi bo silniczek nie zadzialal) ?
 
Odpowiedź
#3
Cześć, moje wcześniejsze pytanie proszę uznać za niebyłe. Wynikało z kompletnego braku zrozumienia jak działa silnik.
Trochę pozmieniałem i napisałem kod, który działa, ale nie do końca dobrze. Tylko czasami włączy i wyłączy silnik. Jak ktoś ma ochotę popatrzeć i trochę podpowiedzieć to będę wdzięczny.

Kod:
#include <Stepper.h>

//ustawienia dla silnika
const int stepsPerRevolution = 64;
signed int direction = -1;
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);
long motorSpeed = 256;
//--------------------------
boolean level = 0; // poziom początkowy oswietlenia i pracy silnika

void setup() {
  myStepper.setSpeed(motorSpeed);
  pinMode(3,OUTPUT); //oswietlenie przycisku
  pinMode(2,INPUT_PULLUP); // przycisk

  digitalWrite(3,level);
}

void loop() {
  //włączenie silnika w zależnosci od poziomu
  if(level){
    myStepper.step(direction);
  }
  //----------------------------
  //obsługa przycisku chwilowego
  if(digitalRead(2) == HIGH){
    delay(50);
    level = !level;
    digitalWrite(3,level);
    while(digitalRead(2) == LOW);
    delay(50);   
  }
}
 
Odpowiedź
#4
Czasami włączy/wyłączy bo nie rozumiesz drgania styku i komend,

Te dalay() to wielkie nie porozumienie praktycznie do niczego nie potrzebne. A te "while" blokuje wykonania "myStepper.step"

Co to za przycisk?? bistabilny czy monostabilny?
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#5
(26-12-2019, 21:13)Jarewa0606 napisał(a): Czasami włączy/wyłączy bo nie rozumiesz drgania styku i komend,

Te dalay() to wielkie nie porozumienie  praktycznie do niczego nie potrzebne. A te "while" blokuje wykonania "myStepper.step"

Co to za przycisk?? bistabilny czy monostabilny?
Cześć, przycisk monostabilny.
Funkcja delay() oraz pusta pętla while zastosowana po to aby sprawnie włączało się i wyłączało oświetlenie dla przycisku. Tak w tutorialach podpatrzyłem i działa to całkiem sprawnie.
 
Odpowiedź
#6
(26-12-2019, 21:35)marhes napisał(a): Funkcja delay() oraz pusta pętla while zastosowana po to aby sprawnie włączało się i wyłączało oświetlenie dla przycisku. Tak w tutorialach podpatrzyłem i działa to całkiem sprawnie.


Tak ale blokuje silniczek..

użyj funkcji nie blokującej bez while bez długiego blokowania.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#7
Nie mam pomysłu. I zdecydowanie nie rozumiem co masz na myśli, oprócz tego, że wszystko jest do bani. Jedyne co mi przychodzi na myśl, to zmienić przycisk na pojedynczy lub może na bistabilny, który poda napięcie do arduino, i wtedy wykona się jakiś tam program dla silniczka.
W każdym razie dziękuję, że starałeś się pomóc.
 
Odpowiedź
#8
Kod:
#include <Stepper.h>

//ustawienia dla silnika
const int stepsPerRevolution = 64;
signed int direction = -1;
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);
long motorSpeed = 256;
//--------------------------
boolean level = 0; // poziom początkowy oswietlenia i pracy silnika

uint32_t Tims =0;
uint8_t ostatni_odczyt =0;
uint8_t stan_sw =0;

void setup() {
  myStepper.setSpeed(motorSpeed);
  pinMode(3,OUTPUT); //oswietlenie przycisku
  pinMode(2,INPUT_PULLUP); // przycisk

  digitalWrite(3,level);
}

void loop() {
  //włączenie silnika w zależnosci od poziomu
  if(level){
    myStepper.step(direction);
  }
  //----------------------------
  //obsługa przycisku chwilowego

  uint8_t odczyt = digitalRead(2);
  
  if(odczyt != ostatni_odczyt){
     Tims=millis();
  }

  if(millis()- Tims >= 100UL){
    if(odczyt!=stan_sw){
       stan_sw=odczyt;
         if(stan_sw==LOW){
         level = !level;
         digitalWrite(3,level);
        }
     }
   }
}


Jak zadziała to pomyśl co zrobiłem...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#9
Działa i to bardzo ładnie.
Generalnie chodzi tu o to aby nasłuchiwać sygnał od przycisku, jeżeli się zmieni po 100 milisekundach (zmieniłem na 10 bo dla 100 nie chciało działać) w każdym razie pewnie po ustabilizowaniu styków sprawdza czy na pewno przycisk został wciśnięty i jeżeli potrzeba zmienia poziom sygnału dla diody i oczywiście silnika.
Dziękuję bardzo. Nie wpadłbym na to.
Ale mam pytanie. Czy pętla while, którą wcześniej użyłem zatrzymywała mój program czy nie, bo już zgłupiałem. Tutorial wskazywał, że pętła while działała tak długo, aż był wciśnięty przycisk.
 
Odpowiedź
#10
(28-12-2019, 20:56)marhes napisał(a): Generalnie chodzi tu o to aby nasłuchiwać sygnał od przycisku, jeżeli się zmieni po 100 milisekundach (zmieniłem na 10 bo dla 100 nie chciało działać)


Nasłuchiwać to się zgadza, ciągle odczytuje w pętli stan przycisku. A te 100ms nie chodzi o zmianę lecz o stan przycisku millis() wyeliminował krótkie zmiany przycisku czyli wszystkie zmiany które trwały poniżej 100ms były odrzucane. Dziwne że nie działało bo powinno tylko przycisk musi być dłużej naciśnięty powyżej 100ms i przerwa miedzy przyciskaniem powyżej 100ms. 


(28-12-2019, 20:56)marhes napisał(a): Ale mam pytanie. Czy pętla while, którą wcześniej użyłem zatrzymywała mój program czy nie, bo już zgłupiałem. Tutorial wskazywał, że pętła while działała tak długo, aż był wciśnięty przycisk.



W twoim przypadku działał tak długo dopóki nie włączyłeś przycisk. I zablokował cały loop teoretycznie 

  if(level){
    myStepper.step(direction);
  } 

wykonywał sie tylko jak był przyciśnięty przycisk i co drugi raz..
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości