[버섯] 에어 마우스 만들기 기초 ( 아두이노와 MPU-6050 센서 사용 )
페이지 정보
작성자 버섯돌이 작성일17-01-05 19:27 조회42,145회 댓글0건첨부파일
- AirMouseBasic.ino (1.4K) 538회 다운로드 DATE : 2017-01-05 19:27:47
- mpu-6050.ino (1.6K) 169회 다운로드 DATE : 2017-01-05 19:27:47
관련링크
본문
버섯돌이의 아두이노 기초 MPU-6050 센서로 간단한 에어 마우스 만들기 |
https://www.arduino.cc/en/Reference/MouseKeyboard
하지만, 이 라이브러리를 사용하기 위해서는 아래 조건을 만족해야 합니다.
These core libraries allow a 32u4 based boards or Due and Zero board to appear as a native Mouse and/or Keyboard to a connected computer.
ATmega32u4 칩셋은 USB 통신 기능을 지원하며 흔히 HID라고 부르는 키보드나 마우스 등의 기능을 지원합니다.
따라서, 칩셋이 ATmega32u4가 아닌 제품은 마우스 라이브러리를 사용할 수가 없습니다.-_-;;;
문제는, 아두이노 UNO / Nano / Pro / Pro mini의 경우 ATmega328 칩을 사용하기 때문에 사용이 불 가능합니다.
반면, ATmega32u4을 사용하는 제품은 오래된 제품 중에는 Arduino Leonardo 제품이 있었습니다.
https://www.arduino.cc/en/Main/ArduinoBoardLeonardo
최신 제품군에는 Arduino MICRO가 ATmega32u4 칩셋을 사용하고 있습니다.
https://www.arduino.cc/en/Main/ArduinoBoardMicro
레오나르도 보드의 소형화 버전으로 생각하시면 되겠습니다.
그 외의 ATmega32u4 칩셋을 사용하는 보드나 Due and Zero 보드 정도가 키보드와 마우스 라이브러리를 사용할 수 있는 것 같네요.
구글링 해 보면 편법으로 부트로더를 변경해서 우회할 수 있는 보드들도 있지만 이 글의 범위를 벗어나고 복잡하니 논외로 하겠습니다.
MPU-6050 Accelerometer + Gyro - 아두이노 공식 가이드
ARDUINO MPU 6050 – BEST IMU SENSOR TUTORIAL
https://diyhacking.com/arduino-mpu-6050-imu-sensor-tutorial/
Ep. 57 Arduino Accelerometer & Gyroscope Tutorial MPU-6050 6DOF Module
이렇게 가져온 데이터를 아두이노에서 제공하는 Mouse 클래스를 이용해서 제어하면 에어 마우스가 됩니다.^^
에어 마우스 구현 컨셉..
MPU-6050 센서를 좌/우/앞/뒤로 기울였을 때 화면에서 마우스가 이동하려면 무엇이 필요할 까요?
아주 쉽게~ 생각하면... 마우스를 제어하는 방법과 센서를 제어하는 방법을 알아야겠지요?
본 강좌에서는 필요가 없으나 우노는 보편적으로 많이 사용되는 모델이고 마우스 제어 부분만...
다른 프로그램의 도움을 받거나 원격 통신 등을 이용하면 우노로도 가능하기에 향후를 위해서 우노 정보도 함께 남겨 놓습니다.
Wire Library ( https://www.arduino.cc/en/Reference/Wire )를 보면 아두이노 우노의 경우 I2C가 A4 (SDA), A5 (SCL)로 되어있네요.
즉, 아두이노 우노를 사용한다면 I2C 통신에는 A4번(SDA) 핀과 A5번(SCL) 핀이 사용됩니다.
따라서, MPU-6050의 SCL에 아두이노의 A5번 핀과 연결하고, MPU-6050의 SDA 핀과 아두이노의 A4번 핀을 연결하면 됩니다.
하지만, 아두이노 우노는 32u4 기반의 보드가 아니라서 정상적인 방법으로는 Mouse 클래스를 사용할 수 없습니다.
구글링 해보면 정품 아두이노 우노의 경우 펌웨어를 수정해서 강제로 HID 기능을 사용할 수는 있습니다.
마우스 제어를 위해 Leonardo 같은 32u4 기반의 보드를 사용해야 하는데...
저는 Micro 보드를 구매했으며 아래 URL에서 Micro 보드에 대한 정보를 확인할 수 있습니다.
https://www.arduino.cc/en/Main/ArduinoBoardMicro
Micro 보드는 MPU-6050의 SCL과 아두이노의 3번 핀과 연결하고, MPU-6050의 SDA 핀과 아두이노의 2번 핀을 연결하면 됩니다.
이제 보드 연결 방법은 알았으니 MPU-6050 센서에서 자이로 값을 얻는 방법을 알아야 합니다.
가장 쉬운 방법은 아두이노 튜토리얼 사이트에서 MPU-6050 센서를 선택합니다.
http://playground.arduino.cc/Main/MPU-6050
목차에서 "Code" 부분을 클릭합니다.
아주 간단한 코드면 충분하므로 Code 영역에서 "Short example sketch" 링크를 클릭합니다.
우측 하단의 "[Get Code]"를 선택합니다.
최종 URL은 아래와 같습니다.
저는 URL에 있는 소스 코드를 복사 후 통신 속도를 9600에서 115200으로 수정했습니다.
소스 파일은 본 글에 mpu-6050.ino 파일로 첨부했습니다.
// MPU-6050 Short Example Sketch // By Arduino User JohnChi // August 17, 2014 // Public Domain #include<Wire.h> const int MPU_addr=0x68; // I2C address of the MPU-6050 int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; void setup(){ Wire.begin(); Wire.beginTransmission(MPU_addr); Wire.write(0x6B); // PWR_MGMT_1 register Wire.write(0); // set to zero (wakes up the MPU-6050) Wire.endTransmission(true); Serial.begin(115200); } void loop(){ Wire.beginTransmission(MPU_addr); Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU_addr,14,true); // request a total of 14 registers AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L) AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L) AcZ=Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L) Tmp=Wire.read()<<8|Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L) GyX=Wire.read()<<8|Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L) GyY=Wire.read()<<8|Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L) GyZ=Wire.read()<<8|Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L) Serial.print("AcX = "); Serial.print(AcX); Serial.print(" | AcY = "); Serial.print(AcY); Serial.print(" | AcZ = "); Serial.print(AcZ); Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53); //equation for temperature in degrees C from datasheet Serial.print(" | GyX = "); Serial.print(GyX); Serial.print(" | GyY = "); Serial.print(GyY); Serial.print(" | GyZ = "); Serial.println(GyZ); delay(333); } |
IDE 환경에서 보드를 "Arduino Micro"를 선택하고 업로드해서 실행합니다.
와우~ MPU-6050 센서에서 원하는 값을 손쉽게 추출할 수 있게 되었습니다.*^^*V
실행 결과를 보면 순서대로 가속도(X,Y,Z)와 온도 및 자이로(X,Y,Z) 값을 확인할 수 있으며,
이 소스를 기준으로 원하는 센서 값을 이용해서 PC의 마우스를 제어하면 되겠습니다.
마우스 제어..
마우스를 제어하기 위해서는 setup()에 Mouse.begin()을 추가합니다.
그리고 loop()에서 Mouse.move()를 이용해서 마우스의 위치를 이동시키면 됩니다.
문제는 센서에서 읽어들인 자이로 값을 그대로 사용하면 안 되기 때문에 필터 등을 구현해야 합니다만....
이 분야와는 담을 쌓아서 그런지 사칙 연산도 힘들다 보니 드론 강좌 등을 아무리 봐도 머리에 안 들어오는 관계로...
저는 예전에 답변했었던 질문의 소스에서 사용된 공식을 그대로 적용했습니다.
복잡한 연산 필요 없이 아래 빨간색으로 표시한 2줄의 연산이면 끝입니다.^^
int16_t gyroX, gyroZ;
int Sensitivity = 300;
gyroX = GyX / Sensitivity / 1.1 * -1;
gyroZ = GyZ / Sensitivity * -1;
GyX와 GyZ는 센서에서 읽어 들인 값이며 실제 사용할 보정된 값이 gyroX와 gyroZ 입니다.
이 값을 Mouse.move 메서드를 이용해서 위치를 제어하면 끝입니다.
Mouse.move(gyroZ, gyroX);
간단하죠? *^^*
보정된 값은 자이로만 이용하며 정교한 공식이 아니라서 흔들림이 있고 시간이 지날수록 누적 오차가 생기기 마련입니다.
하지만, 제가 만들 작품에는 드론처럼 정밀한 제어가 필요하지 않고 단순하게 아들하고 게임을 즐기면 되기에 충분합니다.*^^*
만약, 보다 정밀한 제어가 필요한 분들은 온라인상의 훌륭한 강좌들을 참고하시기 바랍니다.*^^*
기존 소스에 마우스 제어 코드를 추가한 소스이며 파일로 첨부했습니다.
[AirMouseBasic.ino]
저는 충분하지만 정밀한 제어를 원하시면 저도 모르니 구글링하세요.^^;;;
주로 드론(콥터) 관련 강좌가 설명이 자세하니 드론이나 에어 마우스 강좌 등을 살펴보시면 도움이 되리라 봅니다.
참고로, jrowberg의 i2cdev 라이브러리에 있는 MPU6050의 DMP 예제의 경우에는 필터가 적용된 값이라..
출력된 값을 그대로 적용해 보았는데 방향만 반대로 보정해주면 부드럽게 움직이더군요.
테스트..
MPU-6050 센서의 경우 자이로 센서라서 방향이 상당히 중요하며 온도도 센서 값에 영향을 미칩니다.
보통은 온도와 가속도 값 등을 활용해서 보정해야 하지만...
이번 프로젝트에서는 상온이라면 모두 무시한 상태로 자이로 값만 사용해도 됩니다.^^
대신 설치 방향은 주의해야 합니다.
센서 하단을 잘 보시면 X와 Y 방향 표시가 있는데 Y 표시가 있는 저 방향이 앞을 향하고 있어야 합니다.
즉, 사진과 동일한 방향이 마우스의 앞쪽 방향입니다.
각자 사용하시는 아두이노 보드에 맞게 결선 후 첨부한 소스를 실행하면 되겠습니다.
아래는 간단한 동작 영상입니다.
아쉽게도 3D 프린터 사용 정지~ 명령을 하달 받아서 예쁜 케이스가 없군요.^^;;;
각자 예쁘게 꾸미시고 필요하다면 Mouse 클래스를 살펴보셔서 버튼 기능 등도 구현하시기 바랍니다.
구매 정보..
제가 구매했던 Micro 제품입니다.
$3.05 - http://s.click.aliexpress.com/e/iqVFiYf2f
!!!!New Pro Micro ATmega32U4 5V/16MHz Module with 2 row pin header For Leonardo best quality
최저가를 찾아 보니 조금 더 저렴한 제품도 보이네요.
$2.95 - http://s.click.aliexpress.com/e/VZjiMBu
New Pro Micro for arduino ATmega32U4 5V/16MHz Module with 2 row pin header For Leonardo in stock . best quality
$2.94 - http://s.click.aliexpress.com/e/QVjiIIQ
New Pro Micro for arduino ATmega32U4 5V/16MHz Module with 2 row pin header For Leonardo in stock . best quality
MPU-6050 센서입니다.
$1.25 - http://s.click.aliexpress.com/e/FUvjAqF
Free Shipping GY-521 MPU-6050 MPU6050 Module 3 Axis Gyroscope + Accelerometer Module for MPU 6050
$1.26 - http://s.click.aliexpress.com/e/FufQVRf
FREE SHIPPING 1PCS GY-521 MPU-6050 MPU6050 Module 3 Axis analog gyro sensors+ 3 Axis Accelerometer Module (GY-521)
마치며..
아주 간단하지만... 손쉽게 구현할 수 있는 에어 마우스에 대해서 살펴봤습니다.
MPU-6050 센서는 다양하게 활용되니 고속으로 DMP 값을 직접 읽어 들이고..
화려한 GUI에서 테스트 등을 하고 싶은 분들은 본문에 소개한 유튜브 영상과 아래 글을 참고하세요.
https://diyhacking.com/arduino-mpu-6050-imu-sensor-tutorial/
제가 구현하려는 목적에는 복잡한 개념이 필요 없어서 다른 자료들을 살펴보지는 않았으나...
단순하게 생각해도 에어 마우스를 구현하는 방법은 많으며 오래된 개념이라 다양한 자료들이 있을 테니 찾아 보시기 바랍니다.^^;;
유사 기능에 관심이 있던 분들이나 아이와 함께 놀고 싶은 분들에게 도움이 되었길 바랍니다.^^;;
제가 만들려고 했었던 장난감은 마우스 클릭 기능 하나만 더 들어가며 외형을 제외하면 에어 마우스와 동일합니다.
그동안 마우스 클릭 기능은 스스로 학습하시라고 숙제로 남겨 놓고~ 장난감(?)은 따로 포스팅하겠습니다.^^;;
본문 수정 시 가급적 공유한 곳의 글 들도 함께 수정하려고 노력합니다만 누락되는 경우가 많습니다.^^;;;
특히 영상이 첨부된 글의 경우 수정이 어려워서 수정된 위치가 다양하면 블로그 글만 수정하므로
http://playground.arduino.cc/Main/MPU-6050
ARDUINO MPU 6050 – BEST IMU SENSOR TUTORIAL
https://diyhacking.com/arduino-mpu-6050-imu-sensor-tutorial/
jrowberg i2cdevlib
https://github.com/jrowberg/i2cdevlib
Wire Library
https://www.arduino.cc/en/Reference/Wire
Mouse and Keyboard libraries
https://www.arduino.cc/en/Reference/MouseKeyboard
Mouse.begin() 함수
https://www.arduino.cc/en/Reference/MouseMove
KalmanFilter 소스 - TKJElectronics
https://github.com/TKJElectronics/KalmanFilter
[영상] MPU6050 First steps
댓글목록
등록된 댓글이 없습니다.
최신댓글