logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

- Sterowanie temperaturą silnikiem krokowym - Arduino nano

Spec252 10 Wrz 2017 09:43 3399 22
  • #1 16691058
    Spec252
    Poziom 7  
    Posty: 14
    Ocena: 4
    witam !
    Potrzebuję pomocy z programem do Arduino nano . Za pomocą termometru LM35 chcę sterować silnikiem krokowym 28BYJ-48 który będzie odkręcał lub przykręcał zawór dławiąco zwrotny. Gdy termometr wykryje 29 stopni Cecyliusza (lub mniej) to silnik przykręci zawór tak żeby temperatura wzrosła do 30 stopni a gdy będzie 31 stopni (lub więcej) to silnik odkręci zawór tak żeby temperatura nie była mniejsza lub większa od 30 stopni Cecyliusza. Jestem początkujący i nie rozumiem jeszcze dobrze języka C.

    Dziękuję! za zrozumienie i pomoc :wink:
  • Pomocny post
    #3 16691340
    rafcio_21
    Poziom 29  
    Posty: 1110
    Pomógł: 137
    Ocena: 295
  • #4 16691388
    Spec252
    Poziom 7  
    Posty: 14
    Ocena: 4
    Wojciech. napisał:
    Ale czego dokładnie nie rozumiesz? Umiesz odczytać temperaturę oraz sterować silnikiem krokowym z osobna?


    Umiem odczytać temperaturę i osobno sterować silnikiem ale nie umiem tego połączyć.
  • Pomocny post
    #5 16691427
    kindlar
    Poziom 42  
    Posty: 7857
    Pomógł: 915
    Ocena: 1614
    Zawór ma swoje krańcowe położenia. Max to otwarcie, min to zamknięcie. Pomiędzy max i min jest jakiś kąt pracy osi zaworu z nią będzie połączony krokowiec, możliwe, że przez przekładnię aby poradził z oporami ruchu. Trzeba wybazować układ, zapamiętać krańcowe położenia i kąt obrotu przeliczyć na kroki silnika.
  • Pomocny post
    #6 16691456
    Wojciech.
    Poziom 37  
    Posty: 3593
    Pomógł: 319
    Ocena: 467
    O Serwie nie myślałeś? Było by to znacznie wygodniejsze bo na podstawie temperatury w if dajesz konkretny kąt obrotu i koniec.
  • Pomocny post
    #7 16691460
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    A co to są "stopnie Cecyliusza"? :) :) :)
  • #8 16692366
    Spec252
    Poziom 7  
    Posty: 14
    Ocena: 4
    Serwo odpada bo ma zamały kąt obrotu. Zawór dławiąco zwrotny to taki mini reduktor ciśnienia silnik krokowy przekręci śrubę regulacji . Co do kątu max i min obrotu zaworu to można dać krańcówki .

    PS. Sory za Cecyliusze tak mi komp. przełączył :D
  • Pomocny post
    #9 16692408
    Wojciech.
    Poziom 37  
    Posty: 3593
    Pomógł: 319
    Ocena: 467
    Wiem co to jest zawór dławiąco- zwrotny 😉 Są też serwa 360° bez ograniczenia w kącie obrotu. Problem to tylko wykalibrować układ żeby dostosować liczbę kroków w przód i w tył. Możesz to przeliczyć tak jak już wyżej wspomniano lub po prostu programowo zliczając liczbę kroków aż do pełnego otwarcia zaworu. Potem to tylko kilka pętli i po problemie.
  • #10 16693265
    Spec252
    Poziom 7  
    Posty: 14
    Ocena: 4
    Rozumiem ale nie umiem pisać tak skomplikowanych rzeczy w języku C.
  • Pomocny post
    #11 16693430
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #12 16693569
    Wojciech.
    Poziom 37  
    Posty: 3593
    Pomógł: 319
    Ocena: 467
    emarcus napisał:
    Jeżeli ta regulacja jest tylko dwu stanowa to łatwiej będzie dobudowac dodatkowy obwód w stylu „Y” i elektrycznie sterowac przepływ jednej lub grugiej gałęzi z regulatorami przepływu.


    W sumie jak regulator ma być dwustanowy to wystarczy zwykły zawór odcinający 2/2
  • Pomocny post
    #13 16693827
    Konto nie istnieje
    Poziom 1  
  • #14 16695690
    Spec252
    Poziom 7  
    Posty: 14
    Ocena: 4
    Dobrze mniejsza już jaki zawór do tego dam.Potrzebuje pomocy z napisaniem programu do tego na tym silniku krokowym. Tak jak pisałem na początku mam program na termometr i na silnik krokowy ale nwm jak to zrobić że jak ter. wykryje temperature 29C to zacznie się kręcić w lewo a jak wykryje 31C to w lewo. Narazie tyle pomużcie zrobić puźniej będziemy myśleć nad resztą.

    Sory i dziena za wszystko :wink:
  • Pomocny post
    #15 16696415
    Konto nie istnieje
    Poziom 1  
  • #16 16706317
    Spec252
    Poziom 7  
    Posty: 14
    Ocena: 4
    Wojciech. napisał:
    emarcus napisał:
    Jeżeli ta regulacja jest tylko dwu stanowa to łatwiej będzie dobudowac dodatkowy obwód w stylu „Y” i elektrycznie sterowac przepływ jednej lub grugiej gałęzi z regulatorami przepływu.


    W sumie jak regulator ma być dwustanowy to wystarczy zwykły zawór odcinający 2/2



    To nie możne być zawór dwustanowy bo termometr będzie mierzył temp. w tym zaworze

    Dodano po 6 [minuty]:

    emarcus napisał:
    Spec252 napisał:
    Dobrze mniejsza już jaki zawór do tego dam.Potrzebuje pomocy z napisaniem programu do tego na tym silniku krokowym. Tak jak pisałem na początku mam program na termometr i na silnik krokowy ale nwm jak to zrobić że jak ter. wykryje temperature 29C to zacznie się kręcić w lewo a jak wykryje 31C to w lewo. Narazie tyle pomużcie zrobić puźniej będziemy myśleć nad resztą.

    Sory i dziena za wszystko :wink:


    W takim razie dokup jeszcze driver (sterownik(?)) na przykład DRV8825, dla tego silnika krokowego, którego wysterowanie jest w zasadzie 'banalne'; Cały proces komutacji jest tam wbudowany. Wysterowanie sprowadza się do obsługi dwóch pinów(!)
    - jeden z jego pinów kontrolnych zmienia kierunek obrotów,
    - oraz jeden służy do podawania impulsów, gdzie jeden impuls daje obrót silnika o jeden krok.
    <Reszta szczegółów w datasheet drivera.
    Na poczatek zapoznaj się z jego opisem:
    https://www.pololu.com/product/2133/pictures
    O ile wiem, to jest/są dystrybutorzy tych płytek w kraju. Zakupy w chinach byc może są tańsze lecz dostawy trwają długo, albo jeszcze dłużej.

    Potrafisz chyba zmienic stan logicznu cyfrowego pinu wyjściowego w zależności od poziomu ADC na porcie analogowym reprezentującym temperaturę .., a także zliczac zadaną/wysyłaną ilośc impulsów dla kroków silnika ?
    Możesz także znaleźc w internecie 'prawie gotowe' przykłady, - wymagac będą dostosowanie do własnego konceptu.

    e marcus




    Mam taki driver.
    Załączniki:
    • - Sterowanie temperaturą silnikiem krokowym - Arduino nano 71DfYUkK1lL._SL1500_-500x500.jpg (40.23 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #17 16706387
    zster

    Poziom 28  
    Posty: 857
    Pomógł: 136
    Ocena: 69
    Wklej kod którym kręcisz silnikiem. Wtedy pomożemy jak połączyć go z temperaturą.

    Jednak kolega emarcus słusznie zwrócił uwagę na ważne kwestie, przede wszystkim na problem gubienia aktualnej pozycji zaworu. Jeśli zawór ma kąt obrotu większy od 360 stopni, to żadne wyłączniki krańcowe nie wchodzą w grę, jedynie enkoder i to absolutny a nie inkrementalny. W najprostszym przypadku wieloobrotowy potencjometr. Bez tego po resecie, braku zasilania, czy po prostu przy gubieniu kroków przez silnik, układ nie będzie działał prawidłowo.
    Konto firmowe:
    Pracownia Elektroniczna Zdzisław Kasprzyk
    Podegrodzie, Podegrodzie, 33-386 | Strona WWW: z-ster.pl
  • #18 16706823
    Spec252
    Poziom 7  
    Posty: 14
    Ocena: 4
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(12,11,5,4,3,2);

    float cel()
    {
    int pin;
    float c;
    pin=analogRead(A0);
    c = (500.0 * pin)/1023;
    return(c);
    }

    int motorPin1 = 6; // IN 1
    int motorPin2 = 7; // IN 2
    int motorPin3 = 8; // In 3
    int motorPin4 = 9; // IN 4

    int motorSpeed = 1000; //variable to set stepper speed
    // Experiment with this; too small will not work.
    int count = 0; // count of steps made
    int countsperrev = 512; // number of steps per revolution for this motor

    int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};


    void setup()
    {
    //declare the motor pins as outputs
    pinMode(motorPin1, OUTPUT);
    pinMode(motorPin2, OUTPUT);
    pinMode(motorPin3, OUTPUT);
    pinMode(motorPin4, OUTPUT);
    Serial.begin(30);

    lcd.begin(16,2);
    lcd.print("Temp:= C");


    }

    void loop()
    {
    int i;

    for (i = 0; i < countsperrev; i++)
    {
    clockwise();
    }
    for (i = 0; i < countsperrev; i++)
    {
    anticlockwise();
    }



    float Celciusze = cel();

    lcd.setCursor(6,0);
    lcd.print(Celciusze);
    delay(1000);



    }

    /////
    //set pins to ULN2003 high in sequence from 1 to 4
    //delay "motorSpeed" between each pin setting (to determine speed)
    /////
    void anticlockwise()
    {
    for(int i = 0; i < 8; i++)
    {
    setOutput(i);
    delayMicroseconds(motorSpeed);
    }
    }

    void clockwise()
    {
    for(int i = 7; i >= 0; i--)
    {
    setOutput(i);
    delayMicroseconds(motorSpeed);
    }
    }

    void setOutput(int out)
    {
    digitalWrite(motorPin1, bitRead(lookup[out], 0));
    digitalWrite(motorPin2, bitRead(lookup[out], 1));
    digitalWrite(motorPin3, bitRead(lookup[out], 2));
    digitalWrite(motorPin4, bitRead(lookup[out], 3));
    }

    Dodano po 56 [sekundy]:

    To zrobiłem i nwm co dalej :(
  • Pomocny post
    #19 16707105
    zster

    Poziom 28  
    Posty: 857
    Pomógł: 136
    Ocena: 69
    Wklejony przez Ciebie kod jest dobry do demonstracji działania silnika i nic poza tym. Głównym problemem jest tu zastosowanie delayMicroseconds() . Poczytaj proszę o możliwości zastąpienia tych funkcji funkcjami nieblokującymi - choćby z wykorzystaniem słynnych millis() - jak to ugryźć znajdziesz w przykładzie Arduino IDE "BlinkWithoutDelay". Ale do testów możesz spróbować coś takiego :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Nie testowany. Objaśnienia w komentarzach. Na tym przykładzie możesz rozwijać kod.

    PS - możesz ułatwić sobie życie używając takiej biblioteki do sterowania krokowcem z driverem ULN2003 : Link . Prosta i nie blokująca ( nie korzysta z funkcji delay() .
    Konto firmowe:
    Pracownia Elektroniczna Zdzisław Kasprzyk
    Podegrodzie, Podegrodzie, 33-386 | Strona WWW: z-ster.pl
  • #20 16708566
    Wojciech.
    Poziom 37  
    Posty: 3593
    Pomógł: 319
    Ocena: 467
    Spec252 napisał:
    To nie możne być zawór dwustanowy bo termometr będzie mierzył temp. w tym zaworze


    A gdzie ma być ten pomiar temperatury na wlocie czy wylocie zaworu?

    Dodano po 37 [sekundy]:

    Spec252 napisał:
    To nie możne być zawór dwustanowy bo termometr będzie mierzył temp. w tym zaworze


    A gdzie ma być ten pomiar temperatury na wlocie czy wylocie zaworu?
  • #21 16929066
    Spec252
    Poziom 7  
    Posty: 14
    Ocena: 4
    Sory że tak długo nie pisałem ale nie miałem czasu.Ten kod ładnie się sprawuje tylko że muszę zawór ustawić na tą temperaturę ręcznie a potem on działa dobrze tylko przydało by się powielić kod który obraca silnikiem żeby spadnie kilka stopni niżej to znowu obróci silnikiem.(Chodzi mi o to że jak temperatura spadnie z 30 na 28 to silnik obróci się 2 obroty a jak to nic nie da i spadnie znowu do 26 to obróci 4 obroty i tak samo jak tem. będzie wzrastać).

    Dzięki za pomoc. :sm9:

    Dodano po 3 [minuty]:

    Ten zawór steruje przepływem wody która chłodzi parę wodną do odpowiedniej temperatury .
  • #22 16932126
    Konto nie istnieje
    Poziom 1  
  • #23 16932190
    Spec252
    Poziom 7  
    Posty: 14
    Ocena: 4
    emarcus napisał:
    Spec252 napisał:


    Dodano po 3 [minuty]:
    Ten zawór steruje przepływem wody która chłodzi parę wodną do odpowiedniej temperatury .


    Czyli wynikałoby że mierzysz temperaturę pary wodnej, a nie samej wody chłodzącej /obiegowej...
    Czy to dobrze zrozumiałem?
    Jakaż to para wodna o temperaturze 28 czy nawet 30 stopni?

    e marcus



    Tak ten zawur mieży temp. pary a ta temp. 28/30 to przykładowa temp.

Podsumowanie tematu

✨ Użytkownik poszukuje pomocy w programowaniu Arduino Nano do sterowania silnikiem krokowym 28BYJ-48 w oparciu o pomiar temperatury z czujnika LM35. Celem jest automatyczne regulowanie zaworu dławiąco-zwrotnego w zależności od temperatury: silnik ma przykręcać zawór przy 29°C i odkręcać przy 31°C, aby utrzymać temperaturę na poziomie 30°C. Użytkownik potrafi odczytać temperaturę i sterować silnikiem, ale nie wie, jak połączyć te funkcje. W dyskusji poruszono również kwestie kalibracji, problemów z gubieniem kroków silnika oraz alternatywne rozwiązania, takie jak zastosowanie enkodera lub serwomechanizmu. Użytkownik zamierza dostosować kod, aby silnik reagował na zmiany temperatury, a także rozważa użycie sterownika DRV8825 do uproszczenia sterowania silnikiem.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA