정보나눔

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

아두이노간 블루투스 통신
고덕윤 | 2015-12-08
아두이노 우노2개를 가지고 블루투스를 각각 연결시킨 후 데이터를 주고 받을수 있도록 코드를 짜보고 있습니다.
마스터 블루투스 부분에는 스위치2개와 포텐셔미터1개가 있고 스위치2개를 가지고 슬레이브에 있는 LED 2개를 
ON/OFF 할 예정입니다. 그리고 마스터에 있는 포텐셔미터를 가지고 슬레이브에 있는 서보모터 각도를 조절할 생각입니다.
 
아래는 송신부와 수신부 코드입니다.
<송신부>
#include <SoftwareSerial.h>
 
SoftwareSerial BTSerial(2,3);
 
int shift1 = 13;
int shift2 = 12;
 
void setup() {
  BTSerial.begin(9600);
 
  pinMode(shift1, INPUT_PULLUP);
  pinMode(shift2, INPUT_PULLUP);
}
 
void loop() {
  int state1=digitalRead(shift1);
  int state2=digitalRead(shift2);
  int a=analogRead(A0);
  int aa=map(a,0,1023,4,8);
  if(state1 == LOW) 
  {
    BTSerial.print('1');
    BTSerial.write(state1);
    delay(100);
  }
 
  else if(state2 == LOW)
  {
    BTSerial.print('2');
    BTSerial.write(state2);
    delay(100); 
  }
    else if(state2 == HIGH || state1==HIGH)
  {
    BTSerial.print('S'); 
  }
  else if(aa>3)
  {
    BTSerial.print('M');
    BTSerial.write(aa);
    delay(100);
  }
}
 
<수신부>
#include <SoftwareSerial.h>
#include <Servo.h>
 
SoftwareSerial BTSerial(2,3);
Servo myservo;
 
int changeDirection = 0; 
int led1=13;
int led2=12;
 
void setup() {
  BTSerial.begin(9600);
  Serial.begin(9600);
  myservo.attach(9);
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
}
 
void loop() {
   
  if(BTSerial.available())
  {
    char ch = BTSerial.read();
 
  switch(ch)
  {
    case '1':
    {
      digitalWrite(led2,LOW);
      unsigned char motorSpead = BTSerial.read();
      digitalWrite(led1,motorSpead);
 
    }
    break;
 
    case '2':
    {
      digitalWrite(led1,LOW);
      unsigned char motor = BTSerial.read(); 
      digitalWrite(led2,motor);
 
    }
    break;
 
  case 'S':
    {
      digitalWrite(led1,LOW);
      digitalWrite(led2,LOW);
    }
    break;
    
    case 'M':
    {
      unsigned char angle = BTSerial.read();
      if(angle>51 && angle<57 ){
      int angle1=angle;
      int angle2=map(angle1,52,56,0,90);
      myservo.write(angle2);
      delay(15);
      }
      }
          break;
    }
  }
  }
 
스위치2개를 이용해 LED2개를 ON/OFF 시키는 부분은 잘 작동합니다. 하지만 서보모터의 경우 계속해서 혼자서 왔다갔다하네요.... 
  int aa=map(a,0,1023,4,8); 
송신부에서 이렇게 map 함수를 사용한 이유는 스위치가 눌린 상태에서 동시에 서보모터를 작동시키도록 하기 위해서입니다.
스위치의 경우 0과 1을 주기 때문에 일부러 4~8로 잡았습니다.
      unsigned char angle = BTSerial.read();
   if(angle>51 && angle<57 ){
      int angle1=angle;
      int angle2=map(angle1,52,56,0,90);
      myservo.write(angle2);
      delay(15);
      }
수신부에서 angle을 >51, <57 한 이유는 송신부에서 값을 4~8을 주기때문에 아스키코드로 값이 들어와 저렇게 조건문을 달았습니다. 그후 각도를 0~90도로 map함수로 바꾸었습니다.
 
위 함수에서 어디서 잘못되었는지 암만 고민해봐도 답이 나오질 않아 답변을 구하고자 질문을 올렸습니다..
좋은 답변 부탁드립니다..
이전글   |    사운드센서로 측정되는 소리량을 5개의 LED로 제어하고싶은데 질문있습니다.... 2015-12-08
다음글   |    오렌지보드 BLE를 통합적으로 컨트롤 가능한 앱이 있을까요?... 2015-12-09