WIZ812MJ W5100






WIZ812MJ — это ethernet-шилд для подключения к Arduino или STM32.

Встречаются различные версии — wiz810mj, wiz811mj, наверняка есть ещё какие-то, у меня wiz812mj. Чем они отличаются я не интересовался.


Плата построена на базе микроконтроллера W5100.

картинка


Производитель запилил аппаратный TCP/IP стек, а пользователю остаётся только написать заголовки и тело сообщения.


• Питание — 3.3 вольта.

• Потребление — 140-170мА.

• Интерфейс — SPI (пины толерантны к пяти вольтам).

Datasheet


Примеры подключения и кода приведены для плат Arduino и BluePill (stm32).

распиновка





Arduino


Схема для Arduino Nano, Uno:





Схема для Arduino Mega:




Питание лучше брать от стороннего источника.




Код для Arduino


#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 170);
EthernetServer server(80);

int count = 0;

void setup() 
{
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  pinMode(9, OUTPUT);
  digitalWrite(9, LOW);
  delay(100);
  digitalWrite(9, HIGH);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server address ");
  Serial.println(Ethernet.localIP());
}

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

  if(client) 
  {
    char buff[16] = {0,};
    boolean currentLineIsBlank = true;
    int i = 0;
    
    while(client.connected()) 
    {
      if(client.available()) 
      {
        char c = client.read();
        Serial.write( c);
        
        if(i < 15) 
        {
          buff[i] = c;
          i++;
        }  
        
        if(c == '\n' && currentLineIsBlank) 
        {
          if(strstr(buff, "LED_on") != NULL) digitalWrite(13, HIGH);
          else if(strstr(buff, "LED_off") != NULL) digitalWrite(13, LOW);
          
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html><body>");
          client.println("<a href=\"/?LED_on\"\">Led On</a><br /><br />");
          client.println("<a href=\"/?LED_off\"\">Led Off</a><br /><br />");
          
          count++;
          client.print("Update ");
          client.print(count);
          client.println("</body></html>");
          break;
        }
        
        if(c == '\n') currentLineIsBlank = true;
        else if(c != '\r') currentLineIsBlank = false;
      }
    }
    
    delay(1);
    client.stop();
    Serial.println("client disconnected");
  }
}


Код взят из примеров входящих в состав IDE и немного переделан. Добавлено управление ресетом (пин 9), без этого то работало, то не работало, ну и то, что в браузер выводится.

примеры



Перед прошивкой нужно указать свободный IPAddress ip(192, 168, 1, 170); своей домашней сети, а потом ввести его в браузере 192.168.1.170

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



server address должен вернуть адрес, который вы указывали. Если не вернул, значит что-то не так.

На страничке в браузере будут две ссылки для вкл/откл D13 и счётчик обновлений. Страничка будет перезагружаться каждые 5 сек. Чтоб отключить постоянную перезагрузку, нужно закомментировать строку client.println(«Refresh: 5»);, а после того как убедитесь, что всё работает, можно закомментировать строки Serial.write( с); и Serial.println(«client disconnected»);




STM32





Код для stm32

Код такой же как и для Ардуино, только взят из примеров для stm32 (Примеры ⇨ Ethernet_STM ⇨ Web Server) и тоже немного изменён. Прежде чем его зашивать, надо подкорректировать файл ./arduino-1.8.5/hardware/ArduinoSTM32/STM32F1/libraries/Ethernet_STM/src/utility/w5100.h



Раскомментируйте строчку — #define W5100_ETHERNET_SHIELD

Закомментируйте строчки — #define W5500_ETHERNET_SHIELD и #define W5200_ETHERNET_SHIELD



Теперь можно прошивать плату…


// W5x00 <--> STM32F103
// SCS   <-->  PA4 <-->  BOARD_SPI1_NSS_PIN
// SCLK  <-->  PA5 <-->  BOARD_SPI1_SCK_PIN
// MISO  <-->  PA6 <-->  BOARD_SPI1_MISO_PIN
// MOSI  <-->  PA7 <-->  BOARD_SPI1_MOSI_PIN

#include <SPI.h>
#include <Ethernet_STM.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 170);
EthernetServer server(80);

int count = 0;

void setup() 
{
  Serial.begin(115200);
  pinMode(PC13, OUTPUT);
  pinMode(PA3, OUTPUT);
  digitalWrite(PA3, LOW);
  delay(100);
  digitalWrite(PA3, HIGH);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server address ");
  Serial.println(Ethernet.localIP());
}

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

  if(client) 
  {
    char buff[16] = {0,};
    boolean currentLineIsBlank = true;
    int i = 0;
    
    while(client.connected()) 
    {
      if(client.available()) 
      {
        char c = client.read();
        Serial.write( c);
        
        if(i < 15) 
        {
          buff[i] = c;
          i++;
        }  
        
        if(c == '\n' && currentLineIsBlank) 
        {
          if(strstr(buff, "LED_on") != NULL) digitalWrite(PC13, LOW);
          else if(strstr(buff, "LED_off") != NULL) digitalWrite(PC13, HIGH);
          
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html><body>");
          client.println("<a href=\"/?LED_on\"\">Led On</a><br /><br />");
          client.println("<a href=\"/?LED_off\"\">Led Off</a><br /><br />");
          
          count++;
          client.print("Update ");
          client.print(count);
          client.println("</body></html>");
          break;
        }
        
        if(c == '\n') currentLineIsBlank = true;
        else if(c != '\r') currentLineIsBlank = false;
      }
    }
    
    delay(1);
    client.stop();
    Serial.println("client disconnected");
  }
}

Собственно и всё, не забудьте указать правильный ip-адрес.



В статье не ставилась задача описания различных вариантов использования, я хотел лишь показать схему подключения и скетч «чтоб заработало». В примерах IDE есть всё необходимое…



… настройка DNS, шлюза, подсети и т.д.



В довершение могу сказать, что если подключить всё не «на соплях» и дать качественное питание (не от ардуины), то девайс работает вполне стабильно.

В процессе ковыряния столкнулся с тем, что в «Монитор порта» возвращался какой-то нелепый ip-адрес, проблема была в плохой «земле» между устройствами.



Всем спасибо


  • 0
  • 7874
Поддержать автора


Telegram-чат istarik

Задать вопрос по статье
Telegram-канал istarik

Известит Вас о новых публикациях






Комментарии (0)

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.