CC3000 WiFi 실드 (아두이노 Uno, Mega)

WiFi는 우리에게 가장 익숙한 통신 방법 중 하나이고 활용성도 높지만 아두이노에서 WiFi를 쓸려고하면 선택의 폭이 무척 좁습니다. 아두이노에서 쓸만한 WiFi 종류를 꼽아보면…

  •  아두이노 공식 WiFi 실드
    : 가장 간단한 방법. 이미 WiFi 실드용 라이브러리가 아두이노 개발환경에 포함되어 있어 사용하기 좋지만 가격이 너~무 비싼게 문제. 모든 WiFi 선택의 문제는 이게 시작이자 원흉.

robobob_710

  • CC3000 WiFi 실드
    : 아두이노 용으로 나온 WiFi 실드 중 하나. 비록 Adafruit 혹은 Sparkfun 에서 제공하는 라이브러리를 별도로 설치해야 하는 번거로움이 있지만 합리적인 가격이 장점. 해외구매시 20$ 안팎에 구매가 가능. 동작도 안정적이고 연결방법도 쉽움. 실드 형태가 아닌 더 소형화된 모듈 형태로도 나옴. 적어도 현재까지는 WiFi를 구현하기 위한 가장 현실적인 대안이라 생각됨. ESP8266에 가격, 활용성 면에서 밀리지만 사용은 정말 간편함!!

cc3000_wifi_shield

  • ESP8266 WiFi 모듈
    : 3$ 안팎의 믿을 수 없이 저렴한 가격을 무기로 등작한 신성. 일반적인 WiFi 모듈로서 뿐 아니라 AP, 아두이노 처럼 MCU 로 사용하기도 하고 NodeMCU – Lua script 를 이용해서 원격 제어, 아두이노 IDE를 이용해 개발하기도 하는 등 수많은 연구가 이루어지고 있음.아직 동작의 안정성과 전원 관리 등 초급자가 사용하기에는 어려운 모듈임. 펌웨어 업데이트가 지속적으로 이루어지면서 동작이 안정화되고 쓰기 편한 모듈 형태로 나오면 WiFi 시장은 이 모듈로 천하통일 되지 않을까 조심스레 예측함. 하지만 아직은 기다려보는게 좋을 듯. 현존 최고의 활용성, 가성비를 자랑하는 카테고리 킬러로 등극.

esp

  • Wiznet  WiFi 모듈들
    : 국내 업체인 Wiznet에서 생산하는 WiFi 모듈. Ethernet 모듈도 판매함. 한글로 된 자료들을 접할 수 있는 고마운 모듈들이고 종류도 다양.
  • 기타 WiFi 모듈
    : WiFi232 모듈, MT7681 모듈 등이 있으나 사용자층이 적어 관련된 자료를 구하기 어려우므로 추천하기가 힘듬.

이 중에서 현실적으로 구해서 쓰기 가장 만만한 CC3000 WiFi 실드 사용법을 간단히 살펴보겠습니다.

하드웨어적으로 CC3000 WiFi 실드 사용에 어려운 점은 없습니다. 아두이노 우노 또는 메가 보드위에 올리기만 하면 되니까요. 실드를 끼우면 아래 아두이노 핀들이 실드에 의해 사용됩니다.

아두이노

CC3000 WiFi 실드

D13

SCK

D12

MISO

D11

MOSI

D10

CS (CC3000)

D5

VBAT_EN

D4

CS (SD Card)

D3

IRQ

따라서 추가로 다른 모듈, 센서, 소자를 연결할 경우 위 핀들과 중복되지 않게 연결해야 합니다. 그리고 하나 더 신경써야 할 점!! WiFi 모듈들은 대부분 소모 전류가 높습니다. 아두이노에 USB 전원만 넣어서는 제대로 동작하지 않을 수 있습니다. 가급적이면 전용 9V 어댑터로 전원을 공급하는 것이 좋습니다.

CC3000 WiFi 실드 사용을 위해서는 먼저 전용 라이브러리를 설치해야 합니다. Adafruit 에서 제공하는 CC3000 용 라이브러리를 사용하면 됩니다. 아래 링크에서 받으세요.

https://github.com/adafruit/Adafruit_CC3000_Library

(아두이노 최신 개발환경에서 문제가 발생할 수 있음. 1.0.6 버전을 추천)

라이브러리가 설치되었으면 [파일 – 예제 – Adafruit_CC3000] 에 있는 예제들을 실행해서 테스트해보시길 권장합니다. CC3000 WiFi 실드를 활용하는 기본 예제 코드가 충실히 제작되어 있으므로 프로젝트를 진행할 때 이 예제들을 수정해서 사용하면 됩니다. 예제 스케치들은 아래에 있는 공유기의 SSID, 패스워드, 보안 인증 방식만 맞춰주면 동작합니다

// 아래 SSID, 패스워드를 공유기 설정에 맞게 수정
#define WLAN_SSID       "myNetwork"        // cannot be longer than 32 characters!
#define WLAN_PASS       "myPassword"
...
// 보안 인증 방식을 선택
#define WLAN_SECURITY   WLAN_SEC_WPA2

Adafruit CC3000 라이브러리 예제 소스

  • buildtest :실드 초기화 이후 공유기에 연결하고 DHCP를 통해 IP를 할당. www.adafruit.com으로ping 테스트(응답 테스트) 수행.
  • WebClient : 공유기 접속 후 특정 URL에 접속하고 응답으로 받은 페이지를 출력하는 기본 HTTP Request 예제
  • ntpTest, InternetTime : SNTP (Simple Network Time Protocol) 를 통해 현재 시각을 가져오는 예제 스케치
  • GeoLocation : freegeoip.net 서비스를 이용해서 IP를 기반으로 현재 위치를 추정하는 예제
  • SmartConfig : CC3000 WiFi 실드의 설정을 미리 만들어두면 이후부터는 아두이노에서 제어하지 않아도 저장된 설정대로 자동으로 AP를 찾아서 연결하도록 하는 예제. 안드로이드 또는 아이폰에 전용 앱을 설치해서 함께 사용해야 설정 완료가 가능.

주의!!! 예제 소스에 보면 SendTweet 예제가 있는데 현재 동작하지 않습니다. Tweet 인증 방식이 바뀌면서 아두이노 정도의 MCU에서 처리하기에는 인증 과정이 너무 복잡해져 버렸습니다. 대신 thingspeak.com 처럼 IoT 서비스를 제공하는 무료 서버에서 Tweet 을 날릴 수 있도록 중계해주는 서비스를 제공하고 있습니다. 이를 활용하면 됩니다.

여기 또 하나 참고할만한 소스가 있습니다. PIR 센서로 인체 움직임이 감지되면 Tweet을 날리기 위해 thingspeak.com 서버로 HTTP Request를 날려주는 예제입니다.

https://github.com/godstale/How-to-make-talking-things/blob/master/chap11/Arduino/secure_tweet/secure_tweet.ino

예제에서 중요한 부분은 아래와 같습니다.

void updateTwitterStatus(String tsData) {
  Adafruit_CC3000_Client www = cc3000.connectTCP(ip, 80);
  if (www.connected()) {
    // 전송할 API Key와 트윗 문자열 생성
    tsData = "api_key="+thingtweetAPIKey+"&status="+tsData;
    char tempChar[156];
    for(int i=0; i<156; i++)
      tempChar[i] = 0x00;
    tsData.toCharArray(tempChar, 155);
    
    www.fastrprint(F("POST /apps/thingtweet/1/statuses/update HTTP/1.1\r\n"));
    www.fastrprint(F("Host: api.thingspeak.com\r\n"));
    www.fastrprint(F("Connection: close\r\n"));
    www.fastrprint(F("Content-Type: application/x-www-form-urlencoded\r\n"));
    www.fastrprint(F("Content-Length: "));
    www.fastrprint(int2str(tsData.length()));
    www.fastrprint(F("\r\n\r\n"));
    www.fastrprint(tempChar);
    www.println();
  } else {
    Serial.println(F("Connection failed"));    
    return;
  }
  //...
  www.close();
}

WiFi 실드 초기화 및 기본 설정 작업은 모두 setup() 함수 안에서 이루어집니다. 이 부분은 특별히 수정할 게 없을 것입니다. loop() 함수에 있는 루틴들은 자신의 센서, 모듈 연결 상황에 따라 수정이 필요합니다. 실제 HTTP Request 날리는 위 소스를 유심히 보시고 자신의 환경에 맞게 수정해서 사용하시면 됩니다.

참고자료

banner_talkingarduino

You may also like...