취소

커뮤니티

가이드

서포트

전체

아두이노 응용 Xbee 설정과 서보모터 제어

아두이노를 무선 제어하는데 있어서 Bluetooth나 Wi-Fi 등 다양한 통신을 이용한다. 이번에는 그 중에서도 Xbee(Zigbee)를 이용해서 무선 제어하여 서보모터를 제어해보자. 통신 설정 및 방법만 제외하면 Bluetooth 나 Xbee(Zigbee)는 코드 상에서의 차이가 거의 없다.

X-CTU를 이용한 Xbee 설정

X-CTU 소프트웨어 설치

Xbee 를 설정하기 위해서는 X-CTU가 필요로 하다. X-CTU는 digi.com 에서 다운로드 받을 수 있다.

M2M Communications, Remote Monitoring & Management - Digi International digi.com 자세히보기

digi.com 사이트에서 X-CTU를 검색하면 바로 찾을 수 있으며, 자신이 사용하는 OS에 맞추어서 다운로드하면된다. 귀찮을 경우를 대비하여 다운로드사이트 링크를 아래에 건다.

XCTU Software Product Detail - Digi International www.digi.com 자세히보기

X-CTU를 이용한 Xbee 설정

X-CTU를 다운로드 받았으면 설치하고 실행시킨다.

X-CTU 메인화면

X-CTU를 실행시키면 위와 같이 메인화면이 나타난다. Com Port Setup에는 연결되어있는 포트가 나열되어 잇으며 오른쪽의 Test / Qurey 를 클릭하면 선택된 포트에 대한 연결 상태 테스트가 가능하다.

비 정상 연결 에러

비정상적으로 연결 될 경우 여러가지 원인이 있을 수 잇다. 하드웨어 문제, Baud rate 불 일치, AT모드가 아닌 API 모드 설정 상황 등 다양하게 있으며 상황에 맞추어 설정을 수정하여 연결 시도하면 된다. 정상 연결이 되었다면 X-CTU 에서는 Terminal 탭으로 넘아가자

터미널에서는 AT커맨드를 이용하여 Xbee의 파라미터를 변경 할 수 있다. 예를 들어 Baud rate 를 9600에서 19200으로 변경하거나, Address 값을 변경하는 등 설정이 가능하다. AT커맨드를 사용하기 위해서는 +++ 를 사용하며, +++ 입력 후에는 엔터 또는 다른키 입력을 주의해야된다.

Xbee 파라미터 설정 - Xbee Series 1

X-CTU의 Modem Confinguration 탭에서 Read를 누른다. 그러면 연결된 Xbee의 파라미터들을 읽을 수 있다. Xbee Series 1은 802.15.4 프로토콜을 사용하고 있으며 채널은 C, ID는 3332, 그리고 DH, DL, MY는 각각 0으로 공장 출하시 설정되어 있다.

개인적으로 Always Update Firmware 체크는 권장하지 않는다. 불필요하게 Write 할 때 마다 업데이트 할 필요성이 없으며, 오류로 인한 문제를 발생 시킬 수 있다.

Xbee Series 1 파리미터 설정

먼저 자주 사용하는 파라미터를 아래의 표를 통해서 알아보자.

자주사용하는 파라미터

ID는 Xbee의 네트워크 ID로 네트워크 상의 이름, CH는 Xbee의 통신채널을 말한다. SH/SL은 Xbee의 시리얼 번호를 말하며, MY는 모듈의 주소를 말한다. DH/DL은 통신을 보낼 대상의 주소를 말하며, BD는 통신속도를 말한다.

Xbee Series 1 양방향 통신 주소 설정

양방향 통신 주소 설정

Xbee A 에서 Xbee B 로 1대 1 양방향 통신을 하기 위해서는 각각의 Xbee 모듈을 아래와 같이 설정해야된다.

양방향 통신 파라미터 설정

간단하게 설명해서 모듈 A와 B의 설정 값을 동일하게 설정하면 간단하게 바로 된다.

Xbee Series 1 원형 통신 설정

원형 통신 설정

원형 통신은 3개 이상의 Xbee 를 통신할때 사용하는 방법이다. 모듈 A는 모듈 B로, 모듈 B는 모듈 C로, 모듈 C는 다시 모듈 A로 하는 형식으로 주소 설정은 아래를 참고하길 바란다.

원형 통신 파리미터 설정

간단하게 전달 순서를 지정하는 것으로 생각하면 된다. 3개 이상을 하게 될 경우 위를 참고해서 하나 하나 더 늘려가면 최대 지정 가능한 범위 안에서 늘릴 수 있다.

Xbee Series 2 설정하기

Xbee Series 2 는 Series 1 과 달리 Zigbee Mesh 프로토콜을 사용한다. 이 프로토콜은 다음의 세가지 디바이스 타입을 사용하는데 각각 Coordinotor, Router, End Device 이다. 각각의 역활의 이해는 아래를 참고하길 바란다.

Zigbee Mesh 프로토콜

Coordinotor 는 네트워크의 형태 결정 및 보안을 담당한다. 그리고 Router는 네트워크 범위를 확장 할 수 있으며, End Device는 개별적인 센싱 혹은 제어를 담당한다. 이해륻 돕기 위해 스마트홈이라 생각하면 Coordinotor는 홈 시어터로 음향 및 영상 제어, Router는 음향기기 및 조명/영상기기, End Device는 각가의 센서 및 스위치라 생각 할 수 있다.

Coordinator 설정

먼저 Module A의 Function Set 값을 변경해서 Coordinator로 설정하겠다. 이때 주의할 점은 SC, SD가 Router 설정과 동일해야 된다.

Router 설정

그리고 Module B의 Function Set 값을 변경해서 Router로 설정한다. Module B 의 SC, SD의 값 역시 Coordinator 와 동일해야된다. 이로서 Xbee Series 2 의 통신설정이 끝났다.

아두이노로 Xbee 통신하기

회로도

Xbee 를 이용해서 서보모터를 가감속 및 좌우 방향 제어를 할 것이다. 두 대의 아두이노를 사용해서 한 대의 아두이노에서는 서보모터 제어, 또 다른 아두이노에서는 조이스틱으로 수치 값 제어를 실시하며 Xbee를 통해서 두 대의 아두이노가 통신한다.

수신 및 동작 소스코드

조건 1 > Xbee 를 통해서 값을 수신받아야 한다.조건 2 > 전달 받은 값을 기준으로 서보모터를 위치/속도 제어해야된다.

#include <VarSpeedServo.h>    VarSpeedServo myservo;   int Servo_deg = 90;      // 서보 위치 int Servo_speed = 127;    // 서보 속도   void setup() {   Serial.begin(9600);         // 시리얼 통신 설정   myservo.attach(3);           // 서보 PIN 설정   myservo.write(90,255,true);  // 서보 위치 초기화 }   void loop() {   if (Serial.available() > 0) {     if(Serial.read() == 'u') Servo_speed++;     if(Serial.read() == 'd') Servo_speed--;     if(Serial.read() == 'l') Servo_deg--;     if(Serial.read() == 'r') Servo_deg++;   }     myservo.write(Servo_deg, Servo_speed, true);    // 서보 위치&속도 제어 }

송신 및 제어 소스코드

조건 1 > 아날로그 조이스틱으로부터 값을 받아야 된다.조건 1 > Xbee 를 통해서 조이스틱으로 부터 받은 값을 송신해야된다.

int Read_deg; int Read_speed; char Write_deg; char Write_speed;   void setup() {   Serial.begin(9600);         // 시리얼 통신 설정 }   void loop() {   Read_deg = analogRead(0);      // 조이스틱 좌우 값 읽어 위치에 저장   Read_speed = analogRead(1);    // 조이스틱 상하 값 읽어 속도에 저장      Read_deg = map(Read_deg, 0, 1023, -1, 1);      // 좌우 최대&최소에 맞추어 변경   Read_speed = map(Read_speed, 0, 1023, -1, 1);  // 상하 최대&최소에 맞추어 변경     // 전송   if(Read_speed > 0) Serial.write('u');   if(Read_speed < 0) Serial.write('d');   if(Read_deg < 0) Serial.write('l');   if(Read_deg > 0) Serial.write('r');     delay(2000); // 시간 지연 2초 }

어떤가? 확실히 설정 방법이 다를 뿐 블루투스와 제어 방법은 동일하지 않는가? 시리얼 통신을 한다면 대다수 다 비슷비슷하다. 이를 참고해서 블루투스 제어 등 시리얼 기반으로하고있는 무선 제어를 해보길 바란다.

소스코드에는 정답은 없다. 다양한 생각이 있듯 다양한 방법이 있으며, 이는 그 중 하나다.