코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
아두이노간 블루투스 통신
고덕윤 | 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 |