[아두이노] [강좌] 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
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기

임베디드 보드

번호 제목 글쓴이 날짜 조회수
118 아두이노 ESP32 Analog Inputs (ADC) +4 icon 양재동메이커 02-12 16,146
117 아두이노 TIP : Serial의 Port가 Open 시점 확인 icon 양재동메이커 01-21 13,002
116 아두이노 ESP32 Boot Mode icon 양재동메이커 12-28 12,845
115 아두이노 아두이노 에러 리스트(Arduino Error list) icon 양재동메이커 11-24 17,827
114 아두이노 ESP32 main.cpp +1 icon 양재동메이커 11-19 13,192
113 아두이노 ESP32 EEPROM 와 IR Remote icon 양재동메이커 08-06 13,094
112 아두이노 Learn ESP32 icon 양재동메이커 06-25 12,668
111 라즈베리 파이 라즈베리 파이 (Raspberry Pi) 기초 icon 양재동메이커 06-19 14,168
110 라즈베리 파이 (동영상 강의) 라즈베리 파이 강좌 Link icon 양재동메이커 06-17 13,267
109 STM32 / MBED [MED] Switch debouncing icon HellMaker 12-30 15,246
108 기타 [타이젠] 아두이노의 16x2 LCD Display라이브러리 LiquidCrystal_I2C의 타이젠 포팅 icon 양재동메이커 09-15 14,815
107 기타 [타이젠] GPIO의 디지탈 출력과 입력 인터럽트의 C++ Class 제작 icon 양재동메이커 09-12 14,298
106 마이크로비트 서보 모터 icon HellMaker 09-03 14,114
105 마이크로비트 아날로그 온도센서 (마이크로 비트 센서 활용) icon HellMaker 09-01 14,624
104 마이크로비트 터치센서 (마이크로 비트 센서 활용) icon HellMaker 09-01 13,735
103 마이크로비트 디지털 홀 센서 (마이크로 비트 센서 활용) icon HellMaker 08-29 12,919
102 마이크로비트 리니어 홀 센서 (마이크로 비트 센서 활용) icon HellMaker 08-29 12,470
101 마이크로비트 불꽃 감지 센서 (마이크로 비트 센서 활용) icon HellMaker 08-26 12,807
100 마이크로비트 로터리 엔코더 (마이크로 비트 센서 활용) icon HellMaker 08-25 12,917
99 마이크로비트 2컬러 LED(3mm) (센서 활용) icon HellMaker 08-22 12,915