본문으로 바로가기

아두이노를 처음 접한게 2013년 여름이었습니다. 어찌어찌하다가 아두이노로 엔코더를 해석[바로가기]해야할 일이 있어서 공부한 후 블로그에 올려두었었죠. 그 후 3D 프린터를 곁눈질로 구경하면서 그 어마어마한 Firmware가 아두이노 보드에 탑재되어 있다는 것[바로가기]을 또한 알게 되면서 깜짝 놀랬었습니다. 그리고 나서 최근 아두이노 보드와 ESP8266보드를 이용한 wifi의 사용에 대해 또한 이야기[바로가기1, 바로가기2]를 했었죠. 아무튼 아두이노는 참 대단한 아이인것 같습니다. 이제는 코딩 교육과 IoT까지 집어 먹을 모양입니다.~^^ 뭐 저도 분위기나 파악해 볼 겸 오늘은 블루투스 모듈로 유명한 HC-06보드를 이용해서 블루투스 통신으로 아두이노에서 LED를 제어-라고 쓰고 그냥 깜빡 거리기를 해볼려고 합니다.^^

준비하기 - 회로 구성

당연히~ 회로가 준비되어 있어야지요^^

응? 넵.. 저렇습니다.^^. 아두이노는 5V에서 동작하고, 블루투스 모듈인 HC-06보드는 3.3V에서 동작하기 때문에.. HC-06의 TX가 아두이노 들어갈땐, 문제가 없겠지만, 아두이노의 5V TX가 HC-06으로 들어갈 때는 이를 3.3V로 바꾸어 주어야 합니다. 그래서 위에 보이듯이 1k옴과 2k옴으로 전압을 분배해서 연결해 주었구요. LED도 제어할 거니까 살짝꿍 달아주고.... 아참.. 저는 아두이노 Mega 보드를 사용했기 때문에 HC-06 보드를 Serial1에 물릴 수 있었습니다. 만약 Uno 보드를 사용하시는 분들은 소프트웨어 시리얼 통신을 사용하셔야 할겁니다.

뭐 연결은 저렇다는 거죠^^

손이 요즘 떨려요.. 에휴.. 제 손 탓이지만, 그냥 폰 탓을 하고 싶습니다.^^

아두이노측...

브레드보드측~~~~

블루투스 준비 및 세팅

회로도 끝났고 이제 블루투스 준비 해야죠~~~ 먼저... 

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

void loop()
{
  if (Serial1.available()) 
  {
    Serial.write(Serial1.read());
  }

  if (Serial.available()) 
  {
    Serial1.write(Serial.read());
  }
}

와 같이 코드를 작성합니다. 위 코드는 아두이노 시리얼 모니터에서 제가 직접 입력(Serial.read())한 명령을 그대로 블루투스 모듈 HC-06으로 전달(Serail1.write())하고, HC-06 모듈에서 넘어온 메세지(Serial1.read())는 저에게 전달(Serail.write())하는 것입니다.

그리고 저렇게 시리얼 모니터를 열어서 AT라는 명령을 주어서 OK가 반환되면 성공한 것입니다^^

AT+NAME****은 ****로 블루투스 모듈 HC-06의 이름을 바꾸겠다는 것으로 OKsetname이라는 메세지가 나타나면 성공한 것입니다.

AT+PIN****은 ****로 PIN 넘버를 바꾸겠다는 것으로, OKsetPIN 메세지가 나오면 또한 성공입니다^^

AT+BAUD*는 통신속도를 *번으로 변경하라는 것으로, 4:9600, 5:19200, 6:38400, 8:115200의 속도를 의미합니다.

다 세팅하고 나면... 위 그림처럼 제가 바꾼 pwbt라는 블루투스 모듈 이름이 나타나내요^^

PIN넘버를 입력하지 않아서 오류가 났네요^^

핀 넘버를 세팅해준데로 입력하구요^^

OK~~~ 블루투스에 연결되었습니다.^^

아두이노에서 블루투스 초간단 테스트하기

이제 간단하게 통신상태가 괜찮은지 볼까요...

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

void loop()
{
  if (Serial.available()) 
  {
    Serial.println("-");
    Serial1.write(Serial.read());
  }
}

넵.. 너무 간단해서 또 놀래셨죠.. ㅎㅎ. 이번에는 시리얼 모니터에서 글자를 하나 입력하고 그게 블루투스에서 잘 보내주는지를 볼려고 합니다. 시리얼 모니터에서 한 글자 입력하고 엔터, 시리얼 모니터는 그냥 글자 입력되었다고 '-'로 표기하고, 블루투스에도 동일하게 전송해서 확인하는 거죠^^

그럼 당연히 블루투스에서도 어떤 값이 전송되는지 확인할 프로그램이 필요합니다. 저는 맥을 쓰고 있어서 맥(mac)에서 사용할 시리얼 터미널 프로그램이 필요한데요. CoolTerm[바로가기]이라는 이 아이가 손쉽게 접근해 볼 수 있는 프로그램입니다.

이 프로그램에서 pwbt를 찾아서 연결해 줍니다. 그 전에 당연히 PC에서도 연결되어야죠.

그리고 가볍게 connect~~

아두이노의 시리얼 모니터에서 1부터 4까지 그냥 막 전송했습니다. 블루투스에 연결된 터미널 프로그램에서 잘 받고 있는게 보이네요.. 오케이~~~~

아두이노에서 블루투스를 이용해서 LED 테스트하기

이제.. 아두이노 보드에 붙여둔 LED... 그 아이 이제 사용해야죠^^

char incommingMsg;
int LED = 13;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial1.begin(9600);
  pinMode(LED, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  while (Serial1.available()) {
    incommingMsg = Serial1.read();

    if (incommingMsg == '1') {
      Serial.println("LED is ON !");
      digitalWrite(LED, HIGH);
    }
  
    if (incommingMsg == '0') {
      Serial.println("LED is OFF !");
      digitalWrite(LED, LOW);
    }
  }
}

코드는... 위와 같이 바꿉니다. LED는 13번으로 해두고, Serial1은 블루투스 모듈인 HC-06에 연결되어 있는데 여기서 1이면 on, 0이면 off로 인식해서 LED를 끄고 켜는거죠^^

CoolTerm의 Send String 에서

1을 보내면~

켜지고~~

0을 보내면~

꺼지죠~~ 뭐 너무 당연하지만^^. 이렇게.. 아두이노에서 블루투스 통신을 연습해 보았습니다.^^


댓글을 달아 주세요

  1. BlogIcon 공수래공수거 2018.02.28 08:42 신고

    이런 기술들이 발전을 해 평창에서의
    드론 예술 비행을'조정하는군요 ㅋ

  2. BlogIcon 휴식같은 친구 2018.02.28 11:02 신고

    아두이노가 이렇게 간단한 코딩으로 이렇게 구현이 되는군요.
    잘 보고 갑니다.

  3. BlogIcon GeniusJW 2018.02.28 11:24 신고

    ㅎㅎ~
    정말 신기합니다.

  4. BlogIcon 비키니짐(VKNY GYM) 2018.02.28 15:50 신고

    잘 보고갑니다. 즐거운 하루 되세요.

  5. 포스팅 잘 보고 갑니다~~

  6. BlogIcon luvholic 2018.03.01 00:07 신고

    블루투스를 설정하고 LED 램프가 꺼졌다 켜질 수 있게 명령할 수 있군요 ㅎㅎ넘 신기합니다~!!
    3월, 언제나 즐겁게 보내시기 바랍니다 :)

  7. BlogIcon 드래곤포토 2018.03.01 00:19 신고

    잘보고 갑니다.
    즐거운 시간되세요 ^^

  8. BlogIcon peterjun 2018.03.01 02:17 신고

    마냥 신기하기만 합니다.
    이거 만지작 거리는 친구 녀석을 어제 만났네요. ㅎㅎ

  9. BlogIcon *저녁노을* 2018.03.01 05:12 신고

    잘 보고가요
    행복한 삼월 되세요

  10. BlogIcon 귀요미디지 2018.03.01 18:19 신고

    잘보고가요~
    내일 출근하면 다시 주말
    이번주는 왠지 기쁘네요 ^^

  11. pught21 2018.04.10 19:13 신고

    int incommingMsg;

    // motor control pin
    const int motorDirPin = 8; // L298 Input 1
    const int motorPWMPin = 24; // L298 Input 2

    // encoder pin
    const int encoderPinA = 2;
    const int encoderPinB = 3;

    int encoderPos = 0;
    const float ratio = 360./30./26.;

    // P control
    float Kp = 30;//제어신호
    float targetDeg = 90;//목표값

    void doEncoderA(){ encoderPos += (digitalRead(encoderPinA)==digitalRead(encoderPinB))?1:-1;}
    void doEncoderB(){ encoderPos += (digitalRead(encoderPinA)==digitalRead(encoderPinB))?-1:1;}

    void doMotor(bool dir, int vel){
    digitalWrite(motorDirPin, dir);
    analogWrite(motorPWMPin, dir?(255 - vel):vel);
    }

    void setup() {
    pinMode(encoderPinA, INPUT_PULLUP);
    attachInterrupt(0, doEncoderA, CHANGE);

    pinMode(encoderPinB, INPUT_PULLUP);
    attachInterrupt(1, doEncoderB, CHANGE);

    pinMode(motorDirPin, OUTPUT);

    Serial.begin(115200);
    Serial3.begin(115200);

    }

    float motorDeg = float(encoderPos)*ratio;

    float error = targetDeg - motorDeg;
    float control = Kp*error;

    void Good(){

    doMotor( (control>=0)?HIGH:LOW, min(abs(control), 255));

    }
    void loop() {

    incommingMsg = Serial3.read();
    if (incommingMsg == '1') {

    doMotor( (control>=0)?HIGH:LOW, min(abs(control), 255));

    }

    if (incommingMsg == '0') {
    Serial.println("OFF !");
    Good();
    }

    }

    이렇게 블루투스 모듈로 1이오면 모터가 전진되게 프로그램을짰습니다.. 그런데 1이 왔을때 모터가 45도 전진되고 멈추는 프로그램인데 모터가 멈추지않고 전진하네요 ㅠㅠ 왜그런지아세요...?