TOY CAR CONTROLLED BY WIFI
프로젝트 팀 Wired Factory의 SierraWhiskey 님의 제작기입니다. 원문은 다음 링크에서 보실 수 있습니다. http://mydiyrecipe.com/?p=47
스마트폰 WiFi로 컨트롤되는 장난감 자동차
“아이가 가지고 놀던 장난감 RC카를 스마트폰으로 조종할 수 는 없을까? WiFi로 뭔가를 조종할 수 있다면 만들 수 있는 것들이 훨씬 많을텐데. 그래서 WiFi Toy Car가 탄생합니다.”
Background
USR-WIFI232 Overview
WIFI232 series product is used for convert data from RS232 to WIFI TCPIP, Two-way transparent transmission, user need not know the WIFI and TCPIP detail, update the product for WIFI control. All the convert work is done by the module, for users, the RS232 side is only as a serial device, at the WIFI side, for user is TCPIP Socket data. User can setup the work detail by sample settings, setup via inside web pages or RS232 port, the setup work need only do once, then it will save the setting forever.
Arduino – http://www.arduino.cc/
LED 하나를 켜기 위해서 센서 하나를 동작하기 위해서 얼마나 많은 지식이 필요할까? 답은 어디에서 구현하느냐에 따라 다르다. 어떤 프로세서를 쓰느냐, 어떤 OS를 쓰느냐에 따라 같은 동작을 두고도 구현 방법은 천차만별이다. 때로는 LED 하나를 켜는 일, 센서에서 값 하나를 읽어오는 일에 너무 많은 지식이 요구되기도 한다.
구현상의 어려움이 아이디어를 막아서는 안되지 않을까? 아두이노는 단순하며 직관적이다. 생활속 아이디어를 현실화하기 위한 훌륭한 도구이다. 시간을 몇 년전으로 돌려보자. 장난감 자동차를 스마트폰으로 컨트롤 한다는 게 가능이나 했던 이야기일까? 얼마나 많은 시간과 노력 그리고 비용을 들여야 했을지 까마득하다. 아두이노는 많은 샘플코드들이 오픈되어 있고 다양한 H/W 모듈이 라이브러리와 함께 제공된다. 컴파일/다운로드도 단 몇초면 끝난다.
What You Need
Direction
1. 눈여겨 두었던 아이의 장난감을 뜯어보았다. 2WD/2CH 를 지원하는 모델이다. 전후/좌우 컨트롤이 가능하지만 속도 조절 및 미세한 조향은 불가능하다. Ni-CD 1.2V 배터리 4개가 직렬로 연결되어 전원을 공급한다.
RF만 WiFi로 대체하고 나머지는 재사용하기 위해서 기존에 어떻게 동작하고 있었는지 확인해볼 필요성이 생겼다. 내부를 살펴보니 RX-2C라고 적힌 IC가 PCB 한가운데 자리잡고 있다. 인터넷에서 datasheet를 찾아보니 47MHz 에서 동작하는 Receiver를 포함한 장난감 전용 IC로 보인다. IC에서 전후/좌우 on/off 핀만을 제공하다보니 속도 조절 및 미세한 조향이 될리 없다. Reference 회로도를 보면 트랜지스터로 스위칭 회로를 구성하여 모터를 켜고 끄는 부분이 확인되며 실제 장난감의 PCB도 유사하게 구성되어 있다.
2. 전후/좌우 네 개의 핀에 점퍼선을 날려 차체밖으로 뺀다. GND와 배터리 전원도 함께 빼준다. 아두이노 보드와 WiFi 모듈 그리고 배터리는 차체 외부 트렁크에 위치할 예정이다.
3. 점퍼선을 이용해 모터제어핀을 D4(LEFT), D5(RIGHT), D6(FORWARD), D7(REVERSE)에 연결한다. WIFI232에는 12개의 출력핀이 제공되지만 VCC, GND 그리고 두 개의 Serial 통신관련 핀만 연결해주면 제어가 가능하다. D2(Serial Rx), D3(Serial Tx) 핀을 WIFI232와 연결해준다. WIFI232는 3.3V(±5%)로 동작된다.
4. WiFi232 설정
WiFi232 모듈은 AP(Access Point) Mode와 STA(Station) Mode를 지원한다. UART를 이용하여 직접 연결 모드를 설정하거나 AP의 Setup Page를 이용해 원하는 설정이 가능하다. Setup web page를 통해 설정하는 방법은 다음과 같다.
WiFi232 모듈에 전원을 인가하면 ‘HF-A11x_AP’란 이름으로 AP가 검색된다. 스마트폰의 WiFi를 활성화하고 위의 AP에 접속한다. 연결에 성공하면 브라우저를 이용하여 http://10.10.100.254’로 접근한다. 메뉴에 진입하여 아래와 같이 설정하면 된다.
설정을 완료하면 WiFi232 모듈은 AP로 동작하게 되고 스마트폰이 Client가 되어 Host에 접속하게 된다.
5. Transmitter Application 구현
기본적으로 WiFi232 모듈을 지원하는 안드로이드/IOS 등 OS를 위한 레퍼런스 소스 코드가 제공된다. 이를 참고하여 Transmitter App.을 구현하면 된다. 추후 확장성을 위해 4채널 지원을 염두하고 구현하였으며 2채널 선택시 좌측은 전/후진, 우측은 좌/우회전으로 동작한다.
6. 아두이노 스케치
#include <SoftwareSerial.h> SoftwareSerial mySerial(2, 3); // RX, TX const int PIN_LEFT = 4; const int PIN_RIGHT = 5; const int PIN_FORWARD = 6; const int PIN_REVERSE = 7; const int MASK_LEFT=1<<3; const int MASK_RIGHT=1<<2; const int MASK_FORWARD=1<<1; const int MASK_REVERSE=1<<0; void setup() { pinMode(PIN_LEFT, OUTPUT); pinMode(PIN_RIGHT, OUTPUT); pinMode(PIN_FORWARD, OUTPUT); pinMode(PIN_REVERSE, OUTPUT); digitalWrite(PIN_LEFT, LOW); digitalWrite(PIN_RIGHT, LOW); digitalWrite(PIN_FORWARD, LOW); digitalWrite(PIN_REVERSE, LOW); // Open serial communications and wait for port to open: Serial.begin(57600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } Serial.println("Welcome Savage Control (WIFI version)"); mySerial.begin(57600); } char inByte = 0; int exByte = 0; const int magic0 = 0x52; const int magic1 = 0x43; const int magic_ping = 0x50; int magic_check=0; int pwm_seq = 0; int pwm_period = 0; static int state = 0; //No Connection void loop() // run over and over { if (mySerial.available()>0) { inByte = mySerial.read(); } if(magic_check==0) { if(inByte==magic_ping) magic_check=0; if(inByte==magic0) magic_check++; } else if(magic_check==1) { if(inByte==magic1) magic_check++; } else if(magic_check==2) { //Serial.print(inByte, HEX); exByte = inByte; magic_check++; } else if(magic_check==3) { if(exByte==inByte) magic_check++; else magic_check=0; } else { state = exByte; magic_check=0; exByte=0; } if((state & MASK_LEFT) == MASK_LEFT) { digitalWrite(PIN_RIGHT, LOW); digitalWrite(PIN_LEFT, HIGH); Serial.println("LEFT"); } else if((state & MASK_RIGHT) == MASK_RIGHT) { digitalWrite(PIN_LEFT, LOW); digitalWrite(PIN_RIGHT, HIGH); Serial.println("RIGHT"); } else { digitalWrite(PIN_LEFT, LOW); digitalWrite(PIN_RIGHT, LOW); } if((state & MASK_FORWARD) == MASK_FORWARD) { digitalWrite(PIN_REVERSE, LOW); if(pwm_seq%pwm_period==0) digitalWrite(PIN_FORWARD, HIGH); else digitalWrite(PIN_FORWARD, LOW); Serial.println("FORWARD"); } else if((state & MASK_REVERSE) == MASK_REVERSE) { digitalWrite(PIN_FORWARD, LOW); if(pwm_seq%pwm_period==0) digitalWrite(PIN_REVERSE, HIGH); else digitalWrite(PIN_REVERSE, LOW); Serial.println("REVERSE"); } else { digitalWrite(PIN_FORWARD, LOW); digitalWrite(PIN_REVERSE, LOW); } }
7. 테스트
처음에는 배터리를 추가로 장착하지 않았다. 배터리가 없어도 5V 전원을 RX-2C에서 입력받아서 사용할 수 있다. 하지만 문제는 모터 제어시 일시적으로 3.3V 이하로 전압 강하가 일어나는 경우 WiFi 연결이 끊어지는 경우가 발생한다. 좌/우 조향의 경우 전류 소모가 적지만 전/후 동작시에는 전류소모가 커 실제로 이러한 현상이 발생하게 된다. 안정적인 전원 공급을 위해 3.7V LiPo 배터리를 추가하였다.
Conclusion
무선 조종 장난감을 만드는 것이 이번 프로젝트의 목표는 아니다. 진정한 의미는 향후 확장성에서 찾을 수 있다. 집안의 무언가를 원격에서 스마트폰으로 컨트롤 할 수 있는 현실적인 방법이 생긴 것이다. 이를 통해 앞으로 현실화될 수 있는 아이디어들이 벌써부터 기대가 된다.