Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

ESP32 + moduł ethernetowy enc28j60, jak to skonfigurować?

madiz08 23 Nov 2019 20:44 1920 13
e-mierniki
  • #1
    madiz08
    Level 14  
    Witam
    Czy może komuś z kolegów udało się połączyć ESP z siecia lokalną, ale nie po WiFi, a po Ethernecie? Mam dwa moduły ethernetowe enc28j60. Jedynym źródłem które znalazłem jest strona:
    https://esp32.com/viewtopic.php?t=3994
    Pobrałem bibliotekę oraz wgrałem podany na tej stronie kod, podłączając moduł enc28j60 do pinów SPI (miso, mosi, sck), jednak niestety to nie działa. Nie wiem do końca czym jest złącze CS (chip select). Próbowałem na stałe podłączyc ten pin do masy, potem do 3,3V, ale to też nic nie dało.
  • e-mierniki
  • Helpful post
    #2
    khoam
    Level 41  
    Czy przeglądałeś tę stronę: https://github.com/8-DK/EtherCard

    madiz08 wrote:
    Nie wiem do końca czym jest złącze CS (chip select).

    Gdzie podłączyć CS też jest opisane na tej stronie.
  • #3
    madiz08
    Level 14  
    Super, działa!!! Wcześniej sugerowałem się w ogóle takim podłączeniem pinów jak na screenie powyżej. Wszystko działa, także działam dalej. Dziękuję

    Dodano po 22 [minuty]:

    Jedyne co zmieniłem, to jako napięcie zasilające nie 5V, tylko 3,3V dla modułu. Przy 5V strasznie mocno się grzał, przy 3,3V chip jest po prostu ciepły, a komunikacja ethernet działa prawidłowo
  • Helpful post
    #4
    khoam
    Level 41  
    madiz08 wrote:
    Jedyne co zmieniłem, to jako napięcie zasilające nie 5V, tylko 3,3V dla modułu. Przy 5V strasznie mocno się grzał, przy 3,3V chip jest po prostu ciepły, a komunikacja ethernet działa prawidłowo

    Wprawdzie piny SPI w module ENC28J60 tolerują 5V, ale już niekoniecznie piny SPI w ESP32 :)
    Przy zasilaniu modułu ENC28J60 z 3V3 będzie OK.
  • e-mierniki
  • #5
    madiz08
    Level 14  
    A jeszcze miałbym pytanko, czy dałoby się rozwiązać problem z kompilacją EEPROM.h?
    Code: c
    Log in, to see the code

    Powyższy kod jest dokładnie tym, co podane jest na stronie z biblioteką do ESP32. Jednak jeżeli odznaczymy zakomentowaną pierwszą linijkę kodu, tym samym wstawiając bibliotekę EEPROM.h, występują błędy kompilacji.
    Chodzi mi o to, że przez oddzielną aplikację mogę ładować zawartość IP, podsieci i inne do pamięci EEPROM, po czym przy starcie mikrokontrolera te wszystkie adresy są pobierane właśnie z EEPROM.
    Działa mi to na UNO z modułem ethernetowym, na ESP32 przy użyciu WiFi, natomiast przy użyciu enc28j60 z ESP32, nie mogę odpowiednio skompilować projektu.
  • #6
    khoam
    Level 41  
    madiz08 wrote:
    Jednak jeżeli odznaczymy zakomentowaną pierwszą linijkę kodu, tym samym wstawiając bibliotekę EEPROM.h, występują błędy kompilacji.

    Jakie są to konkretnie błędy kompilacji?
  • #7
    madiz08
    Level 14  
    Poniżej przesyłam błędy kompilacji spowodowane dodaniem EEPROM.h
    Code: c
    Log in, to see the code
  • Helpful post
    #8
    khoam
    Level 41  
    Wygląda na to, że pliki EEPROM.{h,cpp} występują w dwóch miejscach, w libraries\EEPROM\ oraz libraries\EtherCard-master\
    Musisz się zdecydować na jedną, a drugą wykasować :)
  • #9
    madiz08
    Level 14  
    Dokładnie tak. Okazuje się, że musiałem tymczasowo usunąć Wifi.h oraz Wifi.cpp z lokalizacji:
    C:\Users\Admin\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.2\libraries\EEPROM\src
  • #10
    martii
    Level 11  
    No ja też postanowiłem pobawić się tym modułem i mam taki oto objaw:

    Restarting...
    ets Jun 8 2016 00:22:57

    rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
    configsip: 0, SPIWP:0xee
    clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
    mode:DIO, clock div:2
    load:0x3fff0018,len:4
    load:0x3fff001c,len:1044
    load:0x40078000,len:8896
    load:0x40080400,len:5828
    entry 0x400806ac
    Trying to get an IP...
    MAC: 74:69:69:2D:30:31
    Failed to initialise EEPROM
    Restarting...

    Kod w zasadzie ze stronki - jedynie to używam Visual Studio Code z PlatformIO - ale biblioteka ta sama.
  • #11
    khoam
    Level 41  
    martii wrote:
    Kod w zasadzie ze stronki - jedynie to używam Visual Studio Code z PlatformIO - ale biblioteka ta sama.

    Jaki kod z jakiej stronki? Jaka biblioteka?
  • #12
    martii
    Level 11  
    Dokładnie taki (używam takiej plytki mini-testowej, którą promujesz w postach) ESP-WROOM-32 - piny podpięte jak w dokumentacji do EtherCard [github 8-DK] - w sumie to nie wiem czy nie robię pod górkę bo ESP32 chyba ma jakoś wbudowany ethernet?

    #include <Arduino.h>
    #include <EtherCard.h>
    #define STATIC 1 // set to 1 to disable DHCP (adjust myip/gwip values below)

    // mac address
    static byte mymac[] = {0x74, 0x69, 0x69, 0x2D, 0x30, 0x31};
    // ethernet interface ip address
    static byte myip[] = {192, 168, 90, 200};
    // gateway ip address
    static byte gwip[] = {192, 168, 90, 1};

    // LED to control output
    int ledPin10 = 9;

    byte Ethernet::buffer[700];

    char const page[] PROGMEM =
    "HTTP/1.0 503 Service Unavailable\r\n"
    "Content-Type: text/html\r\n"
    "Retry-After: 600\r\n"
    "\r\n"
    "<html>"
    "<head><title>"
    "Service Temporarily Unavailable"
    "</title></head>"
    "<body>"
    "<h3>This page is used behind the scene</h3>"
    "<p><em>"
    "Commands to control LED are transferred to Arduino.<br />"
    "The syntax: http://192.168.0.XX/?LED10=OFF or ON"
    "</em></p>"
    "</body>"
    "</html>";

    void blinkLed()
    {
    while (true)
    {
    digitalWrite(ledPin10, HIGH);
    delay(500);
    digitalWrite(ledPin10, LOW);
    delay(500);
    }
    }

    void setup()
    {
    pinMode(ledPin10, OUTPUT);

    Serial.begin(115200);
    Serial.println("Trying to get an IP...");

    Serial.print("MAC: ");
    for (byte i = 0; i < 6; ++i)
    {
    Serial.print(mymac, HEX);
    if (i < 5)
    Serial.print(':');
    }
    Serial.println();

    if (ether.begin(sizeof Ethernet::buffer, mymac, 15) == 0)
    {
    Serial.println("Failed to access Ethernet controller");
    }
    else
    {
    Serial.println("Ethernet controller access: OK");
    };

    #if STATIC
    Serial.println("Getting static IP.");
    if (!ether.staticSetup(myip, gwip))
    {
    Serial.println("could not get a static IP");
    blinkLed(); // blink forever to indicate a problem
    }
    #else

    Serial.println("Setting up DHCP");
    if (!ether.dhcpSetup())
    {
    Serial.println("DHCP failed");
    blinkLed(); // blink forever to indicate a problem
    }
    #endif

    ether.printIp("My IP: ", ether.myip);
    ether.printIp("Netmask: ", ether.netmask);
    ether.printIp("GW IP: ", ether.gwip);
    ether.printIp("DNS IP: ", ether.dnsip);
    }

    void loop()
    {

    word len = ether.packetReceive();
    word pos = ether.packetLoop(len);

    // IF LED10=ON turn it ON
    if (strstr((char *)Ethernet::buffer + pos, "GET /?LED10=ON") != 0)
    {
    Serial.println("Received ON command");
    digitalWrite(ledPin10, HIGH);
    }

    // IF LED10=OFF turn it OFF
    if (strstr((char *)Ethernet::buffer + pos, "GET /?LED10=OFF") != 0)
    {
    Serial.println("Received OFF command");
    digitalWrite(ledPin10, LOW);
    }

    // show some data to the user
    memcpy_P(ether.tcpOffset(), page, sizeof page);
    ether.httpServerReply(sizeof page - 1);
    }
  • #13
    khoam
    Level 41  
    Zakładam, że używasz biblioteki EtherCard z tej strony: Link
    Biblioteka ta zawiera własną obsługę emulowanego EEPROM i jest ona już nieaktualna. Chodzi o pliki EtherCard/src/EEPROM.h oraz EtherCard/src/EEPROM.cpp.

    Należy użyć innej, nowszej wersji tych plików dostarczanych wraz z Arduino Core dla ESP32 (Link), Na początek wykasuj po prostu pliki EEPROM.h oraz EEPROM.h z biblioteki EtherCard, którą doinstalowałeś do projektu i spróbuj skompilować ponownie program - powinny zostać użyte pliki z Core.

    martii wrote:
    bo ESP32 chyba ma jakoś wbudowany ethernet?

    Ma wbudowaną obsługę protokołu Ethernet (interfejs fizyczny i tak trzeba dołączyć), ale w Core dla ESP32 nie ma wsparcia dla ENC28J60.
  • #14
    martii
    Level 11  
    EDIT:

    No dobra - podmieniłem to co napisałem niżej oraz wszystkie wystpąpienia EEPROM.eeprom_read_byte na EEPROM.readByte i teraz kompiluje się, ale coś tam jest dalej zrypane bo nawet uplink się nie podnosi - jak dam samo zasilanie to jest OK - uplink na zielono - jak wrzucę kod - kicha ciemność na porcie.

    ----------------------------------

    Już oczywiście próbowałem usunąć te pliki - ale nie wiem dlaczego nie pobiera ich z Core i się nie kompiluje plując błędami :(
    Nawet podmianka w 3 plikach biblioteki #include "EEPROM.h" na #include <EEPROM.h> nie pomogła :(

    lib/EtherCard-master/src/bufferfiller.cpp: In member function 'void BufferFiller::emit_p(const char*, ...)':
    lib/EtherCard-master/src/bufferfiller.cpp:62:30: error: 'class EEPROMClass' has no member named 'eeprom_read_byte'
    while ((d=EEPROM.eeprom_read_byte(*s++)) != 0)
    ^
    lib/EtherCard-master/src/stash.cpp: In static member function 'static void Stash::prepare(const char*, ...)':
    lib/EtherCard-master/src/stash.cpp:179:36: error: 'class EEPROMClass' has no member named 'eeprom_read_byte'
    while ((d = EEPROM.eeprom_read_byte(*s++)) != 0)
    ^
    lib/EtherCard-master/src/stash.cpp: In static member function 'static void Stash::extract(uint16_t, uint16_t, void*)':
    lib/EtherCard-master/src/stash.cpp:258:24: error: 'class EEPROMClass' has no member named 'eeprom_read_byte'
    c = EEPROM.eeprom_read_byte(*ptr++);
    ^
    lib/EtherCard-master/src/enc28j60.cpp:275:13: warning: 'void xferSPI(byte)' defined but not used [-Wunused-function]
    static void xferSPI (byte data) {
    ^