Проблемы с 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, может быть, от других вещей, происходящих в сети. Возможно ли это?
Я не знаю, как написать код для обнаружения этих неисправностей.
Большое спасибо за помощь. нет
@orestino, 👍2
Обсуждение1 ответ
Лучший ответ:
У меня были аналогичные проблемы с экраном 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-карта.
- Подключение Arduino ethernet shield (ip-адрес - 0.0.0.0)
- Как подключить Arduino и базу данных MySQL сервера WAMP?
- Разбор HTTP с аутентификацией в Arduino + Ethernet Shield
- Nano не может получить ответ от ENC28J60 Ethernet Shield
- Как подключить устройство SPI к плате Etherntet на Arduino Uno
- Shield Ethernet: Максимальная скорость
- MQTT на nano с Ethernet Shield не работает
- связь между двумя arduino с помощью ENC28J60?
когда ваш код печатает «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