Restarter (odcinanie zasilania co jakiś czas)

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
bpijet
Młodszy majsterkowicz
Posty: 34
Rejestracja: 8 lut 2014, 15:24
Lokalizacja: Gdynia

Restarter (odcinanie zasilania co jakiś czas)

Post autor: bpijet » 22 lip 2015, 23:26

Stworzyłem pewien system, który wymaga restartów co jakiś czas. Na przykład co godzinę. Stworzyłem sobie na attiny2313 mały systemik który odcina zasilanie temu drugiemu co około godzinę. Problem polega na tym, że dzieje się tylko pierwszy restart po godzinie, reszta nie następuje. Ktoś ma jakiś pomysł co może nie działać? A najlepiej jeśli ktoś zna takie gotowe rozwiązanie, np między zasilaniem w gniazdku, a urządzeniem, które odcinałoby zasilanie co jakiś czas na 5/10 sekund. Załączam kod z attiny:

Kod: Zaznacz cały

int przekaznik = 0;
int czas = 0;
 
void setup() {                
  pinMode(przekaznik, OUTPUT);     
}
 
void loop() {
  if (czas == 295)
  {
  digitalWrite(przekaznik, HIGH);
  delay(1000);
  digitalWrite(przekaznik, LOW);
  czas = 0;
  }
  delay(1000);
  czas++;
}

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


stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Restarter (odcinanie zasilania co jakiś czas)

Post autor: stiven » 23 lip 2015, 12:16

Kod wygląda dobrze, nie wiem czemu to działa tylko raz. Ewentualnie możesz spróbować zmienić pin przekaźnika na inny niż 0 i 1, bo z doświadczenia wiem, że na tych pinach takie rzeczy dziwne mogą się dziać, nawet jeśli nie korzysta się z seriala.

A czy to musi być zrobione na zasadzie odcinania zasilania? Czy wystarczy "zwykły" reset? Nie wiem czy masz arduino, czy jakiś inny mikrokontroler, obojętnie, jest pin RESET i podanie na niego stanu niskiego powoduje reset mikrokontrolera. Więc zamiast przekaźnika, mógłbyś podawać z attiny2313 stan niski na pin reset co godzinę przez określony czas. Można zrobić nawet tak, że nie potrzeba drugiego mikrokontrolera, tylko zrobić taki reset na tym samym. Pin reset połączyć z innym pinem w tym samym mikrokontrolerze i na tym pinie co określony czas podawać stan niski. Tylko żeby delaye nie wpływały na program, to zamiast nich skorzystać z millis(). Kolejny jeszcze łatwiejszy sposób, bez drugiego mikrokontrolera i bez łączenia pinu z resetem, można zrobić reset programowy. Czyli też najlepiej korzystając z millis() co określony czas robić ten reset programowo.

http://www.instructables.com/id/two-way ... /?ALLSTEPS


Jeszcze taka jedna rzecz, bo można się zdziwić. Kiedy ustawisz pin jako wyjście i nie ustawisz na nim żadnego stanu, to najczęściej na takim pinie jest stan niski. Ale nie zawsze, czasami jest stan wysoki. Dlatego dla pewności w setup po ustawieniu w pinMode() danego pinu jako wyjście, powinno się też ustawić na nim odpowiedni stan przez digitalWrite().
bpijet
Młodszy majsterkowicz
Posty: 34
Rejestracja: 8 lut 2014, 15:24
Lokalizacja: Gdynia

Re: Restarter (odcinanie zasilania co jakiś czas)

Post autor: bpijet » 23 lip 2015, 12:35

Kolega widzę bardziej obeznany :) Dzięki za pomoc, będę testował. Po pinMode() rozumiem, że w pętli setup ustawić stan niski? A korzystając z okazji, może ty też będziesz wiedział, czemu w ogóle ten system potrzebuje restartów :D Kod prezentuje się następująco:

Kod: Zaznacz cały

#include "etherShield.h"
#include "ETHER_28J60.h"

int pilot = 6;
int stan = 0;
int led = 13;

static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};  
                                                           
static uint8_t ip[4] = {192, 168, 0, 109};                       

static uint16_t port = 80; 

ETHER_28J60 ethernet;

void setup()
{ 
  ethernet.setup(mac, ip, port);
  pinMode(pilot, OUTPUT);
}

void loop()
{
  char* params;
  if (params = ethernet.serviceRequest())            
  {
      ethernet.print("<body bgcolor='black' text='blue'>");
 
    if (strcmp(params, "?brama") == 0)         
    {
      ethernet.print("<br><A HREF='?zmiana'><center><img src=http://s2.postimg.org/s25f2nke1/psd_power_button.jpg width=700 height=700/></center></A>");
    }
    if (strcmp(params, "?zmiana") == 0)              
    {
      digitalWrite(pilot, HIGH);
      delay(1000);
      digitalWrite(pilot, LOW);
      ethernet.print("<br><A HREF='?brama'><center><img src=http://s29.postimg.org/k6qcwtnxj/back_button.png width=700 height=700/></center></A>");
    }
    ethernet.respond();
    }
  digitalWrite(led, HIGH);
  delay(100);
  digitalWrite(led, LOW);
  }
Urządzenie pada różnie. Od 1 na tydzień do na przykład 3. Mam pewność, że zacina się Arduino, a nie na przykład moduł ethernetowy. Ah, no i dalej nie wspomniałem. Tak, całość jest oparta o Arduino. Uno dokładniej.
Awatar użytkownika
Nefarious19
Starszy majsterkowicz
Posty: 373
Rejestracja: 4 cze 2014, 23:04

Re: Restarter (odcinanie zasilania co jakiś czas)

Post autor: Nefarious19 » 23 lip 2015, 17:20

A koledzy o czymś takim jak watchdog to słyszeli? Jak nie to proponuje się zapoznać bo może się przydać
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Restarter (odcinanie zasilania co jakiś czas)

Post autor: stiven » 23 lip 2015, 22:20

Z tymi modułami ethernetowymi tak bywa. Sam nie używałem ale z forum wiem, ludzie kombinują właśnie z tym resetowaniem. Nawet na stronie arduino o tym piszą, ale niestety według tego co piszą tu:
http://playground.arduino.cc/Main/ArduinoReset
to okazuje się, że jednak ani reset programowy ani przez watchdoga nie zdaje egzaminu przy problemie z zawieszaniem się ethernetu. Piszą, że w większości przypadków dobrym rozwiązaniem jest reset wywołany z innego pinu, ale nie jestem pewien, czy chodzi o pin z tego samego arduino czy z drugiego(wiadomo, jeśli byłoby tak, że może być z tego samego, to i z drugiego też).
- connecting a wire to the "reset" pin from some other (output) Arduino pin -- apparently often works
Awatar użytkownika
Nefarious19
Starszy majsterkowicz
Posty: 373
Rejestracja: 4 cze 2014, 23:04

Re: Restarter (odcinanie zasilania co jakiś czas)

Post autor: Nefarious19 » 24 lip 2015, 10:05

Ja w swoich sterownikach robię inną rzecz. Może przyda się wam ten patent. Mianowicie podaje zasilanie na poszczególne moduły poprzez tranzystor typu PNP bądź mosfet typu P. Szczególnie gdy robię coś do jakiegoś auta gdzie bezpieczeństwo jest najważniejsze to wprowadzam pewne self-testy np co 10 sekund, do tego wathcdog. W momencie kiedy układ się zresetuje, odcinane jest zasilanie od wszystkich modułów a po 1-2 sekundach przywracane. reset moze wywołać watcdog bądź ja sam jeżeli seltest stwierdzi co nie działa. Polecam tę metodę. Dzięki niej uniknąłem kiedyś kolizji gdyż pomimo że jeden układ sterownika w aucie mi się spalił, program to wykrył, dokonał resetu i wszystko ruszyło. Dodam że przed resetem zapisuje wszystko do eeproma żeby po resecie wszystko było tak poustawiane jak przed.
Arturr300
Starszy majsterkowicz
Posty: 307
Rejestracja: 16 paź 2013, 17:24

Re: Restarter (odcinanie zasilania co jakiś czas)

Post autor: Arturr300 » 1 sie 2015, 09:05

Mam chyba pomysł: jak wygląda podłączenie przekaźnika?
Dałeś diodę równolegle, zaporowo do cewki przekaźnika? Bez tego mogą się dziać dziwne rzeczy
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Restarter (odcinanie zasilania co jakiś czas)

Post autor: stiven » 1 sie 2015, 09:31

Arturr300 najpierw było zawieszanie, a dopiero później dodany przekaźnik, żeby resetować arduino zanim się zawiesi.
Arturr300
Starszy majsterkowicz
Posty: 307
Rejestracja: 16 paź 2013, 17:24

Re: Restarter (odcinanie zasilania co jakiś czas)

Post autor: Arturr300 » 1 sie 2015, 09:35

Chodzi mi o naprawienie restartera - żeby restartował więcej niż 1 raz :)
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Restarter (odcinanie zasilania co jakiś czas)

Post autor: stiven » 1 sie 2015, 09:49

A tak, masz rację.
ODPOWIEDZ

Strony partnerskie: