728x90
반응형

에어 마우스: https://jinho-study.tistory.com/247

 

아두이노 에어 마우스(자이로센서)

2019년 창의적 종합설계 경진대회 때 만들었던 에어 마우스이다. 하루면 만들 수 있는 작품인데, 알 수 없는 통신에러 때문에 몇 주일을 날렸었다. 알고 보니 핀 문제였는데 각 핀마다 어느 정도 �

jinho-study.tistory.com

에어 마우스에서 필요 없는 기능만(민감도 조절) 빼면 바로 완성이다. 

그렇기 때문에 새로운 코드는 없다.

#include<Wire.h> // 통신? 때문에 필요
#include<Mouse.h> // 마우스 움직여야지!

/*
 SDA 2번 Pin, SCL 3번 Pin
 Int 7번 Pin
 Int 무조건 박아야됨. 
 */
 
#define MPU6050_INT_PIN 7 // 레오나르도에서는 무조건 박아주자

#define MPU6050_INT digitalPinToInterrupt(MPU6050_INT_PIN)

const int MPU_addr=0x68;  // I2C address of the MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;

void setup()
{
  // 설정인데 안 건드는게 좋음. 잘 되있음.
  Serial.begin(9600);

  Serial.println("start");
  Serial.print(MPU6050_INT); Serial.print(" on pin "); Serial.print(MPU6050_INT_PIN);
  
  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);
  pinMode(10, INPUT); // 좌클릭 버튼
  pinMode(11, INPUT); // 우클릭 버튼
  Mouse.begin();
  pinMode(MPU6050_INT, INPUT);
  //attachInterrupt(MPU6050_INT, dmpDataReady, RISdlfhgk62ING);
}

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)
  // 여기 위까지는 코드 건들지 않는 걸 추천. 여기 아래부터 수정 ㄱㄱ

  int lb = digitalRead(10); // 1이면 누른 상태, 0이면 안 누른 상태임.
  int rb = digitalRead(11); // 위와 마찬가지
  
  float gyroY, gyroZ;
  int sens = 1100;
  gyroZ = GyZ / sens;
  gyroY = -GyY / sens;

if(lb == 1) // Left button이 1이라는건 좌클릭을 하고 있다는 상태이므로 
  {                                       // 마우스를 누른 상태로 유지시켜주는 Mouse.press()를 사용함.
    Mouse.press(); // 좌클릭 한 상태 유지
  }
  if (rb == 1) // 우클릭
  {
    Mouse.press(MOUSE_RIGHT);
  } 
  if (lb == 0) 
  {
    Mouse.release(); //클릭 상태 해제
  }
   if (rb == 0) 
  {
    Mouse.release(MOUSE_RIGHT); //클릭 상태 해제
  }

  Sprint1(gyroY, gyroZ, lb, rb);
  Mouse.move(gyroZ, gyroY); // 마우스를 움직이는 함수
}

void Sprint1(int gyroY, int gyroZ, int lb, int rb) // 자이로, 버튼 값 확인용 시리얼 프린트 함수
{
  Serial.print("X축: "); 
  Serial.print(gyroZ);
  Serial.print(" // Y축: "); 
  Serial.print(-gyroY);
  Serial.print(" // 좌 클릭: ");
  Serial.print(lb);
  Serial.print(" // 우 클릭: ");
  Serial.println(rb);
}

필요한 재료는 다이소에서 파는 2000원? 짜리 장난감 총, 인두기, 접착제 정도이다. 

1. 장난감 총을 완전히 분해한다.

2. 방아쇠 부분과 손잡이 옆쪽 부분을 인두기로 뚫고 그 구멍 사이에 각각 버튼이 삐죽 튀어나도록 붙인다.

3. 손잡이 아래부분에 구멍을 뚫고, 점퍼선들을 잘 정리해서 그 구멍에서 빼냄.

4. 다시 조립하면 완성!

탕탕탕
728x90
반응형

'Projects > 에어 마우스' 카테고리의 다른 글

아두이노 에어 마우스(자이로센서)  (0) 2020.06.20
아두이노 조이스틱 마우스  (0) 2020.06.19

+ Recent posts