проблема с enc28j60+arduino

paf
Offline
Зарегистрирован: 25.01.2013

Спасибо, Андрей. 

Большое  спасибо, leshak!

настройки сети



Ќ бва®©Є  Їа®в®Є®«  IP ¤«п Windows


Ethernet adapter Џ®¤Є«о祭ЁҐ Ї® «®Є «м­®© бҐвЁ:

   DNS-бгддЁЄб Ї®¤Є«о祭Ёп . . . . . : 
   ‹®Є «м­л© IPv6- ¤аҐб Є ­ «  . . . : fe80::fd25:2191:cf76:4b27%11
   IPv4- ¤аҐб. . . . . . . . . . . . : 192.168.1.201
   Њ бЄ  Ї®¤бҐвЁ . . . . . . . . . . : 255.255.255.0
   Ћб­®ў­®© и«о§. . . . . . . . . : 192.168.1.1

’г­­Ґ«м­л©  ¤ ЇвҐа isatap.{7AD626FD-2A4D-4391-B915-3C57403CC90E}:

   ‘®бв®п­ЁҐ б।л. . . . . . . . : ‘।  ЇҐаҐ¤ зЁ ­Ґ¤®бвгЇ­ .
   DNS-бгддЁЄб Ї®¤Є«о祭Ёп . . . . . : 

’г­­Ґ«м­л©  ¤ ЇвҐа Teredo Tunneling Pseudo-Interface:

   DNS-бгддЁЄб Ї®¤Є«о祭Ёп . . . . . : 
   IPv6- ¤аҐб. . . . . . . . . . . . : 2001:0:9d38:6ab8:9f:356e:3f57:fe36
   ‹®Є «м­л© IPv6- ¤аҐб Є ­ «  . . . : fe80::9f:356e:3f57:fe36%13
   Ћб­®ў­®© и«о§. . . . . . . . . : ::

ip шилду даю 192.168.1.123

вот скетч из примера.



#include <Ethernet.h>
#define SIZE 50

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 123 };

Server server(80);

char response[SIZE];
int size = 0;

void setup() {
#ifdef ETHERSHIELD_DEBUG
	Serial.begin(9600);
#endif
	Ethernet.begin(mac, ip);
	server.begin();
	while (size < SIZE) {
		response[size] = 'A';
		size++;
	}
	response[size] = '\0';
}

void loop() {
	Client client = server.available();

	if (client) {

#ifdef ETHERSHIELD_DEBUG
		Serial.println("New client!");
#endif

		// an http request ends with a blank line
		int current_line_is_blank = 0;
		while (client.connected()) {
			if (client.available()) {
				char c = client.read();

				if (c == '\n' && current_line_is_blank) {
#ifdef ETHERSHIELD_DEBUG
					Serial.println("Received headers!");
#endif

					int i = 0;
					sprintf(response, "millis() = %lu", millis());
					while (response[i] != '\0') { i++; }
					client.println("HTTP/1.0 200 OK");
					client.println("Content-Type: text/html");
					client.print("Content-Length: ");
					client.println(i);
					client.println();

					client.print(response);
					break;
				}
				else if (c == '\n') {
					current_line_is_blank = 1;
				}
				else if (c != '\r') {
					current_line_is_blank = 0;
				}
			}
		}

#ifdef ETHERSHIELD_DEBUG
		Serial.println("Disconnected");
#endif

		client.stop();
	}
}

что означает первая строка? Подключение файла откуда? 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

paf пишет:

что означает первая строка? Подключение файла откуда? 

Если все работает - не забивайте голову: не найдет библиотеку - компилятор ругнется и остановит сборку. А вот для того, чтобы плата отвечала в браузере - у Вас должен быть включен не клиент, а сервер...

paf
Offline
Зарегистрирован: 25.01.2013

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

Путаница в примере? Я правильно понимаю, что скетч должен отвечать в мониторе если к шилду обращается браузер на 192.168.1.123?

Вот либа с примерами. Только из этой библиотеки примеры пингуются.

 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

paf пишет:

Путаница в примере? Я правильно понимаю, что скетч должен отвечать в мониторе если к шилду обращается браузер на 192.168.1.123?

Не знаю. Но клиент, в сетевом понимании, это тот, кто обращается к серверу с запросом... И отвечать не в мониторе, а туда же: в сеть. Иначе какой смысл в сети? :) В монитор можно навтыкать отладочных сообщений.

paf пишет:

Вот либа с примерами. Только из этой библиотеки примеры пингуются.

Ну так и пользуйтесь ей. В приведенной Вами ссылке есть файл Server.cpp, значит есть и методы его вызова из основной программы. Изучать весь код по данной ссылке лично я не готов.

paf
Offline
Зарегистрирован: 25.01.2013

Да, этот скетч так и называется WEB_Server_DEBUG. 

Эта строка Serial.println("New client!"); должна вывести в монитор  - New client! Если все работает... 

Так-с... Если пинг проходит значит, отвечает скетч. Но скетч ничего не "слышит" когда его стучат браузером ??? И монитор молчит! 

"-ни-ичего не понимаю..."   :(

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

paf пишет:

Да, этот скетч так и называется WEB_Server_DEBUG. 

Эта строка Serial.println("New client!"); должна вывести в монитор  - New client! Если все работает...

Да.

paf пишет:

Так-с... Если пинг проходит значит, отвечает скетч. Но скетч ничего не "слышит" когда его стучат браузером ??? И монитор молчит! 

А порт - правильно выставлен? При пинге - светодиод на шилде мигает? Потому, что может оказаться два устройства с одинаковыми IP в сети.

Воткните в либу/скетч Serial.print по приходу любого пакета и посмотрите... Место ищется по аббревиатуре ICMP, на которую шилд отвечает...

leshak
Offline
Зарегистрирован: 29.09.2011

Бр... Ваша фамилия часом не Сусанин?  ;)

"Вот пример" - из какой он библиотеки и его имя - догадайтесь сами. Предполагается что это "не рабочий пример", но... ниже упоминается библиотека  Ethernet_ENC28J60  и говорится что "она пингуется". Поиск говорит что это пример из нее, c именем WebServerDEBUG.pde (да... увидел что позже сказали имя, но почему не сразу?)

Но раньше вы говорили что пример у вас "не пингуется". Имеем

- пример из библиотеки который якобы не пингуется
- эта же библиотека с заявлением - пингуется

 

Какой URL набираете в браузере - так и не сказали. Что видите в браузере в ответ - тоже тайна (timeout, badrequest, какие-то цифры, бесконечную загрузку).

Кстати, а что вы вообще подразумеваете под словом пингуется/не пингуется?

И контрольный: а почему вы взяли эту библиотеку? Я же вроде говорил про нее что "симпатична и проста", но "автор забросил больше года назад, а списко TODO" - пугает. Читали файлик Todo.markdown?

- SYNACK (when a request comes) -> win size is changed. why?
- ACK number when receive an ACK packet with data is INCORRECT! ACK number should be the last received packet len (of this connection) + 1
- send is not working properly: disconnect that is really sending packets
- recv is not working for length > 1
- What if we receive/send a packet size greater than BUFFER\_SIZE?
- Implement connect()
  - SYN+ACK is not being received/read (maybe the SYN we are sending is not ok)
- Implement send()

(краткий перевод)   посылка - нерабоает, прием - не работает, размер пакетов неведомо почему меняется...

Может и не актуален этот список и уже все починили, но ... зачем брать библиотеку в которой нет уверенности и на формуме нет никого с кем у нее был успех/опыт? Уверены что сможете ее дожать? 

Почему не взять библиотеку которая известно что работает? Я же говорл, Сообщение #9 ПОСЛЕДНИЙ АБЗАЦ.  А в нем говорится про библиотеку ethercard, и примеры брать из нее.

 

 

paf
Offline
Зарегистрирован: 25.01.2013

Ну хорошо. Взял две IDE. 1.0 и 1.0.3 распаковываю езеркард в папку с прочими библиотеками. Открываю пример где указан статичный айпи. Компилирую, заливаю. Пробую. Пуск. Выполнить. Ping 192.168.1.203 - заданный адрес недоступен. Вот это я и называл не пингуется. Обе версии IDE дают одинаковый результат. В мониторе выходит первая строка из скетча (одна, первая) всё замирает... жму ресет на плате. в мониторе повторение первой строки и ...всё! То же что и три дня назад. leshak, я уверяю Вас, первое, что я сделал три дня назад последовательно перепробовал все библиотеки и примеры из них. Безуспешно. Напрашивается вывод - шилд в помойку. Мне поясняют, шилд работает  Ethernet_ENC28J60 примеры дают ответ на пинг. Кроме пинга ничего. Вывод, шилд выбрасывать рано, поскольку осталось еще потерзать UNO.  Ну что еще то? Особенности Меги? Ну китайская фундуино, аккуратно спаяно SPI работает - пытал SD карту.  Варианты с DHCP не запускал, настройки сети статичные адреса.

Придет еще один шилд попробую его... Спасибо, leshak за Ваше участие, ну если железка подбитая?

leshak
Offline
Зарегистрирован: 29.09.2011

Да подождите вы руки опускать :)

Про то что спрашиваю "как пингуете", не обижайтесь. Просто перебираем все возможное. Всякое было что под одним словами разное понимают. Лучше переспросить.

Итак, библиотека у нас EtherCard. Скажите еще откуда взяли ее, ссылку (очень часто бывают что берут какую-то старую версию и потом голову ломают). К тому же, можно, от греха когда ее ставите - убрать из папки libraries другие библиотеки enc28j60. Могут именами файлов/классов пересечься (хотя в этом случае скорее всего будет ошибка компиляции, но на всяк случай...).

Осталось выяснить какой же именно пример из EtherCard вы запускаете?

getStaticIP.ino?

Что при этом в Serial Monitor видите? Молчать туда он в любом случае не может. Как минимум "[getStaticIP]" должен сказать. Даже если шилд вы уже выкинули в мусорное ведро :)
Если "проблемы" - долго может молчать. До 5-ти минут у меня бывало (если все хорошо, то быстро всю диагностику выплевывает). Но все равно потом признается что он не может найти сам шилд или gateway и т.п.

И про питание. Я помню вы сказали "взял отдельное". Но откуда вы его взяли, с чего?

Скетч заливаете "вот ровно как он есть" или хоть что-тов нем да меняете?

leshak
Offline
Зарегистрирован: 29.09.2011

Так. Есть догадка.

Автор проапдейтил эту библиотеку. В том числе пофиксал проблему с SS пином которую я описывал в #35 посте.

Теперь стало более логично, но.... для меги теперь  необходимо обязательно указывать третий параметр в ehter.begin

Попробуйте вместо

 if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 

сделать

 if (ether.begin(sizeof Ethernet::buffer, mymac,53) == 0) 

Очень велика вероятность что в этом причина.

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

Так что хоть тушкой, хоть чучелом - а заставим ее работать ;)

paf
Offline
Зарегистрирован: 25.01.2013

О-о, как...!  pin53...  смо-отри-ка! Почти ГАЗ-53! .......Во-от... тебе бабушка и ... Сусанин день...

 

Где бы примерчиков порыть?! Попроще? В этой лайбратеке не густО... Ох, как я по ангельски читать не лю...мею!

Тэк-с... вот если скетчик чуть поправить, то можно диодиками помигать, а можно и... форточками похлопать! :)))  И даже рыбок покормить.

Вот такой он - leshak! ;)


 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

У меня только с EtherSheild заработало - почему я так и не понял видимо у меня контроллер специально для этой библиотеки, хотя тот же ENC28J60 - подключается аналогично.

Поэтому я сделал вывод что EtherCard неработает.

Кто работал с ней можете пояснить что в них такого разного? Вторая просто повкуснее ...

ogogon
ogogon аватар
Offline
Зарегистрирован: 04.04.2011

Коллеги, а почему у всех библиотек для ENC28J60 нет такой настройки IP, как шлюз по умолчанию? (МАС есть, TCP/IP адрес и маска есть. Дефолтного шлюза - нет...)

Как гаджет на базе этого софта будет работать с другими подсетями через маршрутизатор?

Ogogon.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

ogogon пишет:

Как гаджет на базе этого софта будет работать с другими подсетями через маршрутизатор?

Никак не будет, или будет через NAT, и слава Богу, т.к. эта плата может одновременно обрабатывать только один запрос и любой залетевший дятел положит Вам этот "гаджет" наглухо..

ogogon
ogogon аватар
Offline
Зарегистрирован: 04.04.2011

Andrey_Y_Ostanovsky пишет:
Никак не будет, или будет через NAT, и слава Богу, т.к. эта плата может одновременно обрабатывать только один запрос и любой залетевший дятел положит Вам этот "гаджет" наглухо..

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

Ogogon.

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

Помогите решить проблемку

Использую шилд на ENC28j60

Задача: На 433МГц (в перспективе 2.4ГГц) получить информацию с нескольких датчиков и отправить ее на народный мониторинг

Использовал стандартную Ethernet библиотеку, входящую в состав Arduino IDE.
Работает все нормально, но несколько раз в сутки перестает работать Ethernet. Иногда связь восстановливается, иногда нет. Сейчас поставил затычку по проверке связи и перезагрузки контроллера (этакий сторожевой таймер). Нехорошо :(

Кто-то сталкивался с ненадежностью непрерывной работы Ethernet Shield?

 

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

sav13 пишет:

Использовал стандартную Ethernet библиотеку, входящую в состав Arduino IDE.
Работает все нормально, но несколько раз в сутки перестает работать Ethernet. Иногда связь восстановливается, иногда нет. Сейчас поставил затычку по проверке связи и перезагрузки контроллера (этакий сторожевой таймер). Нехорошо :(

Кто-то сталкивался с ненадежностью непрерывной работы Ethernet Shield?

Опять повисла сеть и resetFunc() не помогла. Боюсь, что зависает именно модуль Ethernet :(

Видимо придется через сторожевой таймер:

wdt_disable(); 
wdt_enable(WDTO_15MS);
while (1) {}

или ресет пин дергать каким нибудь цифровым выходом

inhelp
inhelp аватар
Offline
Зарегистрирован: 23.09.2012

leshak пишет:

Я не уверен, но как я понял, на 3.3v пине, на некоторых платах,  напряжение генерируется FTDI чипом (в качестве побочной функции). И там максимальные токи довольно маленькие. Хилый он для этого.

У меня на arduino nano v3 , проблема была именно в питании, спасибо большое за совет -- все работает )))

Vad
Offline
Зарегистрирован: 26.05.2013

Сэкономил на свою голову..

не деньги экономил.. а место))

третий день копаюсь в либе.. научил ее файлы отправлять..

Кто нибудь знает как организовать POST запрос из нескольких пакетов TCP?

Отправляю файл на сервер.. есстественно  он не помещается в один пакет :)) нужно  POST разбить на несколько пакетов

А как раскидать клиентский запрос на несколько пакетов(как в серверном примере multipacket) .. пока мыслей нет..

(можно конечно "костыль" применить.. отправлять  исходный файл кусками по 500 байт.. а многокаменный сервер заставить его собрать, но это  как-то... не по русски.. не по человечески и не кошерно :) )

как TCP флагами управлять в режиме клиента  так и не нашел..

документации на нее ноль 

http://jeelabs.net/pub/docs/ethercard/

 

 

Monsel
Offline
Зарегистрирован: 27.10.2013

leshak пишет:
Так в них же всех написанно для " using an Arduino Wiznet Ethernet shield. " какое они имеют отношение к enc28j60?

 

плата  Ethernet Shield W5100   http://www.ebay.com/itm/Ethernet-Shield-W5100-Micro-SD-Card-SlotFor-Ardu...

это "Wiznet" ?

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Monsel пишет:

плата  Ethernet Shield W5100

это "Wiznet" ?

Да, только если у Вас UNO, или другая плата с USB-B разъемом - то он будет мешать втыкать эту плату: Разъем RJ-45 ножками, торчащими с обратной стороны платы, как раз попадает на большой разъем USB снизу на ардуине.

Vad
Offline
Зарегистрирован: 26.05.2013

Не мешает там ничего. Все втыкается и вытыкается "как надо" ;)

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Vad пишет:

Не мешает там ничего. Все втыкается и вытыкается "как надо"

Это Вы не пробовали другие платы - они до конца садятся, а тут, даже на Вашей фотографии, голые ножки между платами видно.

Мое дело - просто предупредить, что есть конструктивная особенность. Я у себя планирую заменить на UNO большой USB разъем на miniUSB, но пока все собираюсь с мыслями.

Vad
Offline
Зарегистрирован: 26.05.2013

я их..  штук тридцать уже воткнул ))

мне не надо  рассказывать ))

sonmax
Offline
Зарегистрирован: 30.06.2013

В продолжение темы...

Есть МЕГА + шилд на ENC28j6, необходимо утянуть с сайта файлик, например этот: "http://arduino.cc/asciilogo.txt", долго пытался запустить через разные библиотеки, но почитав эту ветку определился с библой "ethercard", настроил как писалось выше (не забыл про SS -53 и порт 80) и наконец все заработало.

// This demo does web requests to a fixed IP address, using a fixed gateway.
// 2010-11-27 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php
#include <EtherCard.h>
#define REQUEST_RATE 5000 // milliseconds
// ethernet interface mac address
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
// ethernet interface ip address
static byte myip[] = { 192,168,1,203 };
// gateway ip address
static byte gwip[] = { 192,168,1,1 };
// remote website ip address and port
static byte hisip[] = { 174,129,243,245 };
// remote website name
char website[] PROGMEM = "arduino.cc";
byte Ethernet::buffer[700];   // a very small tcp/ip buffer is enough here
static long timer;
// called when the client request is complete
static void my_result_cb (byte status, word off, word len) {
  Serial.print("<<< reply ");
  Serial.print(millis() - timer);
  Serial.println(" ms");
  Serial.println((const char*) Ethernet::buffer + off);
}
void setup () {
  Serial.begin(9600);
  Serial.println("\n[getStaticIP]");
  if (ether.begin(sizeof Ethernet::buffer, mymac,53) == 0) 
    Serial.println( "Failed to access Ethernet controller");
  ether.staticSetup(myip, gwip);
  ether.hisport = 80;
  ether.copyIp(ether.hisip, hisip);
  ether.printIp("Server: ", ether.hisip);
  while (ether.clientWaitingGw())
    ether.packetLoop(ether.packetReceive());
  Serial.println("Gateway found");
  timer = - REQUEST_RATE; // start timing out right away
}
void loop () {
  ether.packetLoop(ether.packetReceive()); 
  if (millis() > timer + REQUEST_RATE) {
    timer = millis();
    Serial.println("\n>>> REQ");
    ether.browseUrl(PSTR("/asciilogo.txt"), "", website, my_result_cb);
  }
}

На данный момент проблема в следующем: маленький буфер и данные не влезают, максимально 512.

Вот что получается в ответе

[getStaticIP]
Server: 174.129.243.245
Gateway found

>>> REQ
<<< reply 282 ms
HTTP/1.1 200 OK
Server: nginx/1.4.2
Content-Type: text/plain
Last-Modified: Wed, 02 Oct 2013 13:46:47 GMT
ETag: "524c23c7-8d7"
Content-Length: 2263
Accept-Ranges: bytes
Date: Sat, 16 Nov 2013 10:26:11 GMT
X-Varnish: 53478282
Age: 0
Via: 1.1 varnish
Connection: close
X-Cache: MISS
X-URL: /asciilogo.txt

           `:;;;,`                      .:;;:.           
        .;;;;;;;;;;;`                :;;;;;;;;;;:     TM
      `;;;;;;;;;;;;;;;`            :;;;;;;;;;;;;;;;      
     :;;;;;;;;;;;;

Как можно увеличить? (вариант поменять 700 на 3000 не проходит)

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

sonmax пишет:

Как можно увеличить? (вариант поменять 700 на 3000 не проходит)

Ну, вообще говоря, и не должен. :) Нормальный размер ethernet-фреймов - 1500 байт на все, а полезной информации - и того меньше.

Учитывая тот факт, что библиотека не умеет сама собирать фрагментированные или chunked-пакеты - получить данные большего, чем 1472 байта объема нереально. Тут придется либо менять хотелки, либо дописывать недостающий функционал.

sonmax
Offline
Зарегистрирован: 30.06.2013

Понятно.

Но может быть есть какой-то способ закачать файл с сайта?

например скачать содержимое по частям (с определенной позиции), или  как-то сохранить файл на SDкарту.

к сожалению никаких похожих библиотек не нашел. 

Буду признателен за помощь.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

sonmax пишет:

к сожалению никаких похожих библиотек не нашел. 

Вероятно потому, что никому не приходит в голову использовать ардуино для скачивания файлов... :)

Sirocco
Offline
Зарегистрирован: 28.09.2013

sav13 пишет:
Кто-то сталкивался с ненадежностью непрерывной работы Ethernet Shield?

Да. В моём случае одна плата в другую не подходила по разъёмам, сделал на проводка длинной ~20 см. Переодически были глюки. Связь пропадала. Потом отпаял все колодки, одну плату приклеил термоклеем к другой через картонку, все проводки надёжно спаял, помеслил весь этот колхоз в металлическую коробку и залил всё нафиг термоклеем под завязку. 

Это всё валяется в колодце на глубине 1,8 м, где установлен счётчик воды и насос повышающий давление. Система может отключать насос от сети силовым реле, отключать подачу воды из магистрали, силовое реле - клапан воды, снимает импульсы со счётчика воды, измеряет температуру воды в водопроводе и температуру воздуха, в колодце и на высоте 30 см от колодца(просто температура на улице).

В колодец прокинута витая пара. 4 провода витухи подключены в Ethernet, оставшиеся две пары проводов используются для питания ардуины, по ним идёт 24 Вольта. В коробке с ардуиной лежит обычный (но нормального качества) автомобильный USB зарядник, он принимает 8-30В, выдаёт стабильные 5В. 

В качестве разъёмов выбрал обычные телефонные четырёх пиновые. Просто их и гнёзд под них было дома дофига. Сначала думал что затея плохая, ведь условия адские, низкая температура, высокая влажность... Но за два года ничего не случилось. Все разьёмы, после того как воткнул, обильно залил тем же прозрачным термоклеем. За два года ниразу не лазил в этот колодец, только сверял показания счётчика каждый месяц, его видно сверху. После шести раз перестал сверять, показания за пол года не разнились.

Один только раз система зависла, снял питание на минуту, подал. Работет снова уже 4 мес.

Sirocco
Offline
Зарегистрирован: 28.09.2013

Для проблемной enc28j60 нашёл вот это: https://github.com/ntruchsess/arduino_uip

У меня zero research enc28j60, миниатюрная такая. Пробовал библиотеки приведённые в этом форуме, заработала только самая простенькая, но в ней небыло веб клиента. В остальных веб клиент так и не заработал. 

arduino_uip ещё не пробовал, пока не дома. Но вроде поддержка и описание автора оставляют надежды.

Sirocco
Offline
Зарегистрирован: 28.09.2013

Да! Решено! 

запишу как тег, чтоб поисковики шустро слали сюда по ключевым словам:

enc28j60 web client arduino - отличная библиотека, с которой плата работает достаточно хорошо и в режиме клиента и в режиме сервера: https://github.com/ntruchsess/arduino_uip

В описании всё есть. Достаточно написать код для распространённого модуля  wiznet 5100 и заменить стандартную библиотеку на новую, тоесть вместо:

#include <Ethernet.h>

написать

#include <UIPEthernet.h>

И подключать #include <SPI.h> не нужно.

Проверил, всё работает. Изощрённо-мазахистского кода не писал, там может и будут проблемы, но получить параметры с датчиков и отправить их get запросом - это запросто. Также нормально работает сервер. Тестил на IDE arduino-1.0.5-r2, плата ардуино мини про.

Так что если задачи тривиальные, то можно закупаться этой дешовкой по 3$ плюс ардуино 2,5$ и мутить разные независимые мини контроллеры, объединяя их в общюю сеть. При такой стоимости даже не охото и пытаться всё-всё что нужно нагрузить на одну ардуину. Пусть одна шлёт только данные с счётчиков воды, и там рядом и валяется, другая управляет светом, третья как метеостанция... Ну вы поняли.

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

Интересная библиотека ,надо проверить .У меня нормально работала  EtherCard ,но там не удобно реализована отправка данных ,даже не помню чего даже..Много эксперементировал. Все приходилось переделывать под enc28j60 .  Все же enc28j60 медленее работает чем w5100 ,из-за программной реализации . На этом модуле у меня все летало только на стелярисе (TI) -там частота м/к 80мгц.

user1q
Offline
Зарегистрирован: 04.04.2014

Sirocco пишет:

Но за два года ничего не случилось. Все разьёмы, после того как воткнул, обильно залил тем же прозрачным термоклеем. За два года ниразу не лазил в этот колодец, только сверял показания счётчика каждый месяц, его видно сверху. После шести раз перестал сверять, показания за пол года не разнились.

Один только раз система зависла, снял питание на минуту, подал. Работет снова уже 4 мес.

Подскажите, пожалуйста, какую из библиотек вы при этом использовали? Если можно - прямо ссылку оставьте.

А то у меня enc постоянно виснет через 3-4 часа после начала работы.

Спасибо.

Sirocco
Offline
Зарегистрирован: 28.09.2013

Для enc я писал тут http://arduino.ru/forum/apparatnye-voprosy/problema-s-enc28j60arduino-0?page=1#comment-60936 У меня всё прекрасно работает. Но код всего-то шлёт данные с датчика, никаких тяжёлых функций.

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

Sirocco
Offline
Зарегистрирован: 28.09.2013

Стоп! То, что у меня там два года работает, это 5100 шилд. Я просто писал, что с ним были глюки, из-за длинных проводов до ардуины. Но в любом случае, китайский шилд тоже работает стабильно, хотя и медленно.

pshtettt
Offline
Зарегистрирован: 23.05.2014

ПОМОГИТЕ (писал в другой теме"Помогите с enc28j60 (метод Post)") есть скетч шлет на сервер

01 #include <UIPEthernet.h>
02 EthernetClient client;
03 signed long next;
04 void setup()
05 {
06   Serial.begin(9600);
07   uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05};
08   Ethernet.begin(mac);
09   Serial.print("localIP: ");
10   Serial.println(Ethernet.localIP());
11   Serial.print("subnetMask: ");
12   Serial.println(Ethernet.subnetMask());
13   Serial.print("gatewayIP: ");
14   Serial.println(Ethernet.gatewayIP());
15   Serial.print("dnsServerIP: ");
16   Serial.println(Ethernet.dnsServerIP());
17 }
18 void loop()
19 {
20   delay(3000);
21       if (client.connect(IPAddress(XX,XX,XX,XX),80))
22         {
23           char buf[80];
24           Serial.println("Client connected");
25            sprintf(buf, "GET /t.php?s=_____ST HTTP/1.0");
26            /////////////////////////////////
27            Serial.println(buf);
28            delay(500);
29            client.println(buf); // Отправляем GET запрос
30            delay(100);
31            client.println();
32            delay(500);
33            Serial.println("disconnecting.");
34            client.stop(); // Завершаем соединение
35         }
36         else
37         {
38            Serial.println("connection failed");
39         }
40 }

но есть вопрос_ если отвалится соединение или выдернуть шнурок и воткнуть обратно то соединение не востановится и ip уже не получим. Какие есть предложения по повторной настройке enc-шки(получению сетевых настроек)?

makaroff
Offline
Зарегистрирован: 13.06.2014
Приветствую!
Прошу сильно не ругаться и больно не бить. Имею проблему... Собрал я погодную станцию UNO + Ethernet W5100 + BMP180 + DHT11 + DS18b20 + LCD на I2C... И всё это прекрасно работает! Показания выводятся и на экранчик, и в порт, и даже страничка формируется с помощью Визнетовского Изернет Шилда. А вот с ENC28J60 подружить не удаётся :((. Т.е. сама то стейшен пашет и всё везде кажет, акромя интернета. Мож подскажете какую библиотеку использовать и что в коде поправить?
Пробовал разные либры, больше всего понравилась библиотека UIPEthernet, но не пошло...
 
  // Подключаем библиотеки
  
  #include <Wire.h> // общение по I2C
  
  #include <LiquidCrystal_I2C.h>  // библиотека для LCD1602
  LiquidCrystal_I2C lcd(0x27,16,2);  // установка адреса экрана 0x27, 16 символов, 2 строки  

  #include "DHT.h" // либа для DHT11 - датчика влажности и температуры

  #define DHTTYPE DHT11 // задаём тип датчика DHT
  #define DHTPIN A0 // сообщаем пин подключения DHT    
  DHT dht(DHTPIN, DHTTYPE);

  #include <Adafruit_BMP085.h> // либа для BMP085/BMP160 - датчика давления и температуры
  Adafruit_BMP085 bmp;
  
  #include <OneWire.h>// инициализация библиотеки шины OneWire
  #include <DallasTemperature.h>// инициализация библиотеки термодатчиков (здесь DS18B20)
  #define ONE_WIRE_BUS A1 // подключение цифрового DS вывода датчика к пину A1
  OneWire oneWire(ONE_WIRE_BUS); // запуск интерфейса OneWire для подключения OneWire устройств
  DallasTemperature sensors(&oneWire); // указание, что устройством oneWire является термодатчик от  Dallas Temperature
  
  #include <SPI.h>
  #include <Ethernet.h> // либа для Wiznet W5100
  byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // задаём mac-адрес...
  IPAddress ip(192,168,1,100); // и статический ip
  EthernetServer server(80); // а так же порт (c 80-м работает быстрее)
  
  void setup() 
  {
    Serial.begin(9600); // задаём скорость работы порта 9600    
    Serial.println("Weather Station by makaroff"); // пишем в порт няшку ЧСВ ))
      
    lcd.init();  // инициализируем LCD
    lcd.backlight();  // включаем подсветку LCD
    lcd.setCursor(0, 0);
    lcd.print("Weather Station");
    lcd.setCursor(0, 1);
    lcd.print("by makaroff");
    
    delay (5000); // задержечка в 5 секунд
    
    lcd.clear();  // очищаем LCD
    
    dht.begin(); // запускаем DHT
    sensors.begin(); // запуск сенсоров DS
    bmp.begin(); // запускаем BMP
    
    Ethernet.begin(mac, ip); // запускаем Ethernet c указанием ip и mac
    server.begin(); // запускаем сервер
    Serial.print("IP address "); // сообщаем о запуске сервера по адресу...
    Serial.println(Ethernet.localIP()); // выводим локальный адрес сервера
    Serial.println(); // печатаем в порт пустую строку
   }
  void loop()
   {  
    // работаем с BMP
    if (!bmp.begin()) // если BMP не запустился
      {
        Serial.println("Could not find a valid BMP160 sensor, check wiring!"); // пишем в порт, что BMP не найден
      }
      else // если всё норм, то...
      {
       // читаем и пишем температуру внутри корпуса в порт    
       // Serial.print("Temperature in case = ");
       // Serial.print(bmp.readTemperature());
       // Serial.println(" *C");
    
       // читаем и пишем в порт давлене в Паскалях
       // Serial.print("Pressure = ");
       // Serial.print(bmp.readPressure());
       // Serial.println(" Pa");
      
       // читаем и пишем в порт давлене в мм ртутного столба
       Serial.print("Pressure = ");
       Serial.print(bmp.readPressure()/133.33);
       Serial.println(" mm");
      }
    
    // работаем с DHT
    float h = dht.readHumidity(); // читаем влажность с DHT
    float t = dht.readTemperature(); // читаем температуру с DHT
    if (isnan(t) || isnan(h)) // если не можем считать из DHT t и h, то...
     {
      Serial.println("Could not find a valid DHT sensor, check wiring!"); // пишем это в порт
     }
     else // если всё норм, то...
     {
      // пишем влажность в комнате в порт
      Serial.print("Humidity in room = ");
      Serial.print(h);
      Serial.println(" %");
      // пишем температуру в комнате в порт
      Serial.print("Temperature in room = ");
      Serial.print(t);
      Serial.println(" *C");
     }
      
    // работаем с датчиками DS18B20
    sensors.requestTemperatures(); // команда опроса температуры DS
    Serial.print("Temperature outside = ");
    Serial.print(sensors.getTempCByIndex(0)); // печать в порт температуры ("0" в данном случае указывает на первое устройство на шине)
    Serial.println(" *C");    
    // Serial.print(sensors.getTempCByIndex(1)); // печать в порт температуры ("1" в данном случае указывает на второе устройство на шине)
    // Serial.println(" *C");
          
    Serial.println(); // печатаем в порт пустую строку
    
    //================== Работаем с LCD ==================
    //lcd.clear();
    //lcd.home();
    lcd.setCursor(0, 0);
    lcd.print("Pr.");
    lcd.print(bmp.readPressure()/133.33, 0);
    lcd.print("mm   ");
    lcd.setCursor(11, 0);
    lcd.print("H.");
    lcd.print(h, 0);
    lcd.print("% ");
    lcd.setCursor(0, 1);
    lcd.print("T.room");
    lcd.print(t  , 0);
    lcd.setCursor(9, 1);
    lcd.print("T.out");
    lcd.print(sensors.getTempCByIndex(0), 0);
       
       
    //================== Ethernet ==================
    // при подсоединении клиента появляются непрочитанные байты, доступные для чтения:
     EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
	  client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          {
           // поприветствуем
           client.println("Weather station by makaroff <br /><br />");
           // давлене в мм ртутного столба
           client.print("Pressure = ");
           client.print(bmp.readPressure()/133.33, 0);
           client.println(" mm <br />");
           // влажность в комнате
           client.print("Humidity in room = ");
           client.print(h, 0);
           client.println(" % <br />");
           // температура в комнате     
           client.print("Temperature in room = ");
           client.print(t, 0);
           client.println(" *C <br />");
           // температура за окном
           client.print("Temperature outside = ");
           client.print(sensors.getTempCByIndex(0), 0);
           client.println(" *C");       
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
    Serial.println();
    }
  }

 

 

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

В скетче не прописан шлюз на роутер -вот и не пускает из интернета..

serfer89
Offline
Зарегистрирован: 28.06.2014

Добрый день, столкнулся с проблемой при подключении Arduino nano v3 и ENC28J60,  использую UIPEthernet version 1.01 пины такие:

плата -  ардуин

3,3V - 3,3V

GND - GND

SO - D12

SCK - D13

CS - 8(10) - в зависисмости от библиотеки

SI - D11

в примерах с этой библиотеки хотя бы в мониторе порта появляеться имитация (или) какая-то работа, но на пинги не отвечает, подключено от компа на прямую в ардуин патчкором, питание от USB, внешнего нет.  В остальных библиотеках нет ни пинга ни в мониторе информации. Точно пока не могу сказать о питании на шильд, возьму мультиметр замеряю.

Еще заметил что диод на 13 пине, который моргает из примера по умолчанию, есть напряжение он еле-еле зажигаеться, не ярко, но горит. В чем может быть беда? Может кто-то уже от тестировал библиотеку и подскажите соответсвие пинов для нее.

Задача, была реализована на W5100 + Uno+датчики температуры, реализован сервер и клиент отсылались запросы ГЕТом на сервер Ubuntu Server, которые местили показания датчиков, а сервер на Arduino слушал что приходит в ответ, включать диодик или нет, хотелось бы и тут такое провернуть. Спасибо.

А если с Uno(питаеться от адаптера) с выхода 5В взять, должно запитать Nano?

 

fonoton
Offline
Зарегистрирован: 22.07.2014

Добрый день.
У меня такой вопрос к тем, кто подключал enc28j60. Как плата вообще должна реагировать (на уровне железа) при подключении? Пытаюсь соеденить ее с компьютером через свич. При подключении шнура от компьютера к свичу на последнем загорается светодиод, соответственно номеру испольиспользованного порта (там их 8) и компьютер рапортует о подключении к локальной сети. Подключение же шнура от шилда к свичу не как не индицируется: светодиод н а свиче не загорается, на разьеме шилда также ничего не светится. Горит только красный светодид на шилде о том, что есть питание. По поводу общения между шилдом и arduino пока даже не заикаюсь. Так должна быть какая-то реакция на уровне светодиодов или шилд скорее мертв, чем жив? Или я что-то упускаю?

leshak
Offline
Зарегистрирован: 29.09.2011

По идее - должна... но... сами пачкорды тоже бывают разные. Не помню как точно называются, но типа "кросс" и "обычный".
У кроса, как-бы RX/TX меняются местами (ну называются они не RX/TX но суть "прием/передача").

Большинство современных роутеров сами расчихляются какой ему сунули. Но вот то что на "неправильном" будет работать шилд - не факт (или свитч если "тупой как угол дома").
 

но, честно говоря, ни разу не смотрел что там горит, если на ардуине не залит ни один скетч использующий шилд. Но когда залит - то все горит. По крайней мере на роутере. на любом кабеле.

fonoton
Offline
Зарегистрирован: 22.07.2014

Скетч залит, но реакции"0". Ладно, завтра попробую сваять кросс-кабель и напрямую подключить к компу. Если и в этом случае ничего не засветится, то наверное в все-таки шилд. Или на компе нужно сделать какие-то особые настройки? В любом случае спасибо за ответ. После завтрашних экспериментов с кордом отпишусь.

leshak
Offline
Зарегистрирован: 29.09.2011

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

Я бы, честно говоря, с пачкордами уже в последнию очередь... 
Вначале бы попробовал на каком-нибудь роутере. Вряд ли вы сможете найти роутер, который не сможет заработать "по любом типу пачкорда" (причем сам по себе, без каких-то движений с вашей стороны). Да и в роутере, всегда можно посмотреть список клиентов. Появился ли там MAC вашего шилда...
Опять-таки роутер, если нужно, и IP-шник по dhcp может шилду дать.

Вообщем "зачем вам свитч"?  :)

А вообще, я бы начал с проверки питания на шилде. По крайней мере я со своим долго танцевал, то "работает/не работает", пока пытался питать его с 3v пина меги. Поставил отдельный внешний регулятор на 3v, саму мегу запитал от внешнего блока - и проблемы с шилдом ушли.
 

fonoton
Offline
Зарегистрирован: 22.07.2014

Все дело в том, что я этим делом на работе занимаюсь ;) - куча свободного времени. Роутер дома и придется все тащить домой. На работе два компа, но один в корпоративной сети и к нему не подключишся, другой без сетки-отсюда и подключение через свич из-за отсутствия кросс-кабеля. Вот такие костыли). Насчет питания-изначально запитал не от arduino - завалялась платка преобразователя на 3.3 вольта, так-что думаю дело не в питании. Смущает меня нулевая реакция шилда. Соединение с arduino проверил несколько раз, библиотеки на месте (etherShield и ETHER_28J60) , скетч залил самый простой "Hello world", но кроме светодиода питания на шилде ничего не светится. Думал светодиоды на разьеме начнут мигать когда обращусь из браузера по адресу 192.168.1.15 (такой в скетче), но реакции"0 ". Поэтому и думаю, что шилд не рабочий.

leshak
Offline
Зарегистрирован: 29.09.2011

fonoton пишет:
Думал светодиоды на разьеме начнут мигать когда обращусь из браузера по адресу 192.168.1.15 (такой в скетче)

А на самом компе какой адресс? Тоже "жестко прописан"?

fonoton
Offline
Зарегистрирован: 22.07.2014

Да, жестко прописан 192.168.1.50

Sirocco
Offline
Зарегистрирован: 28.09.2013

Поведаю такую историю: делал дома устройство с ардуино уно и данным изернет модулем. Всё работало. Поместил в коробочку, залил термоклеем слегка. Утром взял это и понёс на работу. Подключил, а ноут не видит сети. Поменял кабель. Всёравно не видит. Воткнул ноут в сеть, ноут определил сеть. Сделал вывод, что изернет модуль накрылся. С трудом расковырял клей, достал ардуинку, выпаял из модуля преобразователь 5в->3.3в и кварц, и выкинул его. Взял другой такой же модуль. Спаял тоже самое. Сто раз проверил, залил опять клеем. Остыло. Проверил. Всё работает. Принёс модуль на работу чтоб по программировать... А оно опять не работает... Стал выяснять.

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

Вот такая хрень. Будьте осторожны, возможно ваше детище не взлетит. 

P.S. жалко выброшенного модуля.

P.P.S. Ноут очень древний, какой-то DELL 2003 года с WinXP. Он у нас дежурный на работе, на нём права не ограничены и можно ставить драйверы. Почему они не стыкуются, так и не понял.

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

Это легко объясняется - enc28j60 не имеет автоопределения rx-tx как и этот ноут.. Если подключить обратным патчкордом то все будет работать

Sirocco
Offline
Зарегистрирован: 28.09.2013

А как-то можно заставить работать enc28j60 в режиме и сервера и клиента? Нужно чтоб была веб страничка с данными от датчиков. Это есть и работает. А теперь потребовалось эти данные ещё слать в БД методом post запроса. Теперь есть два кода, код веб сервера и код отсылки запроса. Как их совместить? Если одновременно добавить библиотеку  EthernetClient client; и EthernetServer server(80); то возникает конфликт и код не компилируется.