• 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
Arduino + silnik krokowy 28BYJ-48 pytania do szkicu
#1
Witam, 
Jestem amatorem jeśli chodzi o programowanie, i bardzo prosiłbym was o pomoc 
Może zacznę od tego o co mi chodzi. 

Potrzebuje napisać szkic który podczas podania stanu wysokiego silnik zrobi kilka obrotów po czym się zatrzyma przy czym stan wysoki cały czas jest podawany. 

A następnie jeśli stan zmieni się na niski zrobi tyle samo obrotów w 2 stronę. 
i program się wyłączy w oczekiwaniu na zmiane stanu wtedy zareaguje 

Ma to być podnoszenie osłony wiatraka, jak wiatrak się włączy osłona się podnosi jak wyłączy to się zamyka. 
Czy ktoś z was ma dużo cierpliwości i chciałby pomoc ? 

O ile jestem w stanie napisać prostsza cześć to nie mam pojęcia za bardzo jak zrobić aby pętla wykonywała się tylko raz w zależności od stanu wiatraka oraz reagowała tylko wtedy jeśli stan się zmieni oraz najtrudniejsze jeśli zabraknie prądu i system się zresetuje ma pamiętać ostatni stan jaki był i jesli się zmienił to otworzyć lub zamknąć osłonę a jeśli jest ten sam to nie robić nic( nie chce aby np silnik podnosił już podniesiona osłonę)


Jeszcze raz podkreślę ze bardzo słabo się znam na programowaniu pewnie sporo namieszałem ktoś da mi wskazówkę ? 


Kod:
#include <CheapStepper.h>
#include <EEPROM.h>

int przeslona = 3;
int napiecie = 4;
int niskie = 5;
uint8_t EEPROMaddress = 130 ;
CheapStepper stepper (8, 9, 10, 11);

void setup()
{
  pinMode(przeslona, INPUT);
  pinMode(napiecie, OUTPUT);
  Serial.begin(9600);
  Serial.println("Ready to start moving!");
  stepper.setRpm(12);
}

void loop()
{
  przeslona = EEPROM.read(EEPROMaddress); // odczyt zapisu z EEPROM
  digitalWrite( napiecie, HIGH); // wyjscie na pinie 5v dla testu
  digitalWrite( niskie, LOW); // wyjscie na pinie 0v dla testu

  if (digitalRead(przeslona))
  {
    przeslona = napiecie;
    EEPROM.write(EEPROMaddress, przeslona) ;
  }
  else if(digitalRead(przeslona))
  {
    przeslona = niskie;
    EEPROM.write(EEPROMaddress, przeslona) ;
  }

  if (digitalRead(przeslona) != LOW)
  {
    stepper.moveDegreesCW (180);
    delay(1000);
  }
  else
  {
    stepper.moveDegreesCCW (180);
    delay(1000);
  }
}
 
Odpowiedź
#2
Tu https://www.elektroda.pl/rtvforum/topic3487025.html masz podpowiedź, łącznie z kodem
Kod:
static stan_zmiennej;
if( stan_zmiennej != odczyt_portu(3) ){ // Wykrycie zmiany stanu portu
stan_zmiennej = odczyt_portu(3);

//na podstawie "stan_zmiennej" można określić czy wystąpiło zbocze narastające czy opadające
}
jak wykryć zmianę stanu wejścia aby reagować na zbocze sygnału a nie poziom. Masz też tam opisane jaki rozmiar zmiennej zadeklarować.
Pomagam (nie prowadzę kursów), tylko, gdy w poście załączone są niezbędne materiały (kod, schemat) a pytający zna podstawy.

Na kod z Delay szkoda czasu.
Kod wymaga komentowania.
Kod bez WDT jest niepewny.



 
Odpowiedź
#3
Z zapamiętaniem na czas wyłączenia zasilania to kontroler może nie wystarczyć (szczególnie w EEPROM), najlepiej byłoby mieć dwie krańcówki, a co najmniej jedną. Może być tak, że zanik nastąpi podczas podnoszenia lub stan nie zostanie zapisany prawidłowo. Lepiej byłoby startować, sprawdzać czy krańcówka wskazuje na stan zamknięty, jak nie to zamknąć i od nowa odliczyć kroki do otwarcia. Mając dwie od razu wiesz czy przesłona jest w skrajnym położeniu i którym.
Wiesz że ten test:
Kod:
 digitalWrite( napiecie, HIGH); // wyjscie na pinie 5v dla testu
 digitalWrite( niskie, LOW); // wyjscie na pinie 0v dla testu
trwa mrugnięcie oka kolibra?
Zrób sobie kurs, bo pytasz o podstawy. Arduino jest proste, ale alfabet trzeba znać:
https://forbot.pl/blog/kurs-arduino-pods...rsu-id5290
 
Odpowiedź
#4
(07-08-2018, 11:21)kaczakat napisał(a): Z zapamiętaniem na czas wyłączenia zasilania to kontroler może nie wystarczyć (szczególnie w EEPROM), najlepiej byłoby mieć dwie krańcówki, a co najmniej jedną.
Krańcówki to najlepsze rozwiązanie ale kłopotliwe w montażu. Można zrobić jak z domykaniem szyb samochodowych, wiadomo że max czas podnoszenia to np 2 sekundy, po resecie można więc włączyć silnik na zadany czas. Na krokowych pewnie nie bardzo da się wykryć zwiększony pobór prądu gdy silnik zostanie mechanicznie zablokowany gdy znajdzie się w skrajnym położeniu (niektóre sterownik szyb tak stwierdzają osiągnięcie skrajnej pozycji). Skuteczne jest dodanie enkodera ale to też problem mechaniczny.
Pomagam (nie prowadzę kursów), tylko, gdy w poście załączone są niezbędne materiały (kod, schemat) a pytający zna podstawy.

Na kod z Delay szkoda czasu.
Kod wymaga komentowania.
Kod bez WDT jest niepewny.



 
Odpowiedź
#5
Prąd można mierzyć ewentualnie na wentylatorze, może być też taka konstrukcja klapki ze sprzęgłem, by jej nie urywało w skrajnych pozycjach, ale to zależy co to za wentylator i ile klapka ma wytrzymać, no i czy faktycznie krańcówka to problem.
 
Odpowiedź
#6
(07-08-2018, 11:47)kaczakat napisał(a): i czy faktycznie krańcówka to problem.
Włączniki mechaniczne mogą być kłopotliwe w montażu ale można użyć optycznych.

Przyznam, że ja nie bawił bym się w krańcówki. Szansa, że zasilanie padnie w czasie pracy silnika są raczej małe. Rozwiązanie ze sprzęgłem jest dobre. W amatorskim wykonaniu takie sprzęgło robi się ze sprężyny jak od długopisu tylko gęściejszej i dłuższej.

Autor ma poważniejszy problem. Dostał gotowca i nie potrafi go zaimplementować w swoim kodzie.
Pomagam (nie prowadzę kursów), tylko, gdy w poście załączone są niezbędne materiały (kod, schemat) a pytający zna podstawy.

Na kod z Delay szkoda czasu.
Kod wymaga komentowania.
Kod bez WDT jest niepewny.



 
Odpowiedź
#7
(07-08-2018, 12:05)es2 napisał(a): Autor ma poważniejszy problem. Dostał gotowca i nie potrafi go zaimplementować w swoim kodzie.

Niestety to prawda Smile
 
Odpowiedź
#8
(07-08-2018, 21:55)kamilk1092 napisał(a):
(07-08-2018, 12:05)es2 napisał(a): Autor ma poważniejszy problem. Dostał gotowca i nie potrafi go zaimplementować w swoim kodzie.

Niestety to prawda Smile

Więc zrób jak było radzone na Elektrodzie, zacznij od wywalenia obsługi eeprom (przy okazji, dlaczego zapisujesz eeprom od adresu 130? Jakaś ulubiona liczba?) następnie w miejscu gdzie reagujesz na poziom stanu wejscia "przesłona" reaguj na zmianę poziomu tak jak masz w przykładzie.
Pomagam (nie prowadzę kursów), tylko, gdy w poście załączone są niezbędne materiały (kod, schemat) a pytający zna podstawy.

Na kod z Delay szkoda czasu.
Kod wymaga komentowania.
Kod bez WDT jest niepewny.



 
Odpowiedź
#9
możne się to śmieszne wyda ale nie mam pojęcia o co w tym "stan zmiennej" i jak to zapisać zmienne to ja znam typu int (głównie) dlatego też szukam dalszej pomocy Smile

eeprom wywalę, a co do numeru tak sobie to wymyśliłem Smile
 
Odpowiedź
#10
A jak Ci idzie z kursem Arduino?
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości