스마트폰 G-센서 제어 로봇카: 아두이노 & 블루투스 기반 RC카 제작
부품 및 소모품
| 부품 | 수량 | 비고 |
| 아두이노 우노 | 1 | 메인 컨트롤러 |
| HC-06 블루투스 모듈 | 1 | 스마트폰과 무선 통신 (HC-05도 사용 가능) |
| L298N 모터 드라이버 | 1 | DC 기어 모터 2채널 구동 |
| 2륜 로봇카 플랫폼 | 1 | 차체, 모터, 바퀴 포함 키트 권장 |
소프트웨어 및 서비스
- RemoteXY: 모바일 앱 GUI 편집기 및 라이브러리 (https://remotexy.com)
- 아두이노 IDE
프로젝트 개요
스마트폰의 자이로스코프(G-센서)를 조이스틱처럼 사용해 로봇카를 무선 제어하는 프로젝트입니다. RemoteXY 서비스를 이용해 별도 앱 개발 없이 모바일 인터페이스를 생성하고, 아두이노 코드에 자동 통합됩니다.
제작 단계
1단계: 하드웨어 조립
로봇카 플랫폼에 아두이노 우노, HC-06 블루투스 모듈, L298N 드라이버, 배터리를 장착하고 회로도에 따라 배선합니다. 기어 모터 2개는 좌/우 바퀴를 독립 구동합니다.
2단계: RemoteXY GUI 설계
- RemoteXY 에디터(https://remotexy.com/en/editor/) 접속
- 조이스틱 컨트롤 추가 → 'G-sensor' 모드 활성화 (스마트폰 기울임으로 제어)
- 토글 스위치 추가 (LED 온/오프 등 부가 기능용)
- 'Get source code' 클릭해 아두이노 스케치 생성
3단계: 라이브러리 설치 및 기본 테스트
RemoteXY 라이브러리(https://remotexy.com/en/library/)를 아두이노 IDE에 설치 후 생성된 스케치를 업로드합니다. 모바일 앱(RemoteXY 다운로드 페이지에서 설치)과 블루투스 페어링해 GUI 동작 확인.
4단계: 모터 제어 로직 추가
생성된 스케치의 `RemoteXY` 구조체에 조이스틱 X/Y 값(`joystick_1_x`, `joystick_1_y`)이 들어옵니다. 이를 좌/우 모터 속도로 변환하는 `Wheel()` 함수를 구현하고 `loop()`에서 호출합니다.
차동 구동 공식:
- 우측 모터 속도 = Y - X
- 좌측 모터 속도 = Y + X
조이스틱 값 범위(-100~100)를 PWM(0~255)로 매핑(`v * 2.55`)해 `analogWrite`로 출력합니다.
5단계: 모바일 앱 연결 및 실행
- 스마트폰에 RemoteXY 앱 설치
- 앱 실행 → 블루투스 버튼 → 모듈 선택 (HC-05/06 보통 'HC-06' 또는 'INVOR'로 표시)
- 연결 완료 후 스마트폰 기울여 로봇카 제어
완성 코드 (핵심부)
#define REMOTEXY_MODE__SOFTWARESERIAL
#include <SoftwareSerial.h>
#include <RemoteXY.h>
#define REMOTEXY_SERIAL_RX 2
#define REMOTEXY_SERIAL_TX 3
#define REMOTEXY_SERIAL_SPEED 9600
// RemoteXY 설정 배열 (에디터에서 자동 생성)
unsigned char RemoteXY_CONF[] = { 3,0,23,0,1,5,5,15,41,11,43,43,1,2,0,6,5,27,11,5,79,78,0,79,70,70,0 };
struct {
signed char joystick_1_x; // -100~100
signed char joystick_1_y; // -100~100
unsigned char switch_1; // 0/1
unsigned char connect_flag;
} RemoteXY;
// 모터 핀 정의
#define PIN_MOTOR_RIGHT_UP 7
#define PIN_MOTOR_RIGHT_DN 6
#define PIN_MOTOR_RIGHT_SPEED 10
#define PIN_MOTOR_LEFT_UP 5
#define PIN_MOTOR_LEFT_DN 4
#define PIN_MOTOR_LEFT_SPEED 9
#define PIN_LED 13
unsigned char RightMotor[3] = {PIN_MOTOR_RIGHT_UP, PIN_MOTOR_RIGHT_DN, PIN_MOTOR_RIGHT_SPEED};
unsigned char LeftMotor[3] = {PIN_MOTOR_LEFT_UP, PIN_MOTOR_LEFT_DN, PIN_MOTOR_LEFT_SPEED};
void Wheel(unsigned char *motor, int v) {
if (v > 100) v = 100;
if (v < -100) v = -100;
if (v > 0) {
digitalWrite(motor[0], HIGH);
digitalWrite(motor[1], LOW);
analogWrite(motor[2], v * 2.55);
} else if (v < 0) {
digitalWrite(motor[0], LOW);
digitalWrite(motor[1], HIGH);
analogWrite(motor[2], (-v) * 2.55);
} else {
digitalWrite(motor[0], LOW);
digitalWrite(motor[1], LOW);
analogWrite(motor[2], 0);
}
}
void setup() {
pinMode(PIN_MOTOR_RIGHT_UP, OUTPUT);
pinMode(PIN_MOTOR_RIGHT_DN, OUTPUT);
pinMode(PIN_MOTOR_LEFT_UP, OUTPUT);
pinMode(PIN_MOTOR_LEFT_DN, OUTPUT);
pinMode(PIN_LED, OUTPUT);
RemoteXY_Init();
}
void loop() {
RemoteXY_Handler();
digitalWrite(PIN_LED, RemoteXY.switch_1 ? HIGH : LOW);
Wheel(RightMotor, RemoteXY.joystick_1_y - RemoteXY.joystick_1_x);
Wheel(LeftMotor, RemoteXY.joystick_1_y + RemoteXY.joystick_1_x);
}
회로도
제공된 배선도 이미지 참조 (아두이노 - 블루투스 - L298N - 모터 연결).
확장 아이디어
- 초음파 센서 추가로 장애물 회피 기능 구현
- 속도 조절 슬라이더 GUI 추가
- 배터리 전압 모니터링 및 앱에 표시
- HC-06 대신 ESP32/ESP8266으로 Wi-Fi 제어 전환