ARM Webserver com ethernet shield W5100 e STM32 no mbed

Neste artigo abordaremos o uso do W5100 e do STM32F030 na placa Nucleo com a montagem de um Webserver utilizando o mbed.

 

O mbed é uma plataforma de desenvolvimento da ARM que visa diminuir o tempo de desenvolvimento com uma maior abstração do hardware. Para saber mais você pode conferir este webinar do Thiago Lima que mostra os primeiros passos na plataforma. Ainda sobre a plataforma, estou usando o compilador no browser, mas sinta-se livre para reproduzir este artigo com o mbed instalado em sua máquina. Você pode ver como fazer isto neste artigo de Thiago Lima.

 

Explicar o funcionamento da página não é a finalidade deste artigo, portanto assumi que você saiba HTML e CSS.

 

Hardware

 

Apesar do ethernet shield W5100 encaixar na placa Nucleo, precisamos fazer algumas ligações pois os sinais do SPI ficam no conector ICSP do shield e não são conectados com a NUCLEO.

 

Figura 1: Pinout da placa nucleo.
Pinout da placa ethernet shield w5100.
Figura 2: Pinout da placa ethernet shield w5100.

 

A ligação fica a seguinte:

 

Tabela 1: Ligação dos pinos do Ethernet Shield com a Nucleo.

Ethernet ShieldNucleo
MOSIPB_5
MISOPB_4
SCKPB_3

 

Veja o pinout da placa nucleo aqui.

 

Fundamentação teórica

 

Usaremos a biblioteca da Wiznet para o controle do shield, nela foram implementadas as interfaces necessárias para a troca de informações com o chip.

 

O que faremos é iniciar o servidor web (porta 80) e ficar aguardando o cliente conectar e requisitar a página do servidor para começar o envio. A página foi desenvolvida em HTML e estilizada com CSS.

 

Na página, nós usamos o protocolo de transferência HTTP 1.0, pois nesta versão o padrão de conexão não é persistente, não sendo necessário enviar no HEADER parâmetros como “Connection: close”.

 

A comunicação do botão é feita com GET, a página manda uma requisição "/1" para acender ou "/0" para apagar o led. A função get_request que implementei pode receber uma cadeia enorme de caracteres, basta aumentar o tamanho do Buffer passado no parâmetro da função get_request. O retorno da função devolve o tamanho da solicitação que foi feita pelo cliente.

 

Assim que iniciamos a conexão e disparamos os buffers com a página HTML, o navegador precisa de um parâmetro para saber que a página foi recebida, isto se faz através do número de caracteres da página. Quando o navegador recebe a quantidade de caracteres esperada, ele envia uma flag “FIN” para sinalizar o fim da transmissão de dados. Desta forma o nosso servidor encerra a conexão e o envio. É importante saber que sem receber este sinal, o servidor e o cliente ficam com a conexão ativa, isto resulta em uma página em loop no navegador. No cabeçalho nós enviamos então o parâmetro “Content-Length:” para sinalizar o tamanho da página.

 

Flags de comunicação HTTP.
Figura 3: Flags de comunicação HTTP.

 

Prática

 

Vamos abir o mbed, adicionar a placa no compilador e importar a biblioteca da Wiznet. Veja abaixo:

 

Selecionando a placa no Mbed.
Figura 4: Selecionando a placa no Mbed.

 

No canto direito superior podemos ver que a placa já foi selecionada, caso contrário é só clicar neste local, depois em “add board” e procurar sua placa no catálogo.

 

Crie um novo projeto vazio e crie um documento em branco chamado "main.cpp". Agora vamos importar a biblioteca da wiznet para o projeto em questão:

 

Importando a biblioteca da wiznet para o projeto.
Figura 5: Importando a biblioteca da wiznet para o projeto.

 

Clique com o botão direito no "Projeto > Import Library > From Import Wizard". Na barra de pesquisa procure por "wiznet_library" e adicione a biblioteca com duplo clique.

 

Selecionando a biblioteca da wiznet para o projeto.
Figura 6: Selecionando a biblioteca da wiznet para o projeto.

 

Cole o código abaixo no main.cpp.

 

Vá até o arquivo wiznet.h e descomente a linha "#define USE_W5100", comente a linha "#define USE_W5200" e "#define USE_W5500".

 

Definição do chip do Ethernet Shield.
Figura 7: Definição do chip do Ethernet Shield.

 

Agora vamos por partes: Preencha os parâmetros abaixo de acordo com sua rede, se você usa Windows você pode obter informações da sua rede com o comando “ipconfig” no CMD. Caso esteja no linux, você pode tentar “ip addr show”, dependendo da sua distribuição.

 

Nos vetores “page_XXXX” está a nossa página WEB. Eu separei em diversos vetores para facilitar, mas poderia estar sem problemas em apenas um vetor, porém isto dificulta a manutenção e o entendimento. O código original da página está abaixo, você pode salvá-lo em um “arquivo.htm” para abrir no seu browser.

 

Agora é só compilar e testar na sua placa! 

 

Resultados

 

Página do Webserver.
Figura 8: Página do Webserver.
Placa Nucleo e Ethernet Shield com as ligações dos pinos SPI.
Figura 9: Placa Nucleo e Ethernet Shield com as ligações dos pinos SPI.

 

O que achou do artigo? Ficou com alguma dúvida a respeito do código? Deixe um comentário, seu feedback é muito importante pra mim!

 

Saiba mais

 

Curso mbed e FRDM KL46Z da NXP

Curso mbed e FRDM KL25Z da NXP

Aplicação da WEMOS D1 R1 como Webserver

 

Referências

 

TCP Headers with SYN and FIN Flags Set

How to create Simple Web Server with Mbed and W5100 Ethernet Shield

Adding ethernet connectivity to a STM32-Nucleo

W5100, Wiznet

NUCLEO-F030R8, ST

NUCLEO-F030R8, Mbed

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Muriel Costa
Técnico em mecatrônica, Graduando em Engenharia da informação pela Federal do ABC. Entusiasta da área, adoro frequentar espaços colaborativos e estar engajado com a comunidade. Em minhas escassas horas vagas gosto de organizar meu laboratório, desenvolver projetos, assistir séries e apreciar um bom churrasco.

8
Deixe um comentário

avatar
 
4 Comment threads
4 Thread replies
5 Followers
 
Most reacted comment
Hottest comment thread
5 Comment authors
velrinoBrunaGabrielMuriel CostaRafael Telles Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
velrino
Visitante
velrino

Ótimo artigo, claro, abrangente e objetivo!

Bruna
Visitante
Bruna

Ficou muito bom, admiração por sempre procurar saber mais e repassar para os outros. Parabéns!

Gabriel
Visitante
Gabriel

Artigo muito útil! Parabéns.

Rafael Telles
Visitante
Rafael Telles

Parabéns pelo artigo Muriel, muito bem escrito 🙂
Vi que para fazer webservers no Arduino, normalmente colocamos o HTML escrito no código, como você fez, daria pra deixar em arquivos separados? Talvez com algum macro pro compilador "colar" o conteúdo do HTML ali?