4WD Bluetooth

4WD Bluetooth#

지금까지 배운 RC카, 블루투스 모듈 사용법, 컨트롤러 사용법을 종합하여 Bluetooth로 조종하는 4WD를 만들어 보겠습니다. IR리모트를 사용한 RC카를 베이스로 하여 IR수신부를 빼고, 블루투스 모듈인 HC-06만 연결하면 됩니다.


schematic#

/image/4wd-bt-17.png

Bluetooth Serial Controller 설정#

여기서는 4WD를 블루투스로 조종하기 위한 콘트롤러를 만들어 봅니다.


  1. 먼저 Bluetooth Serial Controller를 실행시키세요. (블루투스 페어링이나 앱 설치방법은 이전의 글을 참고하세요.) 아래화면은 TERMINAL Mode인 상태입니다. 여기서 스페너 모양 아이콘을 눌러 PREFERCE로 진입하세요.
/image/4wd-bt-01.png

  1. PREFERENCE 화면에서 아무곳이나 누른 뒤, 위로 스크롤하여
/image/4wd-bt-02.png

  1. 9 BUTTON MODE를 활성화 시키고, TERMINAL MODE를 꺼주세요.
/image/4wd-bt-03.png

  1. 그러면 이런 화면이 나타납니다. 이제 각각의 버튼을 정의해보겠습니다.
/image/4wd-bt-04.png

  1. 다시 스페너 모양 아이콘을 눌러 PREFERENCE로 들어간 뒤, BUTTON-Name을 선택합니다.
/image/4wd-bt-05.png

  1. button2, button4, button5, button6, button8을 각각 누른 뒤, 각 버튼 별로 ‘전진’, ‘왼쪽’, ‘정지’, ‘오른쪽’, ‘후진’이라고 이름을 붙여줍니다.
/image/4wd-bt-06.png

  1. 다시 PREFERENCE에서 Command를 누르세요.
/image/4wd-bt-07.png

  1. Command에서 정의해주는 값이 제일 중요한데요. 각 버튼을 누를때, 아두이노로 전달되는 값을 정의해주는 것이기 때문입니다. button2, button4, button5, button6, button8을 각각 누른 뒤, 각 버튼 별로 ‘F’, ‘L’, ‘O’, ‘R’, ‘B’이라고 입력값을 넣어주세요. 이 값은 스케치 작성시 사용해야 하므로 꼭 기억해두어야 합니다.
/image/4wd-bt-08.png

  1. 이제 Visibility로 갑니다.
/image/4wd-bt-09.png

  1. 여기서는 필요없는 버튼을 지워줄 수 있어요. 실제 사용되는 버튼에만 체크하고, 나머지 버튼은 체크 해제합니다.
/image/4wd-bt-10.png

  1. 그러면, 아래와 같은 멋진 블루투스 컨트롤러가 나타납니다.
/image/4wd-bt-11.png

  1. 이 상태에서 돋보기 모양 아이콘을 눌러 HC-06에 접속해 봅니다. 여기서부터는 블루투스 페어링 과정에서 설명했던 부분과 똑같습니다.
/image/4wd-bt-12.png

  1. 모듈ID인 SKS100을 누르면 페어링을 시도하고요.
/image/4wd-bt-13.png

  1. 만일 페어링할 모듈이 나타나지 않으면, Scan for devices로 모듈을 찾아 페어링을 해봅니다.
/image/4wd-bt-14.png

  1. 페어링을 시도하는 중이네요.
/image/4wd-bt-15.png

  1. 페어링 완료! 이제 컨트롤러 사용을 위한 모든 준비과정이 완료되었습니다.
/image/4wd-bt-16.png


4WD 블루투스 초음파센서 자동차#

위 회로에 초음파 센서 하나만 덧붙여봅니다. 50cm 이내에 물체가 접근하면 후진했다가 정지하도록 되어있습니다. (실제로는 50cm보다 훨씬 짧은 거리내에서 후진을 시작하네요.)

DC모터 + 4WD 자동차 만들기 (TB6612FNG)

DC모터 사용하기#

아두이노의 5V, 3.3V핀으로는 모터에 필요한 충분한 전압과 전류를 공급하기 어렵다. 그러므로 사용하려는 모터에 맞는 전압과 전류의 공급을 위한 모터드라이버를 사용해야 한다. 아두이노에서 주로 사용하는 모듈은 L293D, L298N와 TB6612FNG 등이 있으며, 여기서는 TB6612FNG 모터드라이버와 함께, 모터 및 아두이노 단독사용을 위하여 별도의 외부전원을 사용한다. 외부 전원으로는 모터를 위한 1.5V AA*4개와 함께 아두이노 단독사용을 위한 9V 사각전지(6F22)를 추가로 연결하였다.

1.5V AA 6개 혹은 3.7V 18650 2개를 직렬로 연결하여 사용하면, 9V 사각전지(6F22)가 필요하지 않으므로 이 방법을 추천한다. 또한 AA 건전지를 사용하는 경우 4WD기준 연속사용시간은 10분 정도뿐일 정도로 전지 소모가 매우 빠르므로, 충전이 가능한 18650 사용을 추천한다.

Arduino, 라인트레이서, L298N

아두이노를 사용하여 검은색 라인을 따라 움직이는 라인트레이서 자동차를 만들어보자.


TCRT5000 IR reflective sensor#

라인트레이서 제작시 가장 널리 사용되는 IR 센서이다. 감지하는 부분이 검은색으로 되어 있는 부분이라면 IR이 모두 흡수되고, 흰색으로 되어 있는 부분에서는 모두 반사되는 원리를 이용한다.

/image/LT-03.png
  • 장애물이 없는 경우: 1 반환
  • 센서와 12mm이내의 거리에 밝은색이 위치하는 경우: 0 반환
  • 센서와 12mm이내의 거리에 검은색이 위치하는 경우: 1 반환
  • 검은색의 경우도 아주 가까이 가져가면 적외선 수신량이 증가하여 0의 값을 반환할 수 있으므로, 라인트레이서 구성시 감지하는 적당한 거리를 찾는 것이 중요합니다.
  • 10~12mm 정도의 거리에서 측정하는 것을 추천
  • AO 단자를 이용할 경우 아날로그 신호로 처리도 가능

(위 스펙과는 별도로) 라인트레이서 제작시에는 경험상 센서가 바닥면으로부터 2cm정도 떨어지도록 설치하는 것을 추천함

Arduino, Bluetooth 페어링

아두이노에서 블루투스를 이용하는 방법을 알아보겠습니다.


Bluetooth module 선택#

  • 아이폰 : MLT-BT05(AT-09) BLE 모듈 사용 (이 모듈은 안드로이도에서도 사용 가능)

    HC-06, HC-05는 아이폰에서 SPP(Serial Port Profile) 통신이 지원하지 않는 이유로 사용할 수 없습니다. 그러므로 아이폰으로 블루투스 통신을 하기 위해서는 MLT-BT-BT05, AT-09, CC2541, HM-10, HC-02, RN-42 같은 BLE(Bluetooth Low Energy) 모듈을 사용합니다. 연결방법이나 AT명령어 세트는 HC-06과 비슷해요. 주의 할 점은, 시리얼 모니터에서 Both NL & CR 모드를 선택해주어야 하는 것입니다.

/image/BT-01.jpg
  • 안드로이드 : HC-06(or HC-05) 블루투스 모듈 사용 (이 모듈은 아이폰에서 사용 불가)
/image/BT-02.jpg

※ 요즘은 잘 사용하지 않지만, HC-05를 사용하기도 합니다. 생김새가 거의 비슷하지만, 몇가지 차이점이 있는데요. 보통 HC-06과 구별하기 위하여, HC-05에는 칩 위에 V형태로 체크를 해두거나, 화이트로 하얀색 점을 찍어두는 경우가 많습니다. 그리고, 가장 큰 차이점은 HC-05의 경우 6개의 핀이 모두 존재해요.

Arduino, Bluetooth, Blynk

Blynk 설정#

Blynk 라이브러리 설치#

  1. docs.blynk.cc 접속 – Downloads – Blynk Library
  2. https://github.com/blynkkk/blynk-library/releases/tag/v0.6.1
    • Blynk_Release_v0.6.1.zip 다운로드
  3. 압축을 풀면 libraries, tools 폴더가 보임
  4. 이 두 폴더를 아두이노IDE의 기본 스케치북 위치로 복사하여 붙여넣기 함
    • 기존의 libraries 폴더와 합쳐짐
    • 기본 스케치북 위치 확인 방법
      • 아두이노IDE – 파일 – 환경설정 – 설정탭 – 스케치북 위치

스마트폰에 Blynk App 다운로드 하여 설치하기#

  • 아이폰 : 애플 앱스토어
  • 안드로이드 : 구글 플레이스토어


버튼 위젯을 이용한 LED On/Off 하기#

Blynk 계정생성 및 Auth Token 받기#

  1. Blynk App 실행
  2. Create New Account : 주로 사용하는 e-mail을 사용하여 계정 생성
  3. Blynk에서 New Project 생성
    • 아이폰용 MLT-BT05의 경우
      • Project Name 설정: BLE Test
      • CHOOSE DEVICE: Arduino UNO
      • CONNECTION TYPE: BLE
      • 설정 후 Create 버튼
    • 안드로이드용 HC-06의 경우
      • Project Name 설정: HC-06 Test
      • CHOOSE DEVICE: Arduino UNO
      • CONNECTION TYPE: Bluetooth
      • 설정 후 Create 버튼
  4. Auth Token 확인
    • 가입시 지정한 이메일로 로그인하여 토큰 확인
    • (매우 복잡한 형태의) 토큰을 복사하여 코딩시 사용할 것이므로, 컴퓨터로 확인!
    • 스마트폰으로 확인하는 것은 무의미함

Blynk 위젯 설정#

  1. 아이폰용 MLT-BT05를 사용할 경우
    • 생성된 프로젝트(BLE Test) 바탕화면으로 진입하면 Blynk App 상단의 초록색 메뉴바의 이름이 BLE Test로 바뀜
    • 여기서 ⊕버튼 터치한 후 Button위젯과 BLE위젯 추가
    • 추가된 BUTTON 위젯 선택 후 설정
      • OUTPUT: Select pin: Digital D13 / MODE: SWITCH
  2. 안드로이드용 HC-06를 사용할 경우
    • 생성된 프로젝트(HC-06 Test) 바탕화면으로 진입하면 Blynk App 상단의 초록색 메뉴바의 이름이 HC-06 Test로 바뀜
    • 여기서 ⊕버튼 터치한 후 Button위젯과 Bluetooth위젯 추가
    • 추가된 BUTTON 위젯 선택 후 설정
      • OUTPUT: Select pin: Digital D13 / MODE: SWITCH

Blynk 연결하기#

  1. 아두이노 스케치 예제 불러오기
    • 파일 – 예제 – Blynk – Boards_USB_Serial – Arduino_SoftwareSerial 선택
    • 예제의 char auth[] = “YourAuthToken”; 부분을 찾아서 쌍따옴표 사이의 YourAuthToken을 지운 뒤, 이메일에서 복사한 AuthToken 붙여넣기
  2. 아두이노 UNO에 스케치 업로드
  3. 스마트폰의 블루투스 기능을 키고,
    • 아이폰용 MLT-BT05의 경우
      • Bluetooth 모듈 설정에서 설정한 모듈ID 디바이스를 연결(예를 들어 MLT-BT05-T) (디폴트 연결PIN 123456)
      • Blynk App에서 BLE버튼(블루투스 아이콘 모양) 터치 후 Connect BLE device 버튼을 누른 뒤,
      • 연결할 디바이스 MLT-BT05-T를 찾은 후 OK버튼 누름
      • MLT-BT05-T connected 메시지가 나오면 연결 완료된 것임
    • 안드로이드용 HC-06의 경우
      • Bluetooth 모듈 설정에서 설정한 모듈ID 디바이스를 연결(예를 들어 HC-06-T 디바이스를 연결 (디폴트 연결PIN 1234)
      • Blynk App에서 Bluetooth버튼(블루투스 아이콘 모양) 터치 후 Connect Bluetooth device 버튼을 누른 뒤,
      • 연결할 디바이스 HC-06-T를 찾은 후 OK버튼 누름
      • HC-06-T connected 메시지가 나오면 연결 완료된 것임
  4. Blynk App 상단의 뒤로 돌아가기 버튼을 누른 뒤, App 오른쪽 상단의 ▷(플레이버튼)버튼을 누름
    • App상단에 빨간색 숫자1이 보이면 아직 연결이 되지 않았다는 것을 의미함
    • 잠시 기다리면 빨간색 숫자1이 사라지고, 이 상태가 작동 준비가 완료된 것을 의미함
  5. BUTTON 아이콘을 눌러 ON/OFF → 아두이노 Built-in LED ON/OFF
  6. Blynk App 오른쪽 상단의 □(정지버튼)을 누른 뒤, ⊕버튼 터치한 후 Text Input 위젯 추가


슬라이더 위젯을 이용한 LED 밝기 제어#

Built-in LED가 사용하는 13번핀은 PWM이 지원되지 않으므로, 11번핀을 사용한다.

Blynk에 센서값 출력하기

원문: http://help.blynk.cc/en/articles/512056-how-to-display-any-sensor-data-in-blynk-app


센서값을 Blynk로 출력하기 위해서는 Blynk가 연결되지 않은 상태에서 시리얼모니터에 센서값들을 출력할 수 있어야 한다. ​센서값을 출력하는 코드가 완성되면, 그 다음으로 Blynk에 센서값을 보내는 작업을 시작하는 것이 좋다.

Blynk앱에 센서값을 표시하는 방법에는 크게 두가지 방법이 있으며, 진행중인 프로젝트에 따라 적절한 방법을 선택하면 된다.


PULL#

  • 이 경우에 블링크는 앱이 열려있는 동안에만 Blynk에서 값을 받는다.
  • 앱에서 센서값을 표시하는 가장 간단한 방법이며, Blynk 앱의 Virtual Pins이 구동중일때 센서값을 가져온다. (Blynk를 닫거나 백그라운드에서 실행될때 데이타는 요청되지 않는다.) 타이머를 사용할 필요가 없으므로 코딩이 단순한 편이지만, 데이터가 서버에 저장되지 않으므로 히스토리 그래프를 볼 수 없다는 단점이 있다.

Blynk 앱 설정#

  1. 새 프로젝트를 만든다. (새로운 Auth Token값이 당신의 이메일에 전송된다)
  2. Value Display 위젯을 추가한다.
  3. 위젯 세팅으로 가서 PIN 항목을 Virtual Pin V5로 설정한다.
  4. Reading Rate를 3초로 설정한다.

sketch#

  1. Analog Pin에서 값을 (간단하게) 읽어들이는 경우에는 코드를 쓸 필요가 없다. 단지 예제파일을 오픈하여 하드웨어와 커넥션만 변경한다.
  2. e-mail을 체크하여 Auth Token을 확인하고, 스케치에 Auth Token을 수정입력한다.
  3. 하드웨어에 코드를 업로드한다.
  4. Blynk에서 플레이버튼을 누른다.
  5. 값이 표시되는 것을 볼 수 있다.
BLYNK_READ(V5) { //Blynk app has something on V5
  sensorData = analogRead(A0); //reading the sensor on A0
  Blynk.virtualWrite(V5, sensorData); //sending to Blynk
}

이 코드는 매시간마다 Blynk가 _READ 요청을 Virtual Pin V5에 보내도록 한다. A0핀에서 센서값을 읽은 후, Blynk에서 Virtual Pin V5에 되돌려 준다.

Bluetooth Serial Controller 앱

Bluetooth 시리얼 통신#

Bluetooth Serial Controller 앱을 통하여 아두이노와 스마트폰 간의 간단한 시리얼 통신을 해보겠습니다. 이를 위해서는 먼저 Bluetooth 페어링 문서를 참고하여 블루투스 모듈과 스마트폰을 페어링 해두어야 합니다. 페어링이 완료된 후 시리얼 통신을 진행합니다.


schematic#

/image/BT-03.jpg

sketch#

#include <SoftwareSerial.h>
SoftwareSerial BTSerial(2, 3); //Connect HC-06 TX,RX 

void setup()  
 {
   Serial.begin(9600);
   Serial.println("Hello!");

  // set the data rate for the BT port
   BTSerial.begin(9600);
 }

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


스마트폰에 Bluetooth Serial Controller 앱 설치하기#

  1. 이제 Google Playstore를 통해서 스마트폰에 Bluetooth Serial Controller 앱을 설치합니다. (iOS는 유사한 프로그램으로 설치)
/image/BTserialapp-01.png

​ 비슷한 역할을 하는 수많은 앱들이 있는데, 여러 앱을 설치하고 사용해본 결과, 이 앱이 사용하기에 유연함을 갖고 있는 것 같더군요.

Processing 기초

  • processing.org 에서 다운로드 (다운로드 페이지)
  • arduino sketch는 C++기반이고, processing sketch는 java기반입니다.

processing sketch 예제#

  1. 예제1 : 프로세싱 윈도우 크기, 배경색, 점, 선, 사각형, 원, 텍스트, 폰트, 사진 입력
void setup() {
  size(400,400);
  background(100);        // background(0,255,0);
  strokeWeight(10);       // dot/line width
  stroke(0,255,0,100);    // dot/line color and transparency, noStroke();
  point(200,200);         // draw dot
  line(0,0,200,150);      // draw line
  ellipse(300,300,50,80); // draw circle(x,y,xr,yr)
  fill(0);                // rect/text color, nofill();
  rect(100,250,150,300);  // draw rectangle(x1,y1,x2,y2)
  
  textSize(20);
  PFont font = createFont("NanumGothic", 32);
  textFont(font);
  text("Hello World!",200,100); // text(string,x1,y2)

  PImage img = loadImage("sks.jpg");  // file in '/sketch_XXXXXXa/data/' folder
  image(img,20,50);       // image(img,x,y,width,height);
  
}

void draw() {

}

  1. 예제2 : 마우스와 키보드 이벤트
void setup() {
  size(400,400);
}

void draw() {
  
}

void mousePressed() {
  if(mouseButton == LEFT) {
    println("left button Pressed!");
  } else if(mouseButton == RIGHT) {
    println("right button Pressed!");
  } else if(mouseButton == CENTER) {
    println("center button Pressed!");
  }
}

void keyPressed() {
  println("key Pressed!");   // Key event
  println(key);              // Key String
  println(keyCode);          // ASCII Code
}

void mouseReleased() {
  println("button Released!");
}

void keyReleased() {
  println("key Released!");
}

void mouseClicked() {
  println("button Clicked!");
}

void mouseMoved() {
  println("mouse Moved!");
}

void mouseDragged() {
  println("mouse Dragged!");
}

void mouseWheel() {
  println("mouse Wheel!");
}

  1. 예제3 : 마우스 움직이는 대로 원 그리기
void setup() {
  size(400,400);
}

void draw() {  
}

void mouseMoved() {
  ellipse(mouseX,mouseY,50,50);  
}

  1. 예제4 : 자유선 그리기
void setup() {
  size(400,400);
}

void draw() {  
}

void mouseMoved() {
  line(pmouseX,pmouseY,mouseX,mouseY);  
}


schematic#

아두이노의 기본 LED를 사용할 것이므로 별도의 회로 연결없이 아두이노만 연결한다.

1602 LCD, 조도, 초음파, 온습도

1602 LCD 중에서 (I2C 모듈이 추가되어 있지 않은) 가장 기본적인 형태, 즉 1602 LCD만 있는 상태에서의 출력방법을 알아보겠습니다.


schematic#

/image/1602-01.jpg

schematic : 백라이트 밝기 조절 추가#

백라이트를 사용하지 않으면 너무 어두워서 글자가 잘 보이지 않는다. 적당한 밝기의 백라이트 사용을 위해 LCD 3번핀을 3.3㏀ 거쳐서 GND로 연결(혹은 1㏀ 3개를 직렬연결) 하거나, 아래 회로와 같이 가변 저항을 사용하면 백라이트의 밝기를 적절히 조절할 수도 있다.

/image/1602-02.jpg

Pin Map#

LCD PinArduino Uno
1VSSLCD GNDGND
2VDDLCD 전원+5V
3VO글자 대비값(가변저항 추가/미사용시 3.3㏀ 거쳐서 GND)
4RS레지스터 설정12
5RW읽기/쓰기모드 설정GND
6E쓰기모드 활성화11
7D0데이터 핀
8D1
9D2
10D3
11D45
12D54
13D63
14D72
15A배경밝기 전압입력(가변저항 추가)
16K배경밝기 GND(가변저항 추가)


sketch#

라이브러리 설치하기#

이 경우에는 Arduino IDE에 기본적으로 포함되어 있는 LiquidCrystal 라이브러리를 이용한다.

7 Segment (FND) 사용하기

FND의 종류#

  • FND는 Anode형과 Cathode형으로 분류되며, 이 중 Anode형이 주로 사용되고 있는데요. Anode형은 중앙핀이 VCC이며, Cathode형은 GND입니다. 우리가 사용하는 것은 5611BH로 Common Anode형입니다.

  • 7 Segment (FND)는 숫자나 문자를 표현하는 7개의 LED와 소수점을 표현하는 1개의 LED가 포함되어 있는 부품을 의미합니다. FND는 16X2 LCD와 비교할 때 표현할 수 있는 문자의 개수가 제한되고, 각 문자의 표현을 위하여 총 8개의 LED를 하나씩 조절해주어야 하는 등 사용이 복잡하다는 단점이 있습니다. 그렇지만, 전력소모가 적고 크기가 큰 Segment를 선택하면 비교적 큰 문자도 표현할 수 있다는 장점이 있어 다양한 용도로 사용되고 있습니다.