반응형

【 아두이노Proj#8 사륜구동 4WD 블루투스 RC카 만들기~! (with 모터쉴드)

 지난시간, 블루투스모듈을 이용한 통신을 학습하였다. 또한 미니카도 만들어 제어해보았는데, 이제 이 것들을 종합해서 업그레이드 해보도록 하자! 

 바퀴 4개를 이용하여 4륜 구동으로 만들고 아두이노 프로미니로 소형 리모컨을 만들어 무선제어를 한다면, 교육적이고 멋진 아두이노 장난감을 만들어 낼 수 있다.  여기에 Adafruit 사의 모터쉴드를 이용하면, 별다른 선연결도 없이 간단히 4개의 DC모터를 제어할 수 있다.

Let's get it~!

 

▶ 선수 학습 :

    1. [아두이노 모듈#16] 아두이노... 블루투스통신 (블루투스 설정법 참조) ☜ (클릭)

    2. [아두이노 모듈#18] 아두이노... 블루투스통신 (블루투스 제어법 참조) ☜ (클릭)

    3. [아두이노 모듈#22] Adafruit의 4채널 모터쉴드(모터쉴드 사용법 참조) ☜ (클릭)
    4. [아두이노 ProMini#2] 초소형 블루투스 리모컨 만들기(리모트 컨트롤러 참조) ☜ (클릭)

 

▶ 실습 목표 :  

 1. [ Adafruit 모터 쉴드의 사용법을 익힐 수 있고 4개의 DC모터 제어를 할 수 있다.] 

 2. [ 조이스틱의 컨트롤 기능을 익힐 수 있다.  ]

 3. [ 블루투스 모듈의 셋업과 페어링(연결) 및 사용법을 익힐 수 있다. ]

 4. [ 아두이노 두 대 상호간 통신을 통해 제어하는 방법을 익힐 수 있다 ]

 

▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)

[1.  사륜 구동 본체 연결도]

[2. 블루투스 리모컨 연결도]

- 1. 우노 리모컨

우노(나노)보드 조이스틱 조정기 연결도

- 2. 프로미니 리모컨

프로미니 보드 조이스틱 조정기 연결도

※ 블루투스 페어링(자동 연결)을 위해서는, 선수학습 1번을 통해 블루투스 설정법을 확인하여, 본체에 있는 블루투스 모듈은 슬레이브로(Slave)로 설정하고, 조이스틱 조정기의 블루투스는 마스터(Master) 설정 작업이 필요하다.  
(물론 마스터와 슬레이브가 반대로 바뀌어도 상관이 없다)

  - 선수학습을 참고하면 좀더 상세하게 조이스틱 컨트롤로(조정기) 회로를 조립할 수 있다.

  - 우노회로나, 프로미니 회로 모두 같은 코드를 사용하니 상황에 따라 적합한 것을 선택할 수 있다.

 

▶ 실습 절차  :  

1.   부품을 준비하여 위와 같은 회로를 각각 구성한다. 

   -  사륜카의 베이스 판은 아크릴 판 혹은 MDF 등 주변에서 쉽게 구할 수 있는 것으로 사용해도 무방하다.

   -  여기서는 3D 프린팅으로 출력한 것을 베이스로 사용하였다.

   -  모터와 베이스를 연결하는 적합한 나사가 없을 경우, 두꺼운 양면테잎 혹은 글루스틱으로 부착하여도 무방.

   -  3.7V 베터리 2개를 직렬연결 해주면, 충분한 전류가 공급되어 힘있고 빠르게 구동된다.

2.   아래 코드를 작성하고 각각의 프로그램을 로딩 후 실행시킨다.

 

 

▶ 프로그램 코드 및 설명  : 

 

【 코드1-본체 

#include  <AFMotor.h>            // Adafruit 모터 쉴드 라이브러리 사용
#include  <SoftwareSerial.h>    //블루투스 통신을 위한 기본 헤더 선언
                                 
SoftwareSerial BTSerial(2, 3);  // 블루투스 모듈과 통신을 위한 아두이노 연결핀(TX = 2 , RX = 3)
//모터의 전후좌우 방향을 컨트롤하는 PIN번호를 상수로 선언
AF_DCMotor MOTOR1(1);     // 모터쉴드 M1 지정
AF_DCMotor MOTOR2(2);     // 모터쉴드 M2 지정
AF_DCMotor MOTOR3(3);     // 모터쉴드 M3 지정
AF_DCMotor MOTOR4(4);     // 모터쉴드 M4 지정
#define ActionTime 3000
/*  for (i=0; i <255; i++) {
    motor.setSpeed(i);
    delay(20);
  }
*/
void Stop_Release() {
  MOTOR1.run(RELEASE);
  MOTOR2.run(RELEASE);
  MOTOR3.run(RELEASE);
  MOTOR4.run(RELEASE);
  delay(20);
}

void Go_Forward() {
  MOTOR1.run(FORWARD);
  MOTOR2.run(FORWARD);
  MOTOR3.run(FORWARD);
  MOTOR4.run(FORWARD);
  delay(20);
}

void Go_Backward() {
  MOTOR1.run(BACKWARD);
  MOTOR2.run(BACKWARD);
  MOTOR3.run(BACKWARD);
  MOTOR4.run(BACKWARD);
  delay(20);
}

void Go_Left() {
  MOTOR1.run(FORWARD);
  MOTOR2.run(BACKWARD);
  MOTOR3.run(BACKWARD);
  MOTOR4.run(FORWARD);
  delay(20);
}

void Go_Right() {
  MOTOR1.run(BACKWARD);
  MOTOR2.run(FORWARD);
  MOTOR3.run(FORWARD);
  MOTOR4.run(BACKWARD);
  delay(20);
}

void setup() {
  BTSerial.begin(9600); //블루투스와 통신하기 위한 속도설정(모듈의속도 확인필요)
  Serial.begin(9600);   // 시리얼(모니터) 통신 속도를 설정
  MOTOR1.setSpeed(250);
  MOTOR2.setSpeed(250);
  MOTOR3.setSpeed(250);
  MOTOR4.setSpeed(250);
}

void loop() {
/* 기본 동작  
  Go_Forward();
  Stop_Release();
  Go_Left();
  Stop_Release();
  Go_Right();
  Stop_Release();
  Go_Backward();
  Stop_Release();
*/
  if (BTSerial.available()) {   // 블루투스로 신호가 있을 경우 실행되는 루틴
    char cmd = (char) BTSerial.read();   // 블루투스로 읽은 값을 char타입 변수에 저장
    Serial.println(cmd);  //cmd변수에 저장된 내용을 사용자가 `시리얼모니터`로 확인
    
    if ( cmd == 'f') {          //블루투스에서 'f'값이 들어오면 전진
      Go_Forward();
    } else if (cmd == 'l') {     //블루투스에서 'l'값이 들어오면 좌회전
        Go_Left();
    } else if (cmd == 'r') {     //블루투스에서 'r'값이 들어오면 우회전
        Go_Right();
    } else if (cmd ==  'b') {    //블루투스에서 'b'값이 들어오면 후진
        Go_Backward();
    } else if (cmd == 's') {    //블루투스에서 's'값이 들어오면 멈춤
        Stop_Release();
    }
  }
}

 

【 코드2-조이스틱 조정기 

/*  블루투스 조이스틱 조정기 만들기        */
#include  <SoftwareSerial.h>
SoftwareSerial BTSerial(2, 3);  // BTSerial(Rx, Tx)
int BTstates=0;       // 블루투스 신호 상태 저장용 변수
const int X_AXIS =0; //마우스 X 축 (A0)
const int Y_AXIS =1; //마우스 Y 축 (A1) 
int xVal=0;
int yVal=0;

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

void loop() {  
  xVal=map(analogRead(X_AXIS),0,1023,100,0); //x축값 읽어 저장 
  yVal=map(analogRead(Y_AXIS),0,1023,300,200); //Y축값 읽어 저장
  
  // 모터 전진 //
  if (xVal >= 60 && yVal >= 225 && yVal <=275)  { 
    BTSerial.write('f');
    Serial.println('f');
  }
  
  // 모터 후진 //
  else if (xVal <= 40 && yVal >= 225 && yVal <=275)  { 
    BTSerial.write('b');
    Serial.println('b');
  }
  
  // 모터 좌회전 //
  else if (yVal <= 240 && xVal >= 25 && xVal <= 75)  { 
    BTSerial.write('l');
    Serial.println('l');
  }

  // 모터 우회전 //
  else if (yVal >= 260 && xVal >= 25 && xVal <= 75)  { 
    BTSerial.write('r');
    Serial.println('r');
  }

 else { 
    BTSerial.write('s');
    Serial.print('s');
  }
  delay(100); 
}

 

▶ 코드 다운로드 :

 (위 두 가지 코드 압축파일로 다운로드)

(PROJ03) 4WD_CAR.zip
0.00MB

 

위 코드에 사용된  AFMotor.h 라이브러리 첨부 :

Adafruit-Motor-Shield.zip
0.01MB

(만약 위 라이브러리를 다운 받아 추가 할 경우, 압축을 풀지말고, 아두이노 라이브러리 포함하기 메뉴에서 .zip 라이브러리 추가... 메뉴를 이용해서 추가해주세요. )

 

 

▶ 회로 제작/동작 영상 :

(YouTube : 1080P 고화질로 보기)

https://youtu.be/0tEaw29_dJc

 

(카카오로 보기)

 

 

프로젝트 제작에 사용된 3D 프린팅용 파일 :

1. Car 베이스
( 1. 아래는 본 영상에 사용된 Car-베이스 오리지널 출력 파일 입니다.
오리지널 파일은 고정용 나사 구멍이 뚫려 있습니다.)

아래 파일 출력 예상 이미지

 

ORIGINAL_chasis01.STL
0.27MB



( 2. 아래는 직경이 다소 큰 바퀴를 사용할 경우 가운데 부분이 걸릴 수 있어 바퀴 나뉘는 부분을 좀더 좁게 , 그리고 두께를 4t 정도 되도록한 파일 입니다.  그리고 직접 드릴로 나사의 고정 위치를 잡도록 나사구멍이 없는 파일입니다. 
- 다만, 수정한 파일은 직접 출력해서 테스트해 보지 않았기에, 먼저 오리지널 파일을 사용해 보시고 필요할 경우 아래 파일을 출력해 보시기 바랍니다.)

아래 파일 출력 예상 이미지
Rasino_4WheelCar_base_01.stl
1.48MB

2. 모터 고정용 브라켓
(본 게시글에 사용된 모터를 Car 베이스에 고정하기 위한 브라켓 입니다. )
아래 출력용 모터 서포터는 좌측용과 우측용 2가지이며,  각각 2개씩 총 4개를 출력하면 됩니다.

아래 파일 출력 예상 이미지
soporte_motor1.STL
0.04MB
soporte_motor2.STL
0.04MB


3. 모터 고정용 전용 브라켓(M3 나사) 별도 구매용
( 위 2번의 브라켓은 출력용이다 보니 아무래도 RC-Car를 
운행 할 수록 Car 베이스에 단단히 고정되지 않고 흔들거릴 수 있습니다.  때문에,   본 게시글에 사용된 모터 전용 M3나사 브라켓을 별도로 구매해서 고정시키셔도 좋을 것 같습니다.)

브라켓 구매 링크 :  smartstore.naver.com/domekit/products/2988750683  (2개 1셋 이기 때문에 구매하실때는 2개구매 혹은 여유 있게 구매)

 

반응형
반응형

【 아두이노ProMini#2 초소형 블루투스 리모컨 만들기! for RC CAR ( Arduino Pro Mini) 

 지난시간, 블루투스 조이스틱으로 제어되는 소형 미니카를 만들어 보았다. 하지만 무언가 아쉽다. 아두이노 우노로 리모컨을 만들다 보니 크기가 거의 미니카와 차이 없을 정도로 크게 느껴졌다. 그래서 이번엔 아두이노 프로미니를 이용해서 한 손에 쏙들어가서 컨트롤 할 수 있도록 작게 만들어보려한다. 앞선 실습을 진행했다면 무난하게 만들 수 있을 것이다.  
(필요한 경우, 선수학습 부분을 참고하면 문제 없을 것이다)

 Let's get it~!

 

▶ 선수학습 :

    1. [아두이노 모듈#14] 조이스틱 Joystick 사용하기 #1 ☜ (클릭)

    2. [아두이노 모듈#6] 조이스틱 미니카 만들기 (유선 미니카 기본 참조)  ☜ (클릭)

    3. [아두이노 Proj#6]  선없는 무선 미니카 만들기 (무선 미니카 참조) ☜ (클릭)

    4. [아두이노 모듈#16] 아두이노... 블루투스통신 (블루투스 설정법 참조) ☜ (클릭)

    5. [아두이노 모듈#18] 아두이노... 블루투스통신 (블루투스 제어법 참조) ☜ (클릭)

    6. [아두이노 Promini#1] 아두이노 프로미니 사용하기(프로미니 사용법 참조) ☜ (클릭)

 

▶ 실습 회로 도면 :

▶ 실습목표  :  

    1. 프로미니 보드에 대해 이해하고 기본 사용법을 익힐 수 있다.

    2. 프로미니의 UART 통신을 위한 FTDI사의 FT232RL 모듈 사용법을 익힐 수 있다.

    3. 소형베터리 사용하며 작은 프로토타입의 작품을 만들어 볼 수 있다. 

 


▶ 코딩 :

 

/*  블루투스 조이스틱 조정기 만들기        */
#include  <SofrwareSerial.h>
SoftwareSerial BTSerial(2, 3);    // BTSerial(Rx, Tx)
int BTstates=0;       // 블루투스 신호 상태 저장용 변수
const int X_AXIS =0;    //마우스 X 축 (A0)
const int Y_AXIS =1;    //마우스 Y 축 (A1) 
int xVal=0;
int yVal=0;

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

void loop() {  
  xVal=map(analogRead(X_AXIS),0,1023,100,0); //x축값 읽어 저장 
  yVal=map(analogRead(Y_AXIS),0,1023,300,200); //Y축값 읽어 저장
  
  // 모터 전진 //
  if (xVal >= 60 && yVal >= 225 && yVal <=275)  { 
    BTSerial.write('f');
    Serial.println('f');
  }
  
  // 모터 후진 //
  else if (xVal <= 40 && yVal >= 225 && yVal <=275)  { 
    BTSerial.write('b');
    Serial.println('b');
  }
  
  // 모터 좌회전 //
  else if (yVal <= 240 && xVal >= 25 && xVal <= 75)  { 
    BTSerial.write('l');
    Serial.println('l');
  }

  // 모터 우회전 //
  else if (yVal >= 260 && xVal >= 25 && xVal <= 75)  { 
    BTSerial.write('r');
    Serial.println('r');
  }

 else { 
    BTSerial.write('s');
    Serial.print('s');
  }
  delay(100); 
}

 

 

▶ 코드 다운로드 :

04_Blue_Joystick.zip
0.00MB

▶ 회로 동작 영상 :

(YouTube : 1080P 고화질로 보기)

https://youtu.be/XG2exuDnex8

 

<카카오로 보기>

 

 

 

반응형
반응형

【 아두이노Proj#6 선없는 조이스틱 블루투스 무선 미니카 만들기~! (HC-05)

 지난 시간 조이스틱을 이용한 미니카를 만들어 보았다. 하지만, 선이 연결되어 있어 움직임과 거리에 제약이 있어 많이 불편하였다. 이에, 최근에 다루었던 블루투스 통신 기능을 활용하여 무선으로 깔끔하게 제작해 보도록 하자.

 

▶ 선수 학습 :

    1. [아두이노 모듈#14] 조이스틱 Joystick 사용하기 #1 ☜ (클릭)

    2. [아두이노 모듈#15] L9110S 모듈 사용하기 #1 (모터 드라이버 참조)  ☜ (클릭)

    3. [아두이노 모듈#6] 조이스틱 미니카 만들기 (유선 미니카 기본 참조)  ☜ (클릭)

    4. [아두이노 모듈#16] 아두이노... 블루투스통신 (블루투스 설정법 참조) ☜ (클릭)

    5. [아두이노 모듈#18] 아두이노... 블루투스통신 (블루투스 제어법 참조) ☜ (클릭)

 

 미니카 제작 재료 (우노보드 대신 나노보드로 대체 가능)

( ※ 배터리 전원을 5V이하로 공급 시 Step-UP 컨버터를 사용하면 되고, 5V이상을 공급 시에는 AMS1117과 같은 5V 정전압 컨버터 같은 것을 사용하면 됩니다)
예시) 18650 3.7v 1개 사용시 → Step-Up컨버터 / 18650 3.7v 2개 사용시→ 정전압 컨버터

▶ 실습 목표 :  

 1. [ L9110S 모터 모듈을 활용하는 방법에 대해 이해 할 수 있다. 

 2. [ 조이스틱의 컨트롤 기능을 익힐 수 있다.  ]

 3. [ Step up 컨버터를 이용해 낮은 입력 전압을 5V전압으로 승압해 주는 컨버터를 다룰 수 있다. ]

 4. [ 블루투스 모듈의 셋업과 페어링(연결) 및 사용법을 익힐 수 있다. ]

 5. [ 아두이노 두 대 상호간 통신을 통해 제어하는 방법을 익힐 수 있다 ]

 

▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)

[1. 미니카 본체 연결도]
※ 18650(3.7v) 배터리를 1개 사용하는 미니카 회로도 입니다. 
당연히 움직이는 속도가 빠르지 않을 수 있고 동작 시간도 짧을 수 있습니다. 만약 배터리를 추가하여 활용하고자 할 때는 아래 미니카 전원보강회로 도면을 참고해 주세요.

 

[2. 미니카 블루투스 조정기 연결도]

※ 블루투스 페어링(자동 연결)을 위해서는, 선수학습 4번을 통해 블루투스 설정법을 확인하여, 본체에 있는 블루투스 모듈은 마스터(Master)로 설정하고, 조이스틱 조정기의 블루투스는 슬레이브로(Slave)로 설정 작업이 필요하다. 
(물론 마스터와 슬레이브가 반대로 바뀌어도 상관이 없다)

[ 5V 이상의 배터리 2개를 사용시 회로 연결도 ]
:  만약 5v이상의 배터리를 공급한다면,  Stepup 모듈은 필요치 않으며, 18650 두 개를 직렬로 연결하면 7.4v가 되고 Vin에 입력하고,  모터 드라이버 모듈에도 공급을 해주면 높은 전압(전력)으로인해 모터에 힘이 잘 전달 됩니다.  
이 때, 블루투스는 5V를 넘겨 입력하면 안 되기에, 아두이노의 5V 단자에서 연결해야 하니 주위하세요.

▶ 실습 절차  :  

1.   부품을 준비하여 위와 같은 회로를 각각 구성한다. 

   -  미니카의 베이스 판은 아크릴 판 혹은 MDF 등 주변에서 쉽게 구할 수 있는 것으로 한다.

   -  미니카의 구동 바퀴 외에 보조바퀴를 달아도 되고, 여기처럼 미끌리면서 지지 해줄 수 있는 둥근 나사로 간단히 해결하여도 좋다. 

   - 미니카의 구동속도나 파워를 높이고자 한다면, 3.7V 베터리 2개를 직렬연결 해주거나, 충분한 전류가 공급될 수 있도록 베터리부분을 보강 해준다. 

2.   아래 코드를 작성하고 각각의 프로그램을 로딩 후 실행시킨다.

3.  응용실습 :  코딩 부분을 수정하여 조이스틱의 대각선 방향 제어가 되도록 실습해본다. (선수학습 3번 참조)

 

▶ 프로그램 코드 및 설명  : 

【 코드1-본체 

#include <SoftwareSerial.h>
SoftwareSerial BTSerial(2, 3); // BTSerial(Rx, Tx)
int A_1A = 9;
int A_1B = 10;
int B_1A = 5;
int B_1B = 6;
int speed = 250;   // speed: 0~ 255
char joyBT;

void setup() {
  //핀을 초기화 하고, 출력설정
  pinMode(A_1A, OUTPUT);
  pinMode(A_1B, OUTPUT);
  pinMode(B_1A, OUTPUT);
  pinMode(B_1B, OUTPUT);
  digitalWrite(A_1A, LOW);
  digitalWrite(A_1B, LOW);
  digitalWrite(B_1A, LOW);
  digitalWrite(B_1B, LOW);
  Serial.begin(9600);  
  BTSerial.begin(9600);
}

void loop() {
  if (BTSerial.available()) {      
    joyBT = BTSerial.read();
    Serial.println(joyBT);        
    switch (joyBT) { 
     case 'f' :        // 모터 전진        
        //모터A
        analogWrite(A_1A, speed);
        analogWrite(A_1B, 0);    
        //모터B
        analogWrite(B_1A, speed);
        analogWrite(B_1B, 0);
        break;
     
    case 'b' :        // 모터 후진                
        analogWrite(A_1A, 0);
        analogWrite(A_1B, speed);            
        analogWrite(B_1A, 0);
        analogWrite(B_1B, speed);  
        break;
       
    case 'l' :        // 모터 좌회전                
        analogWrite(A_1A, speed);
        analogWrite(A_1B, 0);            
        analogWrite(B_1A, 0);
        analogWrite(B_1B, speed);        
        break;    
    
    case 'r' :        //모터 우회전                
        analogWrite(A_1A, 0);
        analogWrite(A_1B, speed);            
        analogWrite(B_1A, speed);
        analogWrite(B_1B, 0);
        break;
    
    case 's' :        // 모터 정지      
      analogWrite(A_1A, 0);  
      analogWrite(A_1B, 0);    
      analogWrite(B_1A, 0);
      analogWrite(B_1B, 0);
      break;    
    }
  }
}

 

 

【 코드2-조정기 

#include <SoftwareSerial.h>
SoftwareSerial BTSerial(2, 3); // BTSerial(Rx, Tx)
int BTstates=0;       // 블루투스 신호 상태 저장용 변수

const int X_AXIS =0; //마우스 X 축 (A0)
const int Y_AXIS =1; //마우스 Y 축 (A1) 
int xVal=0;
int yVal=0;

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

void loop() {
  
  xVal=map(analogRead(X_AXIS),0,1023,100,0); //x축값 읽어 저장 
  yVal=map(analogRead(Y_AXIS),0,1023,300,200); //Y축값 읽어 저장
  
  // 모터 전진 //
  if (xVal >= 60 && yVal >= 225 && yVal <=275)  { 
    BTSerial.write('f');
    Serial.println('f');
  }
  
  // 모터 후진 //
  else if (xVal <= 40 && yVal >= 225 && yVal <=275)  { 
    BTSerial.write('b');
    Serial.println('b');
  }
  
  // 모터 좌회전 //
  else if (yVal <= 240 && xVal >= 25 && xVal <= 75)  { 
    BTSerial.write('l');
    Serial.println('l');
  }

  // 모터 우회전 //
  else if (yVal >= 260 && xVal >= 25 && xVal <= 75)  { 
    BTSerial.write('r');
    Serial.println('r');
  }

 else { 
    BTSerial.write('s');
    Serial.print('s');
  }
  delay(100); 
}

 

 

▶ 아두이노 파일다운 :

(다운받아서 압축을 풀어 사용하세요)

[ BlueTooth Joystick_L9110 ].zip
0.00MB

 조립 과정 및 동작 영상 :

[ YouTube 고화질 영상보기 ]

https://youtu.be/zcgeo4yLVnw

 

반응형
반응형

【 아두이노모듈#18】아두이노 2대 블루투스 통신: 볼륨(Var)으로 서보모터 제어! (HC-05

 지난시간 블루투스 모듈을 이용하여 간단히 스위치(LED On/Off)제어 실습을 해보았다. 이제부터는 본격적으로 좀더 다양하고 활용도가 높은 것들을 제어 해보도록 하자. 

 이번시간에는 가변저항(Variable Resistor)을 돌려 저항값을 변화 시키면 블루투스로 페어링(연결)된 아두이노 회로2의 서보모터를 작동 시켜볼 것이다.   더불어 가변저항을 돌릴 때 변화되는 모습을 눈으로 직관할 수 있도록 LED도 달아 보았다. 

 선이 없는 무선은 자유로움과 함께 흥미로움도 한 층 끌어 올려 줄 것이다.  그럼,  Let's get it~!

 

▶ 선수 학습 :

   1. [아두이노모듈#16] 아두이노 2대로 블루투스통신! (블루투스 기본설정법)  ☜ (클릭)

   2. [아두이노기초#17] 아두이노 블루투스 ... LED On/Off 제어(블루투스 기초사용법)  ☜ (클릭)

   3. [아두이노에러해결#4] 서보모터 떨림 현상해결 (서보모터&블루투스 에러 대처)  ☜ (클릭)

 

▶ 실습 회로 도면 :

【회로 1- 서보모터-Slave 회로】

 

【회로 2- Var-LED-Master 회로】

 

▶ 실습목표  :  

    1. 블루투스 모듈(HC-05,06)의 설정과 사용법에 대해 익힌다. (페어링, 기타 설정법)

    2. 블루투스 상호간 통신을 이해하고, 이를 이용해 아두이노 상호간 데이터를 주고 받거나 제어할 수 있다.

    3. 블루투스 통신을 통해 서보모터의 회전(위치)제어를 할 수 있다(블루투스 데이터 처리법 등)

 

▶ 실습절차  :  

   1.  위 회로 1의 도면을 보고 회로를 구성하라. "회로1"의 HC-05 모듈은 'Slave' 모드로 설정한다. 

   2.  위 회로 2의 도면을 보고 회로를 구성하라. "회로2"의 HC-05 모듈은 'Master' 모드로 설정한다.  

   3.  아래에 있는 각각의 아두이노 코드를 보고, 작성하거나 다운받아 각각의 아두이노에 업로드 한다. 

   4.  '회로1'과 '회로2'에 전원을 공급하고 인접하게 두 면 페어링(연결)에 성공한다.

   5. '회로2'의 VAR(가변저항)의 레버를 손으로 돌리면 저항값이 변화되고, 변화되는 정도에 따라 LED 밝기가 변하며, 그 값을 블루투스 모듈을 통해 전송한다. 

   6.  '회로1'에서는 블루투스 데이터를 전달 받아서 서보모터가 범위 영역에서 잘 회전을 하는지 확인 한다. 

   7.  아래 코드는 기본 제어 코드에서 서보모터의 떨림현상을 제어하기 위한 코드가 추가 되었다.  이 부분에 대해 확인 및 이해를 하고, 본인만의 제어 코드를 적용해 보라. ( 선수학습 3번, "... 서보모터 떨림 현상 해결편" 참조 ) 

▶ 코딩 :

 【 '코드 1'- 서보모터-Slave 회로】

/* 블루투스 LED버튼 켜기 & VAR-Servo Control [ Servo part ] */
/* 아두이노/라즈베리파이-IOT 교육자료는 Rasino.tistory.com   */
#include <SoftwareSerial.h>
#include <Servo.h>
#define servoPin 10
SoftwareSerial BTSerial(2, 3); // BTSerial(Rx, Tx)
Servo myservo;
int BTstates=0;       // 블루투스 신호 상태 저장용 변수
int currentVar=0 ;
int previousVar=0;
int readVar = 0;

void setup()  {
  Serial.begin(9600);
  BTSerial.begin(9600);  
  myservo.attach(servoPin);
  pinMode(servoPin, OUTPUT);
}

void loop()  {  
  if (BTSerial.available())  {    
  // --- 수신되는 Var 값을 체크 후 서보 모터 구동 루틴 ---
    currentVar=BTSerial.read();
    Serial.println(currentVar);      
      // 값을 ±4 이상의 변화에서만 모터가 작동되도록하여 떨림현상 제거(값 조정가능)
      if ((currentVar > previousVar+4) or (currentVar < previousVar-4)) {
        myservo.attach(servoPin);
        myservo.write(currentVar); 
        delay(35); 
        previousVar = currentVar;        
    }   
    myservo.detach();   // 서보 모터 정지
  } 
}

 

 【 '코드 2'- VAR_LED-Master 회로】

/* 가변저항으로 서보모터 구동하기 with 블루투스 [VAR part]   */ 
#include  
#define LED 10 
#define VAR A0 
SoftwareSerial BTSerial(2, 3); // BTSerial(Rx, Tx) 
int brightness = 0; 
int readVar = 0; 

void setup()  { 
  Serial.begin(9600); 
  BTSerial.begin(9600);   
  pinMode(LED, OUTPUT); 
} 
void loop()  { 
//--- VAR 값을 체크 후 LED Fade In/Out과 서보모터 구동용 BT신호 발송  
  readVar = map(analogRead(VAR),0,1023,0,179); //서보모터 각도(0~180도) 
  brightness = map(analogRead(VAR),0,1023,0,255);//LED 밝기(0~255) 
  Serial.println(readVar); 
  Serial.println(brightness); 
  BTSerial.write(readVar);      
  analogWrite(LED, brightness);   
} 

 

▶ 아두이노 코드 다운로드 :

 

01_BT_LED_Servo.zip
0.00MB
02_BT_LED_VAR.zip
0.00MB

 

▶ 회로 동작 영상 :

(YouTube : 1080P 고화질로 보기)

https://youtu.be/LL-jOJ7VTcA

반응형
반응형

【 아두이노모듈#17】아두이노 2대로 블루투스 통신하여 LED ON/OFF 제어하기! (HC-05

 지난 시간 HC-05 모듈을 이용해서 블루투스 설정과 기본 페어링에 대해 학습해 보았다. 

 이번 시간 부터는 본격적으로 블루투스 상호간 통신을 활용한 응용작품 들을 구현해보고자 한다. 

선없이 무선으로 컨트롤 된다는 것은 매우 매력적이며, 관심과 흥미 또한 엄청나게 커질 것이다. 

 그 첫 시간으로 블루투스(회로) 기기 상호간 버튼제어를 해보려 한다. BT Master(회로)에서 버튼을 누르면, BT Slave(회로) 에서 LED가 켜지도록 할 것이다.  또한 그 반대도 가능하도록 두 회로 모두 버튼과 LED를 달아서, 동일한 회로 두개를 만들면 된다.   코딩도 마스터, 슬레이브 구분 없이 동일한 코드를 사용한다. 


 (단, 기계식의 버튼(스위치)을 사용하게 되면 , 예전에 다룬 것처럼 채터링 현상(바운싱)이 일어 나게 되니,  채터링 방지 루틴을 참고하여 넣을 것이다.   아래, 선수 학습 참조)   

Let's get it~!

 

▶ 선수 학습 :

   1. [아두이노모듈#16] 아두이노 2대로 블루투스통신! (블루투스 기본사용법)  ☜ (클릭)

   2. [아두이노기초#06] 채터링과 디바운스 (버튼의 바운싱 현상 제거)  ☜ (클릭)

 

▶ 실습 회로 도면 :

▶ 실습목표  :  

    1. 블루투스 모듈(HC-05,06)의 설정과 사용법에 대해 익힌다. (페어링, 기타 설정법)

    2. 블루투스 상호간 통신을 이해하고, 이를 이용해 아두이노 상호간 데이터를 주고 받거나 제어할 수 있다.

 

▶ 실습절차  :  

    1. 위와 같은 회로 두 개를 만들고, "회로1"의 HC-05 모듈은 Master 모드로 설정한다. 

    2. "회로2" 의 HC-05 모듈은 Slave 모드로 설정하고 아래 코드를 업로드 한다. 

    3.  '회로1'과 '회로2'에 전원을 공급하고 인접하게 두 면 페어링(연결)에 성공한다.

    4. '회로1'의 스위치를 누르면  숫자 '1'이 블루투스 모듈을 통해 '회로2'로 전달 되며, '회로2'에서는
        전달받는 신호('1')가 있을 경우 LED를 ON 시킨다.    그 반대의 경우도 동일하게 동작하여야 한다. 

    5. '회로1'에서 스위치를 누를 경우 '회로1' 에 있는 자신의 LED도 'SW 누름 확인'을 위해 한 번 깜빡이도록 한다.('회로2'에서도 마찬가지)

    6. 채터링(스위치의 기계적 다중 접점에 의한 바운싱 현상) 현상 해결을 위해 바운싱 방지 알고리즘을 적용한다.
       (선수학습 참조)

 

▶ 회로 동작 영상 :

 

▶ 아두이노 코드 :   (아래코드를 동일하게 만든 두 개의 회로에 각각 업로드 한다)

 

/* LED_SW On-Off  블루투스 Master/Slave code        */

#include  <SoftwareSerial.h>
#define SW 12 
#define LED 11
#define bounceTimer 200   
// 바운싱 카운트 200으로 설정 
u8 keyState = HIGH;   
// 버튼의 상태 저장용 변수
u8 bounceCount = 0; 
// 바운스 변수 선언
SoftwareSerial BTSerial(2, 3); 
// BTSerial(Rx, Tx)
int BTstates=0;         
// 블루투스 신호 상태 저장용 변수

void setup()  {
Serial.begin(9600);
BTSerial.begin(9600);  // 자신의 BT모듈의 설정값으로 변경 할 것
pinMode(SW, INPUT);
pinMode(LED, OUTPUT);
}

void loop()  {
// ---- 버튼 바운싱에러 방지 코드와 블루투스 신호 발신 영역 ----
  u8 key = digitalRead(SW); 
// 버튼 값 읽어 key변수에 저장
  if(key == HIGH)  {          
// 버튼이 눌러졌다면
    if(keyState == LOW) {     
// 이전의 버튼 상태가 LOW 였었다면
          if(bounceCount == 0) {  
            bounceCount = bounceTimer;   
            Serial.println("Push");          
            BTSerial.write('1'); 
// 버튼이 눌러졌으니,블루투스를 통해1을 전송
            digitalWrite(LED, HIGH); 
//버튼 눌림 확인용 LED On
            delay(100);
            digitalWrite(LED, LOW); 
//버튼 눌림 확인용 LED Off
            keyState = key;   
// 현재의 키값 저장
          }  
          else {
              bounceCount --; 
//  바운스 카운트 값 감소
          }      
    }    
  }    
  else{                          
 // 버튼이 안 눌러졌었다면
    if(keyState == HIGH)  {    
// 이전의 상태가 눌린 상태였다면
      Serial.println("Pull");    
 // 버튼을 놓은(Pull) 것임 
      keyState = key;   }     
 // 놓은(Pull)버튼 상태 저장
  }

//--- 수신되는 블루투스 신호 체크 후 LED ON/OFF 루틴 ---
  if (BTSerial.available())
  {
    char str=BTSerial.read();
    if (str=='1')
    {
      BTstates=!BTstates;
      Serial.println(str);
      digitalWrite(LED, BTstates);
    }    
  } 
}

 

▶ 아두이노 코드 다운로드 :

02_LEDSW_MS.zip
0.00MB

 

▶ 전체 과정 영상 :

(YouTube 1080P로 보기)

https://youtu.be/NqZV7kYnl-I

 

(카카오)

 

반응형
반응형

【 아두이노모듈#16】아두이노 2대로 블루투스 통신하기! (HC-05

 아두이노 두 대 상호간 통신을 통해 데이터를 서로 주고 받을 수 있는 방법이 있다. 바로 블루투스 모듈인 BlueTooth module (HC-05 또는 HC-06)를 이용하면 된다. 

 다르게 이야기 해서, 아두이노 RC Car가 있고, 이를 유선이 아닌 무선으로 제어하고자 할 때 블루투스 모듈을 이용하면 제어가 가능하다. 

우선 두 대의 아두이노+블루투스 모듈 서로간 기본 통신법에 대해 다루고자 한다.  차 후에는 RC 카에 적용하여, 무선으로 제어 해보고자 한다. 
 해보면 알겠지만, 블루투스 모듈 제어가 다소 까다롭다. 영상처럼 단번에 되지 않을 것이다. 절차와 조건이 잘 맞아야 하니,  차분하게 글과 영상을 보면서 따라 해본다면, 문제가 생겨도 충분히 해결해 나갈 수 있을 것이다.

Let's get it~!

 

▶ BT(BlueTooth) 모듈 설명 :

 

 블루투스 모듈은 크게, 통신규격 버전에 따라 '2.0버전 모듈'과 '4.0버전 모듈'이 있고, 저전력으로 동작되는 '4.0 BLE 모듈(HM-10)' 등이 있다. 
그리고, 2.0 모듈(혹은 2.0 이하 버전) 중에서는 크게 HC-05 와 HC-06 모델이 대표적이다. 
이번에 다룰 블루투스는 2.0 제품군이고, 그 중에서 HC-05모듈을 중심으로 다루고자 한다.  HC-06 모듈도 방법적으로 조금의 차이가 있겠지만, HC-05 모듈을 잘 다루어 본다면, 크게 어렵지 않을 것이다. 

 그리고 중요사항으로 HC-05 모듈과 HC-06 모듈의 초기 설정값(공장 초기값)은 아래와 같다. (단, 펌웨어 버전에 따라 다를 수 있음)

HC-05 모듈과 HC-06 모듈의 초기 설정값

 HC-05와 HC-06의 외관상 큰 차이점은, 외부 버튼 스위치가 있고 없고의 차이가 있다. 또한 핀수가 각각 6핀과 4핀이다. (HC-06이 6핀도 있음)  HC-05모듈은 기본 슬레이브로 설정되어 있지만 AT명령어 모드에서 마스터로 변경이 가능하지만,  HC-06모듈은 슬레이브 모드만 지원된다.   
※ 주의해야할 것은 서로 통신하기 위해서는 하나는 마스터(Master), 하나는 슬레이브(Slave)로 설정되어야 페어링(연결) 되면서 통신이 가능해진다.  따라서 블루투스 모듈끼리 통신을 위한 회로를 구성할 때는 기본적으로 HC-05모듈 하나가 있어야 한다.

그런데, HC-06모듈의 펌웨어 버전이 1.7 이상에서는 AT명령으로 마스터 모드 설정이 가능한데, 펌웨어 3.0 이상에서는 전송옵션(시리얼모니터 설정)도 Both NL & CR로 변경되었다.  

 [ ※ HC-05 모듈은, 최근에 출시 되는 제품의 경우 펌웨어 버전이 3.0 버전으로 출시 되고 있다. 2017.06.01 기준 ]

 모듈에 따른 블루투스 통신 방법은 , 

  1번. 'HC05 ↔ HC05' 

  2번. 'HC05 ↔ HC06' 

  3번. 'HC06 ↔ HC06'   이런 형태로 가능하다. 

 

[ HC-05 스팩 ]

- 칩셋 : CSR Bluetooth chip ,  Bluetooth V2.0 표준 프로토콜 사용

- 주파수 : 2.4GHz~2.8GHz  ISM band

- Serial UART 통신속도 : 4800~1382400Bps  지원

- 입력전압 : 3.6V~ 6V
- 페어링 거리 : 최대 10M (장애물 및 조건에 따라 짧아짐)

- 전력 : +3.3VDC 일때 50mA

- 소모전류 : 통신시(30~40mA),  대기시 (8mA)

- 동작온도 : -20℃ ~ 40℃

- 크기 : 26.9mm x 13mm x 2.2mm

- Password (Pin code) : 1234  (default)

[ 코드 작성 시 아래 통신속도 구분에 주의 할 것! : HC-05기준이며, 펌웨어 버전에 따라 달라질 수 있음]
- 블루투스 통신속도(default) : 9600bps
- AT명령어 모드 통신 속도(default) : 38400bps     


[ HC-05 마스터모드 설정 방법 ]
- 회로 연결 : 
 먼저 아래 연결도를 참고하여 연결하여야 한다.  다만 주의해야 할 것은 블루투스 모듈의 Rx단자에 입력되는 신호의 레벨은 3.3V여야 한다.  하지만 아두이노 포트의 출력은 5V레벨이기 때문에 3.3V레벨로 다운시켜 입력한다. 
여기서는 가장 손쉬운 레벨변환 방법인 1㏀저항과 2㏀저항을 이용한 전압분배 방법을 이용한다. 

만약, Vin 전압이 5V라면, 5V의  2/3 전압은 약 3.3V가 된다.(=Vout 출력 전압) 
즉, Vin에 아두이노 포트 출력(여기서는 3번 포트)을 연결하였을 때 5V 레벨의 High 신호는 Vout 으로 3.3V레벨의 신호로 낮추어 출력되며 이를 블루투스 수신단자 Rx로 입력되도록 하기 위함이다.
- 기본(default)은 슬레이브(Slave)모드로 설정되어 있으며, 마스터(Master)모드로 바꾸기 위해서는, AT 커맨드모드(Command mode-명령어모드)로 진입하여 설정하게 되어 있는데, 커맨트 모드 진입은 아래처럼 회로 연결을 하고 HC-05모듈에 붙어 있는 스위치를 이용하여 진입할 수 있다.  (경우에 따라 아두이노의 UART 통신단자인 0번, 1번 포트로 연결하여 작업이 가능하나, 0, 1 포트를 사용하게 되면 아두이노 프로그램 전송이 안 되어 번거로울 수 있다)



-위와 같이 회로 연결을 하였다면, HC-05모듈에 공급된 전원을 잠시 제거한 상태에서 HC-05모듈에 부착된 작은 스위치를 누르면서 전원 공급을 다시 넣어 준다. (이때, 스위치에서 손을 바로 떼지말고, 약 2초 정도 계속 눌러 준다)

- 그러면, 빠르게 깜빡이던 모듈의 LED가 2초 간격으로 깜빡이는 것을 확인 할 수 있을 것이다. 

그런 다음 아두이노 IDE의 시리얼 모니터 창을 열고 아래와 같은 AT 통신 명령어를 이용하여 마스터/슬레이브 설정과 여러가지 설정이 가능해진다. 

- 우선 아래와 같은 코드를 입력한다. 

----------------------------------------------------------------------------

#include  <SoftwareSerial.h>
SoftwareSerial myBT(2, 3); //BlueTooth(Rx, Tx)
void setup() {
  Serial.begin(9600);
  pinMode(7, OUTPUT);   //Enable 단자에 High 넣어줄 포트 
  digitalWrite(7, HIGH);
  Serial.println("Enter AT Commands: ");
  myBT.begin(38400);  // AT-커맨드 모드 통신속도는 38400입니다. 
}
void loop() {
  if (myBT.available())
    Serial.write(myBT.read());
  if (Serial.available())
    myBT.write(Serial.read());
}

----------------------------------------------------------------------------

▶ 아두이노 코드 다운로드 

BTSetup.zip
0.00MB

- 위 코드를 업로드시키고 아래와 같은 시리얼 모니터 창을 연다.

1. 성공적으로 AT 모드 진입시 ,  " AT ⏎ " 입력하면 아래처럼 OK 싸인이 뜬다.
만약, AT 명령어 입력시 OK 싸인이 뜨지 않는 다면, 아래 통신 속도를 확인해 보세요. 

[ 코드 작성 시 아래 통신속도 구분에 주의 할 것! : HC-05기준이며, 펌웨어 버전에 따라 달라질 수 있음]
- 블루투스 통신속도(default) : 9600bps
- AT명령어 모드 통신 속도(default) : 38400bps     
※ 따라서, AT명령어(커맨드) 모드를 위해 아두이노 코드에서 myBT.begin( )의 속도를 38400bps로 설정하여 업로드 하였는지? 확인해 보세요.

- 주의!  아두이노 코드와 시리얼 모니터의 통신 속도와 방법을 아래처럼 일치 시킨다.

 

2. 모듈의 버전 확인  :  AT+VERSION ⏎  

 

3. 모듈의 고유주소 확인 :  AT+ADDR 

 

4. 모듈의 마스터/슬레이브 모드 확인 :  AT+ROLE 

 

5. 마스터 모드로 변경하기 :  AT+ROLE=1  

 

(잘 변경 되었는지 확인 하기  :  AT+ROLE ⏎ )

(다시 슬레이브 모드로 전환하기 위해서는 : AT+ROLE=0 ⏎ )

 

 

6. 모듈의 이름 변경하기 :  AT+NAME= xxxx   

(이름 'RasinoHC05-Master' 로 변경한 경우)   default 값은 : 'HC-05' 되어 있음.

(이름 확인은 추후에 휴대폰 등의 블루투스 검색기능을 통하면 아래처럼 확인 가능함)

 

7. 패스워드 확인 및 변경  :  
 ( default 패스워드 값은 : 1234 이다.)
- 패스워드 확인 명령어 :  AT+PSWD? 
- 패스워드 변경 명령어 :  AT+PSWD=4321  (반드시“ ” 넣을 )

(값 변경 : AT+PSWD= xxxx ⏎ )  ,  아래는 4321로 변경한 예 
(혹은, 펌웨어 버전에 따라 " " 따옴표 없이 입력해 보세요)

(비번 변경확인 :  AT+PSWD ⏎ )

※ 이상과 같이 설정이 모두 끝난 후에는 아래 회로 처럼, 7번포트에 연결한 Enable 단자를 제거하고, HC-05모듈의 커맨드 모드 종료를 위해 전원을 제거후 다시 연결한다.  (HC-05의 LED가 다시 빠른 속도로 깜빡임)

 

※ 참고 :  여기까지는 HC-05의 펌웨어 2.0버전 기준이었으며,  거의 유사하나 약간의 명령어 차이 혹은 기능의 차이가 있는 3.0버전의 예시를 아래 간단히 출력하였으니 참고하시라. (3.0 버전에서는 소문자 입력X, 대문자만 가능)

(기타 상세한 명령어 설명은 아래 HC-05.PDF 파일을 참고)

 

8.  위와 같은 과정을 거쳐 하나는 "슬레이브 회로" 하나는 "마스터 회로" 두 가지를 준비한다. 

 

9. 두 가지 회로가 모두 준비 되면, 통신 확인을 위해 두 대의 PC(혹은 노트북)이 필요한데, 각각 하나씩 회로를 PC에 연결한다. 

10.  두 모듈 회로간 페어링(연결)은 각각 PC에 연결되어 전원이 공급되면 자동으로 페어링 된다. ( HC-05모듈의 LED가 커맨드 모드 일 때 처럼 2초 간격으로 깜빡이게 된다)   

 

11. 통신확인은,  PC-A의 시리얼 모니터 창에서 숫자 1을 입력하면, PC-B의 시리얼 모니터 창에 숫자 1이 나타나고 그 반대도 가능하다) 
아래와 같이, 마스터 회로와 슬레이브 회로 두 가지를 준비하고 실습한다. 이때, En 단자는 연결하지 않으며, 블루투스 모듈의 보호를 위해 분배저항을 반드서 넣어서 작업한다. 

【 ※  전체 과정 영상으로 익히기 

▷ 유튜브로 보기 (1080P 지원)

https://youtu.be/p7bhIBFFymw

 

▷ 카카오로 보기

 

 

[ Trouble Shooting - 문제해결 ]

※ 분명 똑같이 한 것 같은데, 영상에서 처럼 동작이 안 될 경우가 있을 것이다.  아래 몇 가지 사항을 체크 해보자.

 

[ 블루투스 페어링(연결)의 기본 조건 :  1. 마스터와 슬레이브 상호간 연결됨,  2. 두 개의 블루투스 모듈의 비번(pin번호)이 같아야함 (default : 1234) ] 

 

1. 모듈 사양과 버전 확인  :  HC-05 인지? HC-06인지?  혹은 펌웨어 버전 확인

  같은 HC-05 모듈이라 하더라도, 펌웨어 버전에 따라, 명령어가 조금씩 차이가 있다. 

  예),  펌웨어 버전 2.0에서는 소문자 대문자 구분 없이 적용되나, 펌웨어 3.0에서는 대문자만 적용됨.

       고유 주소:  3.0 버전에서는 18:E4:400006 형태로 나옴, 

 

 

2. 초기 AT 커맨드 모드로 진입에 성공해야 통신속도 등 여러가지 설정이 가능하다.  
  ( 시리얼 모니터 창에 "Enter AT Commands: " 메세지가 뜬다고,  AT 모드로 진입이 성공 한 것이 아니다.  보드가 PC에 연결만 되면, 무조건 출력 되도록 코딩 되어 있다.   AT모드는, 명령어 창에, AT를 입력하면 'OK' 싸인이 떠야 한다.  그외에 마스터 슬레이브 명령어 등등 처리시 'OK' 신호가 떠야 하니, AT모드 진입 부분을 다시 살펴 보기 바란다. ) 

코드의 Serial.begin(9600) 와 시리얼 통신창의 9600 baud 속도가 일치해야 한다. (BT모듈의 통신속도와는 별개임)

주의, HC-05 모듈은 시리얼모니터 입력 형태를 "Both NL&CR" 로 해주고,

        HC-06 모듈은 시리얼모니터 입력 형태를 "No line ending"으로 맞추어 주어야 한다.

 

3. 가장중요한 보드레이트(Baud late:통신속도)를 맞추어야 한다. BT마스터 모듈과 BT슬레이브 모듈의 설정된 통신속도와 코드의 통신속도가 동일하게 되어 있는지 확인해야 한다.  예) myBT.begin(xxxx)  , HC-05마스터, HC-05슬레이브, 이 세 개의 통신 속도가 일치 되어야 함.   
   단,  코드에서 Serial.begin(xxxx) 통신속도는 시리얼 모니터 창의 통신속도 하고만 맞추면 문제 없다. 

 - HC-05의 경우 기본적으로(default) UART 통신속도가 9600에 맞추어져 있으며(경우에 따라, 38400도 있음) 

 - HC-06의 경우 기본적으로(default) 9600에 맞추어져 있다. 

   단, 펌웨어 버전에 따라 위와 같지 않을 수 있음으로 코드내에서 9600과 38400을 바꾸어 입력해가며 테스트 해볼 것.

 

4. 마스터 모듈 설정이 되어 있는가?  

  - 블루투스 모듈이, 슬레이브 모듈끼리는 페어링이 되지 않는다.  반드시 모듈하나는 마스터로 설정이 되어야 페어링(연결) 된다.

 

5. AT 명령어 입력 방법 :

 AT 명령어 형식이 블루투스 모듈 혹은 펌웨어 버전에 따라 상이할 수 있다. 여러 형태로 시도해보기 바란다.

예를 들어)  패스워드 변경 명령어 입력시,  아래처럼 여러 형태로 입력 해보기 바란다.

 1.  AT+PSWD=1234  

 2.  AT+PSWD:"1234" 

 3.  AT+PSWD=1234? 

 

※ 주요 AT 관련 명령어(HC-05 기준)

AT :  연결 상태 체크
AT+NAME : default 이름 확인
AT+ADDR :  default 주소 보기
AT+VERSION : 버전 보기
AT+UART : 보드레이트 보기(확인)
AT+ROLE:  마스터?/슬레이브? 상태 확인
AT+RESET :  리셋과 AT mode 빠져나오기
AT+ORGL : 공장 출하 상태로 원위치 시키기
AT+PSWD: 현재의 패스워드 보기

 

※ HC-05 AT 명령어 파일(pdf)과 HC-06 AT 명령어 파일을 첨부하였다. 

(아래 PDF 파일을 참고하면, 위에서 소개하지 않은, IPSCAN 정보나, 블루투스 Pair된 기기 정보 리스트를 보거나 삭제 할 수 있는 명령어들이 있으니 필요할 경우 참고하면 좋을 것이다)

Bluetooth HC-05.pdf
0.08MB
Bluetooth HC-06.pdf
0.14MB

 

★ 마지막 시도 :

 위 5번 까지 별의별 짓(?) 다 시도 해봤지만, 아예 AT 커맨드 모드 진입 자체가 안 된다는 분이 있을 것이다. 

그럴 때는 이렇게 한 번 해보시라.   

 - 상황 : 버튼이 달려 있고 6pin이고, HC-05로 추정되는 모듈이라고 생각 되는 상황에서,  혹은 아니어도...

 AT 명령어 모드는 38400 속도에서만 진입가능한 경우가 있었다(시리얼 모니터 통신속도가 아닌, 블루투스 통신속도).    따라서 AT모드 진입과 설정을 위해 코드상에 myBT.begin(38400)으로 맞추어 실행시켰다.  그런 다음 AT 를 입력해 보면, OK가 떳으며, 다른 명령어도 잘 먹혔다.   이때, AT+UART ⏎  입력해보면, 현재의 BT모듈의 통신 속도를 확인 할 수 있을 것이다. 본인의 경우 (9600으로 나왔다!!,  HC-05모듈의 default 값인 38400이 아니었음) ,
 이제 AT모드 진입이 성공 되었으니,  마스터/슬레이브 , 이름 설정 등등을 끝내고,  본격적으로 실행시킬 때는 코드상에서  BT모듈의 통신속도를 다시 myBT.begin(9600)으로 바꾸어 주었다.(BT모듈값과 일치시킴).
  이렇게 하였더니, 두 개의 블루투스 모듈의 페이링이 잘 되었고 통신도 문제가 없이 잘 실행 되었다.   

  혹은 일단, AT모드로 진입이 성공되면 BT모듈 들의 보드레이트 자체를 아예 모두 38400으로 변경을 해도 될 것이다. 

 
※ 기타 사항 :  

  - HC-05 모듈로 AT커맨드 모드 진입시, 모듈의 'En단자'에 High 레벨을 가하지 않더라도 커맨드 모드 진입은 가능하였다.

  - 버전이 다른 HC-05 모듈, 예를 들어, HC-05(2.0Ver, Master),와 HC-05(3.0Ver, Slave) 와 페어링도 문제 없이 잘 됨.

    (단, 비번은 같아야 함,  default : '1234' , 하나는 반드시 마스터, 나머지는 슬레이브 여야함.)

 

 

[ 다시한번 더 최종 정리 ]

HC-05와 HC-06이 다른점은 HC-05는 마스터와 슬레이브 모두 가능하고 HC-06은 슬레이로 고정되있다. 

그리고 공장 초기값(default)의 차이가 있다.

 

예)

HC-06은 Slave,9600,8,N,1, pin=1234,"HC-06" 시리얼모니터에서 "line ending없음"

HC-05는 Slave,38400,8,N,1,pin=1234,"HC-05" 시리얼모니터에서 "Both NL & CR" 이다.

 

하지만 펌웨어 버전 1.7이상에선 HC-06도 AT명령으로 마스터모드 설정이 가능하다
그리고 펌웨어 3.0 이상에서는 전송 옵션도 "Both NL & CR"로 변경되었다.

 

결론, 자신이 가지고 있는 블루투스의 모델 HC-05, 06 외에,  블루투스 펌웨어 버전이 중요함! 
버전에 따라 AT 명령어도 조금씩 다를 수 있고 접속 통신속도와 기본값(drfault)도 다르니,  확인하여 사용해야 한다.

 

 

포기하기 전에...

 여기까지 글을 읽었다는 뜻은 해볼만큼 해보고 나서도 AT모드 진입조차 안 되어, BAUD RATE 확인이나, 펌웨어 버전 확인 조차 못하는 상황일 것이다.  물론 핸드폰의 앱으로 접속하고 데이터를 보내는데 성공해도 AT 모드로 접속이 안 되는 경우이다.  필자의 판단으로는 똑같은 HC-05 모듈이라도 제조 출하시 펌웨어 버전이 다를 수 있는데, 이 펌웨어 버전이 낮을 경우 이런 증상이 있는 것으로 판단이 된다.(Ver 2.0 미만으로 추정). 
  따라서 이와 같은 상황이라고 판단되면, 그리고 AT모드 진입이 반드시 필요하다면, 새로 최신 펌웨어 버전의 블루투스 모듈을 구매하길 바란다.  그렇게 하는 것이 정신건강에 좋다.  그리고 같은 판매처에서 구매하다보면, 다른 버전을 구매해도 같은 제품이 배달되는 경우가 더러 있는 것 같으므로, 구매처를 바꾸어 구매하는 것이 좋을 것 같다.

 

그럼, 건투를 빕니다...  ^^;

반응형