정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

아두이노 블루투스 통신
성만이 | 2019-12-19

1. 아두이노 우노, 레오나르도

2. 아두이노 IDE

3. mpu 6050, HC-06 3.3V

4. 자이로센서를 연결하고 이 데이터 값을 레오나르도에 있는 블루투스에 보내 컴퓨터 키보드가 눌리도록 설계하여씁니다.

5. 아래 sending, recieve 순으로 코드 올리겠습니다.

#include
#include
SoftwareSerial BT(8,9);

const int MPU=0x68;
const int ctrl = 3;
const int shift = 4;
const int z = 5;
const int alt = 6;

int AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
void get6050();
int xpos;
int ypos;

void setup()
{
  Serial.begin(9600);
  BT.begin(9600);
 pinMode(ctrl, INPUT);
 pinMode(shift, INPUT);
 pinMode(z, INPUT);
 pinMode(alt, INPUT);
  
 Wire.begin();
 Wire.beginTransmission(MPU);
 Wire.write(0x6B);
 Wire.write(0);
 Wire.endTransmission(true);
}


void loop()
{
 if(BT.available()){
Serial.write(BT.read());
 }
 if(Serial.available()){
BT.write(Serial.read());
 } 
  get6050();
  xpos=map(AcX,-16383,16383,0,180);
  ypos=map(AcY,-16383,16383,0,180);

  if(xpos>130){BT.write("d"); //xpos가 130보다 크면 d를 송출
  }
  else{BT.write(" ");
  }
  if(xpos<60){BT.write("u"); //xpos가 60보다 작으면 u를 송출
  }
  else{BT.write(" ");
  }
  if(ypos<60){BT.write("l"); //ypos가 60보다 작으면 l을 송출
  }
  else{BT.write(" ");
  }
  if(ypos>130){BT.write("r"); //ypos가 130보다 크면  r을 송출
  }
  else{BT.write(" "); //아니면 쓰레기값 송출
  }

  if (digitalRead(ctrl) == HIGH) {     
    BT.write('c');
  }  
  if (digitalRead(shift) == HIGH) {
    BT.write("s");
  }
  if (digitalRead(z) == HIGH) {
    BT.write("z");
  }
  if (digitalRead(alt) == HIGH) {
    BT.write("a");
  }
                                           
}

void get6050(){

  Wire.beginTransmission(MPU);

  Wire.write(0x3B);

  Wire.endTransmission(false);

  Wire.requestFrom(MPU,14,true);

  AcX=Wire.read()<<8|Wire.read();

  AcY=Wire.read()<<8|Wire.read();

  AcZ=Wire.read()<<8|Wire.read();

  Tmp=Wire.read()<<8|Wire.read();

  GyX=Wire.read()<<8|Wire.read();

  GyY=Wire.read()<<8|Wire.read();

  GyZ=Wire.read()<<8|Wire.read();

}

 

여기까지가 샌딩이고요.

 

#include
#include
SoftwareSerial btSerial(8,9); 

void setup() {
 Serial1.begin(9600);
 btSerial.begin(9600);
}

void loop() {
  char command;
  if(btSerial.available()>0){
    command=btSerial.read();

    if(command=='u'){
      Keyboard.press(KEY_UP_ARROW); //u를 받았을 때, 키보드 up키를 누름.
      }
      else{Keyboard.release(KEY_UP_ARROW);
      }
    if(command=='d'){
      Keyboard.press(KEY_DOWN_ARROW); //d를 받았을 때, 키보드 down키를 누름.
      }
      else{Keyboard.release(KEY_DOWN_ARROW);
      }
    if(command=='l'){
      Keyboard.press(KEY_LEFT_ARROW); //l을 받았을 때, 키보드 Left키를 누름.
      }
      else{Keyboard.release(KEY_LEFT_ARROW);
      }
    if(command=='r'){
      Keyboard.press(KEY_RIGHT_ARROW); //r으 받았을 때, 키보드 RIGHT키를 누름.
      }
      else{Keyboard.release(KEY_RIGHT_ARROW);
      }
    if(command=='c'){
      Keyboard.press(KEY_LEFT_CTRL);
      }
      else{Keyboard.release(KEY_LEFT_CTRL);
      }
    if(command=='s'){
      Keyboard.press(KEY_LEFT_SHIFT);
      }
      else{Keyboard.release(KEY_LEFT_SHIFT);
      }
    if(command=='z'){
      Keyboard.press('z');
      }
      else{Keyboard.release('z');
      }
    if(command=='a'){
      Keyboard.press(KEY_LEFT_ALT);
      }
      else{Keyboard.release(KEY_LEFT_ALT);
      }
    Serial.write(command);
    

  }
  }

 

여기까지가 리시브입니다.

6. 블루투스 통신 속도가 9600이상으로 가면 신호가 가지 않습니다. 제가 듣기로는 SoftwareSerial 함수를 쓰면 9600이상 올라가면 작동을 안한다고 아는데 사실인가요? 만약 사실이라면 레이트 9600이상으로 올리는 법 좀 알려주세요.

 그리고 통신은 잘 되고 있는데 시리얼 모니터에 AT라고 쳐도 OK가 안뜨는 건 왜 그런가요? 이것도 어떻게 해결해야 하나요?

이전글   |    안드로이드 스튜디오에서 만든 앱을 통해 kocoafab_BLE로 블루투스 페어링... 2019-12-14
다음글   |    오렌지보드BLE를 라즈베리파이에 페어링 하려는데 안됩니다.... 2019-12-20