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

[Rozwiązano] Zakłócenia sygnałów w Arduino z modułem przekaźnikowym 8x - jak je wyeliminować?

Trimus 07 Sie 2024 12:18 522 22
  • #1 21183008
    Trimus
    Poziom 5  
    Posty: 49
    Ocena: 2
    Witam. Mam problem z sterownikiem arduino. wyjscia sa sterowane przez modul przekaźnikowy z optoizolatorami, wejscia przez podawanie masy gnd na wejscia i co chwile lapie mi lewe sygnaly - podajac sygnal na 1 kanal lapie mi ten i jakis inny, gdy zalacze jeden kanal zaczyna dzialac a w czasie jego dzialania lapie inny, co moze byc przyczyna i jak to rozwiazac
    oto moduł przekaźnikowy:https://allegro.pl/oferta/przekaznik-8x-8-kanalowy-modul-sterowa-stanem-niskim-5v-avr-arduino-arm-10a-8470695734
    oto program:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Co może być przyczyna? Z góry dziękuje za pomoc.
  • #2 21183032
    hindoos
    Poziom 36  
    Posty: 3754
    Pomógł: 290
    Ocena: 662
    Trimus napisał:
    i co chwile lapie mi lewe sygnaly - podajac sygnal na 1 kanal lapie mi ten i jakis inny, gdy zalacze jeden kanal zaczyna dzialac a w czasie jego dzialania lapie inny, co moze byc przyczyna i jak to rozwiazac

    Czyli na wejściach masz zakłócenia - ale tylko przy załączonych przekaźnikach? Czy samoczynnie układ i tak łapie coś "z powietrza"?
  • #3 21183060
    Trimus
    Poziom 5  
    Posty: 49
    Ocena: 2
    Układ samoczynnie łapie zakłocenia, raczej na wejściach to nie jest. gdy podaje impuls to łapie zawsze ten kanał co ma ale czasem razem z nim załączają się inne kanały, również podczas pracy gdy nie podaje zadnego impulsu to np. brama się zamyka i nagle sama z siebie załącza się druga brama ,wyglada mi to na zakłocenia na wyjściach - moze optoizolacja tych przekaźników jest kijowa? ciężko powiedziec. impulsy sa podawane przez sterownik radiowy firmy ELMES. tak wygląda układ (może trochę niedokładnie ale szybko od ręki): Ręczny schemat układu z przekaźnikami i sterownikiem radiowym
    gdy modul przekaznikowy nie jest podpiety ten problem nie wystepuje dopiero gdy wepne ten modul, gdy go niema to wszystko działa dobrze - on wyzwala przez gnd te przekazniki
  • Pomocny post
    #4 21183110
    Konto nie istnieje
    Poziom 1  
  • #5 21183124
    hindoos
    Poziom 36  
    Posty: 3754
    Pomógł: 290
    Ocena: 662
    Jeszcze możesz sprawdzić sam moduł przekaźników bez Arduino. Też bym obstawiał że on gdzieś jest wadliwy, pewnie jakiś element przeciwzakłóceniowy brakuje albo nie jest prawidłowo przylutowany i zbiera.
  • #6 21183136
    Trimus
    Poziom 5  
    Posty: 49
    Ocena: 2
    próbowałem jeszcze odseparować zasilanie tego modułu od arduino - zastosowałem osobny zasilacz 5V, a gnd połączyłem - dalej pojawiają się błędne sygnały

    Dodano po 59 [sekundy]:

    miałem dwa identyczne moduły przekaźnikowe i problem występuje na obu tych modułach, niestety

    Dodano po 12 [minuty]:

    spróbuję w programie zastosować Debouncing, zobaczymy
  • #7 21183150
    hindoos
    Poziom 36  
    Posty: 3754
    Pomógł: 290
    Ocena: 662
    Czekaj czekaj, coś mi się nie spina ciągle. Czy uruchamiana jest dioda LED załączania wyjść na listwie przekaźnikowej czy nie? Bo zrozumiałem, że nie - i to sama listwa losowo załącza wyjście. To co tu zmieni debounce skoro ta logika działa poprawnie?
  • #8 21183162
    Trimus
    Poziom 5  
    Posty: 49
    Ocena: 2
    Diody na wyjściach przekaźnikowych załączają się normalnie - błędny impuls aktywuje te wyjścia i diody się świecą.
  • Pomocny post
    #9 21183165
    hindoos
    Poziom 36  
    Posty: 3754
    Pomógł: 290
    Ocena: 662
    Błędny impuls na wejściach powoduje wejście logiki i uruchomienie wyjść, patrz na przyczynę a nie skutek :)
    Zacząłbym od montażu rezystorów podciągających na wejściach i zrezygnowanie z podciągania wbudowanymi rezystorami.
  • #10 21183175
    Trimus
    Poziom 5  
    Posty: 49
    Ocena: 2
    Zabudowałem rezystory na wejściach - 4 rezystory po 100 ohm szeregowo w każdym z kanałów.
  • Pomocny post
    #11 21183179
    hindoos
    Poziom 36  
    Posty: 3754
    Pomógł: 290
    Ocena: 662
    R1 do R4 na schemacie to nie są rezystory podciągające!
  • #12 21183202
    mam_pytanie
    Poziom 30  
    Posty: 1077
    Pomógł: 164
    Ocena: 259
    Cytat:
    zastosowałem osobny zasilacz 5V, a gnd połączyłem - dalej pojawiają się błędne sygnały

    Jesli sterowanie odbywa sie stanem niskim, to chyba raczej linia 5 V powinna być podłączona.
  • #13 21183267
    Trimus
    Poziom 5  
    Posty: 49
    Ocena: 2
    Witam! udało się! dodałem do programu debounce i blokady czasowe które defacto wyeliminowały wszystkie błędne impulsy! teraz działa poprawnie
    oto zmodyfikowany kod, może komuś się przyda:)

    // Definiowanie pinów dla wejść i wyjść
    #define A0_PIN A0
    #define A4_PIN A4 // Zmieniono z A1 na A4
    #define A2_PIN A2
    #define A3_PIN A3
    #define OUTPUT_2 3
    #define OUTPUT_4 4
    #define OUTPUT_5 5
    #define OUTPUT_6 6
    #define OUTPUT_10 10
    #define OUTPUT_11 11
    #define OUTPUT_12 12
    #define OUTPUT_13 13

    // Zmienne do zarządzania stanem i czasem dla bram
    int gate1_state = 0; // 0 = zatrzymana, 1 = otwieranie (OUTPUT_2), 2 = zamykanie (OUTPUT_4)
    int gate2_state = 0; // 0 = zatrzymana, 1 = otwieranie (OUTPUT_5), 2 = zamykanie (OUTPUT_6)

    unsigned long gate1_start_time = 0;
    unsigned long gate2_start_time = 0;
    const unsigned long interval = 27000; // 27 sekund w milisekundach
    const unsigned long blockInterval = 1500; // 1,5 sekundy w milisekundach - blokada innych kanałów
    const unsigned long channelCooldown = 380; // 0,38 sekundy w milisekundach - cooldown dla tego samego kanału

    // Zmienne do zarządzania stanem oświetlenia
    int lightingInternalState = 0; // 0 = wszystko wyłączone, 1 = OUTPUT_12 włączony, 2 = OUTPUT_13 włączony, 3 = oba włączone
    int lightingExternalState = 0; // 0 = wszystko wyłączone, 1 = OUTPUT_10 włączony, 2 = OUTPUT_11 włączony, 3 = oba włączone

    // Zmienne do debouncowania i czasów
    unsigned long lastDebounceTimeA0 = 0;
    unsigned long lastDebounceTimeA4 = 0;
    unsigned long lastDebounceTimeA2 = 0;
    unsigned long lastDebounceTimeA3 = 0;
    unsigned long lastGlobalActivationTime = 0; // Czas globalny dla blokady wejść
    unsigned long lastChannelActivationTime = 0; // Czas ostatniej aktywacji kanału
    const unsigned long debounceDelay = 500; // 500 ms - czas debouncowania
    const unsigned long stabilityDelay = 200; // 200 ms - czas na potwierdzenie stabilnego sygnału

    // Funkcja sprawdzająca, czy wystarczająco dużo czasu upłynęło od ostatniej aktywacji dla wszystkich kanałów
    bool isGlobalActivationAllowed() {
    return (millis() - lastGlobalActivationTime) > blockInterval;
    }

    // Funkcja sprawdzająca, czy wystarczająco dużo czasu upłynęło od ostatniej aktywacji danego kanału
    bool isChannelActivationAllowed() {
    return (millis() - lastChannelActivationTime) > channelCooldown;
    }

    // Funkcja sprawdzająca, czy sygnał na pinie jest stabilny
    bool isSignalStable(int pin, unsigned long stableTime) {
    unsigned long startTime = millis();
    while ((millis() - startTime) < stableTime) {
    if (digitalRead(pin) != LOW) {
    return false;
    }
    }
    return true;
    }

    // Funkcja do debouncowania i filtrowania sygnałów wejściowych
    bool debounceAndFilter(int pin, unsigned long &lastDebounceTime, unsigned long stableTime, unsigned long debounceDelay) {
    if (digitalRead(pin) == LOW && (millis() - lastDebounceTime) > debounceDelay) {
    if (isSignalStable(pin, stableTime)) {
    lastDebounceTime = millis();
    return true;
    }
    }
    return false;
    }

    void setup() {
    // Ustawienie pinów wejściowych na tryb INPUT_PULLUP
    pinMode(A0_PIN, INPUT_PULLUP);
    pinMode(A4_PIN, INPUT_PULLUP); // A4 zamiast A1
    pinMode(A2_PIN, INPUT_PULLUP);
    pinMode(A3_PIN, INPUT_PULLUP);

    // Ustawienie pinów wyjściowych na tryb OUTPUT
    pinMode(OUTPUT_2, OUTPUT);
    pinMode(OUTPUT_4, OUTPUT);
    pinMode(OUTPUT_5, OUTPUT);
    pinMode(OUTPUT_6, OUTPUT);
    pinMode(OUTPUT_10, OUTPUT);
    pinMode(OUTPUT_11, OUTPUT);
    pinMode(OUTPUT_12, OUTPUT);
    pinMode(OUTPUT_13, OUTPUT);

    // Inicjalizacja wszystkich wyjść na HIGH (wyłączone)
    digitalWrite(OUTPUT_2, HIGH);
    digitalWrite(OUTPUT_4, HIGH);
    digitalWrite(OUTPUT_5, HIGH);
    digitalWrite(OUTPUT_6, HIGH);
    digitalWrite(OUTPUT_10, HIGH);
    digitalWrite(OUTPUT_11, HIGH);
    digitalWrite(OUTPUT_12, HIGH);
    digitalWrite(OUTPUT_13, HIGH);
    }

    // Funkcja do sterowania Bramą 1
    void controlGate1() {
    if (gate1_state == 0) { // zatrzymana -> rozpocznij otwieranie
    digitalWrite(OUTPUT_2, LOW); // Włącz otwieranie
    digitalWrite(OUTPUT_4, HIGH); // Upewnij się, że zamykanie jest wyłączone
    gate1_state = 1;
    gate1_start_time = millis();
    } else if (gate1_state == 1) { // otwieranie -> zatrzymanie
    digitalWrite(OUTPUT_2, HIGH); // Zatrzymaj otwieranie
    gate1_state = 2;
    gate1_start_time = millis();
    } else if (gate1_state == 2) { // zatrzymana -> rozpocznij zamykanie
    digitalWrite(OUTPUT_4, LOW); // Włącz zamykanie
    gate1_state = 3;
    gate1_start_time = millis();
    } else if (gate1_state == 3) { // zamykanie -> zatrzymanie
    digitalWrite(OUTPUT_4, HIGH); // Zatrzymaj zamykanie
    gate1_state = 0;
    }
    }

    // Funkcja do sterowania Bramą 2
    void controlGate2() {
    if (gate2_state == 0) { // zatrzymana -> rozpocznij otwieranie
    digitalWrite(OUTPUT_5, LOW); // Włącz otwieranie
    digitalWrite(OUTPUT_6, HIGH); // Upewnij się, że zamykanie jest wyłączone
    gate2_state = 1;
    gate2_start_time = millis();
    } else if (gate2_state == 1) { // otwieranie -> zatrzymanie
    digitalWrite(OUTPUT_5, HIGH); // Zatrzymaj otwieranie
    gate2_state = 2;
    gate2_start_time = millis();
    } else if (gate2_state == 2) { // zatrzymana -> rozpocznij zamykanie
    digitalWrite(OUTPUT_6, LOW); // Włącz zamykanie
    gate2_state = 3;
    gate2_start_time = millis();
    } else if (gate2_state == 3) { // zamykanie -> zatrzymanie
    digitalWrite(OUTPUT_6, HIGH); // Zatrzymaj zamykanie
    gate2_state = 0;
    }
    }

    void loop() {
    unsigned long currentTime = millis();

    // Kontrola Bramy 1 z debouncowaniem, filtrowaniem i blokadą czasową
    if (debounceAndFilter(A0_PIN, lastDebounceTimeA0, stabilityDelay, debounceDelay) && isChannelActivationAllowed()) {
    lastChannelActivationTime = currentTime;
    if (isGlobalActivationAllowed()) {
    lastGlobalActivationTime = currentTime;
    }
    controlGate1();
    }

    // Kontrola Bramy 2 z debouncowaniem, filtrowaniem i blokadą czasową
    if (debounceAndFilter(A4_PIN, lastDebounceTimeA4, stabilityDelay, debounceDelay) && isChannelActivationAllowed()) {
    lastChannelActivationTime = currentTime;
    if (isGlobalActivationAllowed()) {
    lastGlobalActivationTime = currentTime;
    }
    controlGate2();
    }

    // Kontrola oświetlenia wewnętrznego z debouncowaniem, filtrowaniem i blokadą czasową
    if (debounceAndFilter(A2_PIN, lastDebounceTimeA2, stabilityDelay, debounceDelay) && isChannelActivationAllowed()) {
    lastChannelActivationTime = currentTime;
    if (isGlobalActivationAllowed()) {
    lastGlobalActivationTime = currentTime;
    }
    lightingInternalState = (lightingInternalState + 1) % 4;
    switch (lightingInternalState) {
    case 0:
    digitalWrite(OUTPUT_12, HIGH); // Wyłącz oba światła
    digitalWrite(OUTPUT_13, HIGH);
    break;
    case 1:
    digitalWrite(OUTPUT_12, LOW); // Włącz pierwsze światło
    digitalWrite(OUTPUT_13, HIGH);
    break;
    case 2:
    digitalWrite(OUTPUT_12, HIGH); // Włącz drugie światło
    digitalWrite(OUTPUT_13, LOW);
    break;
    case 3:
    digitalWrite(OUTPUT_12, LOW); // Włącz oba światła
    digitalWrite(OUTPUT_13, LOW);
    break;
    }
    }

    // Kontrola oświetlenia zewnętrznego z debouncowaniem, filtrowaniem i blokadą czasową
    if (debounceAndFilter(A3_PIN, lastDebounceTimeA3, stabilityDelay, debounceDelay) && isChannelActivationAllowed()) {
    lastChannelActivationTime = currentTime;
    if (isGlobalActivationAllowed()) {
    lastGlobalActivationTime = currentTime;
    }
    lightingExternalState = (lightingExternalState + 1) % 4;
    switch (lightingExternalState) {
    case 0:
    digitalWrite(OUTPUT_10, HIGH); // Wyłącz oba światła
    digitalWrite(OUTPUT_11, HIGH);
    break;
    case 1:
    digitalWrite(OUTPUT_10, LOW); // Włącz pierwsze światło
    digitalWrite(OUTPUT_11, HIGH);
    break;
    case 2:
    digitalWrite(OUTPUT_10, HIGH); // Włącz drugie światło
    digitalWrite(OUTPUT_11, LOW);
    break;
    case 3:
    digitalWrite(OUTPUT_10, LOW); // Włącz oba światła
    digitalWrite(OUTPUT_11, LOW);
    break;
    }
    }

    // Sprawdzanie, czy minęło 27 sekund dla Bramy 1
    if (gate1_state != 0 && (millis() - gate1_start_time >= interval)) {
    if (gate1_state == 1) {
    digitalWrite(OUTPUT_2, HIGH); // Zatrzymaj otwieranie
    } else if (gate1_state == 2) {
    digitalWrite(OUTPUT_4, HIGH); // Zatrzymaj zamykanie
    } else if (gate1_state == 3) {
    digitalWrite(OUTPUT_4, HIGH); // Zatrzymaj zamykanie
    }
    gate1_state = 0; // Zatrzymaj bramę po 27 sekundach
    }

    // Sprawdzanie, czy minęło 27 sekund dla Bramy 2
    if (gate2_state != 0 && (millis() - gate2_start_time >= interval)) {
    if (gate2_state == 1) {
    digitalWrite(OUTPUT_5, HIGH); // Zatrzymaj otwieranie
    } else if (gate2_state == 2) {
    digitalWrite(OUTPUT_6, HIGH); // Zatrzymaj zamykanie
    } else if (gate2_state == 3) {
    digitalWrite(OUTPUT_6, HIGH); // Zatrzymaj zamykanie
    }
    gate2_state = 0; // Zatrzymaj bramę po 27 sekundach
    }
    }

    Oto szczegółowe omówienie działania kodu:

    1. Inicjalizacja i ustawienia w funkcji setup():
    Konfiguracja pinów:
    Piny A0, A2, A3, A4 są ustawione jako wejścia z włączonym wewnętrznym rezystorem podciągającym (INPUT_PULLUP). To oznacza, że przyciski muszą być podłączone tak, aby po naciśnięciu zwierały pin do masy (LOW).
    Piny 3, 4, 5, 6, 10, 11, 12, 13 są ustawione jako wyjścia, które będą sterować bramami oraz oświetleniem.
    Wszystkie wyjścia są inicjalizowane stanem HIGH, co oznacza, że na starcie wszystkie urządzenia są wyłączone.
    2. Sterowanie bramami (controlGate1() i controlGate2()):
    Brama 1 (controlGate1()):
    Stan 0: Brama jest zatrzymana. Po naciśnięciu przycisku (A0), brama zaczyna się otwierać (pin 3 ustawia się na LOW, co oznacza włączenie otwierania), a stan bramy zmienia się na 1.
    Stan 1: Brama jest w trakcie otwierania. Kolejne naciśnięcie przycisku powoduje zatrzymanie otwierania (pin 3 ustawia się na HIGH) i zmienia stan bramy na 2.
    Stan 2: Brama jest zatrzymana po otwieraniu. Kolejne naciśnięcie przycisku powoduje rozpoczęcie zamykania bramy (pin 4 ustawia się na LOW, co oznacza włączenie zamykania), a stan zmienia się na 3.
    Stan 3: Brama jest w trakcie zamykania. Kolejne naciśnięcie przycisku powoduje zatrzymanie zamykania (pin 4 ustawia się na HIGH), a stan bramy wraca do 0.
    Brama 2 (controlGate2()):
    Działa dokładnie tak samo jak brama 1, ale sterowanie odbywa się przez piny 5 (otwieranie) i 6 (zamykanie), a przycisk sterujący to A4.
    3. Sterowanie oświetleniem:
    Oświetlenie wewnętrzne (lightingInternalState):
    Stan oświetlenia zmienia się cyklicznie przy każdym naciśnięciu przycisku podłączonego do A2:
    Wszystko wyłączone.
    Włączone pierwsze światło (pin 12 LOW).
    Włączone drugie światło (pin 13 LOW).
    Oba światła włączone.
    Oświetlenie zewnętrzne (lightingExternalState):
    Działa analogicznie do oświetlenia wewnętrznego, ale sterowanie odbywa się przez piny 10 (pierwsze światło) i 11 (drugie światło), a przycisk sterujący to A3.
    4. Logika blokad i debouncowania:
    Debouncowanie: Kod wykorzystuje czas opóźnienia (debounceDelay), aby ignorować fałszywe sygnały spowodowane drganiami styków przycisków.
    Blokada kanałów:
    Po naciśnięciu dowolnego przycisku, blokowane są wszystkie inne kanały na 1,5 sekundy (blockInterval), aby uniknąć przypadkowych aktywacji innych urządzeń.
    Każdy przycisk można ponownie aktywować po 0,38 sekundy (channelCooldown), ale inne kanały pozostają zablokowane przez pełne 1,5 sekundy.
    5. Główna pętla (loop()):
    Sprawdzanie i obsługa wejść:
    Kod cyklicznie sprawdza stan każdego z czterech wejść (A0, A2, A3, A4), wykorzystując funkcję debounceAndFilter(), która realizuje zarówno debouncowanie, jak i filtrowanie sygnałów.
    Jeżeli spełnione są wszystkie warunki (debouncowanie, sygnał stabilny, dozwolona aktywacja), kod aktywuje odpowiednią funkcję sterującą: controlGate1(), controlGate2(), lub przełącza stan oświetlenia wewnętrznego/zewnętrznego.
    Automatyczne zatrzymanie bram:
    Kod sprawdza, czy brama była otwarta lub zamykana przez 27 sekund. Jeżeli tak, brama zostaje automatycznie zatrzymana, aby zapobiec ciągłemu działaniu.
    Podsumowanie:
    Kanały A0 i A4 kontrolują odpowiednio Bramę 1 i Bramę 2, gdzie każda brama ma tryby otwierania, zatrzymywania i zamykania.
    Kanały A2 i A3 sterują odpowiednio oświetleniem wewnętrznym i zewnętrznym, z cyklicznym przełączaniem stanów (wyłączone, jedno światło włączone, drugie światło włączone, oba światła włączone, wyłączone...).
    Kod zawiera mechanizmy zabezpieczające przed drganiami styków oraz blokuje inne kanały po aktywacji dowolnego z nich, aby zapobiec przypadkowym aktywacjom i zapewnić przewidywalne działanie systemu.

    Dodano po 2 [minuty]:

    problem tkwił prawdopodobnie w impulsach wejściowych, gdzieś na wejsciu pojawialy sie błędne krótkotrwałe impulsy, które miały po kilka ms, dzieki za pomoc!

    Dodano po 1 [minuty]:

    >>21183202 właśnie nie do końca, jedynie zwieranie z GND uruchamia kanały
  • Pomocny post
    #14 21183277
    hindoos
    Poziom 36  
    Posty: 3754
    Pomógł: 290
    Ocena: 662
    Trimus napisał:
    dodałem do programu debounce i blokady czasowe które defacto wyeliminowały wszystkie błędne impulsy!


    Moim zdaniem obszedłeś problem zamiast go rozwiązać :)
  • #15 21183804
    _jta_
    Specjalista elektronik
    Posty: 49096
    Pomógł: 3212
    Ocena: 4251
    Rozumiem z tego, że zakłócenia pojawiają się na wejściach Arduino?

    Lepszy debouncing można by zrobić tak: odczytywać w pętli wszystkie wejścia i zapisywać do zmiennej (każde wejście do innego bitu); po odczytaniu kompletu wejść porównywać tę zmienną z poprzednią wartością - jeśli była zmiana, zrestartować odliczanie czasu debouncingu; kiedy upłynie odpowiedni czas bez zmian, zapisany stan wejść uznawać za stabilny i porównać z poprzednim stanem stabilnym; jeśli jest różnica, to wykonać odpowiednią akcję i zrestartować odliczanie czasu debouncingu.

    Aha: na schemacie nie ma oporników pull-up (powinny być przy włącznikach); wejścia Arduino mają wbudowane, ale o dużym oporze (około 50kΩ) i układ może być podatny na zakłócenia. Można jeszcze przy pinach Arduino dać kondensatory do masy.
  • Pomocny post
    #16 21183849
    mam_pytanie
    Poziom 30  
    Posty: 1077
    Pomógł: 164
    Ocena: 259
    Cytat:
    Moim zdaniem obszedłeś problem zamiast go rozwiązać

    A czy to ważne, kiedy chcesz się pochwalić napisanym wsadem?

    Cytat:
    właśnie nie do końca, jedynie zwieranie z GND uruchamia kanały

    Aha, czyli takie coś:
    Schemat połączenia Arduino z optotriakiem.
    działa?
    Powodzenia. :)
  • Pomocny post
    #17 21183963
    _jta_
    Specjalista elektronik
    Posty: 49096
    Pomógł: 3212
    Ocena: 4251
    Wejście Arduino do wejścia transoptora? Jakoś nie widzę, by to mogło działać.

    Problemem są zakłócenia wchodzące do Arduino. Przy ograniczeniu do wbudowanego pullup-u wejścia bywają podatne na zakłócenia. Transoptor chyba na to mało pomoże, choć może mógłby - jakby droga od wyjścia transoptora do pinu Arduino była krótka, lub zaekranowana.

    Program lepiej zamieszczać tak (wersja z #1):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i wersja z #13:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    (przy edycji jest wybór "Listing kodu" SYNTAX...)
  • Pomocny post
    #18 21184061
    mam_pytanie
    Poziom 30  
    Posty: 1077
    Pomógł: 164
    Ocena: 259
    Cytat:
    Wejście Arduino do wejścia transoptora?

    Wyjście do wejścia. Przynajmniej tak narysował.
    Rysunek układu elektronicznego z opisami, izolacją galwaniczną, połączeniami i miejscami na elektronikę.
    Cytat:
    Transoptor chyba na to mało pomoże

    Może by i pomógł, gdyby moduł przekaźnikowy, rzeczywiście posiadał izolację galwaniczną.
  • Pomocny post
    #19 21184092
    _jta_
    Specjalista elektronik
    Posty: 49096
    Pomógł: 3212
    Ocena: 4251
    Ja na tym rysunku nie widzę żadnego transoptora. A ten w >>21183849, to chyba twój?

    Autor próbował oddzielnego zasilania przekaźników, i to nie pomogło. Ale może masa miała odcinek wspólny?
  • Pomocny post
    #20 21184381
    janrukmateusz
    Poziom 3  
    Posty: 8
    Pomógł: 1
    Ocena: 1
    >>21184092
    Próbowałem oddzielnego zasilania ale masę musiałem zostawiłem połączoną (gnd wspólne obu układów) po prostu na vcc modułu przekaźników wpiąłem + z zasilacza 5V a gnd wspólne. Na wyjściach nie ma zakłóceń, moduł przekaźnikowy posiada już optoizolacje, zakłócenia pojawiały się na wejściu, macie rację problem trochę obszedłem zamiast go rozwiązać, bo układu nie modyfikowałem, nie dodałem żadnych kondensatorow na wejścia do gnd tylko dodałem ten debouncing

    Dodano po 1 [minuty]:

    >>21184381
    Debouncing rozwiązał problem ale metodą raczej ominięcia przyczyny tych zakłóceń a nie ich wyeliminowania, bo zakłócenia dalej są, tyle że program ich nie wychwytuje

    Dodano po 42 [sekundy]:

    >>21183963 dziękuję za radę :))
  • Pomocny post
    #21 21184429
    mam_pytanie
    Poziom 30  
    Posty: 1077
    Pomógł: 164
    Ocena: 259
    @_jta_ , transoptory są w module przekaźnikowym.
    Jeśli ma on rzeczywiście wejścia wyzwalane stanem niskim, poprzez zwarcie do masy, powinien działać raczej wtedy, kiedy plus zasilania będzie wspólny z modułem Arduino, nie minus.
    Owszem, mógłby działać na wspólnej masie, gdyby zwieranie wejść bocznikowało transoptory.
    Te jednak musiałyby być normalnie załączone, lecz wtedy, ciągle świeciłyby także LED, połączone z nimi w szereg.
    Tymczasem, LED zapalają się w momencie wyzwolenia danego wejścia.[/youtube]
  • #23 21719128
    Trimus
    Poziom 5  
    Posty: 49
    Ocena: 2
    Dodałem do programu specjalne funkcje antyzakłóceniowe z delayem i problem ustał

Podsumowanie tematu

✨ Problem dotyczył zakłóceń sygnałów na wejściach Arduino sterowanego modułem przekaźnikowym 8-kanałowym z optoizolatorami, gdzie podanie sygnału na jeden kanał powodowało niezamierzone aktywacje innych kanałów. Moduł przekaźnikowy wyzwalany był przez masę (stan niski), a zakłócenia pojawiały się tylko po jego podłączeniu. Próby eliminacji obejmowały oddzielne zasilanie modułu, zastosowanie rezystorów szeregowych na wejściach oraz wprowadzenie programowego debouncingu i blokad czasowych. Debouncing w kodzie Arduino skutecznie wyeliminował błędne impulsy, choć zakłócenia fizycznie nadal występowały. Dyskusja wskazała na możliwe źródło zakłóceń EMI generowane przez moduł przekaźnikowy, potencjalne braki w izolacji galwanicznej oraz konieczność stosowania rezystorów podciągających i kondensatorów filtrujących na wejściach Arduino. Zalecano także testowanie innych modułów przekaźnikowych o lepszej separacji sygnałów oraz poprawne prowadzenie masy, aby uniknąć prądów zakłócających. Ostatecznie rozwiązaniem okazało się zastosowanie programowych funkcji antyzakłóceniowych z opóźnieniami (delay), które stabilizowały odczyty wejść i eliminowały fałszywe aktywacje przekaźników.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA