Ремонтируем ENC28J60 Ethernet Shield for Arduino Nano 3.0 RJ45 Webserver Module

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Сут такова.

NANO+ENC28J60 Ethernet Shield, залил скетч, Ethernet кабель воткнул, зеленая лампа горит, оранжевая пару раз мигнет и затухает, связи с устройством по Ethernet нет. Заведомо исправное устройство с аналогичным скетчем по этому же кабелю работает.

Какие действия для ремонта ENC28J60 Ethernet Shield можно предпринять?

Жду Вашей помощи и советов.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

а оно вообще куда нибуть откликается? в ком порт например?

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Puhlyaviy пишет:

а оно вообще куда нибуть откликается? в ком порт например?

запускал пример с библиотеки, где в сериал выводится TP который определяется программно шилдом. Выводит 0.0.0.0 . Нано исправна, пробовал на 2-х разных нано.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

тоесть другой шильд с этим скечем работает нормально? а этот шильд не работает?

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

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Puhlyaviy пишет:

тоесть другой шильд с этим скечем работает нормально? а этот шильд не работает?

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

 

принес на работу, воткнул здесь, все работает. Что за ерунда? Возможна ли проблема в питании? Просто дома кабель USB немного барахлит, но скетч то прошился..... В общем вечером еще раз дома проверю.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

ingener.solovyev пишет:

принес на работу, воткнул здесь, все работает. Что за ерунда? Возможна ли проблема в питании? Просто дома кабель USB немного барахлит, но скетч то прошился..... В общем вечером еще раз дома проверю.

я думаю что дома у вас просто все не по феншую.. а вот на работе больше свободной энергии :)

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Puhlyaviy пишет:

ingener.solovyev пишет:

принес на работу, воткнул здесь, все работает. Что за ерунда? Возможна ли проблема в питании? Просто дома кабель USB немного барахлит, но скетч то прошился..... В общем вечером еще раз дома проверю.

я думаю что дома у вас просто все не по феншую.. а вот на работе больше свободной энергии :)

 

Поменял USB кабель, взял другой Ethernet кабель, воткнул в другой LAN порт в роутере, результат нулевой. На роутере горит оранжевый диод, на шилде зеленый. Роутер NETGEAR JWC2000. Но другие МК то работают без проблем.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

я тут допил чай и посмотрел на чаинки :) 

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

 

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Puhlyaviy пишет:

я тут допил чай и посмотрел на чаинки :) 

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

 

Хм мысль. Попробую. Для MAC адреса есть какие то ограничения в плане велечины чисел в HEX-е?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

вам хватит поменять на единичку

0xDE 0xAD 0xBE 0xEF 0xFE 0xEE

следующим будем последняя цифра 0xEF, потом  0xF0 ну и так далее

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Puhlyaviy пишет:

вам хватит поменять на единичку

0xDE 0xAD 0xBE 0xEF 0xFE 0xEE

следующим будем последняя цифра 0xEF, потом  0xF0 ну и так далее

 

не помогло.

 

А есть разница в библиотеках для Ethernet Shield Uno W5100 и Ethernet Shield Nano enc28j60 ? Может я не ту библиотеку использую?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

есть разница!

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Есть ссылка на рабочую библиотеку по версию ардуино > 1.0 ?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

у меня W5100. так что с последней версией библиотеки для enc28j60 не помогу....

на вскидку это вот вроде бы.
https://github.com/gregor-samsa/ethercard

пробуйте, я сегодня уже 6 часов из жизни потерял с библиотеками, разбирательствами почему они с ДУЕ не работают и ругаются через строчку... пока внес все правки в библиотеки хотелось кого нибуть придушить потихому...

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Puhlyaviy пишет:

у меня W5100. так что с последней версией библиотеки для enc28j60 не помогу....

на вскидку это вот вроде бы.
https://github.com/gregor-samsa/ethercard

пробуйте, я сегодня уже 6 часов из жизни потерял с библиотеками, разбирательствами почему они с ДУЕ не работают и ругаются через строчку... пока внес все правки в библиотеки хотелось кого нибуть придушить потихому...

 

Смотрел похожую библиотеку. Придется весь скетч переписывать под нее.

Но нашел библиотеку адаптированную, выглядит как под W5100, вот только собака не  работает (( Может гляните как пар спустите?

https://drive.google.com/?usp=chrome_app#folders/0B82cnzweCbn1Q29ER3JtUHlyNHM

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Нашел источник этой библиотеки https://github.com/turicas/Ethernet_ENC28J60   , компелируется, но в браузере 0 реакции :(

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

В общем роясь в инете пол дня и перелопачивая библиотеки нашел наиболее красивый способ.

http://arduino.shopium.ua/pages/etherShield-simple-wrapper/

Библиотеки обе переделал под версию 1.01 и больше (заменил WProgram и WConstant). Пример сктча запустил - все работает.

#include "etherShield.h"
#include "ETHER_28J60.h"

static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};   // this just needs to be unique for your network, 
                                                                // so unless you have more than one of these boards
                                                                // connected, you should be fine with this value.
                                                           
static uint8_t ip[4] = {192, 168, 0, 55};                       // the IP address for your board. Check your home hub
                                                                // to find an IP address not in use and pick that
                                                                // this or 10.0.0.15 are likely formats for an address
                                                                // that will work.

static uint16_t port = 80;                                      // Use port 80 - the standard for HTTP

ETHER_28J60 e;                                 			 // Создали обьект e класса ETHER_28J60 

void setup()
{ 
  e.setup(mac, ip, port);                               	// Запустили
}

void loop()
{
  if (e.serviceRequest())                               	// Если есть запрос клиента
  {
    e.print("<H1>Analog Values</H1><br/><table border=\"1\">"); // Создаём текст ответа - табличку
    e.print("<tr><th>Input</th><th>Value</th></tr>");           // со значениями аналоговых входов
    for (int i = 0; i < 6; i++)
    {
      e.print("<tr><td>"); e.print(i); e.print("</td><td>"); e.print(analogRead(i)); e.print("</td></tr>");
    }
    e.print("</table>");
    e.respond();           			// отправляем табличку клиенту
  }
  delay(100);
}

Куда можно залить обе библиотеки для будущих покалений нубов?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

поздравляю... как обычно в общем глюки жили в библиотеке :)

а вот добавить на сайте библиотеко-помойку наверно было бы хорошей идеей... хотя можно завести такую помойку где нибуть и тут просто пришпилить ссылку..

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

ingener.solovyev пишет:

В общем роясь в инете пол дня и перелопачивая библиотеки нашел наиболее красивый способ.

http://arduino.shopium.ua/pages/etherShield-simple-wrapper/

Библиотеки обе переделал под версию 1.01 и больше (заменил WProgram и WConstant). Пример сктча запустил - все работает.

#include "etherShield.h"
#include "ETHER_28J60.h"

static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};   // this just needs to be unique for your network, 
                                                                // so unless you have more than one of these boards
                                                                // connected, you should be fine with this value.
                                                           
static uint8_t ip[4] = {192, 168, 0, 55};                       // the IP address for your board. Check your home hub
                                                                // to find an IP address not in use and pick that
                                                                // this or 10.0.0.15 are likely formats for an address
                                                                // that will work.

static uint16_t port = 80;                                      // Use port 80 - the standard for HTTP

ETHER_28J60 e;                                 			 // Создали обьект e класса ETHER_28J60 

void setup()
{ 
  e.setup(mac, ip, port);                               	// Запустили
}

void loop()
{
  if (e.serviceRequest())                               	// Если есть запрос клиента
  {
    e.print("<H1>Analog Values</H1><br/><table border=\"1\">"); // Создаём текст ответа - табличку
    e.print("<tr><th>Input</th><th>Value</th></tr>");           // со значениями аналоговых входов
    for (int i = 0; i < 6; i++)
    {
      e.print("<tr><td>"); e.print(i); e.print("</td><td>"); e.print(analogRead(i)); e.print("</td></tr>");
    }
    e.print("</table>");
    e.respond();           			// отправляем табличку клиенту
  }
  delay(100);
}

Куда можно залить обе библиотеки для будущих покалений нубов?

Puhlyaviy пишет:

поздравляю... как обычно в общем глюки жили в библиотеке :)

а вот добавить на сайте библиотеко-помойку наверно было бы хорошей идеей... хотя можно завести такую помойку где нибуть и тут просто пришпилить ссылку..

 

К сожалению работает только при отправке небольших кусков в WEB. Я уже пожалел что купил этот можуль а не W5100. Но раз есть этот, значит надо с ним и работать научиться. Вы бы могли мне объяснить принцип работы стандартной библиотеки ethernetshield.h под мой модуль? 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Возмите библиотеку ethercard и прекратите мучиться :)

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

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Puhlyaviy пишет:

Возмите библиотеку ethercard и прекратите мучиться :)

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

качаю. бужут вопросу, буду писАть.

 

Спасибо!

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

И вот первая же ошибка, ошибка компиляции:In file included from getStaticIP.ino:4:

C:\Program Files (x86)\Arduino\libraries\ethercardmaster/EtherCard.h:94: error: conflicting return type specified for 'virtual void Stash::write(uint8_t)'
C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/Print.h:48: error:   overriding 'virtual size_t Print::write(uint8_t)'
C:\Program Files (x86)\Arduino\libraries\ethercardmaster/EtherCard.h:135: error: conflicting return type specified for 'virtual void BufferFiller::write(uint8_t)'
C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/Print.h:48: error:   overriding 'virtual size_t Print::write(uint8_t)'
 
Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

вот эту версию попробуйте..

https://github.com/jcw/ethercard

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Puhlyaviy пишет:

вот эту версию попробуйте..

https://github.com/jcw/ethercard

 

Эта версия работает. НО, библиотека отличается от стандартной Ethernet. Есть пример скетча, так называемый web-термометр. Если не сложно, разжуйте плз строки коментами, что делает та или иная строка, я что то вообще не догоняю.

#include <OneWire.h>
#include <EtherCard.h>

// настройки Ethernet

#define BUF_SIZE 512

byte mac[] = { 0x00, 0x04, 0xA3, 0x21, 0xCA, 0x38 }; // MAC-адрес

byte fixed = false; // =false: пробовать получить адрес по DHCP, 
                   //         в случае неудачи использовать статический; 
                   // =true:  сразу использовать статический

uint8_t ip[] = { 169, 254, 8, 200 };     // Статический IP-адрес
uint8_t subnet[] = { 255, 255, 0, 0 };   // Маска подсети
uint8_t gateway[] = { 192, 168, 1, 20 }; // Адрес шлюза 
uint8_t dns[] = { 192, 168, 1, 20 };     // Адрес DNS-сервера (необязателен)

byte Ethernet::buffer[BUF_SIZE];
static BufferFiller bfill;  // used as cursor while filling the buffer

// настройки OneWire

#define DS18B20PIN  9
OneWire ds(DS18B20PIN);

// команды DS18B20

void setConversionTime(byte conf) {
  ds.reset();
  ds.skip(); // skip ROM
  ds.write(0x4E); // write scratchpad
  ds.write(0); // Th
  ds.write(0); // Tl
  ds.write(conf); // configuration
}

void startConversionAll() {
  ds.reset();
  ds.skip(); // skip ROM
  ds.write(0x44,0); // start conversion
  delay(10);
}

void setup(void)
{
    Serial.begin(57600);
    delay(2000);

    /* Проверяем, что контроллер Ethernet доступен для работы */
    Serial.println("Initialising the Ethernet controller");
    if (ether.begin(sizeof Ethernet::buffer, mac, 10) == 0) {
        Serial.println( "Ethernet controller NOT initialised");
        while (true);
    }

    // Пытаемся получить адрес динамически 
    Serial.println("Attempting to get an IP address using DHCP");
    if (ether.dhcpSetup()) {
        ether.printIp("Got an IP address using DHCP: ", ether.myip);
    } else {
        // Если DHCP не доступен, используем статический ip-адрес
        ether.staticSetup(ip, gateway, dns);
        ether.printIp("DHCP FAILED, using fixed address: ", ether.myip);
        fixed = true;
    }
}

char okHeader[] PROGMEM =
  "HTTP/1.0 200 OK\r\n"
  "Content-Type: text/html\r\n"
  "Pragma: no-cache\r\n"
;

char authorLink[] PROGMEM =
  "</pre><hr>Read about me <a href=\"http://mk90.blogspot.com\" target=\"_blank\">here</a>"
;

static void homePage (BufferFiller& buf) {
  
  buf.emit_p(PSTR("$F\r\n"
    "<title>Arduino web-thermometr</title>"
    "<h2>DS18B20 Network:</h2>"
    "<pre>"), okHeader);
  
  byte counter = 0; 
  byte addr[8]; 
  byte data[12];
  
  setConversionTime(0x7F); // установить 9-битное разрешение 
  startConversionAll(); // запустить конвертацию температуры
  delay(100); // на конвертацию 9-битного значения требуется 93,75 мс
  
  // ищем устройства и выводим результаты
  ds.reset_search();
  delay(250);
  while (ds.search(addr)) {
    buf.emit_p(PSTR("$D: "),++counter);
    if ( OneWire::crc8(addr, 7) != addr[7]) {
      buf.emit_p(PSTR("- address CRC is not valid!\n"));
      continue;
    } else if (addr[0] != 0x28) {
      buf.emit_p(PSTR("- is not a DS18B20 family device!\n"));
      continue;
    }
    ds.reset();
    ds.select(addr);
    ds.write(0xBE); // читать scratchpad
    for (byte k=0; k<9; k++) {  // нам потребуется 9 байт
      data[k] = ds.read();
    }     
    if ( OneWire::crc8( data, 8) != data[8]) {
      buf.emit_p(PSTR("- value CRC is not valid!\n"));
      continue;
    }
    buf.emit_p(PSTR(" $D.$D °C\n"), *(int *)data/16, (int) (abs(*(int *)data % 16) * 0.625));
  }
  buf.emit_p(PSTR("\nTotal: $D devices."), counter);
  buf.emit_p(authorLink);
}


void loop(void)
{
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);
  if (pos) { 
    bfill = ether.tcpOffset();
    char* data = (char *) Ethernet::buffer + pos;
    Serial.println(data); // распечатываем запрос для отладки
    
    if (strncmp("GET / ", data, 6) == 0) 
      homePage(bfill);
    else
      bfill.emit_p(PSTR(
        "HTTP/1.0 401 Unauthorized\r\n"
        "Content-Type: text/html\r\n"
        "\r\n"
        "<h1>401 Unauthorized</h1>"));
        
    // отправить ответ клиенту
    ether.httpServerReply(bfill.position());
  }
}

 

Интерес вызывают строки, начиная с 69.