Автоматический Reset

KEROLine
Offline
Зарегистрирован: 08.10.2013

Использую MEGA 2560 c Ethernet Shield`ом.

Залил скетч - работает.

Отключил питание. Включил. Не работает.

Нажал кнопу Reset. Работает.

Как сделать так, чтоб Reset был после повторного включения питания? Какой код добавить? Или перемычку воткнуть?

Клапауций
Offline
Зарегистрирован: 10.02.2013

на кнопку ресет конденсатор навесить

а, вообще какая-то схемотехническая фигня, если устройство после включения не выходит на рабочий режим - возможно не хватает мощности блока питания.

KEROLine
Offline
Зарегистрирован: 08.10.2013

А разве после выключения-включения питания не должен быть авто Reset?

Клапауций
Offline
Зарегистрирован: 10.02.2013

KEROLine пишет:

А разве после выключения-включения питания не должен быть авто Reset?

Именно, но если мощности блока питания не хватает, то возможно разное.

...это я предполагаю самое простое - возможны иные варианты, почему халабуда начинает работать после ручного ресета.

KEROLine
Offline
Зарегистрирован: 08.10.2013

Поставил БП на 100Вт. Не помогло. Может это из-за Ethernet Shield`a ???

Looka
Offline
Зарегистрирован: 24.04.2012

WDT   Вам в помощь

Клапауций
Offline
Зарегистрирован: 10.02.2013

KEROLine пишет:

Поставил БП на 100Вт.

Смысл? - на выходе из атомной электростанции, помощнее трансформаторы стоят.

KEROLine пишет:
Может это из-за Ethernet Shield`a ???

Нужно смотреть, сколько Ethernet Shield кушает и на что рассчитан стабилизатор напряжения дуино - возможно не хватает мощности.

KEROLine
Offline
Зарегистрирован: 08.10.2013

Так ведь не факт что имеет место быть простой Зависон. Если какие либо настройки Ресета?

Пример скетча брал из Интернета. Менял только IP. ТОчно никаких перемычек не надо?

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес
byte ip[] = { 192, 168, 0, 2 }; // IP адрес (В броузере вводим 192.168.0.2)
EthernetServer server(80);

int numPins = 4;
int pins[] = { 2, 3, 4, 5 };    // Пины для реле
int pinState[] = {0, 0, 0, 0};  // Состояние пинов

void setup()
{
  // Изначально выключаем все реле
  for (int i = 0; i < numPins; i++)
  {
    pinMode(pins[i], OUTPUT);
    digitalWrite(pins[i], 1);
  }
  
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop()
{
  EthernetClient client = server.available();
  if (client)
  {
    // Проверяем подключен ли клиент к серверу
    while (client.connected())
    {
      // Проверяем идет ли запрос к серверу
      int dataCount = client.available();
      if (dataCount > 0)
      {
        // Считываем данные передаваемые серверу с клиента (броузера)
        for (int i = 0; i < dataCount; i++)
        {
          char ch = client.read();
          // Если данные передаются, то они будут переданы POST запросом, который начинается с символа 'P'
          if (i == 0 && ch != 'P')
            break;
          if (ch == '\n' && i < dataCount - 1)
          {
             // Находим строку, в которой содержатся передаваемые данные
             char chNext = client.read();
             // Формат строки r2=on&r3=on&r4=on (Пример если нужно включены 2,3,4 реле)
             if (chNext == 'r')
             {
               // Выключаем все реле
               pinState[0] = 0;
               pinState[1] = 0;
               pinState[2] = 0;
               pinState[3] = 0;
               
               // Считываем первый номер реле, который нужно включить
               char relayNum = client.read();
               pinState[relayNum-'0'] = 1;
               Serial.write(relayNum);
               
               // Считываем вспомогательную информацию (=on&)
               relayNum = client.read();
               relayNum = client.read();
               relayNum = client.read();
               relayNum = client.read();
                
               // Пока есть данные об остальных реле, считываем и заносим в массив pinState
               while (relayNum != -1)
               {
                  relayNum = client.read();
                  relayNum = client.read();
                  pinState[relayNum-'0'] = 1;
                  Serial.write(relayNum);
                  relayNum = client.read();
                  relayNum = client.read();
                  relayNum = client.read();
                  relayNum = client.read();
               }
             } else
             {
                // Если не было передано данных, то выключаем все реле
                pinState[0] = 0;
                pinState[1] = 0;
                pinState[2] = 0;
                pinState[3] = 0;
             }
          }
        }
      }
      
      // В соответствие с переданными данными включаем реле
      for (int i = 0; i < 4; i++)
      {
         digitalWrite(pins[i], !pinState[i]);
      }
      
      // Выводим HTML страницу, на которой пользователь может включить или выключить нужные ему реле
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html");
      client.println();
      client.println("<html>");
      client.println("<head>");
      client.println("<title>Zelectro. Relay + Ethernet shield.</title>");
      client.println("</head>");
      client.println("<body>");
      client.println("<h3>Zelectro. Relay + Ethernet shield.</h3>");
      client.println("<form method='post'>");
      client.print("<div>Relay 1 <input type='checkbox' ");
      if (pinState[0] == 1)
        client.print("checked");
      client.println(" name='r0'></div>");
      client.print("<div>Relay 2 <input type='checkbox' ");
      if (pinState[1] == 1)
        client.print("checked");
      client.println(" name='r1'></div>");
      client.print("<div>Relay 3 <input type='checkbox' ");
      if (pinState[2] == 1)
        client.print("checked");
      client.println(" name='r2'></div>");
      client.print("<div>Relay 4 <input type='checkbox' ");
      if (pinState[3] == 1)
        client.print("checked");
      client.println(" name='r3'></div>");
      client.println("<input type='submit' value='Refresh'>");
      client.println("</form>");
      client.println("</body>");
      client.println("</html>");
      client.stop(); 
    }
  }
}

 

KEROLine
Offline
Зарегистрирован: 08.10.2013

Клапауций пишет:

KEROLine пишет:

Поставил БП на 100Вт.

Смысл? - на выходе из атомной электростанции, помощнее трансформаторы стоят.

KEROLine пишет:
Может это из-за Ethernet Shield`a ???

Нужно смотреть, сколько Ethernet Shield кушает и на что рассчитан стабилизатор напряжения дуино - возможно не хватает мощности.

А чего ж оно тады после Ресета начинает работать? Если типа мощности не хватает...

axill
Offline
Зарегистрирован: 05.09.2011

никаких настроек для ресета не нужно, перемычек никаких по этому поводу тоже нет

соглашусь с коллегами - скорее всего дело в параметрах питания и дело не только в мощности вашего блока

вашим блоком вы питание установленные на меге стабилизаторы, вот с ними и может быть засада. Я столкнулся с тем, что при втыкании ethernet в мегу 5в превращались в 4.2В. Можете у себя посмотреть. Решил подключением внешнего стабилизатора на 5в напрямую к пианм 5в ардуины отключив питание от внешнего разъема. USB при этом совершенно спокойно можно подключать. В качестве внешнего стабилизатора лучше всего брать импульсный, например настраиваемый step-down модуль

Клапауций
Offline
Зарегистрирован: 10.02.2013

KEROLine пишет:

А чего ж оно тады после Ресета начинает работать? Если типа мощности не хватает...

Даже думать не хочу почему так, но против факта не попрёшь - на холодную не работает.

KEROLine
Offline
Зарегистрирован: 08.10.2013

Что ж, господа, попробую с отдельным питанием. Проверю - отпишусь в теме. Спасибо.

KEROLine
Offline
Зарегистрирован: 08.10.2013

Подцепил отдельное питание 5В на шилд. Проблема осталась. Нету линка. Попытки типа есть. Светодиоды пытаются загорется, но тутже гаснут.

Клапауций
Offline
Зарегистрирован: 10.02.2013

KEROLine пишет:

Подцепил отдельное питание 5В на шилд. Проблема осталась. Нету линка. Попытки типа есть. Светодиоды пытаются загорется, но тутже гаснут.

И, напряжение питания на ногах контроллера шилда и дуино равно 5V?

nmi
Offline
Зарегистрирован: 17.12.2012

Добрый день, скорее всего у Вас  2560 ревизия 1 и Ethernet Shield не оригинал....у них проблемма с автозапуском, т.к используется упрощенная схема автозапуска. Это происходит из за того что сигнал сброса появляется раньше чем питание приходит в норму

Рекомендую заменить 2560 на ревизию 3, если нет возможности сделайте на отдельной платке супервизор питания(1 имс+конденсатор) - который будет сбрасывать мегу  через 20-30 мс после появления напряжения на 5 вольт....делов на 15 минут.

Программным способом вы не победите, так как микроконтроллер не запускается либо запускается непонятно с какого места в адресном пространстве, соответственно система команд слетает.....

 

MaksMS
Offline
Зарегистрирован: 11.03.2013

Чего именно не стартует ? Ethernet шилд или мега ?

 

Есть у меня одна MEGA 2560 -запускается не сразу ,надо подождать

А так же есть Ethernet шилд на WD5100 -он требудет сброса.До этого был заказан такой же шилд в том же магазине и с ним проблем не было..

Решается электролитом на reset

GothThug
GothThug аватар
Offline
Зарегистрирован: 07.09.2014

Хоть тема и старая, я всеже дополню, у меня мега и китайский шилд всё работает, вот мой исходник, брал тоже с сайта какогото, и чесно не помню но вроде тоже допиливать пришлось....



#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес
byte ip[] = { 192, 168, 100, 2 }; // IP адрес (В броузере вводим 192.168.0.2)
EthernetServer server(80);

int numPins = 8;
int pins[] = { 2, 3, 4, 5, 6, 7, 8, 9 };    // Пины для реле
int pinState[] = { 1, 1, 1, 1, 1, 1, 1, 1 };  // Состояние пинов

void setup()
{ 
  // Изначально выключаем все реле
  for (int i = 1; i < numPins; i++)
  {
    pinMode(pins[i], OUTPUT);
    digitalWrite(pins[i], 0);
  }
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop()
{
 EthernetClient client = server.available();
  if (client)
  {
    // Проверяем подключен ли клиент к серверу
    while (client.connected())
    {
   // Проверяем идет ли запрос к серверу
      int dataCount = client.available();
      if (dataCount > 0)
      {
        // Считываем данные передаваемые серверу с клиента (броузера)
        for (int i = 0; i < dataCount; i++)
        {
          char ch = client.read();
          // Если данные передаются, то они будут переданы POST запросом, который начинается с символа 'P'
          if (i == 0 && ch != 'P')
            break;
          if (ch == '\n' && i < dataCount - 1)
          {
             // Находим строку, в которой содержатся передаваемые данные
             char chNext = client.read();
             // Формат строки r2=on&r3=on&r4=on (Пример если нужно включены 2,3,4 реле)
             if (chNext == 'r')
             {
               // Выключаем все реле
               pinState[0] = 0;
               pinState[1] = 0;
               pinState[2] = 0;
               pinState[3] = 0;
               pinState[4] = 0;
               pinState[5] = 0;
               pinState[6] = 0;
               pinState[7] = 0;
               // Считываем первый номер реле, который нужно включить
               char relayNum = client.read();
               pinState[relayNum-'0'] = 1;
               Serial.write(relayNum);
               // Считываем вспомогательную информацию (=on&)
               relayNum = client.read();
               relayNum = client.read();
               relayNum = client.read();
               relayNum = client.read();
               // Пока есть данные об остальных реле, считываем и заносим в массив pinState
               while (relayNum != -1)
               {
                  relayNum = client.read();
                  relayNum = client.read(); // по логике нужно продублировать
                  pinState[relayNum-'0'] = 1;
                  Serial.write(relayNum);
                  relayNum = client.read();
                  relayNum = client.read();
                  relayNum = client.read();
                  relayNum = client.read();
               }
             } else
             {
                // Если не было передано данных, то выключаем все реле
                pinState[0] = 0;
                pinState[1] = 0;
                pinState[2] = 0;
                pinState[3] = 0;
                pinState[4] = 0;
                pinState[5] = 0;
                pinState[6] = 0;
                pinState[7] = 0;
             }
          }
        }
      }
      // В соответствие с переданными данными включаем реле
      for (int i = 0; i < 8; i++)
      {
         digitalWrite(pins[i], !pinState[i]);
      }
      // Выводим HTML страницу, на которой пользователь может включить или выключить нужные ему реле
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html");
      client.println();
      client.println("<html>");
      client.println("<head>");
      client.println("<title>Relay.</title>");
      client.println("</head>");
      client.println("<body>");
      client.println("<h3>Relay.</h3>");
      client.println("<form method='post'>");
      client.print("<div>Relay 1 <input type='checkbox' ");      
      if (pinState[0] == 1)
        client.print("checked");
      client.println(" name='r0'></div>");
      client.print("<div>Relay 2 <input type='checkbox' ");
      if (pinState[1] == 1)
        client.print("checked");
      client.println(" name='r1'></div>");
      client.print("<div>Relay 3 <input type='checkbox' ");
      if (pinState[2] == 1)
        client.print("checked");
      client.println(" name='r2'></div>");
      client.print("<div>Relay 4 <input type='checkbox' ");
      if (pinState[3] == 1)
        client.print("checked");
      client.println(" name='r3'></div>");
      client.print("<div>Relay 5 <input type='checkbox' ");
      if (pinState[4] == 1)
        client.print("checked");
      client.println(" name='r4'></div>");  
      client.print("<div>Свет на кухне<input type='checkbox' ");
      if (pinState[5] == 1)
        client.print("checked");
      client.println(" name='r5'></div>");  
      client.print("<div>туалет<input type='checkbox' ");
      if (pinState[6] == 1)
       client.print("checked");
      client.println(" name='r6'></div>"); 
      client.print("<div>Вентиляция <input type='checkbox' "); 
      if (pinState[7] == 1)
        client.print("checked");
      client.println(" name='r7'></div>"); 
       client.println("<input type='submit' value='Refresh'>");
      client.println("</form>");
      client.println("</body>");
      client.println("</html>");
      client.stop(); 
    }
  }
}

 

std
Offline
Зарегистрирован: 05.01.2012

сап /p/, братишки!

std пытается победить то же самое с RF24, поэтому внимание вопрос: скока вешать в граммах сколько точно ёмкость электролита на reset? От reset до плюса сейчас резистор 10k.

Или одновибратор на 555 обязателен?

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Эксперементально, чем больше емкость, тем дольше она будет заряжаться и тем дольше ресет будет прижат к земле, весь вопрос в том, чтобы она успела разрядиться, при кратковременном пропадании питания.