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가 안뜨는 건 왜 그런가요? 이것도 어떻게 해결해야 하나요?
|