정보나눔

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

아두이노 2대 블루투스 통신, 서보모터 제어
minifo | 2018-09-04

1. 프로젝트 사용한 보드 종류

아두이노 UNO 보드

 

 

2. 사용한 개발 프로그램명

아두이노 스케치

 

 

3. 사용한 센서 모델명

hc-06 블루투스, hc-sr04 초음파, dm-s0090md 서보모터

 

 

4. 연결한 회로 설명 (또는 이미지)

 

 

5. 소스코드 (주석 필수)

  @@초음파 센서 부분

 

//slave
#include

SoftwareSerial mySerial(2, 3); //블루투스의 Tx, Rx핀을 2번 3번핀으로 설정
int echoPin = 12;
int trigPin = 13;

void setup()
{
  Serial.begin(9600);
  while (!Serial) ; // 연결되지 않았다면 반복
  {

  }
  pinMode(trigPin, OUTPUT); // 초음파 송신
  pinMode(echoPin, INPUT);  // 초음파 수신
  Serial.println("Slave BT");
  mySerial.begin(9600);
}

void loop()
{
  sonicWave();
}

void sonicWave()
{
  digitalWrite(trigPin, LOW);
  digitalWrite(echoPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  unsigned long duration = pulseIn(echoPin, HIGH); // echoPin가 HIGH를 유지한 시간 저장
  float distance = ((float)(340 * duration) / 10000) / 2;  //거리 계산

  Serial.println(distance);  // 시리얼창 확인용
  //mySerial.write(Serial.read());
  mySerial.println(distance);  // 블루투스로 데이터 전달
  delay(500);
}

 

 

@@서보모터 부분

 

//master
#include
#include

SoftwareSerial mySerial(2, 3); //블루투스의 Tx, Rx핀을 2번 3번핀으로 설정
Servo myservo;
char buffer[50];  // 통신 할때 buffer배열에 전송받은 데이터 입력
char bufferIndex = 0;
int serValue = 0;

void setup()
{
  Serial.begin(9600);
  myservo.attach(9);
  while (!Serial) ; // 연결되지 않았다면 반복
  {

  }
  Serial.println("Master BT");
  mySerial.begin(9600);
}

void loop()
{
  btComm();
}

void btComm()
{
  while (mySerial.available())
  {
    buffer[bufferIndex]  = mySerial.read();  // 시리얼 통신으로 버퍼 배열 데이터 수신
    bufferIndex++;  // 데이터 수신 후 버퍼 인덱스 1 증가
  }
  int pos = atoi(buffer);  // atoi()함수로 char값을 int값으로 변환
  if (pos != 0)
  {
    Serial.println(pos);  // int값으로 변환된 데이터 출력
  }  

  //버퍼 초기화
  for (int a = 0; a < 51; a++)
  {
    buffer[a] = NULL;
    bufferIndex = 0;
  }

  char in_data;
  in_data = Serial.read();
  if (in_data <= 50)
  {
    for (serValue = 0; serValue <= 90; serValue += 1)
    {
        myservo.write(serValue);
    }
  }
  else
  {
    for (serValue = 90; serValue >= 0; serValue -= 1)
    {
        myservo.write(serValue);
    }
  }
  delay(100);
}

6. 문제점 및 에러 내용

초음파 센서의 값이 50 이하일때 서보모터가 움직이가

초음파 센서의 값이 50 초과일때 서보모터가 0으로 돌아가도록 하게 만들려고 합니다.

 

블루투스로 데이터 수신까지는 받았는데 서보모터가 버퍼링 걸린것처럼 제자리에서 미세하게 와이퍼질합니다

 

부드럽게는 바라지 않고 50이하일때 90도로 유지되도록 하려면 어떤식으로 바꿔야 할 지 조언 부탁드립니다.

이전글   |    아두이노를 활용하여 gps 웹으로 받기 2018-09-02
다음글   |    미세먼지측정기 질문 2018-09-05