레이블이 무선랜인 게시물을 표시합니다. 모든 게시물 표시
레이블이 무선랜인 게시물을 표시합니다. 모든 게시물 표시

2018년 11월 1일 목요일

ESP32에 static IP 사용하기 (Using static IP address on ESP32)

ESP32를 사용해 무선랜에 접속하는 경우 기본적으로 DHCP를 사용해 IP주소를 받아오게 된다.
하지만 ESP32가 서버로 동작하는 경우 IP주소를 고정시켜 놓아햐 할 필요가 있다. 또한 배터리로 동작시 deep sleep 모드를 활용하게 되는데 이때 deep sleep에서 깨어날 때 마다 공유기에 접속 후 DHCP로 IP를 받아오는 과정을 수행해야 하면 그에 따른 배터리 소모도 무시할 수 없다.

그래서 ESP32 무선랜이 DHCP를 사용하지 않고 수동으로 IP주소를 설정하는 방법을 설명하겠다.

DHCP를 사용하건 아니건 공유기에 접속을 해야만 하므로 접속할 공유기 정보(SSID, password) 는 필요하다.

const char * ssid = "REPLACE_YOUR_SSID";
const char * pwd = "REPLACE_YOUR_PASSWORD";

저기서 빨간색 부분을 자신에게 맞게 바꿔주면 된다. 만일 공유기 이름이 myhome 이고 공유기 암호가 hello12345 라고 한다면 다음과 같이 바뀌게 된다.

const char * ssid = "myhome";
const char * pwd = "hello12345";

다음은 static IP 를 지정해 준다.

IPAddress local_IP(192, 168, 1, 200); // ESP32가 사용할 IP address
IPAddress gateway(192, 168, 1, 1);    // Gateway IP address (공유기 IP주소)

IPAddress subnet(255, 255, 255, 0);   // subnet mask
IPAddress primaryDNS(8, 8, 8, 8);     // primary DNS server IP address
IPAddress secondaryDNS(8, 8, 4, 4);   // secondary DNS server IP address

여기서도 물론 빨간색 부분은 자신의 환경에 맞게 바꿔줘야 한다.

* 주소 사이에 '.'이 아니고 ','를 사용하고 있음을 주의할 것

이제 setup() 에서 WiFi.config() 메소드로 위의 설정값들을 ESP32에 할당해 준다.

if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
  Serial.println("STA failed to configure");
}

* 위에서 primaryDNS와 secondaryDNS 는 옵션이라 생략해도 된다.

지금까지 설명한 부분을 정리한 코드이다. 공유기 ssid는 "myhome", 공유기 password는"hello12345", ESP32 IP address는  192.168.1.200, gatewaIP(공유기IP)는192.168.1.1 인 경우의 코드이다. 

#include <WiFi.h>

const char * ssid = "myhome";
const char * pwd = "hello12345";

IPAddress local_IP(192, 168, 1, 200);          // ESP32가 사용할 IP address
IPAddress gateway(192, 168, 1, 1);              // Gateway IP address (공유기 IP주소)

IPAddress subnet(255, 255, 255, 0);          // subnet mask
IPAddress primaryDNS(8, 8, 8, 8);             // primary DNS server IP address
IPAddress secondaryDNS(8, 8, 4, 4);         // secondary DNS server IP address

...

void setup()
{
  Serial.begin(115200);

  if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
    Serial.println("STA failed to configure");
  }

  WiFi.begin(ssid, pwd);
  while (WiFi.status() != WL_CONNECTED) P
    delay(500);
    Serial.print(".");
  }
  
  ...
}

---

다른 방법으로는 ESP32의 코드는 따로 건드리지 않고 ESP32의 MAC address를 알아내 공유기의 DHCP가 고정된 IP를 할당하도록 해 주는 방법도 있다. 하지만 이 경우 IP는 일정하지만 DHCP가 매번 동작하기 때문에 deep sleep에서 깨어나는 경우 배터리 소모를 피할 수 없다.

2016년 7월 8일 금요일

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 3 - 가시광선(빛)

IoT 디바이스에 초기 설정 정보를 넘겨주는 방법으로 이전 포스트들에서 설명한 방법 이외에 다른 방법으로 가시광선(빛)을 사용하는 방법도 있다.

이 방식을 사용하는 제품으로 실제 나와 있는걸로는 Quirky의 Nimbus가 있다.


Nimbus의 뒤쪽에는 빛을 감지하는 광센서가 들어 있어 스마트 폰에서 공유기 정보(SSID, password)를 입력하고 시작 버튼을 누르면 스마트폰 전체 화면이 번쩍이며 SSID와 password 정보를 전송한다. 그러면 Nimbus의 광센서를 통해 데이터를 수신하게 된다.

Nimbus를 연결시킬 공유기의 정보(SSID, password)를 입력한다.


Nimbus의 뒤쪽에 센서가 있어 스마트폰 화면을 저 센서에 가까이 가져다 대 주면 된다.



준비가 다 되었으면 스마트폰 화면의 Start Countdown 버튼을 눌러주면 3초 후 부터 화면이 깜빡이며 데이터 전송을 시작한다.


데이터 전송이 끝나면 스마트폰은 Nimbus가 전송된 정보를 사용해 공유기에 접속한 다음 접속완료 메시지를 보내주길 기다린다.



--

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 1 - 무선 랜 AP모드 활용 

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 2 - 초음파

2016년 7월 6일 수요일

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 2 - 초음파

이전 포스트 (IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 1 - 무선랜 AP 모드 활용)에서 설명했던 것 처럼 IoT 디바이스를 무선랜에 접속하도록 하기 위해서는 접속할 공유기의 SSID, password를 넘겨줘야만 한다.

두번째 방법으로는 초음파를 사용해 SSID, password를 전송하는 것이다. 스마트폰에 있는 스피커는 가청 범위의 주파수 뿐 아니고 사람이 들을 수 없는 초음파도 재생이 가능하다. 그러므로 SSID, password를 FSK등의 방식으로 변조(modulation)하여 스피커로 플레이 하면 된다.

예전에 모뎀을 써 봤거나 팩스를 써 보면 삐~찌지지직~ 하는 소리를 들어 본 적이 있을 것이다. 그렇게 소리를 만드는데 그 소리의 주파수를 좀 더 높게 해서 사람 귀에는 안 들리는 소리로 만들어 플레이하는 것이다.



이 방식을 사용하는 디바이스로 아마존의 Dash 버튼이 있다. 아이폰의 화면에서 dash 버튼을 접속시킬 공유기의 SSID, password를 입력 받은 후 dash 버튼을 설정 모드로 만들어 주면 dash 버튼은 마이크를 통해 초음파 신호를 받아들여 소리를 복조(demodulation)하여 SSID, password를 알아낼 수 있다.

- 스마트 폰에서 공유기 정보를 입력


- Dash 버튼을 설정 모드로 변경한 후 아이폰의 스피커와 dash 버튼의 마이크를 일직선이 되게 가까이 가져다 놓는다. 그러면 아이폰이 스피커를 통해 변조된 신호를 출력하고 dash 버튼은 마이크를 통해 그 소리를 받아 공유기 설정정보를 얻게 된다.

정상적으로 공유기 설정정보를 얻으면 dash 버튼은 그 정보로 공유기에 접속한 다음 아이폰에 성공 메지시를 전송해 준다.

--

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 1 - 무선 랜 AP모드 활용

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 3 - 가시광선(빛)

2016년 7월 1일 금요일

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 1 - 무선랜 AP 모드 활용

무선랜을 사용해야 하는 경우 가장 먼저 해야 할 일은 무선랜 단말기(스마트폰, 노트북 등등)을 무선랜 AP(공유기)에 연결시켜 주는 것이다. 연결을 위해서는 먼저 공유기의 SSID, password를 알아야 한다. 그러면 무선랜 설정 화면으로 가서 자신이 연결하고자 하는 공유기의 SSID를 선택하고, 보안 설정이 되어 있으면 암호를 넣어줘야만 한다.

 그런데 이 과정이 노트북이나 스마트폰같이 화면과 키보드가 있으면 아무 문제가 안되지만 대부분의 IoT 기기들은 화면이나 키보드, 또는 둘 다 없는 경우가 많다.

그래서 장치의 무선랜 설정 UI로 여러가지 방법을 사용하고 있다. 이번에 소개하는 방법은 장치가 먼저 무선랜 공유기가 되어 SSID, password를 받아오는 방식이다.

이 방식을 사용한 샤오미의 스마트 플러그이다.




중국용이다 보니 플러그가 메롱한 모양이라 국내에서 사용하려면 일종의 돼지코(?)가 필요하다.




설정 목표는 아래 그림과 같이 스마트 플러그를 NewGateway라는 SSID를 가지고 있는 공유기에 연결시키는 것이다. 하지만 초기에 스마트 플러그는 NewGateway, test12345라는 정보를 모르기에 공유기에 접속할 수가 없다.



이제 이 플러그를 콘센트에 처음 꼽으면 플러그 위쪽면에 노란색 불이 깜빡인다.


노란불이 깜빡인다는건 스마트플러그가 AP모드(공유기처럼 동작)라는 의미이다. 'chuangmi-plug-m1_miapac...'이라는 SSID에 암호는 없다.

스마트폰에서 새오미 앱을 실행시켜 스마트 플러그를 추가하는 메뉴를 선택한다.



친절하게 노란색 불이 깜빡이는지 확인하라고 알려준다. 노란색 불이 깜빡이므로 아래쪽의 'Yellow light flashing'을 체크하면 Next 버튼이 활성화 되므로 버튼을 눌러준다.

여기에서 스마트 플러그를 접속시키고자 하는 공유기의 SSID와 암호를 넣어준다. 위 그림에서 공유기의 SSID는 'NewGateway', 암호는 'test12345'가 된다.




이제 스마트폰을 스마트 플러그 AP에 연결하라는 안내화면이 나온다. 현재 스마트폰 역시 NewGateway 공유기에 연결되어 있는 상태이다. 여기서 아래쪽의 'Go to set Wi-Fi' 버튼을 눌러준다.


무선랜 설정 화면으로 이동하게 된다. 무선 네트웍 목록에 보면 'chuangmi-plug-m1_,iapac...' 이라는 항목이 보일 것이다. 이 무선랜을 선택해 연결해 주면 된다. 아래 그림에서 볼 수 있는것처럼 이름 옆쪽에 자물쇠 그림이 없으므로 보안설정이 따로 되어 있지 않아 암호를 물어보지 않고 바로 연결한다.


연결이 확인 되었으면 다시 MiHome 앱(샤오미 앱)으로 돌아간다.




그러면 화면이 아래와 같이 바뀌고 스마트 플러그는 파란색 불빛이 깜빡인다. 이 단계에서 스마트폰이 스마트 플러그와 통신을 해 공유기의 정보를 넘겨주게 된다.




잠시 기다리면 아래와 같이 연결을 성공했다는 화면이 나오게 된다. 이제 스마트 플러그가 단말기 모드로 공유기에 연결된 것이다.










--

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 2 - 초음파

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 3 - 가시광선(빛)






2015년 4월 2일 목요일

라즈베리 파이에서 무선랜 연결이 끊어지면 자동으로 리부팅 시키기

라즈베리 파이를 사용하다 보면 무선랜 연결이 종종 끊어지곤 한다. 네트웍 연결이 끊어져 버리면 원격지에 라즈베리 파이를 놓고 사용하기가 힘들어진다. 그래서 네트웍 연결이 끊어졌는지 확인해서, 끊어진 경우 시스템을 리부팅 시키는 방법을 소개한다.



먼저 아래의 내용을 /usr/local/bin/checkwifi.sh 이라는 이름으로 저장해 준다.

$ cat /usr/local/bin/checkwifi.sh
ping -c4 192.168.1.1 > /dev/null
if [ $? != 0]
then
sudo /sbin/shutdown -r now
fi
$

물론 위에서 노란색 부분의 IP 주소는 자신의 공유기 IP 주소(또는 로컬 네트웍 상에 항상 켜져 있는 장비의 IP주소)로 바꿔줘야 한다.  그리고 저 파일의 퍼미션을 변경해 주는걸 잊으면 안된다.

$ sudo chmod 775 /usr/local/bin/checkwifi.sh
$

이제 checkwifi.sh 스크립트를 실행하면 네트웍 연결을 확인해 끊어졌으면 시스템을 리부팅 시키게 된다.

네트웍 상태를 확인해 시스템을 리부팅 시키는 스크립트는 만들었지만, 시스템에서 주기적으로 저 스크립트를 실행해 주도록 해 줘야 한다. 여기서는 cron 을 이용한다.

crontab을 수정해야 하므로 'crontab -e' 명령을 입력해 crontab 에디터를 연 다음, 아래 줄을 추가하고 저장해준다.

*/5 * * * * /usr/bin/sudo -H /usr/local/bin/checkwifi.sh >> /dev/null 2>&1

위의 줄은 cron이 checkwifi.sh 스크립트를 매 5분마다 sudo로 실행하게 해 설정해주는 것이다.

이제 시스템을 리부팅 한 후 테스트를 위해 일부러 무선랜 연결을 끊어보면 몇분 후 시스템이 리부팅 되는걸 확인할 수 있을 것이다.

리부팅 대신 네트웍만 재시동하기

네트웍 연결이 끊어졌을 때 리부팅은 시간이 많이 걸리기 때문에 단지 네트웍만 재시동하기를 원하는 경우는 checkwifi.sh 파일 내용을 다음과 같이 바꿔주면 된다.

cat /usr/local/bin/checkwifi.sh
ping -c4 192.168.1.1 > /dev/null
if [ $? != 0]
then
echo "No network connection, restarting wlan0"
/sbin/ifdown 'wlan0'
sleep 5
/sbin/ifup 'wlan0'
fi
$


2010년 12월 8일 수요일

임베디드 무선랜 모듈 Wiz 610wi (Embedded Wireless LAN module Wiz 610wi)

임베디드 시스템에 무선 인터페이스를 추가하려고 할 때 블루투스나 Zigbee같은 경우는 저렴한 가격에 다양한 모듈을 구할 수 있어 쉽게 추가할 수 있는데 비해 무선랜의 경우는 가격도 비싸고 그나마도 쉽게 구할 수 없어 임베디드 시스템에 추가하기가 쉽지 않다.

하지만 국내 회사인 Wiznet에서 다양한 종류의 임베디드 통신 모듈(Ethernet module, Ethernet-to-serial, WLAN module)을 출시하여 대부분의 필요한 모듈을 쉽게 찾을 수 있다. 그래서 얼마전에 Wiznet에서 임베디드 DIY를 활성화하기 위해 무료로 제공해 준 Wiz 610wi 무선랜 모듈을 mbed 보드에 붙여 테스트를 진행해 보았다.



802.11b/g를 지원하는 모듈로 Serial I/F와 MII I/F를 제공해 주기 때문에 임베디드 보드에 시리얼로 연결하거나 이더넷 포트에 다른 PC들을 연결해 무선 AP나 Gateway로 동작할 수도 있는 다기능 무선랜 모듈이다.

상세 사양은 다음과 같다.

Detailed Technical Specification


610wi는 3가지 동작 모드를 가지고 있다.


이 중 여기서는 mbed 모듈을 무선랜에 연결하는게 목적이기 때문에 client mode를 사용할 것이다.

모듈의 Factory Default 설정은 다음과 같다.


핀 배치는 다음과 같다.


두개의 커넥터(J19, J20)가 있지만 J19(36핀)으로만 신호선이 나오고 J20(20핀)은 단지 보드 고정을 위해 있을 뿐 신호선은 연결되어 있지 않다.

모듈 소형화를 위해 어쩔 수 없는 선택이긴 해도 DIY를 하는 사람들에게 치명적인 단점이 하나 있는데 커넥터의 피치가 일반적으로 많이 사용하는 100mil(2.54mm)이 아닌 50mil(1.27mm)라는 것이다. 직접 전용 PCB를 뜨지 않는 한 만능기판에 실장하기도 힘들고 1.27피치의 커넥터나 만능기판은 구하기도 힘들고 가격도 비싸다.
가능하면 J19, J20 모두 신호선으로 사용하는 대신 100mil(2.54mm) 피치의 커넥터를 사용했으면 더 좋았을거라고 생각한다.

하지만 땜질을 하다 보니 1.27피치가 2.0피치보다는 훨씬 더 좋다는걸 알게 되었다.

 Pin No.
Name
I/O
Description
 Pin No.
Name
I/O
Description
 1 CTS I UART:CTS 2 RTS O UART:RTS
 3 -   4 HW_trig I HW Trigger
 5 GPIO7 I/O Reserved 6 GPIO5 I/O Reserved
 7
 SOUT O UART:Tx 8 SIN I UART:Rx
 9 DC_IN  3.3V 10 DC_IN  3.3V
 11 GND   12 GND  
 13 RxERR I MII Rx Data Error
 14 COL I MII Collision
 15 /W_LEDO
 Wireless LED
 16 MDC I SMI CLK
 17 /RESET I RESET 18 MDIO I/O SMI I/O Data
 19 GND   20 GND  
 21 RXC I MII Rx CLK
 22 RXDV I MII Rx Data Valid
 23 RXD2 I MII Rx Data 24 RXD0 I MII Rx Data
 25 RXD1 I MII Rx Data 26 RXD1 I MII Rx Data
 27 GND   28 GND  
 29 TXC O MII Tx CLK
 30 TXEN O MII Tx Enable
 31 TDX3 O MII Tx Data
 32 TDX2 O MII Tx Data
 33 TDX0 O MII Tx Data 34 TDX1 O MII Tx Data
 35 GND   36 CRS I Carrier Sense

* 모든 신호레벨은 3.3V
* RESET은 최소 1.2usec이상 L로 유지해 줘야 함. 3초 이상 L로 유지되면 factory reset 됨
* HW Trigger가 L면 serial command mode로 들어가고 H면 serial command mode에서 빠져나옴

이 중 시리얼 포트를 통해 연결하는 경우 SIN, SOUT, DC_IN, GND, HW_Trig, /RESET만 있으면 된다.

일반적으로 사용하는 2.54 피치의 만능기판에 직접 연결할 수가 없기 때문에 디바이스마트에서 1.27피치의 만능기판을 구입하여 시리얼 인터페이스를 위해 필요한 핀만 연결해 주었다.


6핀만 연결하여 2.54피치의 핀헤더로 연결하여 mbed 보드와 커넉터로 연결할 생각이다.
보드 제작이 끝나고 나면 방향에 맞게 모듈을 꼽아주면 된다.




전원이 들어온걸 눈으로 쉽게 확인할 수 있도록 녹색의 LED를, 무선랜에 연결된 상태를 확인할 수 있도록 노란색의 LED를 보드에 실장해 주었다.


이 상태에서 보드에 전원을 공급하면 factory default로 설정되어 있는 Access Point 모드로 동작하게 되기 때문에 PC에서 확인해 보면 SSID가 WLANAP인 무선랜이 보이게 된다.

* 무선랜 모듈에 흐르는 전류가 크기 때문에 (최대 450mA) 충분한 전류를 흘려줄 수 있는 전원소스를 사용하여야 한다.


모듈의 IP주소는 192.168.1.254니까 WLANAP에 연결한 다음 컴퓨터의 IP를 수동으로 192.168.1.x 로 맞춰주고 브라우져에서 192.168.1.254로 접속하면 된다.
그럼 아이디와 암호를 물어보는데 디폴트는 admin/admin이다.


이 중 시리얼 포트의 상세 설정은 다음과 같다.


목적대로 사용하기 위해서는 먼저 Wireless settings에서 동작모드를 client mode로 변경해 줘야 한다.


Client 모드로 변경한 다음 client 모드의 설정을 변경하기 위해 'Setup' 버튼을 눌러주었다.


'Setup' 버튼을 누르면 설정 변경을 위해 잠시 기다려야 한다.


문제는 설정이 변경되면 디바이스 타입이 AP에서 무선랜 클라이언트 디바이스가 되기 때문에 무선 네트웍이 사라져서 아래와 같이 홈페이지를 억세스 할 수 없게 된다.


이 시점부터는 시리얼 케이블을 연결해서 설정을 변경해 주어야 한다.


디폴트 설정대로 38400 bps로 속도를 설정하고 시리얼 터미널을 연결하면 위와 같이 명령을 입력할 수 있게 된다. 명령어에 대한 상세한 설명은 메뉴얼을 참고하면 된다.

설정을 끝내고 <DI> 명령에서 보이는 네트웍들중에 하나에 연결시켜 주면 된다.

실제 설정 명령어들과 테스트 결과는 다음 포스트에 올리도록 하겠다.