안내사항, 기간 공지, 등등[텍스트 공간]

RC카

작성자
SIOR
작성일
2022-03-11 16:11
조회
726

RC 카 소개

RC(radio control)카는 무선조종을 통해 원하는 방향으로 움직이는 모형카로,

블루투스와 같은 무선통신을 통해 직접 모터를 조종할 수 있는 모형카를 만드는 것을 목표로 합니다.

아두이노와 모터드라이버를 통해 모터를 직접 출력해보고, 블루투스를 이용해 제어하며 전진, 좌-우회전 작동이 가능하게 구현할 것입니다.

사용 부품

아두이노, 모터드라이브, DC모터, 블루투스, 전원장치

도전과제

원활한 제작을 위해 가이드라인으로 RC카 제작을 위해 총 4가지의 단계로 목표로 설정하였으며, 각 단계의 예상시간은

아두이노 기초실습에 1주, 모터실습에 1-2주, 블루투스 실습 1-2주, 통합제작 2-3주 정도로 예상하고 스케줄링 해주시면 됩니다.

각 단계의 예상시간이 끝나가는 시점에 해당 단계에 대한 설명과 방법을 이 글에 업로드할 예정이니 구현하지 못했거나 작동이 되지 않으실 땐 참고하실 수 있습니다.

보다 구체적인 제작을 위해 각 실습 단계의 과제 목표는 다음과 같습니다.

1. 아두이노 기초 실습

  • 아두이노 IDE 설치
  • 아두이노와 브레드보드, LED 연결(기본 회로/아두이노 숙지)
  • LED 켜보기(Digital OUTPUT 숙지)
  • [심화]스위치 연결하여 LED 켜기(플로팅 현상 -> 풀 업-다운 숙지)

2. 모터 실습

  • 아두이노와 모터드라이브, 전원 연결
  • 모터의 회전시키기 + 방향 바꾸어보기(Analog OUTPUT + PWM 숙지)
  • [심화]전원과 아두이노 연결(USB케이블이 아닌 외부전원으로 동작해보기)
  • [심화]스위치(토글)로 작동이 시작되게 만들기

3. 블루투스실습

  • 아두이노와 블루투스를 연결
  • 아두이노와 연결된 블루투스와 소통해보기(INPUT 숙지, 통신 이해, 설정 읽기)
  • 블루투스 App(Arduino bluetooth controller / BitBlue) 설치
  • 아두이노로 블루투스로부터 값 가져오기(무선 통신으로 INPUT 접하기)
  • 블루투스로 LED켜기(INPUT-OUTPUT 연결)
  • [심화]블루투스 내부 설정값(이름, PIN) 변경해보기

4. 통합 제작 실습

  • 아두이노와 모터드라이브, 블루투스 모두 연결되게 구성
  • 블루투스로 모터 회전시키기
  • RC카 행동 구성 결정(어떤 INPUT으로 어떤 OUTPUT을 하여 RC카가 직진|죄회전|우회전 작동이 가능하게 할 것인지)
  • RC카 외형제작(원하는 방식으로 -> 제공된 틀/우드락/하드보드지/3D프린터)
  • 해당 외형에 회로 구성, 아두이노에 코드 업로드
  • 최종완성 작동해보기
  • [심화]후진이 가능하게 행동구조 변경
  • [심화]이동속도 조절할 수 있게 변경(HIGH|MIDDLE|LOW)


도전과제가이드

1. 아두이노 기초 실습

1-1. 아두이노 IDE 설치 및 준비

아두이노를 통해 하드웨어를 제어하기 위해서는 아두이노 보드에 있는 컨트롤러에 코드를 업로드(이식)하여야 합니다.

이식할 코드를 프로그래밍을 할 수 있는 방법이 아래와 같은 4가지 방법이 있습니다.

  • 아두이노 IDE 1.X
  • 아두이노 IDE 2.X
  • 아두이노 클라우드(Web Editor)
  • PlatformIO IDE

1번이 정통적이고 가장 간단한 방법이다. 아두이노를 구글링하다보면 이 IDE로 개발한 내용들을 많이 볼 수 있습니다.

2번은 기존의 1.X IDE에서 최근 스타일로 기능이 추가되거나 보완되어 새롭게 만들어지고 있는 IDE입니다. 22년 3월 27일 기준으로 아직 개발상태(Release-Candidate)이기에 이용하는 데에는 큰 문제가 없으나 안정적이지 않을 수 있습니다.

3번은 웹브라우저에서 작업하고 클라우드에 저장되기에 플러그인만 설치하면 어디서든 이용가능한 방법입니다.

4번은 임베디드 통합 개발환경을 지원하는 플랫폼입니다. 아두이노뿐만 아니라 다양한 보드/컨트롤러들의 개발로도 사용합니다. 다양한 편집기에 플러그인을 추가함으로써 개발하는 추세힙니다

위에서 기호와 상황에 맞게 설치하시면 되지만

가이드 설명은 가장 간단하고 빠르게 실습할 수 있는 1번(아두이노 IDE 1.X)를 기준으로 설명드리겠습니다.

  1. 공식 다운로드 사이트에서 OS에 맞게 다운로드 해줍니다.
  2. "JUST DOWNLOAD"를 클릭하면 무료로 바로 다운로드할 수 있습니다.
  3. 라이센스 동의해주시고,
  4. 위와 같이 설정(기본상태)으로 선택하신 뒤,
  5. 설치를 진행해주시면 됩니다.
  6. 실행하였을 때, 아래와 같이 창이 뜬다면 정상적으로 설치된 것입니다.

다른 방법으로의 설치는 아래의 링크를 참고해주세요

1-2. 아두이노 IDE 설명

1-2-1.IDE 창 설명


  • 1)확인버튼: 컴파일 시작버튼입니다. 코드에 문법(syntax)오류가 없는지 확인하는 용도로 사용됩니다.
  • 2)업로드버튼: 코드를 컴파일하여 아두이노 보드에 컴파일한 코드를 링킹(업로드)해주는 버튼입니다.
  • 3)그 옆에 버튼들은 코드를 새로만들거나 불러오기, 저장 버튼입니다
  • 4)시리얼모니터 버튼: 아두이노와 시리얼 통신을 하기 위해, 시리얼모니터 창을 여는 버튼입니다
  • 5)코드영역: 아두이노에 이식할 코드를 적는 공간입니다.
  • 6)메세지영역: 컴파일결과와 에러가 생겼을 시 IDE시스템이 메세지를 출력하는 공간입니다.
  • 7)상태바: 커서위치와 최근에 연결한 보드이름과 포트넘버가 표시됩니다.

1-2-2.코드 영역 설명

작성할 코드의 문법은 기본적으로 C언어와 동일합니다.
 참고1
참고2
참고3

보이는 setup과 loop 함수를 통해 코드영역은 크게 3영역으로 나뉩니다.

global 영역

setup 함수와 loop함수의 바깥 영역

코드를 컴파일할 때 실행하는 영역

주로 전역변수나 함수를 선언,정의하는 영역으로 사용합니다.

setup 영역

처음 시작할 때 실행하는 함수 영역

핀모드, 라이브러리 준비, 인터럽트 설정과 같은 초기 설정을 하는 영역으로 사용합니다.

loop 영역

아두이노 내에서 주기적으로 호출되는 함수 영역

이름에서도 알 수 있듯이 아두이노가 무한반복하면서 실행하는 기능으로 실시간 제어 영역으로 사용합니다.


1-2-1. 아두이노와 연결 설명

먼저 컴퓨터와 아두이노를 USB로 연결해줍니다.

IDE가 자동으로 인식하여 어떤 USB 포트로 보드를 연결할 수 있는 지 확인할 수 있습니다.


해당하는 아두이노의 보드이름으로 표시된 포트(위의 이미지에서는 "COM8")를 위와 같이 선택해줍니다.

IDE 맨 아래 상태바에 선택한 보드이름과 포트넘버가 표시되면 정상적으로 연결된 것입니다.

혹시 연결이 되지 않는다면

"제어판">"장치관리자"에 "포트(COM & LPT)" 하단에 아두이노 보드이름이 있는 지 확인하면 됩니다.

이름이 없다면 보드가 컴퓨터에 제대로 연결되지 않거나 보드가 망가진 상태입니다.

보드가 망가졌을 경우, 운영진에게 말씀해주세요.


1-3. blink 예제로 내장LED 깜빡이기

IDE에서 제공해주는 blink 소스코드를 이용해 보드에 내장되어 있는 LED를 깜빡여 봅시다.


맨 상단의 탭에서 "파일"을 클릭한 뒤 > "예제"를 클릭 > "01.Basics"를 클릭 > "Blink"를 클릭하면 보드에 내장LED를 깜빡이는 내용의 코드가 있습니다.

이제 코드가 이상이 없는지 디버깅해 보겠습니다.

위의 메뉴 버튼들 중에 맨 왼쪽에 있는 체크표시("확인"버튼)을 클릭합니다.

아래 메세지 영역에 에러가 없이 "컴파일 완료"가 뜨면 코드에 문법(syntax)오류가 없다는 뜻입니다.

이제 코드를 아두이노에 이식해 보겠습니다.

이후 위의 메뉴 버튼들 중에 화살표표시("업로드"버튼)를 클릭합니다.

아래 메세지 영역에 업로드 완료가 뜨고, 아두이노의 LED가 1초간격으로 점멸을 할 경우 아두이노에 이식이 성공적으로 이루어진 것입니다.

1-4. 외부에 연결된 LED 깜빡이기

이제 회로에 있는 LED와 같이 외부로 연결되어 있는 LED를 깜빡여 봅시다.

아래와 같이 회로를 우선 구성해주시면 됩니다.


저항은 220Ω을 사용하였고, LED는 다리가 긴 쪽(발광소켓안에 소자가 작은 쪽의 다리)이 (+)극에 해당합니다.

아두이노 GND핀에 LED의 (-)극과 저항이 직렬로 연결되게 하고,

아두이노 12핀에 LED의 (+)극과 연결되게 합니다.

이제 이 LED가 깜빡일 수 있게 위의 blink를 이용해 코드를 작성해봅시다.


2. 모터실습

RC카의 메인 출력이 될 DC모터는 간편한 제어와 회전 특성(속도,토크)이 전압에 비례하다는 특징때문에 많이 사용됩니다.

DC모터뿐만 아니라 모터의 제어에는 생각보다 많은 전류가 사용되어 모터에서 필요로 하는 전류가 아두이노 보드의 정격 전류보다 높을 상황이 빈번히 발생합니다.

또한 DC모터의 경우 회전방향을 바꾸는 제어를 하기 위해서는 전극을 바꾸어 주어야 하기에 다양한 제어를 하기 위해서는 모터외에 다른 회로나 모듈이 필요로 합니다.

모터드라이버는 이와 같은 제어상황을 쉽게 처리하기 위해 만들어진 칩입니다.

배부된 모터드라이버의 모델명은 L9110으로 datasheet는 다음의 링크와 같습니다.

모터드라이버를 통해 모터 1개를 동작시키는 회로와 코드는 아래와 같습니다.


#define M1A 6
#define M1B 5

void forward() {
  digitalWrite(M1A, HIGH);
  digitalWrite(M1B, LOW);
}

void backward() {
  // forward와는 반대로 전극을 설정
  digitalWrite(M1A, LOW);
  digitalWrite(M1B, HIGH);
}

void setup() {
  // 5,6번 핀을 모터 제어를 위한 핀으로 설정
  pinMode(M1A, OUTPUT);
  pinMode(M1B, OUTPUT);
}

void loop() {
  forward();
  delay(1000); // 매 1초마다 방향 바꾸기
  backward();
  delay(1000);
}

외부전원을 모터드라이버의 VCC와 GND핀에 연결함으로써 외부전원으로도 모터를 제어할 수도 있습니다.


3. 블루투스실습

블루투스는 디지털 기기의 근거리 무선 통신 표준 기술을 말합니다.

블루투스 모듈은 수 미터에서 수 십미터의 거리의 무선 통신을 저전력으로 수행한다는 장점이 있어 여러 디지털 기기에서 많이 활용되고 있습니다.

배부된 블루투스 모듈명은 HC-06으로 간편하게 사용되는 근거리 블루투스 모듈입니다. datasheet는 다음의 링크와 같습니다.

HC-06은 아이폰에서 사용이 불가능합니다. 아이폰을 통해 블루투스 통신을 하고 싶으시다면 HM-10 블루투스 모듈과 같은 다른 모듈을 이용하시길 권합니다.


우선 블루투스는 칩에 설치되어 있는 소프트웨어(펌웨어)따라 사용방법이 조금씩 다릅니다.

때문에 블루투스의 상태를 볼 겸 아두이노와 연결하여 유선으로 통신을 진행해봅시다.


데이터를 주고 받기 위해서는 통신 방법을 결정하여야 하는데, 가장 간단하게 하나의 선만으로 데이터를 주고 받는 시리얼(직렬) 통신(여러 방법 중에 UART방식)을 통해 아두이노와 블루투스간의 소통을 구성해봅시다.

하나의 선에 단순히 한 쪽의 데이터만 받게 하기 위해 송신(전달transmit = TX)핀과 수신(receive = RX)핀을 분리해 설정해줍시다.

블루투스의 TX는 아두이노의 RX와 연결해야 블루투스의 내용을 아두이노에서 받을 수 있고,

아두이노의 TX는 블루투스의 RX와 연결해야 아두이노의 내용을 블루투스로 보낼 수 있습니다.

TX와 RX의 핀을 정하고, 코드내에서 간편히 이 둘을 교차하게 설정합시다.


예제 회로와 코드는 아래와 같습니다.


#include <SoftwareSerial.h> // 시리얼 연결
#define bt_RXD 7 // 블루투스 RX 핀번호 = 아두이노 TX핀 번호
#define bt_TXD 8 // 블루투스 TX 핀번호 = 아두이노 RX핀 번호

// 블루투스와 아두이노 연결
// 아두이노에서의 "변수이름(RX, TX)"으로 블루투스 연결 정의
// 아두이노의 RX에 블루투스의 bt_TXD가 오게, 반대도 같은 방식으로
SoftwareSerial interface_bt(bt_TXD, bt_RXD); 

void setup(){
  Serial.begin(9600); // 아두이노 보드레이트(기본:9600)로 설정
  interface_bt.begin(9600); // 블루투스 비트레이트(기본:9600)로 설정
  // 시리얼 모니터에 "READY!"를 출력
  Serial.println("READY!");
}

void loop(){
  // 블루투스에서 전송된 내용이 있을 경우
  if (interface_bt.available()) {
    // 수신받은 내용(interface_bt.read())을
    // 시리얼 모니터에 출력하기
    Serial.write(interface_bt.read());
  }
  // 시리얼 모니터에서 전송한 내용이 있을 경우
  if (Serial.available()) {
    // 시리얼 모니터에서 입력한 내용(Serial.read())을
    // 블루투스에 전송하기
    interface_bt.write(Serial.read());
  }
}

코드를 이식하기 전에 우선 시리얼 모니터를 열어봅시다.

아두이노 IDE의 시리얼 모니터는 아두이노의 시리얼 통신을 진행(입출력)을 할 수 있게 해줍니다.

우측 상단의 돋보기 모양의 아이콘을 클릭하면 시리얼 모니터를 열 수 있습니다.

입력칸을 통해 컴퓨터 -> 아두이노의 TX로 데이터를 전달할 수 있고

출력되는 칸을 통해 아두이노의 RX -> 컴퓨터로의 데이터를 확인하실 수 있습니다.

하단의 옵션 값을 "line ending 없음"이 아닌 "Both NL & CR"로 변경해주시고,

보드레이트값이 이전에 설정한 9600인지 확인해줍니다.

코드를 아두이노에 업로드한 이후, 블루투스 모듈의 전원led가 깜빡이고 시리얼 모니터에 READY!가 출력된다면 모든 소통의 준비를 마친 것입니다.


시리얼모니터로 통신하기

이제 시리얼모니터를 통해 블루투스의 상태를 읽어와 봅시다.

우선 입력칸에 `AT`를 타이핑하고 엔터를 치셨을 때, 출력칸에 "OK"가 뜬다면 블루투스와의 시리얼 연결이 성공적으로 이루어진 것입니다.


입력칸에 `AT+VERSION`을 입력하여 현재 블루투스 펌웨어의 버전을 확인해봅시다.

이제 블루투스의 장치이름과 핀번호(비밀번호)를 확인해봅시다.

펌웨어 버전이 3.0이상일 경우

  • `AT+NAME`으로 장치이름 읽기,
  • `AT+NAME=name`으로 장치이름을 name으로 변경,
  • `AT+PSWD`으로 PIN번호 읽기,
  • `AT+PSWD="xxxx"`으로 PIN번호 xxxx으로 변경, 큰따옴표(")도 포함해서 입력

펌웨어 버전이 1.X일 경우

  • `AT+NAME`으로 장치이름 읽기,
  • `AT+NAMEname`으로 장치이름을 name으로 변경,
  • `AT+PIN`으로 PIN번호 읽기,
  • `AT+PINxxxx`으로 PIN번호 xxxx으로 변경


모바일 앱으로 통신하기

이제 설정된 블루투스의 장치이름과 핀번호를 통해 모바일과 무선으로 연결해봅시다.

구글플레이의 Arduino bluetooth controller라는 앱을 통해 간편히 블루투스 통신을 진행할 수 있습니다.

  1. 해당 앱을 설치해주시고, 모바일의 설정-연결-블루투스에 들어가셔서
  2. 연결가능한 디바이스에 블루투스 장치이름이 뜨는 지 확인해줍니다.
  3. 첫 연결의 경우, 페어링 과정이 필요하므로 장치이름이 아닌 숫자나 알파벳의 조합으로된 문자들이 뜰 수 있습니다.
  4. 해당 장치를 클릭하시고 PIN번호를 입력하여 모바일과 블루투스를 연결해줍니다.
  5. 이제 설치한 Arduino bluetooth controller앱을 실행합니다.
  6. 연결된 장치가 표시된다면 클릭하여 다양한 버튼 조작을 위해 Controller mode로 열어줍니다.
  7. 버튼을 클릭하였을 때, 시리얼모니터에 값이 뜬다면 성공적으로 모바일과 무선통신을 마친 것입니다.

이제 이 블루투스를 통해 앱에서 오는 신호로 LED를 키거나 모터의 방향을 전환할 수 있게 코드를 작성해봅시다.