Проблемы с Ethernet Shield (неисправный экран?!)

Я новичок в использовании Arduino Ethernet Shield v2 (код продукта Arduino A000024), и я наблюдаю странное поведение при выполнении важной работы со строгими сроками.

В этом проекте некоторые Arduino (как UNO, так и MEGA2560) отправляют данные датчиков через OSC на пару целевых ПК для последующей обработки.

Для этого я использую довольно простую в использовании библиотеку Arduino OSC, CNMAT.

Я заметил этот факт, который, я думаю, связан с какой-то аппаратной неисправностью.

Я обнаружил, что мой код зависает даже при правильной настройке локальной сети. Код перестает работать, перестает отправлять сообщения OSC, экран Ethernet больше недоступен с помощью ping. Это сохраняется также после повторной загрузки кода или ручного сброса платы Arduino. Сначала я думал, что это моя вина, но я обнаружил, что, заменив щит на другой, проблема волшебным образом исчезла. На одном из проблемных щитов я также испытал много непрерывных отключений и запусков Arduino каждые 5 секунд (перезапуск прошивки из установки)!

Известно, что эти экраны Ethernet неисправны или имеют какие-либо проблемы? Странно то, что я столкнулся с этой проблемой на 3 из 8: это суперкритично! Испытывали ли вы нечто подобное? Знаете ли вы, что подобные проблемы возникали раньше?


Для целей отладки, вот тест кода, который я написал и попробовал на одном Arduino UNO, всегда одном и том же, используя одну и ту же настройку локальной сети (кабель Ethernet, IP-адреса, коммутатор Ethernet), переключая два разных экрана Ethernet:

/* NET stuff ********************************************/
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
EthernetUDP Udp;

IPAddress ip(10, 3, 3, 210); // IP-адрес Arduino
byte mac[] = { 0xA8, 0x61, 0x0A, 0xAE, 0x83, 0xCE };

#define DELAY 1000

// НАСТРАИВАТЬ /////////////////////////////////////////////// ////////////////////
void setup() {
  
  Serial.begin( 115200 );
  Serial.println("setup");

  // Утилиты Ethernet и OSC ****************************
  Ethernet.begin(mac, ip);

  // Проверка состояния оборудования
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.");
  }
  else if (Ethernet.hardwareStatus() == EthernetW5100) {
    Serial.println("W5100 Ethernet controller detected.");
  }
  else if (Ethernet.hardwareStatus() == EthernetW5200) {
    Serial.println("W5200 Ethernet controller detected.");
  }
  else if (Ethernet.hardwareStatus() == EthernetW5500) {
    Serial.println("W5500 Ethernet controller detected.");
  }

  //Сообщает вам, активна ли ссылка.
  // LinkOFF может указывать на то, что кабель Ethernet отключен или неисправен.
  if (Ethernet.linkStatus() == Unknown) {
    Serial.println("Link status unknown. Link status detection is only available with W5200 and W5500.");
  }
  else if (Ethernet.linkStatus() == LinkON) {
    Serial.println("Link status: On");
  }
  else if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Link status: Off");
  }

  while( Ethernet.linkStatus() == LinkOFF ) {
    delay( DELAY );
  }
}

// ПЕТЛЯ /////////////////////////////////////////////// /////////////////////
void loop() 
{

  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.print("Ethernet link broken!\t");
    Serial.println("please connect the Ethernet cable");
    delay( DELAY );
    return;
  }
  
  Serial.println("LOOP working as expected!");
  delay( DELAY );
}

Когда я пробую этот код, используя "дефектный" Arduino Ethernet Shield Serial Monitor печатает что-то вроде этого (обратите внимание, что я ничего не делаю, я оставляю все нетронутым):

[...]
14:25:17.906 -> setup
14:25:18.471 -> W5500 Ethernet controller detected.
14:25:18.471 -> Link status: On
[...]
14:26:41.545 -> LOOP working as expected!
14:26:42.542 -> LOOP working as expected!
14:26:43.538 -> LOOP working as expected!
14:26:44.535 -> Ethernet link broken!   please connect the Ethernet cable
14:26:45.531 -> LOOP working as expected!
14:26:46.561 -> LOOP working as expected!
14:26:47.558 -> LOOP working as expected!
14:26:48.555 -> LOOP working as expected!
14:26:49.552 -> Ethernet link broken!   please connect the Ethernet cable
14:26:50.549 -> LOOP working as expected!
14:26:51.546 -> LOOP working as expected!
14:26:52.543 -> LOOP working as expected!
14:26:53.540 -> LOOP working as expected!
14:26:54.570 -> LOOP working as expected!
14:26:55.567 -> Ethernet link broken!   please connect the Ethernet cable
14:26:56.564 -> LOOP working as expected!
14:26:57.561 -> LOOP working as expected!
14:26:58.557 -> LOOP working as expected!
14:26:59.553 -> Ethernet link broken!   please connect the Ethernet cable
14:27:00.550 -> Ethernet link broken!   please connect the Ethernet cable
14:27:01.546 -> LOOP working as expected!
14:27:02.576 -> Ethernet link broken!   please connect the Ethernet cable
14:27:03.572 -> LOOP working as expected!
14:27:04.569 -> LOOP working as expected!
14:27:05.566 -> LOOP working as expected!
14:27:06.563 -> LOOP working as expected!
14:27:07.560 -> LOOP working as expected!
14:27:08.557 -> LOOP working as expected!
14:27:09.587 -> LOOP working as expected!
14:27:10.583 -> Ethernet link broken!   please connect the Ethernet cable
14:27:11.580 -> LOOP working as expected!
14:27:12.577 -> LOOP working as expected!
[...]

Тем временем пинг перестает работать и не будет работать снова, пока я не перезагружу Arduino:

[...]
64 bytes from 10.3.3.210: icmp_seq=301 ttl=128 time=0.185 ms
64 bytes from 10.3.3.210: icmp_seq=302 ttl=128 time=0.171 ms
64 bytes from 10.3.3.210: icmp_seq=303 ttl=128 time=0.184 ms
64 bytes from 10.3.3.210: icmp_seq=304 ttl=128 time=0.229 ms
64 bytes from 10.3.3.210: icmp_seq=305 ttl=128 time=0.206 ms
64 bytes from 10.3.3.210: icmp_seq=306 ttl=128 time=0.278 ms
64 bytes from 10.3.3.210: icmp_seq=307 ttl=128 time=0.143 ms
64 bytes from 10.3.3.210: icmp_seq=308 ttl=128 time=0.229 ms
64 bytes from 10.3.3.210: icmp_seq=309 ttl=128 time=0.198 ms 
From 10.3.3.165 icmp_seq=335 Destination Host Unreachable
From 10.3.3.165 icmp_seq=336 Destination Host Unreachable
From 10.3.3.165 icmp_seq=339 Destination Host Unreachable
From 10.3.3.165 icmp_seq=342 Destination Host Unreachable
From 10.3.3.165 icmp_seq=343 Destination Host Unreachable
From 10.3.3.165 icmp_seq=344 Destination Host Unreachable
[...]

Как вы видите, "Ссылка" кажется, снова и снова. Я не знаю, почему с этого момента. Я ничего не меняю в настройке сети (кабель локальной сети или что-то в этом роде).

Я не знаю, почему проверка связи перестает работать и не будет работать снова, даже если последовательный монитор сообщает, что LINK включен.

Дайте мне знать, как только сможете, и большое спасибо за вашу помощь и поддержку.

лучшие

нет

PS: я задавал аналогичный вопрос на форуме Arduino, но не мог понять, что это за проблема --> ссылка

ОБНОВЛЕНИЕ 02.11.2021

Я написал новый скетч кода, чтобы всегда печатать статус ссылки. Вот оно.

    /* NET stuff ********************************************/
    #include <SPI.h>
    #include <Ethernet.h>
    #include <EthernetUdp.h>
    EthernetUDP Udp;
    
    IPAddress ip(10, 3, 3, 210); // IP-адрес Arduino
    byte mac[] = { 0xA8, 0x61, 0x0A, 0xAE, 0x83, 0xD5 };
    
    #define DELAY 1000
    
    // НАСТРАИВАТЬ /////////////////////////////////////////////// ////////////////////
    void setup() {
      
      Serial.begin( 115200 );
      Serial.println("setup");
    
      // Утилиты Ethernet и OSC ****************************
      Ethernet.begin(mac, ip);
    
      // Проверка состояния оборудования
      if (Ethernet.hardwareStatus() == EthernetNoHardware) {
        Serial.println("Ethernet shield was not found.");
      }
      else if (Ethernet.hardwareStatus() == EthernetW5100) {
        Serial.println("W5100 Ethernet controller detected.");
      }
      else if (Ethernet.hardwareStatus() == EthernetW5200) {
        Serial.println("W5200 Ethernet controller detected.");
      }
      else if (Ethernet.hardwareStatus() == EthernetW5500) {
        Serial.println("W5500 Ethernet controller detected.");
      }
    
      //Сообщает вам, активна ли ссылка.
      // LinkOFF может указывать на то, что кабель Ethernet отключен или неисправен.
      if (Ethernet.linkStatus() == Unknown) {
        Serial.println("Link status unknown. Link status detection is only available with W5200 and W5500.");
      }
      else if (Ethernet.linkStatus() == LinkON) {
        Serial.println("Link status: On");
      }
      else if (Ethernet.linkStatus() == LinkOFF) {
        Serial.println("Link status: Off");
      }
    
      while( Ethernet.linkStatus() == LinkOFF ) {
        Serial.println("\tplease connect the Ethernet cable");
        delay( DELAY );
      }
    }
    
    // ПЕТЛЯ /////////////////////////////////////////////// /////////////////////
    void loop() 
    {
    
      int LINK_STATUS = Ethernet.linkStatus();
      
      if ( LINK_STATUS == LinkOFF) {
        Serial.print("Ethernet link broken!\t");
        Serial.println("please connect the Ethernet cable");
        delay( DELAY );
        return;
      } else if( LINK_STATUS == Unknown ) {
        Serial.println("LINK_STATUS: Unknown");
        delay( DELAY );
        return;
      } else if( LINK_STATUS == LinkON ) {
        Serial.println("LOOP working as expected! (LINK_STATUS: ON)");
      }
      
      delay( DELAY );
    }

Через некоторое время он выдал мне этот вывод на последовательном мониторе (в то же время ping сказал: «Хост назначения недоступен»):

[...]
10:57:21.207 -> LOOP working as expected! (LINK_STATUS: ON)
10:57:22.203 -> LOOP working as expected! (LINK_STATUS: ON)
10:57:23.200 -> LOOP working as expected! (LINK_STATUS: ON)
10:57:24.197 -> LOOP working as expected! (LINK_STATUS: ON)
10:57:25.195 -> Ethernet link broken!   please connect the Ethernet cable
10:57:26.192 -> LOOP working as expected! (LINK_STATUS: ON)
10:57:27.188 -> LOOP working as expected! (LINK_STATUS: ON)
10:57:28.186 -> LOOP working as expected! (LINK_STATUS: ON)
10:57:29.216 -> Ethernet link broken!   please connect the Ethernet cable
10:57:30.213 -> Ethernet link broken!   please connect the Ethernet cable
10:57:31.210 -> Ethernet link broken!   please connect the Ethernet cable
10:57:32.207 -> Ethernet link broken!   please connect the Ethernet cable
10:57:33.204 -> LOOP working as expected! (LINK_STATUS: ON)
10:57:34.202 -> Ethernet link broken!   please connect the Ethernet cable
10:57:35.198 -> Ethernet link broken!   please connect the Ethernet cable
10:57:36.194 -> Ethernet link broken!   please connect the Ethernet cable
10:57:37.224 -> Ethernet link broken!   please connect the Ethernet cable
10:57:38.221 -> Ethernet link broken!   please connect the Ethernet cable
10:57:39.219 -> LOOP working as expected! (LINK_STATUS: ON)
10:57:40.216 -> LOOP working as expected! (LINK_STATUS: ON)
10:57:41.213 -> LOOP working as expected! (LINK_STATUS: ON)
10:57:42.210 -> LOOP working as expected! (LINK_STATUS: ON)
10:57:43.207 -> LOOP working as expected! (LINK_STATUS: ON)
10:57:44.236 -> LOOP working as expected! (LINK_STATUS: ON)
10:57:45.232 -> Ethernet link broken!   please connect the Ethernet cable
10:57:46.228 -> LOOP working as expected! (LINK_STATUS: ON)
10:57:47.225 -> LOOP working as expected! (LINK_STATUS: ON)
10:57:48.222 -> LOOP working as expected! (LINK_STATUS: ON)
10:57:49.218 -> Ethernet link broken!   please connect the Ethernet cable
10:57:50.216 -> Ethernet link broken!   please connect the Ethernet cable
10:57:51.212 -> Ethernet link broken!   please connect the Ethernet cable
10:57:52.242 -> Ethernet link broken!   please connect the Ethernet cable
10:57:53.239 -> Ethernet link broken!   please connect the Ethernet cable
10:57:54.235 -> Ethernet link broken!   please connect the Ethernet cable
10:57:55.231 -> Ethernet link broken!   please connect the Ethernet cable
10:57:56.227 -> Ethernet link broken!   please connect the Ethernet cable
[...]

Добавление некоторых новых элементов здесь. Я также заметил, что иногда, даже если статус LINK включен, пинг не работает. Мне почти ясно, что эти две вещи совершенно не коррелированы.

Я провел несколько экспериментов по изменению MAC-адреса (устанавливая MAC-адрес, отличный от того, который я вижу на наклейке на шилде). "неправильно" MAC-адрес, похоже, не является причиной проблем. Может ли быть так, что неправильная конфигурация MAC-адреса в прошивке Arduino может привести к неправильной работе?

Я также предпринял много попыток отсоединить и повторно подключить кабель Ethernet к шилду, не выключая Arduino, и столкнулся с рядом различных ситуаций.

1A) отсоединение кабеля Ethernet:

  • Серийный монитор печатает: "Связь Ethernet прервана! подключите кабель Ethernet"
  • пинг прекращается;

1B) повторное подключение кабеля Ethernet:

  • на последовательном мониторе LinkOn и LinkOff чередуются между собой, а затем "LOOP работает как положено! (LINK_STATUS: ВКЛ)" становится стабильным;
  • ping по-прежнему печатает сообщение «Хост назначения недоступен»;

2) сброс платы Arduino (не сброс на шилде)

  • Последовательный монитор: "LOOP работает как положено! (LINK_STATUS: ВКЛ)"
  • ping снова работает;

3A) Попытка повторить ту же процедуру, что и раньше (1A). Отключение кабеля Ethernet:

  • Серийный монитор выводит сообщение "Связь Ethernet прервана! подключите кабель Ethernet";
  • пинг прекращается;

3B) повторное подключение кабеля Ethernet:

  • на последовательном мониторе LinkOn и LinkOff чередуются между собой, а затем "LOOP работает как положено! (LINK_STATUS: ВКЛ)" становится стабильным;
  • ping снова работает (поведение отличается от того, что было раньше!!!);

Мне действительно сложно отлаживать эту проблему. Кажется, здесь нужно учитывать множество переменных, которые я не могу контролировать: если я повторяю одну и ту же процедуру снова и снова, поведение меняется.

Я не уверен, зависит ли это от платы, от чипа W5500, может быть, от других вещей, происходящих в сети. Возможно ли это?

Я не знаю, как написать код для обнаружения этих неисправностей.

Большое спасибо за помощь. нет

, 👍2

Обсуждение

когда ваш код печатает «LOOP работает как положено!», фактический статус не указывается, за исключением того, что это не LinkOFF, @jsotola

У меня были аналогичные проблемы с экраном Ethernet V2, которые, вероятно, были вызваны (неиспользуемым) интерфейсом SD-карты на экране Ethernet V2, мешающим функциям Ethernet (оба используют шину SPI). Я решил эту проблему, явно отключив интерфейс SD-карты CS (установив для контакта 4 высокий уровень) в начале моего кода setup() с помощью: #define SDSelect 4 pinMode (SDSelect, ВЫХОД); digitalWrite (SDSelect, HIGH); Это решило мои проблемы., @StarCat

Спасибо @StarCat за совет! Я попробовал это на «дефектном» щите, и на самом деле дела идут немного лучше. Теперь последовательный монитор всегда сообщает о статусе канала как о включенном (без странного переключения состояния ON-OFF-ON). Но сегодня, после двух дней непрерывного "пинга" экрана Ethernet с моего ноутбука, консоль сообщает мне `icmp_seq=10493 Destination Host Unreachable`. Пинг снова работает, если я делаю ручной сброс Arduino. Почему? Есть ли на W5500 какой-то буфер, который со временем заполняется и из-за этого не дает работать пингу?, @orestino


1 ответ


Лучший ответ:

3

У меня были аналогичные проблемы с экраном Ethernet V2, которые, вероятно, были вызваны (неиспользуемым) интерфейсом SD-карты на экране Ethernet V2, мешающим работе Ethernet (оба используют шину SPI).

Из того, что я мог видеть в схемах EthernetShield2, нет подтягивания сигнала, управляющего выбором чипа SD-карты (D4/SD_CS), что означает, что неинициализированный вывод ввода-вывода на стороне Arduino может потенциально вызвать случайный шум на входе SD CS.

Мое решение состояло в том, чтобы явно отключить интерфейс SD-карты CS, установив вывод 4 на высокий в начале моего кода настройки ().

Я использовал следующий код:

#define SDSelect  4

... Other initialization code

setup() {
    pinMode (SDSelect, OUTPUT);
    digitalWrite (SDSelect, HIGH);

    ... Code continues ...

Это решило мои проблемы со случайными сбоями. Я понимаю, что не могу вспомнить, была ли в то время в слоте SD-карта.

,