ThimbleKrox: 아두이노 마이크로와 MPU-6050을 이용한 손가락 장착형 마우스 컨트롤
부품 및 소모품
 | Arduino Micro | × | 1 |
 | SparkFun 트리플 축 가속도계 및 자이로 브레이크아웃 - MPU-6050 | × | 1 |
필요한 도구 및 기계
앱 및 온라인 서비스
 | Arduino IDE |
프로젝트 소개
안녕하세요, 제 첫 프로젝트인 ThimbleKrox를 소개합니다. 검지손가락(또는 아무 손가락)에 착용해 손가락 움직임으로 마우스 포인터를 제어할 수 있는 골무 형태의 장치입니다.
1단계: 필요한 재료 및 도구
재료:
- Arduino Micro
- MPU-6050
- 아두이노와 PC 연결용 케이블 (마이크로 USB to USB)
- 점퍼 와이어 (아두이노와 MPU-6050 연결용)
- 고무줄 (아두이노를 손에 고정하려면)
도구:
- Arduino IDE가 설치된 컴퓨터 (아두이노에 코드 업로드용)
- 납땜 인두 (아두이노에 핀 헤더가 미리 조립되지 않은 경우)
- 3D 프린터 (골무를 예쁘게 만들고 싶다면)
2단계: 연결
아두이노 핀과 MPU-6050 핀을 연결합니다:
- 아두이노 VCC → MPU-6050 VCC
- GND → GND
- 핀 2 → SDA
- 핀 3 → SCL
3단계: 3D 프린팅 (선택 사항)
골무를 예쁘게 만들고 싶고 3D 프린터가 있다면 골무 본체를 프린트하세요.
두 가지 버전으로 만들었습니다: 서포트가 필요 없는 투명 버전(부피가 크지 않음)과 스팀펑크 스타일 버전(서포트 필요, 색칠하면 더 예쁨). 둘 다 아래쪽 두 돌기 부분이 바닥을 향하게 프린트해야 합니다.
4단계: 조립
3D 프린트 골무 사용 시
배선 후 MPU-6050을 골무 상단 공간에 넣고 케이블은 하단 공간에 넣습니다.
3D 프린트 골무 없이
관심 있는 손가락 끝마디에 MPU-6050을 놓고 테이프나 고무줄로 고정합니다.
5단계: 코드 및 캘리브레이션
먼저 필요한 라이브러리를 설치하세요: Wire.h, I2Cdev.h, MPU6050.h, Mouse.h
ThimbleKrox 캘리브레이션 코드를 업로드하고, 골무를 착용한 뒤 시리얼 모니터(Ctrl+Shift+M)를 여세요.
다음과 같은 출력이 나타납니다:
right | gx = 3165 gy = 469 gz = -1055 | ax = 15232 ay = 2064 az = -4496
방향과 캘리브레이션에 필요한 값들이 표시됩니다.
코드에서 // calibration line으로 표시된 줄의 숫자 값을 수정해 올바른 방향이 나오도록 조정하세요. (값 변경 후 매번 아두이노에 재업로드 필요)
예시:
시리얼 모니터에 left | gx = 3165 gy = 469 gz = -1055 | ax = 5232 ay = 2064 az = -4496이라고 뜨지만 right로 나오길 원한다면, 코드의 if (ax >= 15000)를 if (ax >= 5000)로 변경합니다. 시리얼 모니터의 ax 값(5232)이 코드의 조건값보다 크도록 조정하는 것입니다.
캘리브레이션 코드의 모든 줄을 조정해 정상 작동하면, 메인 코드의 해당 값들도 동일하게 수정하세요.
이제 메인 코드를 업로드합니다.
6단계: 프로젝트 완성
이제 골무를 착용하고 마우스를 조작해보세요!
코드
ThimbleKrox 메인 코드
// 손가락 움직임으로 마우스 포인터 제어
// 캘리브레이션은 "ThimbleKrox calibration code" 실행 후 https://www.hackster.io/projects/dd8881/ 튜토리얼 참조
// 캘리브레이션이 필요한 줄에는 "//calibration line" 표시
// 작성자: Magform
#include <Wire.h>
#include <I2Cdev.h>
#include <MPU6050.h>
#include <Mouse.h>
MPU6050 mpu;
int16_t ax, ay, az, gx, gy, gz;
int vx, vy;
int sensibility = 10; // 이 값으로 감도 조절
void setup() {
Serial.begin(9600);
Wire.begin();
mpu.initialize();
if (!mpu.testConnection()) {
while (1); // 연결 실패 시 중단
}
}
void up() { Mouse.move(0, -sensibility); }
void down() { Mouse.move(0, sensibility); }
void left() { Mouse.move(-sensibility, 0); }
void right() { Mouse.move(sensibility, 0); }
void loop() {
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
if (ax >= 15000) { right(); } // calibration line
if (ax <= -9000) { left(); } // calibration line
if (ay <= -8000) { up(); } // calibration line
if (ay >= 10000) { down(); } // calibration line
// 우클릭/좌클릭 기능 (작업 중)
/*
if (gy >= 20000) { Mouse.click(MOUSE_RIGHT); delay(100); } // calibration line
if (gy <= -20000) { Mouse.click(MOUSE_LEFT); delay(100); } // calibration line
*/
delay(10);
}
ThimbleKrox 캘리브레이션 코드
// ThimbleKrox 캘리브레이션용 코드
// 이 코드를 실행하고 https://www.hackster.io/projects/dd8881/ 튜토리얼 따라하기
// 캘리브레이션이 필요한 줄에는 "//calibration line" 표시
// 작성자: Magform
#include <Wire.h>
#include <I2Cdev.h>
#include <MPU6050.h>
#include <Mouse.h>
MPU6050 mpu;
int16_t ax, ay, az, gx, gy, gz;
int vx, vy;
int Nwrong = 1;
void setup() {
Nwrong = 1;
Serial.begin(9600);
Wire.begin();
mpu.initialize();
while (Nwrong != 0) {
if (!mpu.testConnection()) {
Serial.print("Wrong connection number: ");
Serial.print(Nwrong);
Nwrong++;
delay(1000);
} else {
Nwrong = 0;
}
}
}
void up() { Serial.print(" up "); }
void down() { Serial.print(" down "); }
void left() { Serial.print(" left "); }
void right() { Serial.print(" right "); }
void rightclick() { Serial.print(" RightClick "); }
void leftclick() { Serial.print(" LeftClick "); }
void loop() {
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
if (ax >= 15000) { right(); } // calibration line
if (ax <= -9000) { left(); } // calibration line
if (ay <= -8000) { up(); } // calibration line
if (ay >= 10000) { down(); } // calibration line
/*
if (gy >= 20000) { rightclick(); delay(100); } // calibration line
if (gy <= -20000) { leftclick(); delay(100); } // calibration line
*/
Serial.print(" | gx= "); Serial.print(gx);
Serial.print(" gy= "); Serial.print(gy);
Serial.print(" gz= "); Serial.print(gz);
Serial.print(" | ax= "); Serial.print(ax);
Serial.print(" ay= "); Serial.print(ay);
Serial.print(" az= "); Serial.print(az);
Serial.print("\n");
delay(5000);
}
ThimbleKrox GitHub
https://github.com/Magform/ThimbleKrox
커스텀 부품 및 인클로저
ThimbleKrox 3D 프린팅 모델
Thingiverse에서 모델 다운로드 가능 서포트 필요: 투명 버전은 서포트 불필요
회로도