Arduino Mega + Ethernit shield w5500, зависает SPI
- Войдите на сайт для отправки комментариев
Доброго времени суток!
Допустим в сети есть 2 роутера: Роутер 1 и Роутер 2. Порт WAN роутера 2 подключен в порт LAN роутера 1. Так вот при такой организации сети если ардуину подключить в Lan порт роутера 1, то всё работает нормально, а если подключить в Lan порт роутера 2, то ethenet у ардуины работает примерно 4-5 минуты и перестаёт работать, ардуина полностью не виснет, просто отваливается ethenet и ардуина перестаёт принимать как входящие так и совершать исходящие http запросы до тех пор пока её не перезагрузишь кнопочкой или программно void(* resetFunc) (void) = 0; вот такой строчкой кода. На данный момент выхожу из положения тем что раз в 4 минуты вызывается такая строчка кода: void(* resetFunc) (void) = 0; и ардуина постоянно находится на связи. Может быть кто-то сталкивался с такой проблемой и знает как её решить? Замена шилда не помогает, все шилды 5500 будут иметь такой глюк, другие шилды не пробовал пока.
Роутеры пробовал разные, проблема одна и та же.
Наврядли это проблема Wiznet.
Впрочем, без знания конфигурации сети даже начинать придумывать варианты нет смысла.
Читайте логи роутеров.
Ну, понятно, что тут можно только гадать на кофейной гуще...
Помнится, на w5100 китайцы распаивали резисторы 51 Ом вместо 510 Ом (маркировка SMD резистора на 51 Ом как раз "510"). Может, и здесь что-то похожее.
Такой же эффект зависания кстати происходит если связь с ардуиной будет через wi-fi мост, пробовал 2 модели мостов, ubuntu и mikrotik, то же самое, 5 мин работает и уходит в зависание.
Натравите пример WebClient на гугл. В этом случае пакет пройдёт десятки роутеров и мостов.
дело не в том по какому пути идёт пакет, дело в том какая схема подключения ардуины ну как бы в рамках моей локальной сети
например если воткнуть ардуину напрямую в комп через провод (ethernet) то всё будет нормально работать, а если провод заменить на wi-fi мост то ардуина зависнет, при этом не имеет значения. ардуина будет соединена с вайфай мостом напрямую или же через свич
если например воткнуть комп и ардуину в коммутатор (или даже несколько коммутаторов последовательно соединить) то тоже всё будет нормально работать
если например взять один роутер и воткнуть ардуину в его лан порт, и комп тоже будет подключен к роутеру проводом или по вайфай, то всё будет нормально
если взять ещё один роутер и соединить с первым роутером лан портами, то тоже всё будет нормально и не важно к какому роутеру будет подключена ардуина
но если 2-й роутер будет подключен к 1-му wan портом, а ардуина будет подключена ко 2-му роутеру, то она зависает
и это я опробовал примерно на 30-ти платах и ардуино и w5500, эффект одинаковый... обидно блин
короче заказал чип w5100, посмотрю как он будет работать в проблемных режимах
Судя по вышеописанному (а именно проблеме с WAN-портом), подразумеваю, что не верно настроен Firewall (или вообще не настроен). А так же там всякие PortForward имеется и так далее.
Всем привет почти аналогичная проблема зависают 2 шт ардуино + чип w5100 передают в mqtt в majordomo.
может что-то в коде посмотрите пожалуйста.
#include <SPI.h> // Библиотека SPI шины ПИНЫ ДАТА A4 A5 #include <Ethernet.h> // Ethernet библиотека #include <PubSubClient.h> // Библиотека MQTT #include <OneWire.h> #include <DallasTemperature.h> #include <Wire.h> #include "Adafruit_Si7021.h" #include <Adafruit_Sensor.h> #include <Adafruit_BMP280.h> OneWire oneWire(A3); // пин 3 (a 4.7K resistor is necessary) DallasTemperature ds(&oneWire); Adafruit_BMP280 bmp; // I2C шина Adafruit_Si7021 Si7021 = Adafruit_Si7021(); DeviceAddress sensor1 ={0x28, 0xC3, 0xA5, 0x79, 0xA2, 0x0, 0x03, 0x59};//Спальня Насти DeviceAddress sensor2 ={0x28, 0xA8, 0xD0, 0x79, 0xA2, 0x0, 0x03, 0xDD};//СпальнЯ Сережи DeviceAddress sensor3 ={0x28, 0x87, 0xA1, 0x28, 0x01, 0x0, 0x0, 0x48}; //Мой Кабинет DeviceAddress sensor4 ={0x28, 0xD9, 0xC1, 0x79, 0xA2, 0x0, 0x03, 0xC3};//гардеробная DeviceAddress sensor5 ={0x28, 0x2B, 0xCE, 0xC2, 0x2, 0x0, 0x0, 0xA1};//Гостинная DeviceAddress sensor6 ={0x28, 0xFF, 0xB8, 0x79, 0x97, 0x7, 0x3, 0xDC};//Кухня DeviceAddress sensor7 ={0x28, 0xD, 0xBA, 0xC2, 0x2, 0x0, 0x0, 0xD7};//Спальня DeviceAddress sensor8 ={0x28, 0xE, 0x36, 0xBE, 0x0, 0x0, 0x0, 0x91};//Зал DeviceAddress sensor9 ={0x28, 0x2B, 0xCE, 0xC2, 0x2, 0x0, 0x0, 0xA1};//клодовая DeviceAddress sensor10 ={0x28, 0x93, 0xC5, 0x79, 0xA2, 0x0, 0x3, 0x66};//Парная DeviceAddress sensor11 ={0x28, 0x93, 0xC5, 0x79, 0xA2, 0x0, 0x3, 0x66};//Баня DeviceAddress sensor12 ={0x28, 0xE, 0x36, 0xBE, 0x0, 0x0, 0x0, 0x91}; DeviceAddress sensor13 ={0x28, 0x2B, 0xCE, 0xC2, 0x2, 0x0, 0x0, 0xA1}; DeviceAddress sensor14 ={0x28, 0xFF, 0xB8, 0x79, 0x97, 0x7, 0x3, 0xDC}; DeviceAddress sensor15 ={0x28, 0xFF, 0xB8, 0x79, 0x97, 0x7, 0x3, 0xDC}; DeviceAddress sensor16 ={0x28, 0xFF, 0xB8, 0x79, 0x97, 0x7, 0x3, 0xDC}; // Задаём mac и ip адреса в Локальной сети byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192, 168, 1, 213); //ip Адрес Ethernet Shild'a Arduino IPAddress server(192, 168, 1, 200); //ip Адрес для MQTT Брокера // Шапка Функции Callback (обратный вызов) void callback(char* topic, byte* payload, unsigned int length); EthernetClient ethClient; //Инициализируем Ethernet клиент PubSubClient client(server, 1883, callback, ethClient); //Инициализируем MQTT клиент // Функция Callback void callback(char* topic, byte* payload, unsigned int length) { // Выделяем необходимое кол-во памяти для копии payload byte* p = (byte*)malloc(length); // Копирование payload в новый буфер memcpy(p, payload, length); client.publish("", p, length); // Освобождаем память free(p); } void setup(void) { // delay(50); // Serial.begin(9600); Ethernet.begin(mac, ip); // Инициализируем mac, ip Wire.begin(); ds.begin(); Si7021.begin(); bmp.begin(); bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */ Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */ Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */ Adafruit_BMP280::FILTER_X16, /* Filtering. */ Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */ } void loop(void) { ds.requestTemperatures(); float t1 = ds.getTempC(sensor1); float t2 = ds.getTempC(sensor2); float t3 = ds.getTempC(sensor3); float t4 = ds.getTempC(sensor4); float t5 = ds.getTempC(sensor5); float t6 = ds.getTempC(sensor6); float t7 = ds.getTempC(sensor7); float t8 = ds.getTempC(sensor8); float t9 = ds.getTempC(sensor9); float t10 = ds.getTempC(sensor10); float t11 = ds.getTempC(sensor11); float t12 = ds.getTempC(sensor12); float t13 = ds.getTempC(sensor13); float t14 = ds.getTempC(sensor14); float t15 = ds.getTempC(sensor15); float t16 = ds.getTempC(sensor16); // Считываем и выводим показания температуры float bmpt = bmp.readTemperature(); // Считываем и выводим показания высоты float bmpa = bmp.readAltitude(1013.25); // Считываем и выводим показания атмосверного давления float bmpp = bmp.readPressure(); bmpp = bmpp * 0.00750062; // Преобразуем Паскали в мм.рт.ст. float Si7021H = Si7021.readHumidity();//si7021 получение влажности Перевод в float float Si7021t = Si7021.readTemperature();//si7021 получение температуры Перевод в float static char char_bmpt[10]; // Переменная для перевода из float в char dtostrf(bmpt, 3, 0, char_bmpt); // Перевод из float в char static char char_bmpp[10]; // Переменная для перевода из float в char dtostrf(bmpp, 3, 0, char_bmpp); // Перевод из float в char static char char_bmpa[10]; // Переменная для перевода из float в char dtostrf(bmpa, 3, 0, char_bmpa); // Перевод из float в char static char char_Si7021t[10]; // Переменная для перевода из float в char dtostrf(Si7021t, 3, 2, char_Si7021t); // Перевод из float в char static char char_Si7021H[10]; // Переменная для перевода из float в char dtostrf(Si7021H, 3, 0, char_Si7021H); // Перевод из float в char*/ static char char_temp1[10]; // Переменная для перевода из float в char dtostrf(t1, 3, 2, char_temp1); // Перевод из float в char static char char_temp2[10]; // Переменная для перевода из float в char dtostrf(t2, 3, 2, char_temp2); // Перевод из float в char static char char_temp3[10]; // Переменная для перевода из float в char dtostrf(t3, 3, 2, char_temp3); // Перевод из float в char static char char_temp4[10]; // Переменная для перевода из float в char dtostrf(t4, 3, 2, char_temp4); // Перевод из float в char static char char_temp5[10]; // Переменная для перевода из float в char dtostrf(t5, 3, 2, char_temp5); // Перевод из float в char static char char_temp6[10]; // Переменная для перевода из float в char dtostrf(t6, 3, 2, char_temp6); // Перевод из float в char static char char_temp7[10]; // Переменная для перевода из float в char dtostrf(t7, 3, 2, char_temp7); // Перевод из float в char static char char_temp8[10]; // Переменная для перевода из float в char dtostrf(t8, 3, 2, char_temp8); // Перевод из float в char static char char_temp9[10]; // Переменная для перевода из float в char dtostrf(t9, 3, 2, char_temp9); // Перевод из float в char static char char_temp10[10]; // Переменная для перевода из float в char dtostrf(t10, 3, 2, char_temp10); // Перевод из float в char static char char_temp11[10]; // Переменная для перевода из float в char dtostrf(t11, 3, 2, char_temp11); // Перевод из float в char static char char_temp12[10]; // Переменная для перевода из float в char dtostrf(t12, 3, 2, char_temp12); // Перевод из float в char static char char_temp13[10]; // Переменная для перевода из float в char dtostrf(t13, 3, 2, char_temp13); // Перевод из float в char static char char_temp14[10]; // Переменная для перевода из float в char dtostrf(t14, 3, 2, char_temp14); // Перевод из float в char static char char_temp15[10]; // Переменная для перевода из float в char dtostrf(t15, 3, 2, char_temp15); // Перевод из float в char*/ static char char_temp16[10]; // Переменная для перевода из float в char dtostrf(t16, 3, 2, char_temp16); // Перевод из float в char*/ if (client.connect("TempClient")) { //Отправка данных по MQTT в Брокер client.publish("tNastya", char_temp1); //отправляем в Брокер значения client.publish("tSerg", char_temp2);//отправляем в Брокер значения client.publish("tKabinet", char_temp3); //отправляем в Брокер значения client.publish("tGorderob", char_temp4); //отправляем в Брокер значения client.publish("tZal", char_temp5); //отправляем в Брокер значения client.publish("tGostinaya", char_temp6);//отправляем в Брокер значения client.publish("tSpalnya", char_temp7); //отправляем в Брокер значения client.publish("tKuhnya", char_temp8); //отправляем в Брокер значения*/ client.publish("tTualet", char_temp9); //отправляем в Брокер значения*/ client.publish("tPar", char_temp10); //отправляем в Брокер значения*/ client.publish("tBanaj", char_temp11); //отправляем в Брокер значения*/ client.publish("tRazdevalka", char_temp12); //отправляем в Брокер значения*/ client.publish("tKachegarka", char_temp13); //отправляем в Брокер значения*/ client.publish("tKotel", char_temp14); //отправляем в Брокер значения*/ client.publish("tPodachaPol", char_temp15); //отправляем в Брокер значения*/ client.publish("tObratkaPol", char_temp16); //отправляем в Брокер значения*/ client.publish("bmptemp", char_bmpt); //отправляем в Брокер значения температуры с улицы client.publish("Si7021temp", char_Si7021t); //отправляем в Брокер значения температуры с улицы client.publish("davlenie", char_bmpp); //отправляем в Брокер значения давление client.publish("more", char_bmpa); //отправляем в Брокер значения над уровнем моря client.publish("Humidity", char_Si7021H); //отправляем в Брокер значения давление // Serial.print("Temperature: "); // Serial.print(bmptempvozd); // Serial.print(char_bmpdavlenie); // Serial.print(char_bmpmore); // Serial.print(char_bmptempvozd7021); // Serial.print(char_bmptempvozd70210); // Serial.print(char_bmpHumidity); delay(1000); // Отправка данных в Брокер раз в 5 секунд client.disconnect(); // Отключиться } }На коннекте зависает, поди.
разъясните пожалуйста для особо одаренных ,пинг проходит а данные перестает получать
То кого и куда пинг проходит..
Зависание на connect() - это гипотеза. Не может рессолв FDQN сделать или просто удаленный хост отмораживается - может показать только экспериментальное исследование.
до шилда 5100
по его ip
Ну, хорошо, что проходит. Значит не висит. Но не знаю, как это поможет решить проблему. Копайте в области коннекта.
дело не в том по какому пути идёт пакет, дело в том какая схема подключения ардуины ну как бы в рамках моей локальной сети
например если воткнуть ардуину напрямую в комп через провод (ethernet) то всё будет нормально работать, а если провод заменить на wi-fi мост то ардуина зависнет, при этом не имеет значения. ардуина будет соединена с вайфай мостом напрямую или же через свич
если например воткнуть комп и ардуину в коммутатор (или даже несколько коммутаторов последовательно соединить) то тоже всё будет нормально работать
если например взять один роутер и воткнуть ардуину в его лан порт, и комп тоже будет подключен к роутеру проводом или по вайфай, то всё будет нормально
если взять ещё один роутер и соединить с первым роутером лан портами, то тоже всё будет нормально и не важно к какому роутеру будет подключена ардуина
но если 2-й роутер будет подключен к 1-му wan портом, а ардуина будет подключена ко 2-му роутеру, то она зависает
и это я опробовал примерно на 30-ти платах и ардуино и w5500, эффект одинаковый... обидно блин
короче заказал чип w5100, посмотрю как он будет работать в проблемных режимах
на втором роутере тоже пакеты натятся, правильно?
тут не важно, настроена переадресация портов на одном либо на обои роутерах либо вообще не настроена ни на одном из роутеров, если физически подключить ардуину так как я описал, то происходит зависон, а любое другое сетевое оборудование подключаешь всё работает без проблем, а с ардуиной вот так...
Ничего не зависает просто так. У меня эти визнеты работали на девайсе с аптаймом в год. И через локалку и через впн.
падает на маршрутизации
Может тупо колизии идут, которые маршрутизаторы долго разруливают, и это приводит к видимому зависанию. Ну там IP в сети одинаковые есть. У самих то роутеров маска подсети разная?
Проблема решилась элементарно. Обновлением библиотеки Ethernet до последней версии - 2.0.1. Заодно и ещё несколько глюков ушло.
Тема закрыта