Skocz do zawartości
Samail

Sterowanie silnikiem krokowym ze sprzężeniem zwrotnym - zamek drzwiowy

Pomocna odpowiedź

Witam wszystkich,

jestem w trakcie opracowywania projektu inteligentnego zamka do drzwi. Urządzenie ma umożliwiać sterowanie zamkiem drzwiowym za pośrednictwem aplikacji mobilnej. Przygotowałem już model mechanizmu i schemat elektryczny, aktualnie jestem na etapie programowania układu. Jako "mózg" operacji wykorzystuje Arduino Nano Every. Zwracam się do Was z prośbą o weryfikacje i przedstawienie wszelkich uwag i spostrzeżeń do dotychczasowych efektów projektowania. Prośba wynika z tego, że szykuje się do zakupu niezbędnych elementów i chciałbym zminimalizować ryzyko niepotrzebnych wydatków w przypadku ewentualnych nieprawidłowości. Dodatkowo, chętnie zaciągnę rad od "wyjadaczy".
     Wątpliwości mam głównie w kwestii tytułowego sprzężenia zwrotnego. Do sprawdzania pozycji kątowej wału chcę wykorzystać analogowy  czujnik odbiciowy. Na wale umieściłem pierścień z wypustami. Podczas obrotu wału czujnik natrafia na wypusty co objawia się zmianą wartości wyjściowej czujnika. Zastanawiam się, czy takie rozwiązanie nie wpłynie jakoś znacząco na płynność działania całego mechanizmu i czy w ogóle może zostać zrealizowane. Zdaje sobie sprawę z różnicy rozdzielczości między krokami silnika, a układu sprzężenia zwrotnego.

Oto opracowany szkic programu:


// ================================= IO TAGS ================================= //

const int controllerEnable = 7; //D4
const int controllerMS1 = 9; //D6
const int controllerMS2 = 24; //A5
const int controllerMS3 = 23; //A4
const int controllerSleep = 21; //A2
const int controllerStep = 20;  //A1
const int controllerDir = 19; //A0

const int bluetoothEnable = 5; //D2

const int batteryVoltageIn = A3; 

const int sensorOut = A7; 

// ============================== GLOBAL VARIABLES ============================ //

int batteryPercentage;
float batteryLowVoltage=2.5; //***wartość do pomiaru***
float batteryHighVoltage=5.0; //***wartość do pomiaru***

int sensorImpulsesValue=0;
int correctImpulsesValue=200; //motor resolution
int sensorHighTreshold=1000;  //***wartość do pomiaru***
bool correctPositionFlag;

// ================================= FUNCTIONS ================================ // 

    void readBatteryState()  //reading battery percentage state
      {
        int batteryVoltage=analogRead(batteryVoltageIn);                                                                                     
        float batteryVoltageValue=batteryVoltage * (5.0 / 1023.0); //transforming analog read value to voltage
        batteryPercentage = (int)((batteryHighVoltage - batteryLowVoltage)-(batteryHighVoltage-batteryVoltageValue)/(batteryHighVoltage - batteryLowVoltage))*100; //transforming battery voltage value to percentage value
      }

    void readSensorImpulses() //reading sensor impulses
      {
        if(analogRead(sensorOut)>sensorHighTreshold)
          {
            sensorImpulsesValue++;
          }
      }

    void checkPosition()  //checking position correctness
      {
        if(sensorImpulsesValue==correctImpulsesValue)
          {
            correctPositionFlag=1;
          }
        else
          {
            correctPositionFlag=0;
          }
      }
      
// ------------------------ MOTOR MODE SETUP ----------------------- // 
     
    void setFullStep()
    {
      digitalWrite(controllerMS1, LOW);
      digitalWrite(controllerMS2, LOW);
      digitalWrite(controllerMS3, LOW);
    }

        void setHalfStep()
    {
      digitalWrite(controllerMS1, HIGH);
      digitalWrite(controllerMS2, LOW);
      digitalWrite(controllerMS3, LOW);
    }

        void setQuarterStep()
    {
      digitalWrite(controllerMS1, LOW);
      digitalWrite(controllerMS2, HIGH);
      digitalWrite(controllerMS3, LOW);
    }

// -------------------------- MOTOR MOTION ------------------------- // 

        bool fullForwardTurn()  //one, full shaft turn - forward
    {
      digitalWrite(controllerDir, HIGH);
      
      for(int i=1; i<200; i++)
      {
          digitalWrite(controllerStep, HIGH);
          delay(1);
          digitalWrite(controllerStep, LOW);
          readSensorImpulses();
          delay(1);
      }

      checkPosition();
      
      return correctPositionFlag;
    }


            bool fullReverseTurn()  //one, full shaft turn - reverse
    {
      digitalWrite(controllerDir, LOW);
      
      for(int i=1; i<200; i++)
      {
          digitalWrite(controllerStep, HIGH);
          delay(1);
          digitalWrite(controllerStep, LOW);
          readSensorImpulses();
          delay(1);
      }

      checkPosition();
      
      return correctPositionFlag;
    }

// ============================= SETUP ============================= // 

void setup() 
{
  pinMode(controllerEnable, OUTPUT);
  pinMode(controllerMS1, OUTPUT);
  pinMode(controllerMS2, OUTPUT);
  pinMode(controllerMS3, OUTPUT);
  pinMode(controllerSleep, OUTPUT);
  pinMode(controllerStep, OUTPUT);
  pinMode(controllerDir, OUTPUT);
  pinMode(bluetoothEnable, OUTPUT);
}

//============================= MAIN LOOP =========================== // 

void loop() 
{
   digitalWrite(controllerEnable, HIGH);
   digitalWrite(bluetoothEnable, HIGH);
   readBatteryState();
   fullForwardTurn();
}

Ważniejsze parametry elementów:

Silnik krokowy JK42HW34-0334:

  • napięcie zasilania: 12V DC,
  • prąd: 0,33A/cewka,
  • moment: 0,22 Nm.

Sterownik silnika A4988 RepRap:

  • napięcie logiki: 3-5.5V,
  • napięcie silnika: 8-35V,
  • prąd maksymalny: 1A/cewka,
  • moment: 0,22 Nm.

Układ chcę zasilić power bankiem z dwoma wyjściami: 5V, 1A (logika) i 5V, 2.1A (silnik).
Zastosowany analogowy czujnik odbiciowy: KTIR0711S w module.

Program póki co jest mocno okrojony ale kompiluje się bez oporów 😅. W załączeniu schemat połączeń układu i widoki modelu. Mam nadzieję, że wystarczająco czytelne.

Dziękuję za wszelkie sugestie.

SchematPolaczen.PNG

modelUkladu.PNG

UkladCzujnika.PNG

Udostępnij ten post


Link to post
Share on other sites

Hmm jeśli to silnik krokowy to po co mu to "sprzężenie" jeszcze? Silnikiem krokowym można bardzo precyzyjnie sterować co do kroku a nawet do ćwierć kroku, nie jest tu potrzebne sprzężenie bo stan wału wynika bezpośrednio z wysterowania można więc powiedzieć, że silnik krokowy jest bardziej cyfrowy, co innego w przypadku silników DC które można by powiedzieć, że są bardziej analogowe i tam faktycznie przydają się enkodery. Wystarczy znać jedynie ilość kroków na obrót.

W czym rysujesz te modele?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Przewiduję, że drzwi od wewnątrz można będzie zamknąć bez użycia aplikacji. W takim przypadku, bez znajomości położenia wału nie będę wiedział ile kroków muszę wykonać żeby zamknąć drzwi z poziomu aplikacji. W idealnych warunkach, czyli jeżeli klucz będzie przekręcony tak jak przewiduje to w programie, rzeczywiście nie potrzebuje sprzężenia do tego celu, ale wydaje mi się, że lepiej będzie wykluczyć element niepewności. Druga sprawa jest taka, że coś może pójść nie tak, nawet nie od strony mechanizmu urządzenia, co od strony mechanizmu zamka w drzwiach. Kiedy w którymś momencie zamek zatnie się i nie będzie chciał współpracować. Ogólnie rzecz biorąc w takim przypadku tak czy inaczej nic nie zrobię jeśli będę na zewnątrz, a klucz będzie w drzwiach, ale pocieszę się przynajmniej, że wiem w którym położeniu się zaciął. Początkowo planowałem zastosować jakiś dodatkowy mechanizm, który umożliwiłby wysunięcie klucza, ale na tę chwilę ograniczyłem się do tego co przedstawiłem.

W zasadzie trochę otworzyłeś mi teraz oczy, ze względu na to, że planowałem umieścić w aplikacji opcje "zamknij", "otwórz" ewentualnie coś w stylu "zamknij na jedno przekręcenie". Ale mógłbym zrobić coś na zasadzie analogowego pokrętła, którym mógłbym obracać kluczem w pełnym zakresie. Chociaż mimo to, bezpieczniej jest jednak wiedzieć gdzie się stoi.

Jeśli chodzi o model 3d wykonałem go w Inventorze od Autodesku, schematy opracowałem w Eaglu. Część modeli podzespołów elektronicznych znalazłem na GrabCAD. Trzeba było je przekonwertować, bo akurat jeśli chodzi o takie modele to z tego co wiem wygodniej wykonuje się w innych programach.

Edytowano przez Samail

Udostępnij ten post


Link to post
Share on other sites

12-woltowy silnik krokowy to powinieneś z 30V pędzić a nie z 5. Wybrałeś najgorszą opcję do tak niskiego zasilania. Ten driver to w ogóle z 5V nie ruszy nie mówiąc o tym, że nic na silnik nie wypuści. Jakiego momentu oczekujesz na wale silnika a jakiego na wyjściu do klucza? Z czego planujesz wykonać tę przekładnię ślimakową? Bo one mają małą sprawność a tu widzimy słabiutki jak paluszek noworodka silniczek napędzany z rachitycznego napięcia i przekładnię, która ma szansę po kilku użyciach sama będzie w stanie zatrzymać ten cały mechanizm. A nie myślałeś - skoro już chcesz wstawiać ( z resztą słusznie) sprzężenie zwrotne - o zwykłym mechanizmie serwa tzw. 360° czyli zwykły silnik DC z przekładnią zębatą? Proste to i tanie a moment ma pewnie ze 100 razy większy niż ten nieszczęsny krokowiec. No i daje się zasilać z 5V, nie potrzebuje drivera (bo ma wbudowany a sterujesz całość w dwie strony jednym sygnałem PWM.

 

  • Lubię! 1
  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

Nie spodziewałem się, że będzie problem z zasilaniem silnika biorąc pod uwagę, że dobierałem elementy tak, żeby wszystko do siebie pasowało. Zasilam logikę sterownika z 5V, a cewki silnika z 12V przez przetwornice step-up. Maksymalny prąd cewki to 1A, a prąd jaki mogę pobrać ze źródła to 2.1A. Dlaczego zatem silnik nie ruszy? To znaczy, przy maksymalnym obciążeniu i dwóch cewkach to 2A, ale nie brałem pod uwagę dużych strat na przetwornicy i sterowniku.

Do przekręcenia klucza w zamku potrzebuje momentu o wartości 0,125Nm. Przełożenie przekładni wynosi 8,75. Chciałbym, żeby udało się ją wydrukować z PA. Zatem minimalny moment dla sprawności 50%: M=(0,125Nm/8,75)*2≈0,030Nm. Jestem prawie pewny, że 50% to czcze marzenia, ale nawet przy niższej sprawności wartość momentu powinna być wystarczająca. Do tego dochodzi kwestia dokładności wykonania, ale na podstawie (przyznam, lekko wątpliwej) wiedzy Youtubowej, którą pozyskałem z filmików o drukowanych w 3d przekładniach wywnioskowałem, że da się to zrobić tak, żeby się nie rozpadło. Całość ma być rzecz jasna prototypem, nie będę katować tej przekładni.

Początkowo zakładałem wykorzystanie serwa, byłoby to dużo łatwiejsze rozwiązanie pod chyba wszystkimi względami, jednak potrzebuje większego kąta obrotu - 720st. Mówiąc szczerze, nie dowiadywałem się, czy istnieją rozwiązania serwonapędów spełniających moje wymagania, które jednocześnie nie kosztują kroci. Przy takim napędzie o którym mówisz nie będę miał przypadkiem problemu z dokładnym pozycjonowaniem? Nie wiem co się stanie kiedy przesadzę z obrotem przy dużym momencie.

Swoją drogą zauważyłem, że sporo osób ma uraz do tych biednych silników krokowych.

Udostępnij ten post


Link to post
Share on other sites

Proponowałbym przemyśleć sprawę zasilania - użycie powerbanku to niekoniecznie dobry pomysł. Większość wyłącza się jeśli nie jest obciążona, a niewielki pobór pradu samej elektroniki może być właśnie tak potraktowany.

  • Lubię! 1
  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites
Dnia 30.11.2019 o 15:53, Samail napisał:

Układ chcę zasilić power bankiem z dwoma wyjściami: 5V, 1A (logika) i 5V, 2.1A (silnik).

Tu nigdzie nie ma o przetwornicy, nartomiast wyraźnie widzę 5V w kontekście silnika.

Drivery silników krokowych to kontrolowane źródła prądowe i wymagają sporego (dwu- trzykrotnego) przewyższenia zasilania nad napięciem nominalnym cewki by sensownie działały dla prędkości większych niz kilka kroków/s. Dlatego rozwiązanie z (nawet) 12V zasilaniem drivera dla 12V silnika jest złe choćby z tego powodu, że biorąc pod uwagę konieczny zapas na driver, zostanie Ci może z 6-7V na silnik. A przetwornica boost im wyżej każesz jej podwyższać tym gorzej działa. Chyba że zrobisz taką z transformatorem - wtedy stosunek wy/we jest obojętny, ale o to Cię nie podejrzewam. Powinieneś tu użyć (jeżeli już koniecznie krokowego) silnika pracującego bardziej prądowo, np. z cewką na 2 .. 3.5V. No i ta uwaga o biednych silnikach krokowych... Każde źródło napędu ma jakieś plusy i minusy. Silniki krokowe stosujemy gdy koniecznie potrzebujemy sporych rozdzielczości kątowych, pracy start-stopowej najlepiej w otwartej pętli, bo tam widać całą ich zaletę "krokowości" przy niezbyt wygórowanym zapotrzebowaniu na moment. Albo gdy godzimy się, że moment ten uzyskamy kosztem ogromnych strat energii dostając w zamian właśnie "kroki". Jeśli już musisz użyć jakiegoś rodzaju enkodera to trudno, ale to pierwsze światełko każące się zastanowić czy silnik wybrałeś sensownie. One są naprawdę słabe - tak jeśli chodzi o moc jak i moment, i aplikacja musi naprawdę do nich pasować by z całą odpowiedzialnością można było powiedzieć, że tu krokowy się spełni. Ja nie mam do nich uprzedzeń i zrobiłem wiele maszyn bazujących na tego typu napędach, ale zawsze musiało to być uzasadnione. A daleko szukać: tu masz zasilanie bateryjne czyli po pierwsze sprawność, po drugie sprawność i po trzecie.. wiadomo. Jeśli rowiązanie ma być kompaktowe, wymaga sporego momentu (rozbawiłeś mnie tą przekładnią ślimakową z plastiku - naiwność ludzi chyba naprawdę nie zna granic, ale szczerze mówiąc patrząc na te obrazki podejrzewałem że tak to planujesz) a jednocześnie nie potrzebujesz praktycznie żadnej kątowej rozdzielczości wału silnika, to widać jak na dłoni, że krokowy to zły pomysł. Od tego masz enkoder gdzieś tam na wale i inteligencję w procesorze by tak sterowała poczciwym silnikiem DC (z odpowiednią przekładnią) by zatrzymywac go w zadanym punkcie z dokładnością do 1/4 obrotu. Oczywiście z punktu widzenia sprawności byłoby najlepeij, gdyby tę przekładnię napędzał silnik BLDC, ale to kolejny stopień wtajemniczenia. 

Pisząc o serwie 360° miałem na myśli kompatkowy napęd dwukierunkowy który tylko z wyglądu przypomina typowe serwo:

https://modelarski.com/produkt-SerwoTowerProMG-90DR,12759.html

Tutaj za połowę ceny silnika krokowego z driverem masz ponad 2kgcm przy 5V zasilania i gotowy, wbudowany sterownik do którego podłączasz jeden sygnał cyfrowy regulujący kierunek i prędkość obrotową. A gdy chcesz to wyłączyć bo nikt zamka nie używa, odcinasz mu zasilanie jakimś tranzystorem i jest 0mA. 

BTW: Jeśli ze źródła 5V możesz pobrać 2.1A to po drugiej stronie przetwornicy, na 12V masz już na pewno poniżej 1A przy gorącej elektronice tuż obok akumulatorków powerbanka. Nie wliczam tu rzecz jasna spadków na blaszkach złącza USB (przy 2A całkiem sporych) i żyłowania akumulatorków, które w tej sytuacji zdechną po niedługim czasie.

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites
4 godziny temu, Samail napisał:

Przewiduję, że drzwi od wewnątrz można będzie zamknąć bez użycia aplikacji. W takim przypadku, bez znajomości położenia wału nie będę wiedział ile kroków muszę wykonać żeby zamknąć drzwi z poziomu aplikacji. W idealnych warunkach, czyli jeżeli klucz będzie przekręcony tak jak przewiduje to w programie, rzeczywiście nie potrzebuje sprzężenia do tego celu, ale wydaje mi się, że lepiej będzie wykluczyć element niepewności.

Tego nie przewidziałem :) Myślałem, że chodzi o sterowanie jedynie za pomocą elektroniki zdalnie i bezpośrednio i tylko dwa dwa położenia: zamknięte/otwarte.

Jeśli chodzi o części, przekładnie, etc.z metalu to z dużym prawdopodobieństwem można je zamówić na warsztatach szkolnych przy szkołach mechanicznych za bardzo rozsądną cenę. Uczniowie mają na czym się uczyć a warsztaty fundusze. Wystarczy pójść z rysunkami potrzebnych części lub skontaktować się mailowo z kierownictwem warsztatu i zapytać czy są w stanie coś takiego wykonać.

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

@Elvis W przyszłości planuję wykonać własne źródło o niezbędnych parametrach, póki co skupiam się na samym mechanizmie. Nie zdawałem sobie sprawy z takiego zjawiska, więc na pewno przyda się na przyszłość.

@marek1707 Otworzyłeś mi nieco oczy na całą sytuację i zgodnie z uwagami planuje wszystko przemodelować. Zrezygnuje z przekładni,  co znacznie ułatwi sprawę, do tego zastosuję serwo 360° w miejsce nieszczęsnego krokowca. W kwestii plastiku, rozumiem doskonale, że to niezbyt dobry materiał na elementy mechanizmów, jednak jeśli chodzi o prototypowanie myślę, że sprawdza się dobrze. Uważam, że wykonanie jakiegoś urządzenia czy maszyny w fazie projektowania, co do której nie ma się pewności jak się zachowa lepiej wykorzystać łatwo dostępne, tanie i do tego proste w obróbce materiały.

@atMegaTona Cóż, skoro istnieje takie rozwiązanie, to warto zapamiętać. Kiedy wszyscy mają na tym skorzystać to dlaczego nie?

Wielkie dzięki wszystkim za zainteresowanie i celne wskazówki. Cała ta wiedza na pewno przyda się nie tylko przy tym projekcie ale i kolejnych. Teraz nie pozostaje nic innego, jak tylko tą wiedzę wykorzystać.

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...