[아두이노] [강좌] 48. 와이파이 통신 (2) - 커맨드 모드 사용하기 (WiFly 쉴드)

이번 강좌에서는 WiFly 모듈의 커맨드 모드에 대한 실습을 진행할 예정이다.


지난 강좌에서 잠시 언급했다시피, 실습에서 사용할 WiFly 모듈의 칩은 지난 번 블루투스 칩과 제조사가 같기 때문에 유사한 점이 많다. '$$$' 명령으로 커맨드 모드에 진입한다는 것이 그 중 하나. 


''WiFly' 쉴드는 중간에 'SC16IS750' 칩이 있기 때문에 직접 데이터를 전달할 수 없고,N'WiFly'에서 제공하는 라이브러리를 이용해야 한다. 


'WiFly' 라이브러리는 아래 링크에서 다운로드 받을 수 있다.



>> 'WiFly' 라이브러리 다운로드 링크


위 링크에서 오른쪽 하단의 "Download ZIP" 버튼을 누르면 압축 파일을 다운로드 받을 수 있다. 파일을 아두이노 스케치 툴 폴더 아래의 'libraries' 폴더 내에 압축을 (폴더 만들지 말고) 해제한 후 해제된 폴더명을 'WiFly'로 변경한다. 라이브러리 폴더명에는 '-'가 들어갈 수 없다. 그리고 너무 길어.


그런 후 스케치 툴을 실행하면 '파일→예제'에 아래와 같이 "SpartFun WiFly Shield'라는 카테고리가 생긴 것을 확인할 수 있다.


522920d3448a5efc49f6abc71fcacfe6.png


예제 중 'SpiUartTerminal' 예제를 실행해보자. 



SpiUartTerminal.ino

 

#include <SPI.h>

#include <WiFly.h>


void setup() {

  Serial.begin(9600);

  SpiSerial.begin();

}



void loop() {

  while(SpiSerial.available() > 0) {

    Serial.write(SpiSerial.read());

  }

  

  if(Serial.available()) { // Outgoing data

    SpiSerial.write(Serial.read());

  }

}


 



'MultiSerialMega' 예제와 구조는 비슷하다. 여기서 받은 데이터를 저기로 넘기는 것. 


'SpiSerial' 클래스는 'SC16IS750'와 데이터를 주고받는 프로토콜이 정의된 클래스이므로 SPI 함수가 아닌 것에 유의하자. SPI 함수에는 available() 함수가 엄써요.


이 소스가 중요한 건 아니니까 넘어가고, 업로드 한 후 시리얼 모니터 프로그램을 실행해보자. 그리고는 입력 창에 '$$$'를 입력한 후 전송. 종료 문자 설정이 'No line ending'이어야 한다는 점에 유의. 보레이트(Baud Rate)는 이제 말 안 해도 알겠지.


'$$$'를 전송했을 때 응답으로 'CMD'가 수신되면 정상적으로 통신이 되는 것이다.



'WiFly'는 블루투스에 비해 설정이나 동작 커맨드가 다양하기 때문에 'RN-42'보다 복잡하다. 다음은 'WiFly' 칩의 커맨드 종류 중 일부를 나타낸 것이다. 


401ba8825eabb695dc32952a47e563eb.png
 

473fce537290d7f451a77db4f507e4a6.png
 


좀 더 자세한 내용은 아래 링크의 'User's Guide'를 참고하자.



>> WiFly User's Guide



'Set Command'와 'Get Command'는 사용하는 방식이 동일하다. 'set/get category name value'로 구성된다. 예를 들어 'wlan' 카테고리의 'ssid'를 설정하고 싶다면 "set wlan ssid xxxx"라고 입력하면 된다. 반대로 'ssid'를 읽어오고 싶다면 "get wlan ssid"라고 입력하면 값이 수신된다. 


카테고리 부분은 줄여서 첫 글자만 써도 된다. "set w ssid xxxx"나 "get w ssid"도 됨. 


'Status Command'는 한 카테고리 전체의 설정을 보여주는 커맨드로,N'show category'로 사용한다. 시스템 설정 상태를 확인하고 싶다면 "show sys" 또는 "show s"라고 입력한다.


'Action Command'와 'File I/O Command'는 커맨드마다 매개 변수의 개수나 방법이 다르므로 'User's Guide'를 참고해야 한다.



'WiFly'는 "exit" 명령으로 커맨드 모드를 종료한다. 이건 'RN-42'랑 다르구먼. 모든 커맨드는 대소문자를 구별하지 않지만, SSID처럼 실제 사용되는 값에서는 대소문자에 유의해야 한다. "$$$" 커맨드 외의 모든 커맨드에는 종료 문자 '<cr>'(Carriage Return)로 끝나야 한다. 또 커맨드와 매개 변수를 구분하기 위해서만 공백 문자(띄워 쓰기, Space)를 사용할 수 있으며, 그 외의 경우에 띄워 쓰기를 사용해야 할 경우 공백 문자 대신 '$'를 사용한다. (예: "MY NETWORK" → "MY$NETWORK")





아. 복잡하네. ㅜㅜ




근데 괜찮음. 커맨드를 사용할 일은 잘 없으니까. 


위 예제 소스로 간단하게 'get' 명령이나 'show' 명령을 사용하면 해당 정보를 간단하게 확인할 수 있다. 근데 난 간단한 실습은 안 할테야. 시져시져.



brown_and_cony-42

(애교부리다 사망)



커맨드 모드에서 할당 받은 IP 주소 값을 읽어 오는 실습을 해보자. IP 주소 값을 읽어오려면 AP에 일단 접속해야 하므로 'SpiUartTerminal' 예제에 AP 접속 코드를 추가할 것이다. 당연히 근처에 접속 가능한 AP가 존재해야 하며 AP의 SSID와 패스워드를 알고 있어야 한다.



소스 코드는 다음과 같다.



 WiFly_CommandTest.ino

 

#include <SPI.h>

#include <WiFly.h>


char ssid[] = "ssid";

char passphrase[] = "passphrase";


void setup() {

  Serial.begin(9600);

  Serial.println("Wait....");


  WiFly.begin();


  if(WiFly.join(ssid, passphrase)) {

    Serial.println("Association Failed.");

    while(1) ;

  }


  SpiSerial.println("exit");

  delay(100);


  Serial.println("\n\nWiFly Shield Terminal Routine : \"$$$\"");

}


void loop() {

  while(SpiSerial.available() > 0) {

    Serial.write(SpiSerial.read());

  }


  if(Serial.available()) {

    SpiSerial.write(Serial.read());

  }

}


 




AP 접속과 관련된 기능은 'WiFly' 라이브러리에 정의되어 있으므로 헤어 파일을 추가해준다. WiFly 라이브러리는 SPI 통신을 사용하므로 'SPI.h' 파일도 추가한다. 


문자형 배열 "ssid[]"와 "passphrase[]"에 각각 자신의 AP에 대한 SSID와 패스워드를 문자열로 저장한다. SSID와 패스워드는 대소문자를 구분하므로 주의하자. 


setup() 함수에서는 WiFly 객체를 "WiFly.begin()" 함수로 초기화한다. WiFly 함수에 대한 자세한 설명은 다음 강좌에서 한꺼번에 진행할 예정이므로 지금은 초기화 함수로 알고 지나가자.


그리고 "WiFly.join()" 함수로 AP에 접속을 시도한다.  매개 변수로는 아까 저장한 "ssid[]"와 "passphrase[]" 변수가 사용된다. 접속에 실패할 경우 오류 값이 반환되며, 성공할 경우 0이 반환된다. 


"WiFly.join()" 함수 사용 시 커맨드 모드로 진입하게 되므로 "exit" 커맨드를 전송하여 커맨드 모드를 종료한다. 


loop() 함수는 'SpiUartTerminal' 예제와 동일하다.



자, 업로드 한 후 시리얼 모니터를 실행해보자. 


"WiFly Shield Terminal Routine : "$$$""라는 문구가 나타날 때까지 잠시 기다린다. WiFly 모듈이 AP에 접속하기 위해 3~10초 간의 시간이 소요된다. 만일 30초 이상의 시간이 지났는데도 아무 반응이 없거나 "Association Failed"라는 문구가 나타나면 AP의 상태, SSID와 패스워드, 모듈의 LED 상태(대기 상태에서 State LED가 1초 간격으로 깜빡여야 함)가 모두 정상인지 확인하자. 또는 AP에 보안이 걸려있는 경우는 패스워드만으로 접속할 수 없을 수도 있다. 



만일 모두 정상인데 접속이 되지 않을 경우 공정 초기화를 이용해볼 수 있는데, 이 방법은 맨 아래의 '*참고'를 참조.



정상적으로 AP에 접속되었다면 "WiFly Shield Terminal Routine : "$$$""라는 메시지가 출력될 것이다. 그럼 시리얼 모니터의 입력 창에 "$$$"라고 입력한 후 종료 문자를 "No line ending"으로 설정하여 전송한다. "CMD"라는 응답이 와야 정상적으로 커맨드 모드에 진입된 것이다. 


이제 종료 문자 설정을 '캐리지 리턴(Carriage Return)' 또는 'Both NL & CR'으로 바꾼 후 "get ip"라고 전송해보자. 


다음과 같이 IP에 대한 정보가 출력되는 것을 확인할 수 있다. 


d38e67f1789cc87c446c3210855dd94e.png


빨간 줄로 표시해둔 부분이 바로, WiFly 모듈이 AP로부터 할당 받은 IP 주소가 적힌 곳이다. 만일 아두이노로 서버를 구현한다면 외부에서 저기 표시된 IP를 이용해 접속할 수 있다. 그 아래로 넷마스크(NM, NetMask), 게이트웨이(GW, Gateway) 주소 등도 함께 표시 됨.



IP를 할당 받았으니 이제 구현할 일만 남았...

brown_and_cony-22 



다음 시간엔 "WiFly_WebClient" 예제에 대해 살펴볼 예정! 그럼 안녕.

0
0
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기

임베디드 보드

번호 제목 글쓴이 날짜 조회수
58 아두이노 [강좌] 50. 와이파이 통신 (4) - WebServer 예제 icon 양재동메이커 03-21 9,543
57 아두이노 [강좌] 49. 와이파이 통신 (3) - WebClient 예제 icon 양재동메이커 03-21 13,218
56 아두이노 [강좌] 48. 와이파이 통신 (2) - 커맨드 모드 사용하기 (WiFly 쉴드) icon 양재동메이커 03-20 8,627
55 아두이노 [강좌] 47. 와이파이 통신 (1) - 와이파이란 무엇인가 icon 양재동메이커 03-20 12,393
54 아두이노 [강좌] 46. 블루투스 통신 (5) - 프로토콜 만들기 (2) icon 양재동메이커 03-20 8,914
53 아두이노 [강좌] 45. 블루투스 통신 (4) - 프로토콜 만들기 (1) icon 양재동메이커 03-20 10,408
52 아두이노 [강좌] 44. 블루투스 통신 (3) - RN42 모듈에서 직접 접속하기 icon 양재동메이커 03-20 7,740
51 아두이노 [강좌] 43. 블루투스 통신 (2) - 스마트폰과 통신하기 icon 양재동메이커 03-20 9,844
50 아두이노 [강좌] 42. 블루투스 통신 (1) - RN42 블루투스 모듈 실습하기 icon 양재동메이커 03-20 10,982
49 아두이노 [강좌] 41. 서보 모터 (2) - Servo 함수 알아보기 icon 양재동메이커 03-20 12,698
48 아두이노 [아두이노 강좌] 40. 서보 모터 (1) - 서보 모터 동작 방식 icon 양재동메이커 03-20 12,632
47 아두이노 [강좌] 39. 스텝 모터 (3) - 모터 드라이버 EasyDriver(A3967) 사용하기 icon 양재동메이커 03-20 8,983
46 아두이노 [강좌] 38. 스텝 모터 (2) - Stepper 함수 알아보기 icon 양재동메이커 03-20 12,547
45 아두이노 [강좌] 37. 스텝 모터 (1) - 스텝 모터 동작 방식 icon 양재동메이커 03-20 9,325
44 아두이노 [강좌] 36. DC 모터 (2) - DC 모터 드라이버 실습하기 (TB6612FNG) icon 양재동메이커 03-20 9,187
43 아두이노 [강좌] 35. DC 모터 (1) - DC 모터 동작 방식 icon 양재동메이커 03-20 11,463
42 아두이노 [강좌] 34. SPI 통신 (3) - 기압 센서(MPL115A1) 실습하기 icon 양재동메이커 03-20 8,136
41 아두이노 [강좌] 33. SPI 통신 (2) – SPI 함수 알아보기 icon 양재동메이커 03-20 14,504
40 아두이노 [강좌] 32. SPI 통신 (1) - SPI 통신이란 무엇인가 icon 양재동메이커 03-20 18,975
39 아두이노 [강좌] 31. I2C 통신 (3) - 온도 센서(TMP102) 실습하기 icon 양재동메이커 03-20 14,788