장애인을 위한 스마트 손동작 제어 휠체어
부품 및 소모품
부품 수량 비고
아두이노 나노 R3 (Arduino Nano R3) 2 송신부(장갑), 수신부(휠체어) 각 1개
nRF24L01+ 무선 모듈 2 2.4GHz 무선 통신 (송수신 쌍)
스파크펀 듀얼 H-브리지 드라이버 L298 1 DC 모터 2개 구동용
점퍼 와이어 1세트
DC 모터 12V 2 좌/우 바퀴 구동용
필수 도구
소프트웨어 및 앱
아두이노 IDE
라이브러리: RF24 (nRF24L01+), I2Cdev, MPU6050 (가속도/자이로 센서)
프로젝트 개요
인도 농촌/도시 장애인 비율 증가 추세에 맞춰, 손동작만으로 휠체어를 제어할 수 있는 시스템을 개발했습니다. 장갑에 부착된 MPU6050 가속도계로 손의 기울기를 감지하여 nRF24L01로 무선 전송, 휠체어 측 아두이노가 모터 드라이버로 구동합니다. 하반신 마비 장애인의 이동 편의성 향상이 목표입니다.
하드웨어 구성
송신부 (장갑 착용 측)
아두이노 나노 + MPU6050 (I2C) + nRF24L01+ (SPI)
손 기울기(X/Y축) → 가속도 값 → 매핑 후 무선 전송
수신부 (휠체어 본체)
아두이노 나노 + nRF24L01+ + L298 드라이버 + 12V DC 모터 2개
수신 데이터 파싱 → 모터 PWM/방향 제어
송신부 (장갑) 회로도
수신부 (휠체어) 회로도
실제 조립 모습
코드
송신부 코드 (장갑 측)
#include <SPI.h>
#include "RF24.h"
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
MPU6050 mpu;
int16_t ax, ay, az;
int16_t gx, gy, gz;
int data[2];
RF24 radio(9, 10); // CE, CSN 핀
const uint64_t pipe = 0xE8E8F0F0E1LL;
void setup() {
Serial.begin(9600);
Wire.begin();
mpu.initialize();
radio.begin();
radio.openWritingPipe(pipe);
}
void loop() {
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
data[0] = map(ax, -17000, 17000, 300, 400); // X축 → 전진/후진
data[1] = map(ay, -17000, 17000, 100, 200); // Y축 → 좌/우 회전
radio.write(data, sizeof(data));
}
수신부 코드 (휠체어 측)
#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>
#include <SPI.h>
#include "RF24.h"
const int enbA = 3; // 우측 모터 PWM
const int enbB = 5; // 좌측 모터 PWM
const int IN1 = 2; // 우측 모터 (-)
const int IN2 = 4; // 우측 모터 (+)
const int IN3 = 7; // 좌측 모터 (+)
const int IN4 = 6; // 좌측 모터 (-)
int RightSpd = 130;
int LeftSpd = 130;
int data[2];
RF24 radio(9, 10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
void setup() {
pinMode(enbA, OUTPUT); pinMode(enbB, OUTPUT);
pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(1, pipe);
radio.startListening();
}
void loop() {
if (radio.available()) {
radio.read(data, sizeof(data));
// 전진 (X축 값 높음)
if (data[0] > 380) {
analogWrite(enbA, RightSpd); analogWrite(enbB, LeftSpd);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
// 후진 (X축 값 낮음)
if (data[0] < 310) {
analogWrite(enbA, RightSpd); analogWrite(enbB, LeftSpd);
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
// 좌회전 (Y축 값 높음)
if (data[1] > 180) {
analogWrite(enbA, RightSpd); analogWrite(enbB, LeftSpd);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
// 우회전 (Y축 값 낮음)
if (data[1] < 110) {
analogWrite(enbA, RightSpd); analogWrite(enbB, LeftSpd);
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
// 정지 (중립 영역)
if (data[0] > 330 && data[0] < 360 && data[1] > 130 && data[1] < 160) {
analogWrite(enbA, 0); analogWrite(enbB, 0);
}
}
}
회로도