위즈네트 아카데미

TUTORIAL

튜토리얼

Home  > 튜토리얼

Wireless WizFi250을 아두이노 WiFi Shield 활용 시 유의사항

WIZnet Academy 2015.01.13 14:46 조회 수 : 84

WizFi250-EVB는 WiFi 모듈인 WizFi250를 테스트 하기 위해 개발된 보드이나 동시에 아두이노에 WiFi 연결을 할 수 있도록 설계되어 WiFi Shield로 활용이 가능합니다. 이번 포스팅은 WizFi250을 WiFi Shield 로 사용할 때 유의해야 할 사항을 정리해 보았습니다.




Shield 활용을 위한 Check 사항


 1. WizFi250이 SPI 모드로 동작하고 있는지 확인

  • WizFi250의 Arduino Library는 SPI Interface를 사용해서 WizFi250-EVB(Arduino Shield)와 Arduino를 연결하기 때문에 WizFi250의 현재 모드를 확인 해야 합니다.

  • WizFi250은 Factory Default Setting 후, 처음 입력되는 Interface 신호에 따라 모드가 정해 집니다. 예를 들면, 처음 입력되는 신호가 UART이면 UART 모드로, SPI면 SPI 모드로 동작 합니다.

  • WizFi250을 Factory Default 하기 위한 방법은 아래와 같습니다.

  • WizFi250_Factory_defaultFunction Button을 이용한 방법 이외에 Serial Command를 이용해서 Factory Default를 수행 할 수 있습니다. (주의 할 점은 시리얼로 Factory Default를 수생한 후에는 아무런 Serial Data를 송신 하면 안됨 )

  • WizFi250-EVB를 PC와 USB로 연결 후 Factory Reset 수행

    • WizFi250은 Default로 UART 인터페이스를 사용

    • SPI Interface로 전환하기 위해 WizFi250-EVB를 Factory Reset 후 Arduino Board에 연결




wizfi250_factory_reset

 

2. WizFi250-EVB의 0ohm 저항이 아래의 위치에 있는지 확인

wizfi250-0ohm

 

위 1,2번이 정상적으로 확인 되면, WizFi250 Arduino Library를 다운로드 한 후 WizFi250의 Wi-Fi 기능을 사용 할 수 있습니다.




WizFi250 SPI Signal 확인 방법


SPI Signal 확인을 위한 준비 과정

1. Arduino와 WizFi250-EVB 를 연결
2. Oscilloscope를 사용하기 위해, 아래 그림과 같이 SPI pin(MOSI,SS,SCK,MISO,GND)들에 Cable을 연결
wizfi250-spi-osc-1

 

일반적인 SPI 파형

1. SPI Data를 송/수신 하면, SS(CS)는 low로 설정되고 SCK(CLK)가 8번 분주합니다. 이때 아래 그림과 같이 MISO, MOSI 핀을 이용하여 SPI Data를 송/수신 합니다.

spi-signal

 

2. 아래 그림은 SS(CS) 주기를 기준으로 Capture 한 사진입니다.

spi-signal-1

WizFi250이 MCU에 데이터를 송신할 때의 파형

spi-signal-2

SPI 테스트를 위한 예제 코드
#include <Arduino.h>
#include <SPI.h>
#include <IPAddress.h>
#include "WizFi250.h"

#define ARDUINO_MEGA_2560

WizFi250 wizfi250;

//The setup function is called once at startup of the sketch
void setup()
{
// Add your initialization code here
Serial.begin(9600);
Serial.println("rnSerial Init");

wizfi250.begin();
wizfi250.setDebugPrint(4);
wizfi250.hw_reset();

wizfi250.sync();
}

// The loop function is called in an endless loop
void loop()
{
while(1);
}

 




Arduino Reset 되는 현상 및 Data 깨짐 현상 수정하기


Arduino Uno 기반으로 WizFi250 Library를 작업 중, Arduino Board가 이유 없이 Reboot 되거나 Serial에 출력되는 메시지가 깨지는 현상이 발생할 수 있습니다. 이는 SRAM이 부족한 Uno Board에 다수의 로그 메시지를 출력하려다 보니 SRAM의 메모리가 오버플로우 되어 발생한 것으로 확인 되었으며, SRAM 메모리를 오버해서 사용하려다 보니  모듈이 비정상 메시지를 출력하거나 Reboot 되는 것으로 판단됩니다.

아래 표를 보면 Uno Board는 SRAM을 2KB 밖에 사용하지 못하며, 반면 Flash Memory는 부트로더용 0.5KB를 뺀 31.5KB를 사용 할 수 있습니다.

uno_chart

위 문제를 해결하기 위해서는 SRAM에 저장되어야 하는 로그 메시지들을 비교적 여유가 있는 Flash Memory에 저장 하는 방법을 사용할 수 있으며, 아래와 같이 cpp 파일에 PROGMEM 매크로를 사용하면 됩니다.
(이는 Arduino Board 이외에 다른 AVR사의 MCU에서도 사용 가능 합니다 )
#include <avr/pgmspace.h>

prog_char DBG_Start_Msg[] PROGMEM = "DBG>>>>";
prog_char DBG_SPI_SEND[] PROGMEM = "SPI Send";
prog_char DBG_SPI_RECV[] PROGMEM = "SPI Recv";
prog_char DBG_ERROR_DATA_SIZE_TOO_BIG[] PROGMEM = "Error : send-data-size if too big";
prog_char DBG_ERROR_RX_BUFF_OVERFLOW[] PROGMEM = "Error : m_spi_rx_buffer overflow";
prog_char DBG_ERROR_NOT_FOUND_SUCCESS_STRING[] PROGMEM = "Error : Timeout or Not Found Success";
prog_char DBG_NEED_SPI_NULL[] PROGMEM = "Need SPI_NUL";

 

출처 : 카이젠의 임베디드 DIY 공작소