Не удается включить Arduino Uno + Ethernet Shield с USB-разъема, отличного от компьютера

Мне удалось написать скетч для Ethernet Shield и Arduino. Если я подключу его к USB-порту компьютера, он заработает.

Но если я подключу к любому другому источнику питания, например USB-адаптер питания от iPhone или лабораторный источник питания к розетке, он не будет работать.

Светодиоды издают различные странные вспышки, сильно отличающиеся от питания от компьютера.

В чем может быть причина?

ОБНОВЛЕНИЕ

Я обновил скетч, чтобы он не относился к сериалу:

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

// Введите ниже MAC-адрес и IP-адрес вашего контроллера.
// IP-адрес будет зависеть от вашей локальной сети:
// B6-62-C5-CC-48-81
byte mac[] = {
  0xB6, 0x62, 0xC5, 0xCC, 0x48, 0x81
};
IPAddress ip(192, 168, 10, 90);

// Инициализируем библиотеку сервера Ethernet
// с IP-адресом и портом, который вы хотите использовать
// (порт 80 по умолчанию для HTTP):
EthernetServer server(80);

long requestCount = 0;
long upCounts[] = {0, 0, 0, 0, 0, 0};
long downCounts[] = {0, 0, 0, 0, 0, 0};
int currVals[] = {0, 0, 0, 0, 0, 0};
int prevStats[]= {0, 0, 0, 0, 0, 0};
int upThreshold = 1024-32;
int downThreshold = 32;



void setup() {
  // Открытие последовательной связи и ожидание открытия порта:
// Serial.begin(9600);
// пока (!Серийный) {
// ; // ждем подключения последовательного порта. Требуется только для родного порта USB
// }


  // запускаем соединение Ethernet и сервер:
  Ethernet.begin(mac, ip);
  server.begin();
// Serial.print("сервер находится по адресу");
// Serial.println(Ethernet.localIP());
}


void loop() {

  for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
    int sensorReading = analogRead(analogChannel);
    currVals[analogChannel] = sensorReading;

    if( prevStats[analogChannel] == 0 ) {
      if( currVals[analogChannel] >= upThreshold ) {
        prevStats[analogChannel] = 1;
        if( requestCount>0 ) {
          upCounts[analogChannel] ++;
        }
      }
    }
    else {
      if( currVals[analogChannel] < downThreshold ) {
        prevStats[analogChannel] = 0;
        if( requestCount>0 ) {
          downCounts[analogChannel] ++;
        }
      }
    }
  }


  // прослушивание входящих клиентов
  EthernetClient client = server.available();
  if (client) {
    //Serial.println("новый клиент");
    // HTTP-запрос заканчивается пустой строкой
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        //Серийный.запись(с);
        // если вы дошли до конца строки (получили перевод строки
        // символ) и строка пуста, HTTP-запрос завершился,
        // чтобы вы могли отправить ответ
        if (c == '\n' && currentLineIsBlank) {
          // отправляем стандартный HTTP-заголовок ответа
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // соединение будет закрыто после завершения ответа
          client.println("Refresh: 2");  // автоматически обновлять страницу каждые 2 секунды

          client.print("X-Inthemoon-Request-Count: ");  
          client.println(requestCount);
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            client.print("X-Inthemoon-Analog-To-Digital: ");  
            client.print("Channel=");
            client.print(analogChannel);
            client.print("; ");
            client.print("Min-Value=0; ");
            client.print("Max-Value=1023; ");
            client.print("Value=");
            client.print(currVals[analogChannel]);
            client.print("; ");
            client.print("Up-Change-Count=");
            client.print(upCounts[analogChannel]);
            client.print("; ");
            client.print("Down-Change-Count=");
            client.print(downCounts[analogChannel]);
            client.println(";");
          }


          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // вывод значения каждого аналогового входного вывода
          client.print("Was counting: ");
          if( requestCount>0 ) {
            client.print("YES (request count is ");
            client.print(requestCount);
            client.print(")");
          }
          else {
            client.print("NO");
          }
          client.println("<br />");
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(currVals[analogChannel]);
            client.print(", up changes count is ");
            client.print(upCounts[analogChannel]);
            client.print(", and down changes count is ");
            client.print(downCounts[analogChannel]);
            client.println("<br />");
          }
          client.println("</html>");

          requestCount++;
          break;
        }
        if (c == '\n') {
          // вы начинаете новую строку
          currentLineIsBlank = true;
        } else if (c != '\r') {
          // вы получили символ в текущей строке
          currentLineIsBlank = false;
        }
      }
    }
    // дать веб-браузеру время для получения данных
    delay(1);
    // закрыть соединение:
    client.stop();
    //Serial.println("клиент отключен");
  }
}

Ситуация та же:

https://youtu.be/vypaNOxZ5KI

Он подключен к планшету Samsung с питанием от USB 2А, поэтому маловероятная причина - недостаточный ток.

ОБНОВЛЕНИЕ 2

Я также пытался удалить включение SPI.h

ОБНОВЛЕНИЕ 3

Если я подключу другую плату Arduino (но того же производителя, она с AliExpress), поведение будет таким же.

ОБНОВЛЕНИЕ 4

Я собрал пример мигания, и он работает в любой комбинации. Если я подключаю экран Ethernet, то он мигает обоими светодиодами на плате Arduino и на экране Ethernet.

ОБНОВЛЕНИЕ 5

Я купил другую плату Ethernet, и она тоже не работает.

Пожалуйста, помогите. Кто-нибудь когда-нибудь питал Arduino + Ethernet не от USB?

, 👍2

Обсуждение

Это в принципе неопровержимо. Либо вашему программному обеспечению для работы требуется связь с хост-компьютером, либо какая-то часть установки не соответствует описанию., @Chris Stratton

Программное обеспечение - это просто образец Ethernet отсюда: https://www.arduino.cc/en/Tutorial/WebServer. Это правда, что оно содержит запись в последовательный порт. Это может объяснить мою ситуацию?, @Dims

Будут ли индикаторы состояния экрана Ethernet такими же, если вы отсоедините сетевой кабель?, @Mikael Patel

@MikaelPatel определенно нет. Если кабеля Ethernet нет, то горит только индикатор питания. Если кабель ETH подключен, то другой зеленый светодиод лопается. Но не так, как при работе платы (при подключении компьютера по USB)., @Dims

«Кто-нибудь когда-нибудь питал Arduino + Ethernet не от USB?» — да, у меня есть один, подключенный к настенной розетке и подключенный к сети (ethernet). В такой конфигурации точно работает., @Nick Gammon

«Он подключен к планшету Samsung с питанием от USB 2А, поэтому недостаточный ток является маловероятной причиной». - Я только что измерил работу своей карты Uno и Ethernet, и они потребляли около 200 мА тока., @Nick Gammon

Пробовали ли вы измерять напряжение на плате в другой конфигурации? Это помогло бы выбрать между аппаратной и программной проблемой (хотя обновление 4 заставляет меня думать о ПО), @Julien

@Julien, где измерять при подключении к компьютеру?, @Dims

@Julien, можешь проверить SW, что там может быть не так?, @Dims

Между контактами GND и 5V на заголовке. У вас должно быть от 4,5 до 5,5 на компьютере. Интересный замер на неработающих источниках питания. Я не видел ничего очевидного в источнике. Вам нужно будет научиться отлаживать ;), @Julien

@Julien, не могли бы вы дать несколько советов о том, как отлаживать в моей ситуации?, @Dims

@Dims Вы измеряли напряжение? Я думаю, что когда Ethernet включается, пиковое потребление тока приводит к сбросу устройства. Попробуйте также нажать кнопку сброса вместо того, чтобы просто подключить USB. это дает ту же проблему? Для отладки, поскольку проблема возникает только без подключения к компьютеру, мы не можем использовать печать. Вы можете попробовать добавить некоторые 1-секундные задержки и мигание светодиода до и после «критического» вызова функции, чтобы увидеть, выполняется ли код, если устройство перезагружается (или записывает некоторые флаги в EEPROM)., @Julien


4 ответа


0

Не должно быть абсолютно никакой разницы между питанием Arduino от USB-порта компьютера или сетевой розетки, особенно если вы держите последовательный монитор закрытым.

Итак, вот процедура отладки, которую я бы посоветовал:

  1. отключить экран
  2. подключите Arduino и загрузите прошивку с помощью

    • никаких вызовов Serial, но самое главное, чего следует избегать, — это цикл while в функции setup().

    • короткое мигание светодиода (вы можете использовать встроенный, если хотите) каждый раз, когда функция loop() выполняет итерацию

  3. включите Arduino (без прикрепленного экрана) от компьютера без последовательных консолей и убедитесь, что светодиод мигает через равные промежутки времени
  4. включите Arduino (без прикрепленного экрана) от настенной розетки и убедитесь, что светодиод мигает через равные промежутки времени
  5. отключите вилку от розетки, подключите защитную панель Ethernet без кабеля Ethernet, снова подсоедините вилку и убедитесь, что индикатор debug и все светодиоды на защитной панели мигают, как ожидается
  6. подключите кабель Ethernet, нажмите кнопку сброса Arduino и убедитесь, что все светодиоды мигают должным образом

Возможные ошибки, о которых я сейчас думаю:

  • ШАГ 3
    • прошивка на вашей плате неверна: еще раз проверьте, что процесс компиляции и загрузки успешно завершен, и в консоли Arduino IDE нет ошибок
  • ШАГ 4
    • микропрограмма по-прежнему содержит некоторый код, который ожидает ввода данных с последовательной консоли: начните открывать библиотеки, которые вы используете, для поиска такого кода
    • напряжение, измеренное на плате между контактами GND и 5V, недостаточное, и плата становится коричневой: проверьте, что напряжение выше 4,5 В и кабель USB не поврежден или неисправен
  • ШАГ 5
    • некоторая часть кода внутри библиотеки Ethernet Shield пытается считать данные из последовательного соединения: проверьте код библиотеки еще раз
    • некоторые компоненты ethernet-шилда неисправны, и они потребляют достаточно тока от вашей настенной бородавки, чтобы на самом деле заставить вашу плату перейти в режим защиты (трудно поверить, серьезная розетка на 2 А должна быть гораздо лучший источник питания, чем ваш компьютер)
  • ШАГ 6
    • то же, что и в шаге 5, но может играть роль кабель Ethernet.

Возможно, это не ответ сам по себе, но он может помочь вам найти нужный ответ.

,

Это не сработает, код предназначен для запуска Ethernet-экрана и может блокироваться навсегда в какой-то момент, если щита нет. Более того, Димс уже писал, что простой блинк-код работает как со щитом, так и без него. Проблема возникает только при использовании библиотеки Ethernet., @Julien

@ Джулиен, я не открывал библиотеку Ethernet, поэтому я не могу утверждать, что вы правы или ошибаетесь, когда говорите, что _может блокироваться навсегда_, но я верю, что он может попробовать это сделать. Кроме того, он сказал, что плата мигает _с скетчем мигания_, но я предлагаю использовать светодиодный импульс в начале его функции loop() в качестве меры отладки... что-то, что вы также предложили в комментариях., @Roberto Lo Giacco


2

Извините, я не видел этого раньше, но я подозреваю, что у вас плохая земля, потому что:

  1. Он работает с ПК
  2. Вы используете настенную бородавку
  3. Вы подключаете плату к другому источнику электроэнергии (Ethernet)
  4. Вы говорите, что светодиоды мигают по-разному.

Проложите кабель от разъема GND на плате к точке заземления.
(Возможно, виноват Ethernet, но если у вас нет доступа к коммутатору, я не знаю, как вы могли бы правильно его заземлить)

,

Действительно, отнеси плату к другу домой, проверь, не бывает ли и там., @Paul

Хорошая идея, попробуем!, @Dims


0

Возможно, ваш лабораторный источник питания низкого качества. USB компьютера является хорошим источником питания. Попробуйте использовать батарею 4x1.5v AA. Я использовал эту настройку с arduino+ethernet Shield+дешевым сервоприводом.

,

Пробовал все, в том числе и это., @Dims

Возможно, часть питания вашего ардуино сломана. У вас есть еще один для тестирования?, @BOC


0

У меня тоже была эта проблема с Mega. Он работал с моим пакетом SCADA, работал на Linux, и вы могли пинговать плату Mega/Ethernet, но потом что-то изменилось, и он не запускался/читался через порт ehternet. Было два устройства, и оба вели себя одинаково.

При подключении к ноутбуку для программирования (под управлением W7) и порту Ethernet, а также при запущенном последовательном мониторе функции Ethernet будут работать. Включение и переподключение через usb-порт W7 не сработает. Попытался удалить все вызовы Serial.print(ln) через if Debug type logic , проблема не устранена.

Восстановление серийных сообщений не изменило поведение.

"Решение" состоит в том, чтобы нажать кнопку сброса на плате Ethernet после включения питания, независимо от источника питания. Общий сброс стека с помощью контактов сброса не работает, это должна быть кнопка сброса на модуле Ethernet.

Сделал это через блок, подключенный к Linux-машине, и мгновенно получил пинг, а система SCADA считывает данные.

Если кто-нибудь может пролить больше света на необходимость сброса модуля Ethernet после включения питания, я был бы рад.

,