Arduino - reset od aparatury modułowej

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
akon1111
Młodszy majsterkowicz
Posty: 23
Rejestracja: 12 sie 2016, 21:53

Arduino - reset od aparatury modułowej

Post autor: akon1111 » 6 sie 2017, 11:42

Witam,

od dłuższego czasu pracuję na alarmem oraz włącznikiem/wyłącznikiem oświetlenia opartymi o arduino. Wykonałem oba urządzenia w oparciu o uC atmega328p i zaprogramowałem w ARDUINO IDE. W przypadku obu urządzeń występują podobne problemy - opiszę je poniżej:
1' ALARM - proste urządzenie - atmega328p, klawiatura membranowa, LCD 2x16, buzzer, kontaktron, tranzystor NPN załączający syrenę. Zasilany zasilaczem 12V stabilizowanym, atmega zasilana z LM7805. Problem wygląda tak, że gdy ktoś zadzwoni dzwonkiem do drzwi alarm sam się załącza - nie ma żadnego galwanicznego połączenia miedzy dzwonkiem a alarmem. Próbowałem zasilać alarm bezpośrednio z akumulatora (bez dostępu do sieci 230V) i nic to nie dało. Próbowałem również ekranować urządzenie i wszystkie przewody folią aluminiową podłączoną do uziemienia, ale to również nic nie dało.

2' Sterowanie oświetleniem. Urządzenie oparte o uC ATMEGA 328p , przekaźnik bistabilny i DS3231. Działa to tak, że o określonej godzinie atmega przełącza przekaźnik bistabilny, który daje impuls na przekaźnik impulsowy montowany na szynie DIN w rozdzielnicy. Po pierwszym załączeniu atmega zawiesza się i działa dopiero po odłączeniu i ponownym podłączeniu zasilania. Wcześniej stosowałem taki sam układ to zapalania/gaszenia lampki i zakłócenia nie występowały - przekaźnik bistabilny sterował bezpośrednio lamką, nie przekaźnikiem impulsowym (HAGER EPN 510).

Zabiegi które jak dotąd zastosowałem:
- pin reset atmegi podpięty przez rezystor 10k do VCC,
- stosowanie filtrów zasilania, również zasilanie z akumulatora,
- próby ekranowania,
- wprowadzenie w kodzie atmegi resetu co kilkanascie sekund (jeden z pinów podpięty do pin_reset i co kilkanascie pętli pojawia się na nim stan niski);

Macie jakieś pomysły? Będę wdzięczny za każdą sugestię.

Pozdrawiam

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
scorpion_1982
Majsterkowicz
Posty: 108
Rejestracja: 15 lut 2015, 00:55

Re: Arduino - reset od aparatury modułowej

Post autor: scorpion_1982 » 6 sie 2017, 13:34

A schemat ? Od tego trzeba by zacząć, mamy dużo osób na forum zajmujących zawodowo się elektroniką, natomiast szanowny autorze nie mamy ani jednej wróżki, uzupełnij odpowiednio zapytanie oraz kawałek kodu podaj jak realizujesz wysterowaniem przekaźnikiem.

Wysłane z mojego SM-J510FN przy użyciu Tapatalka
akon1111
Młodszy majsterkowicz
Posty: 23
Rejestracja: 12 sie 2016, 21:53

Re: Arduino - reset od aparatury modułowej

Post autor: akon1111 » 7 sie 2017, 17:26

Poniżej załączam schemat układu. Jeśli chodzi o kod to wprowadziłem funkcję gaszenie i zapalanie która podaje na sekundę stan wysoki na pin D10 o określonych godzinach.
Untitled Sketch 2_schem.jpg
Przepraszam za schemat, ale pierwszy raz używałem tego programu.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
ethanak
Złota rączka
Posty: 764
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: Arduino - reset od aparatury modułowej

Post autor: ethanak » 8 sie 2017, 06:04

To wywal fritzinga do kosza i zacznij używać czegoś normalnego (Eagle chociażby).
Poza tym jeśli to jest cały schemat Twojego układu to dziwne jest, że cokolwiek tam działa. Ja tu nie widzę ani jednego kondensatora. Nie widzę rezystora w bazie tranzystora. Nie widzę diody przy cewce przekaźnika. Więc w takim przypadku zapoznaj się z podstawami projektowania tego typu układów (wybacz, ale nie będę teraz pisać elaboratów na temat podłączania Atmegi oraz wstawiania kondensatorów, diod i rezystorów w różne fajne miejsca).
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
Awatar użytkownika
Slawek
Starszy majsterkowicz
Posty: 448
Rejestracja: 29 mar 2015, 15:05

Re: Arduino - reset od aparatury modułowej

Post autor: Slawek » 8 sie 2017, 16:24

Brak rezystora ograniczającego prąd w bazie tranzystora sterującego cewką przekaźnika powoduje z dużym prawdopodobieństwem pobór prądu znacznie większy niż krytyczne 40mA na pinie arduino. To zapewne powoduje wieszanie się atmegi.
Podłączenie przekaźnika do arduino czy też atmegi powinno wyglądać np. tak :
PRZEKAZNIK.png
Rozumiem, że nie podłączasz dodatkowego rezystora pullup do resetu arduino lecz piszesz o samej atmedze ?

Pozdr
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
akon1111
Młodszy majsterkowicz
Posty: 23
Rejestracja: 12 sie 2016, 21:53

Re: Arduino - reset od aparatury modułowej

Post autor: akon1111 » 8 sie 2017, 19:48

Panowie dziękuję za cenne uwagi, jednak nie przyniosły one skutku...

Podłączyłem też gotowy moduł przekaźnikowy (z izolacja optoelektroniczną) do arduino uno i problem nadal występuje.
Awatar użytkownika
Slawek
Starszy majsterkowicz
Posty: 448
Rejestracja: 29 mar 2015, 15:05

Re: Arduino - reset od aparatury modułowej

Post autor: Slawek » 8 sie 2017, 20:50

Zatem pokaż cały kod, bo może uC się nie zawiesza tylko program jest tak napisany.

Pozdr
akon1111
Młodszy majsterkowicz
Posty: 23
Rejestracja: 12 sie 2016, 21:53

Re: Arduino - reset od aparatury modułowej

Post autor: akon1111 » 8 sie 2017, 21:56

Poniżej kod do włączania i wyłączania przekaźnika o wyznaczonych godzinach. Wprowadziłem funkcję RESET która resetuje arduino co kilka sekund (myślałem, że to pomoże w przypadku zawieszenia uC, ale niestety nic nie daje). Funkcja reset podaje stan niski na pin_reset, który podłaczony jest do pinu nr 1 atmegi (reset).

Kod: Zaznacz cały

#include <Wire.h>

#include <DS3231.h>

DS3231 clock;
RTCDateTime dt;

int licznik = 0;
int pin_reset = 2;
int pin_wlacznika = 3;
int pin_relay = 9;
int stan_wlacznika = HIGH;

void setup()
{
  Serial.begin(9600);
  clock.begin();
  //clock.setDateTime(__DATE__, __TIME__);
  pinMode(pin_relay, OUTPUT);
  digitalWrite(pin_reset, HIGH);
  pinMode(pin_reset, OUTPUT);
  pinMode(pin_wlacznika, INPUT_PULLUP);


}

void loop()
{
  wyswietlanie_czasu_monitor();
  alarm (19, 35, 1);
  alarm (19, 37, 1);
  alarm (19, 39, 1);
  alarm (19, 41, 1);
    alarm (19, 43, 1);
  alarm (19, 45, 1);
  alarm (19, 47, 1);
  alarm (19, 49, 1);
  
  
  alarm (20, 0, 20);
  alarm (20, 30, 20);
  alarm (21, 0, 20);
  alarm (21, 30, 20);
  alarm (22, 0, 20);
  alarm (22, 30, 20);
  alarm (23, 0, 20);
  alarm (23, 30, 20);
  RESET();

}




void alarm (int ha, int ma, int czt)
{
  stan_wlacznika = digitalRead(pin_wlacznika);
  if (dt.hour == ha && dt.minute == ma && dt.second == 0 && stan_wlacznika == LOW)
  {
    ZMIANA();
  }
  if (dt.hour == ha && dt.minute == (ma + czt) && dt.second == 0 && stan_wlacznika == LOW)
  {
    ZMIANA();
  }
}


void wyswietlanie_czasu_monitor() {
  clock.forceConversion();
  dt = clock.getDateTime();
  //Serial.print(dt.hour);
  //Serial.print(":");
  //Serial.print(dt.minute);
  //Serial.print(":");
  //Serial.println(dt.second);
  delay(100);

}

void RESET() {
  licznik++;
  //Serial.println(licznik);

  if (licznik > 100 && dt.second > 5 && dt.second < 50 ) {
    licznik = 0;
    Serial.println("reset");
    delay(100);
    digitalWrite(pin_reset, LOW);
  }
  else {}

}


void ZMIANA() {
  digitalWrite(pin_relay, HIGH);
  delay(1000);
  digitalWrite(pin_relay, LOW);

}
Awatar użytkownika
Marhef
Złota rączka
Posty: 1189
Rejestracja: 18 lis 2011, 02:18

Re: Arduino - reset od aparatury modułowej

Post autor: Marhef » 8 sie 2017, 22:54

A spróbuj resetować za pomocą watchdoga, może Twój program zawiesza się w takim miejscu, że nie wystawia resetu.
akon1111
Młodszy majsterkowicz
Posty: 23
Rejestracja: 12 sie 2016, 21:53

Re: Arduino - reset od aparatury modułowej

Post autor: akon1111 » 9 sie 2017, 11:44

Jak zrobić reset przy pomocy watchdoga ? Szukałem trochę w internecie, ale nie znalazłem nic w przystępnej formie.

Z drugiej strony, reset jest jedynie usunięciem skutku. Podczas przełączania przekaźnika występuje również problem z drugim urządzeniem o którym wcześniej pisałem - alarmem. Gdy alarm jest załączony, (a dochodzi do załączenia przekaźnika) zakłócenie powoduje taki sam skutek jak otwarcie drzwi (rozwarcie kontaktronu).

Kod: Zaznacz cały

int stan_alarmu = 0;
int stan_kontaktronu = 0;
int pin_wlacznika = 4;
int syrena = 0;
int pin_kontaktronu = 3;
int pin_syreny = 5;

void setup()
{
  Serial.begin(9600);
  pinMode(pin_kontaktronu, INPUT_PULLUP);
  pinMode(pin_wlacznika, INPUT_PULLUP);
  pinMode(pin_syreny, OUTPUT);

}

void loop()
{
  stan_alarmu = digitalRead(pin_wlacznika);
  stan_kontaktronu = digitalRead(pin_kontaktronu);

  if (stan_alarmu == 1 && stan_kontaktronu == 1) {
    for (int i = 0; i < 20; i++) {
      delay(1000);
      stan_alarmu = digitalRead(pin_wlacznika);
    }

    if (stan_alarmu == 1) {
      digitalWrite(pin_syreny, HIGH);
    }
    else {}
  }




}
Kontaktron przy zamknietych drzwiach podaje na pin_kontaktronu stan niski. Podczas zakłócenia występuje załączenie alarmu (tak jakby odczytał stan niski). Może podłączyć kontaktron do VCC i załączać na wykrycie stanu niskiego, ale wątpię żeby to pomogło.
Awatar użytkownika
ethanak
Złota rączka
Posty: 764
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: Arduino - reset od aparatury modułowej

Post autor: ethanak » 9 sie 2017, 12:36

Jaki kondensator masz podłączony równolegle z kontaktronem? Jaka jest odległośc od kontaktronu do urządzenia? Jaki przewód?
Jeśli tu masz dobrze, spróbuj połączyć pin kontaktronu z vcc przez opornik 1k, i do masy 100nF niezależnie od kondensatora przy kontaktronie.
Programowo: powtórz odczyt po 50 milisekundach i dopiero kiedy oba będą identyczne możesz go uwzględnić.
A, jeszcze takie głupie pytanie: masz tam kondensatory podłączone do pinów zasilania atmegi?
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
akon1111
Młodszy majsterkowicz
Posty: 23
Rejestracja: 12 sie 2016, 21:53

Re: Arduino - reset od aparatury modułowej

Post autor: akon1111 » 9 sie 2017, 13:37

Ethanak, kondensatory są podłączone. Równolegle do kontaktronu nie podłączyłem żadnego kondensatora. Spróbuję podłączyć taki jak mówisz. Filtracja zasilania wzorowana na te poniżej:
zasilanie_OK2_z_ADC.jpg
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
ethanak
Złota rączka
Posty: 764
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: Arduino - reset od aparatury modułowej

Post autor: ethanak » 9 sie 2017, 13:49

Pierwsza zasada: przy jakichkolwiek mechanicznych stykach podłączanych do wejścia musisz albo podłączyć kondensator równolegle do styków, albo zastosować nawet najprostszy debouncing (a najlepiej i to i to). Inaczej włączenie lodówki w bloku obok poskutkuje wysłaniem impulsu do urządzenia.
Może jednak uprzejmie zrobiłbyś to, co Ci poprzednio zaproponowałem - czyli zapoznał się z ogólnymi zasadami projektowania tego typu układów?
Poza tym jeśli jeszcze raz opublikujesz tu "schemat" pozbawiony paru istotnych elementów to wątpię, aby ktokolwiek chciał dalej z Tobą rozmawiać.
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
akon1111
Młodszy majsterkowicz
Posty: 23
Rejestracja: 12 sie 2016, 21:53

Re: Arduino - reset od aparatury modułowej

Post autor: akon1111 » 9 sie 2017, 14:02

Ethanak, zrobię jak mówisz i zdam relację.

Wracając jeszcze do resetu watchdogiem, to czy mógłby ktoś podrzucić jakiś artykuł jak to zrobić ?
Awatar użytkownika
Marhef
Złota rączka
Posty: 1189
Rejestracja: 18 lis 2011, 02:18

Re: Arduino - reset od aparatury modułowej

Post autor: Marhef » 9 sie 2017, 15:51

W sumie potrzebujesz tylko na początku dołączyć bibliotekę do obsługi watchdoga (#include <avr/wdt.h>), w sekcji setup() najpierw wyłączasz watchdoga (wdt_disable();), a tuż przed pętlą loop() ustawiasz czas, po jakim ma się zrestartować (wdt.enable(czas);) czas jest chyba zdefiniowany, nie możesz dowolnych wartości wstawiać. Nie używałem watchdoga, więc nie jestem pewien tej informacji. I dodatkowo, w pętli loop() musisz co jakiś czas restartować licznik watchdoga (wdt_reset();). Szczegóły w linku:
https://bigdanzblog.wordpress.com/2014/ ... mple-code/
akon1111
Młodszy majsterkowicz
Posty: 23
Rejestracja: 12 sie 2016, 21:53

Re: Arduino - reset od aparatury modułowej

Post autor: akon1111 » 9 sie 2017, 16:03

Marhef, to trochę słabo z tym resetem. Gdy ustawię go co daną jednostkę czasu, może występować on w czasie kiedy bym nie chciał żeby występował (np. podczas wpisywania kodu do alarmu na klawiaturze 4x4 lub po rozłączeniu kontaktrona). Najlepiej żeby dało się go wywołać z instrukcji if()
Awatar użytkownika
Marhef
Złota rączka
Posty: 1189
Rejestracja: 18 lis 2011, 02:18

Re: Arduino - reset od aparatury modułowej

Post autor: Marhef » 9 sie 2017, 21:50

Po to jest funkcja resetu, żeby można było zresetować odliczanie. Poza tym, masz funkcję wtd_disable(); Włączysz ją na czas wpisywania kodu i w tym czasie się nie zrestartuje.
Zresztą, jakie wpisywanie kodu? W żadnym z zamieszczonych przez Ciebie programów nie ma wpisywania kodu.
Awatar użytkownika
ethanak
Złota rączka
Posty: 764
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: Arduino - reset od aparatury modułowej

Post autor: ethanak » 11 sie 2017, 14:10

A widziałeś tam jakiś kondensator? Bo potem okazało się że są... Tyle że w pamięci.
A jak pamiętasz sam się ostatnio zbłaźniłem (i to w arduino, a nie w gołej atmedze), i okazało się, że takie różne kondensatory popodpinane w różne fajne miejsca to baaaaaardzo istotna część konstruowanego ustrojstwa :)
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
Awatar użytkownika
ethanak
Złota rączka
Posty: 764
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: Arduino - reset od aparatury modułowej

Post autor: ethanak » 11 sie 2017, 14:55

Nie ten schemat.
Poza tym: jeśli (o ile pamiętam) pullup w atmedze to 10k - na wypalenie styków będziesz dość długo czekał. Prędzej skorodują ze starości.
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
akon1111
Młodszy majsterkowicz
Posty: 23
Rejestracja: 12 sie 2016, 21:53

Re: Arduino - reset od aparatury modułowej

Post autor: akon1111 » 15 sie 2017, 19:32

Problem nadal nierozwiązany. Zmieniłem przekaźnik na triak, ale nadal bez większych zmian. Wrzucam poprawnie wykonany schemat oraz kod programu.
schemat_gaszenia_swiatla.sch.pdf

Kod: Zaznacz cały

#include <Wire.h>

#include <DS3231.h>

DS3231 clock;
RTCDateTime dt;

int licznik = 0;
int pin_reset = 2;
int pin_wlacznika = 3;
int pin_relay = 9;
int stan_wlacznika = HIGH;

void setup()
{
  Serial.begin(9600);
  clock.begin();
  //clock.setDateTime(__DATE__, __TIME__);
  pinMode(pin_relay, OUTPUT);
  digitalWrite(pin_reset, HIGH);
  pinMode(pin_reset, OUTPUT);
  pinMode(pin_wlacznika, INPUT_PULLUP);


}

void loop()
{
  wyswietlanie_czasu_monitor();
  alarm (20, 0, 20);
  alarm (20, 30, 20);
  alarm (21, 0, 20);
  alarm (21, 30, 20);
  alarm (22, 0, 20);
  alarm (22, 30, 20);
  alarm (23, 0, 20);
  alarm (23, 30, 20);
  RESET();
}




void alarm (int ha, int ma, int czt)
{
  stan_wlacznika = digitalRead(pin_wlacznika);
  if (dt.hour == ha && dt.minute == ma && dt.second == 0 && stan_wlacznika == LOW)
  {
    ZMIANA();
  }
  if (dt.hour == ha && dt.minute == (ma + czt) && dt.second == 0 && stan_wlacznika == LOW)
  {
    ZMIANA();
  }
}


void wyswietlanie_czasu_monitor() {
  clock.forceConversion();
  dt = clock.getDateTime();
  Serial.print(dt.hour);
  Serial.print(":");
  Serial.print(dt.minute);
  Serial.print(":");
  Serial.println(dt.second);
  delay(100);

}

void RESET() {
  licznik++;
  Serial.println(licznik);

  if (licznik > 100 && dt.second > 5 && dt.second < 50 ) {
    licznik = 0;
    Serial.println("reset");
    delay(100);
    digitalWrite(pin_reset, LOW);
  }
  else {}

}



void ZMIANA() {
  digitalWrite(pin_relay, HIGH);
  delay(1000);
  digitalWrite(pin_relay, LOW);
  delay(100);

}
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
akon1111
Młodszy majsterkowicz
Posty: 23
Rejestracja: 12 sie 2016, 21:53

Re: Arduino - reset od aparatury modułowej

Post autor: akon1111 » 15 sie 2017, 20:06

Atmegę programuję na wewnętrznym kwarcu 8MHz. A co do alarmu, to co zmienia czy wywołam go z gotowej biblioteki czy stworzę swoją ? Przy miganiu diodą nigdy nie było problemów z moją funkcją alarm.
Awatar użytkownika
Slawek
Starszy majsterkowicz
Posty: 448
Rejestracja: 29 mar 2015, 15:05

Re: Arduino - reset od aparatury modułowej

Post autor: Slawek » 15 sie 2017, 20:48

Kolego, kondensatory przy atmedze nie 4,7u tylko 100n. Rezestor R3 powinien być podłączony od pinu reset do +5V a nie pinu 4. Na wyjsciu do DS nie potrzeba kondensatora, a już nie na pewno 10uF. Po co ci ten kondensator C5 4,7u przy przycisku ? chyba po to, aby spawać styki, tam też 100n wystarczy, choć jak masz w programie podciągnięty przycisk pod pullup to ten kondensator jest zbędny.
Na zasilaniu przed 7805 wystarczy kondensator elektrolityczny (na schemacie C4 masz zwykły) 220uF i do tego zwykły 100n, za 7805 daj zwykły 100n i 10-22uF elektrolit. Konsdensatory 100n muszą być jak najbliżej 7805.
Na optotriaku, rezystor R4 można zmiejszyć 220-470R wystarczy.
Schemat sterowania powinien wyglądać tak :
triak.png
No i to co podniósł @ MrLewerence, jak z Arduino programujesz atmegę na 8Mhz ? masz wgrane core i załadowałeś bootloader dla 8Mhz ?

Pozdr
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
akon1111
Młodszy majsterkowicz
Posty: 23
Rejestracja: 12 sie 2016, 21:53

Re: Arduino - reset od aparatury modułowej

Post autor: akon1111 » 16 sie 2017, 12:41

Mam wczytane MiniCore i szkic wgrywam na atmega8 z taktowaniem 8MHz (wewnętrzny oscylator).
Jeśli chodzi o kondensatory to wychodziłem z założenia, że czym większy tym lepiej - jak widać błędnie. Zmienię duże elektrolityczne na ceramiczne 100nF i dam znać.
Jeszcze raz dziękuję i pozdrawiam.
Awatar użytkownika
ethanak
Złota rączka
Posty: 764
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: Arduino - reset od aparatury modułowej

Post autor: ethanak » 16 sie 2017, 14:14

Do flaków zwykłem dodawać jedną papryczkę jalapeño na 5litrów flaków.
Czy jakbym dodał wiadro papryki, to byłyby lepsze?
Ja mam w przepisie "jedna papryka". Ty masz " 100 nf".
Trzymaj się przepisu, bo jak będxiesz myślał że "im więcej tym lepiej" to w życiu nawet kiełbasy nie zjesz.
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
akon1111
Młodszy majsterkowicz
Posty: 23
Rejestracja: 12 sie 2016, 21:53

Re: Arduino - reset od aparatury modułowej

Post autor: akon1111 » 16 sie 2017, 20:03

Wprowadziłem poprawki o których pisaliście (załączam aktualny schemat układu).

Problem nadal występuje. Układ nie zawiesza się jak wcześniej od przełączania przekaźnika, ale w ogóle nie startuje - tak jakby zawieszał się od razu po podłączeniu do zasilania.

Zasilanie podawane jest z zasilacza regulowanego z podłączonym buforowo akumulatorem 12V 1,2 Ah (równolegle do źródła). Wydaje mi się, że jest trochę lepiej gdy podłączam bezpośrednio do zasilacza, bez akumulatora. Czy to może mieć jakiś wpływ czy to przypadek ?
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
ODPOWIEDZ

Strony partnerskie: