고급 예제

다양한 도구들을 가지고 마음껏 응용해보세요.

아두이노 WIFI 실드-(1) wifi 기초

2014-08-11 14:25:32

개요 및 부품 목록

 

 

WiFi(Wireless Fidelity)는 무선접속장치가 설치된 곳에서 전파나 적외선 전송방식을 이용하여 일정 거리 안에서 무선 인터넷을 할 수 있는 근거리 통신망을 지칭하는 기술입니다.

근래에 들어서 선없이 인터넷이나 상호간 통신이 가능하다는 장점때문에 게임기, 프린터, TV등 다양한 주변기기들에서도 와이파이가 지원되고 있습니다.


사진 출처 : http://www.kuccblog.net/477

 

 

또한 KTX나 카페, 버스 등 많은 장소에서 Access Point(AP)를 설치하여, 어느 곳에서나 와이파이를 사용할 수 있게 되었습니다.
(Access Point : WiFi를 사용하기 위해 무선장치들을 유선장치에 연결할 수 있게 하는 장치)

이 콘텐츠에서는 와이파이 실드를 사용해 와이파이를 접속해 보고, 접속된 와이파이의 정보를 출력해 보도록 하겠습니다.
(밑의 시리얼 모니터에 나온 값은 BSSID와 MAC Address를 안 보이게 했습니다. 밑에 내용 그대로 진행하였으면 다 제대로 나오게 됩니다.)

 

 

 

부품 목록

 
NO 부품명 수량 상세설명
1 아두이노 우노 R3 1 아두이노
2 아두이노 WIFI 실드 1 WI-FI 실드
 
부품명 아두이노 우노 R3 아두이노 WI-FI 실드
파트

하드웨어 making 및 소프트웨어 Coding

WI-FI 실드 연결 방법


아두이노 우노 R3 기준으로 아두이노 실드를 바로 꽂을 수 있습니다. 각 핀에 맞게 꼽아 주시면 됩니다. 

 

소프트웨어 Coding

 

#include <WiFi.h>

char ssid[] = "AndroidHotspot6971";     //  연결하실 와이파이 이름
char pass[] = "00001111";  // 네트워크 보안키
int status = WL_IDLE_STATUS;

void setup() {

  Serial.begin(9600); 
  while (!Serial) {
    ; // 시리얼 포트에 연결될 때까지 기다림(아두이노 레오나르도만 쓰면 됨)
  }
  
  // 현재 아두이노에 연결된 실드를 확인
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present"); 
    // 와이파이 실드가 아닐 경우
    while(true);
  } 
  
 // 와이파이에 연결 시도
  while ( status != WL_CONNECTED) { // 연결이 될 때 까지 반복
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    // WPA/WAP2 네트워크에 연결
    status = WiFi.begin(ssid, pass);

    delay(10000);
  }
   
  // 연결에 성공했으면 연결확인 메시지와 연결된 네트워크 정보를 띄운다. 
  Serial.print("You're connected to the network");
  printCurrentNet();
  printWifiData();

}

void loop() { 
  // 10초마다 네트워크 연결 확인을 해준다.
  delay(10000);
  printCurrentNet();
}

void printWifiData() {
  // WI-FI 실드의 IP를 출력한다.
  IPAddress ip = WiFi.localIP();
    Serial.print("IP Address: ");
  Serial.println(ip);
  Serial.println(ip);
  
  // MAC어드레스를 출력한다.
  byte mac[6];  
  WiFi.macAddress(mac);
  Serial.print("MAC address: ");
  Serial.print(mac[5],HEX);
  Serial.print(":");
  Serial.print(mac[4],HEX);
  Serial.print(":");
  Serial.print(mac[3],HEX);
  Serial.print(":");
  Serial.print(mac[2],HEX);
  Serial.print(":");
  Serial.print(mac[1],HEX);
  Serial.print(":");
  Serial.println(mac[0],HEX);
 
}

void printCurrentNet() {
  // 접속하려는 네트워크의 SSID를 출력한다.
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // 접속하려는 router의 MAC 주소를 출력한다.
  byte bssid[6];
  WiFi.BSSID(bssid);    
  Serial.print("BSSID: ");
  Serial.print(bssid[5],HEX);
  Serial.print(":");
  Serial.print(bssid[4],HEX);
  Serial.print(":");
  Serial.print(bssid[3],HEX);
  Serial.print(":");
  Serial.print(bssid[2],HEX);
  Serial.print(":");
  Serial.print(bssid[1],HEX);
  Serial.print(":");
  Serial.println(bssid[0],HEX);

  // 수신 신호 강도를 출력한다.
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.println(rssi);

  // 암호화 타입을 출력한다.
  byte encryption = WiFi.encryptionType();
  Serial.print("Encryption Type:");
  Serial.println(encryption,HEX);
  Serial.println();
}
 

 

 

소프트웨어 설명

* 이 코드는 스케치를 사용하여 작성 / 업로드 합니다. 스케치에 대한 사용법은 링크를 참고하시기 바랍니다.

이 소스는 아두이노에서 직접 제공하는 예제 ConnectWithWPA 의 소스입니다. (파일 -> 예제 -> WiFi -> ConnectWithWPA)

와이파이 연결 시 보안 타입에 WPA / WPA2 일 경우에만 밑에 소스를 사용할 수 있습니다. (Web 방식으로 쓰시는 경우는 네트워크 연결 시 keyindex를 추가하셔야 합니다.)
(무선 네트워크를 쓰시는 경우에는 제어판 -> 네트워크 및 인터넷 -> 네트워크 및 공유 센터 -> 무선 네트워크 관리 로 들어 가시면 보안 유형이 나옵니다.)

 

 

 

 

#include <WiFi.h>

char ssid[] = "AndroidHotspot6971";     //  연결하실 와이파이 이름
char pass[] = "00001111";  // 네트워크 보안키
int status = WL_IDLE_STATUS;

WI-FI 실드를 사용하기 위해서는 WiFi 라이브러리를 사용해야 합니다. (사용하지 않았을 경우 컴파일이 되지 않습니다.)

ssid 에는 와이파이 이름, pass에는 해당 와이파이 네트워크 보안키를 적어 줍니다. (자신이 연결하고 싶은 와이파이에 이름과 보안키)
(현재 적혀 있는 ssid와 pass는 제가 쓰고 있는 와이파이 이름과 보안키입니다. 이것을 사용자에게 맞게 바꿔주셔야 연결이 됩니다. 맞지 않으면 Attempting to connect to WPA SSID: 와이파이 이름이 계속 뜨게 됩니다.)


WAP 대신 Web 형식을 사용하시는 경우 여기서 keyindex를 같이 선언해 줍니다.(int 타입)

 

 

 

 

  Serial.begin(9600); 
  while (!Serial) {
    ; // 시리얼 포트에 연결될 때까지 기다림(아두이노 레오나르도만 쓰면 됨)
  }
  
  // 현재 아두이노에 연결된 실드를 확인
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present"); 
    // 와이파이 실드가 아닐 경우
    while(true);
  } 


while(!Serial)문을 사용하여 시리얼에 연결될 때까지 계속 대기합니다.(이건 아두이노 레오나르도만 쓰면 됩니다.).
그 후 아두이노에 연결된 실드를 확인하여 WIFI 실드가 연결될 때까지 계속 대기합니다.

 

 

 

 

 

 // 와이파이에 연결 시도
  while ( status != WL_CONNECTED) { // 연결이될 때까지 반복
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    // WPA/WAP2 네트워크에 연결
    status = WiFi.begin(ssid, pass);

    delay(10000);
  }
   
  // 연결에 성공했으면 연결확인 메시지와 연결된 네트워크 정보를 띄운다. 
  Serial.print("You're connected to the network");
  printCurrentNet();
  printWifiData();

 

 

 

실드를 확인했으면 그다음으로는 WIFI에 연결을 해야 합니다. 연결 시도 중입니다 라는 메시지를 띄우고 그 후 WiFi.begin(ssid,pass)를 이용하여 접속 시도를 합니다. 연결이 성공할 때까지 계속 반복해 줍니다. 
(WPA 대신 Web 타입을 사용하시는 경우 WiFi.begin(ssid, keyindex, pass); 이렇게 사용하셔야 합니다.)

연결이 성공했으면 성공 확인 메시지를 띄우고 연결된 네트워크의 데이터를 출력해 줍니다.
 

void loop() { 
  // 10초마다 네트워크 연결을 확인해준다.
  delay(10000);
  printCurrentNet();
}

연결이 성공 한 후, 10초마다 네트워크 연결을 확인해 준다.
 

void printWifiData() {
  // WI-FI 실드의 IP를 출력한다.
  IPAddress ip = WiFi.localIP();
    Serial.print("IP Address: ");
  Serial.println(ip);
  Serial.println(ip);
  
  // MAC어드레스를 출력한다.
  byte mac[6];  
  WiFi.macAddress(mac);
  Serial.print("MAC address: ");
  Serial.print(mac[5],HEX);
  Serial.print(":");
  Serial.print(mac[4],HEX);
  Serial.print(":");
  Serial.print(mac[3],HEX);
  Serial.print(":");
  Serial.print(mac[2],HEX);
  Serial.print(":");
  Serial.print(mac[1],HEX);
  Serial.print(":");
  Serial.println(mac[0],HEX);
 

printWifiData() 함수는 아두이노와 연결된 WIFI 실드에 대한 IP 정보와 MAC 어드레스를 출력하는 함수입니다.
 

void printCurrentNet() {
  // 접속하려는 네트워크의 SSID를 출력한다.
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // 접속하려는 router의 MAC 주소를 출력한다.
  byte bssid[6];
  WiFi.BSSID(bssid);    
  Serial.print("BSSID: ");
  Serial.print(bssid[5],HEX);
  Serial.print(":");
  Serial.print(bssid[4],HEX);
  Serial.print(":");
  Serial.print(bssid[3],HEX);
  Serial.print(":");
  Serial.print(bssid[2],HEX);
  Serial.print(":");
  Serial.print(bssid[1],HEX);
  Serial.print(":");
  Serial.println(bssid[0],HEX);

  // 수신 신호 강도를 출력한다.
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.println(rssi);

  // 암호화 타입을 출력한다.
  byte encryption = WiFi.encryptionType();
  Serial.print("Encryption Type:");
  Serial.println(encryption,HEX);
  Serial.println();
}

printCurrentNet() 함수는 현재 연결된 네트워크의 이름과 라우터의 MAC주소, 연결 수신 신호 강도와 암호화 타입을 출력 해 주는 함수입니다.
(수신 신호 강도와 암호화 타입은 위에 시작 전 개념 이해하기에서 자료를 링크했습니다. 궁금하신 점 있으시면 링크 확인해 주세요)

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

WIFI쉴드, 아두이노

llpmpll 2015-04-28 17:11:31

#include

char ssid[] = "AndroidHotspot6971"; // 연결하실 와이파이 이름
char pass[] = "00001111"; // 네트워크 보안키
int status = WL_IDLE_STATUS;

이 부분에서 저렇게 직접 지정하지 않고 SD CARD에 저장된 기록(txt)을 읽어서 셋팅할수 있는 방법은 없나요?

판다마니아 2015-05-15 16:09:44

SD카드 라이브러리를 보시면 1바이트씩 읽어오는 함수가 있습니다. (read() 함수를 사용하시면 됩니다.)

이걸 이용해서 기준값을 정해서(예를 들면 엔터값 \n 을 기준으로 ssid, pass 값을 구분해서 저장하셔서 이 값을 불러오신 후 지정해주시면 됩니다.)

근데 wifi에 대한 정보를 SD카드에 넣어서 불러오는 것과 직접 소스 코드 안에서 넣어서 사용하는 것과 그다지 차이나지 않아 보이는데, 용도에 맞게 잘 생각하셔서 사용하시는게 좋아보입니다.

구샛별 2015-06-05 17:49:22

아두이노 우노와 와이파이 쉴드를 이용하여 연결하고 컴파일 후 업로드 하였는데, 시리얼 모니터 상으로는 시리얼 포트가 이미 사용되고 있다고 나오거나 시리얼 포트를 찾을 수 없다고 나옵니다. 이는 어떻게 해결해야 하나요...?

Jeong 2015-10-05 11:51:31

장치관리자에서 아두이노 우노 업데이트다했고 라이브러리 와이파이했고 도구에서 보드나 포트도 다설정 제대로했는데
네트워크에 무선네트워크관리에 아무것도 뜨지가 않아요 어떻게하죠 ??

Danny 2017-04-17 11:09:59

수신 신호 강도를 알아보는 이유는 뭐죠?

jinhoa52 2017-05-31 23:12:07

위즈넷에 있는 와이파이 쉴드로 와이파이 통신하려고 하는데 여기에 있는 코드를 이용해되는 건가요?

kocoafab 2019-02-08 11:10:45

@구샛별
현재 시리얼 모니터가 열려있어서 아두이노 업로드가 안될 수 있습니다. 열려있는 시리얼 모니터창을 다 끄신 후 다시 업로드를 진행해보세요.

@Jeong
무선 네트워크 관리에 현재 사용중인 인터넷 와이파이가 안잡히시나요? 컴퓨터에서 뜨는 와이파이 목록은 와이파이 쉴드와 딱히 큰 상관없습니다. 한번 주변 와이파이 셋팅을 확인해보세요.

@Danny
연결할 와이파이가 제대로 연결되었는지 확인하기 위해서 추가한 부분입니다.이부분은 필요가 없으시면 그냥 빼셔도 됩니다

@JInhoa52
위즈넷에서 제공하는 와이파이는 따로 라이브러리가 있습니다. 이 코드와는 호환이 되지 않을 것 같습니다,

플벨 2019-04-14 16:46:34

와이파이 실드를 ESP2866을 사용해도 되나요?