Arduino Part
송치원
Bluetooth 통신 연결
HC-06 Bluetooth module (Slave)
VCC : 5V에 연결
GND : GND 에 연결
TXD : D2 에 연결
RXD : D2 에 연결
#include <SoftwareSerial.h> // 1
int blueTx=2;
int blueRx=3;
SoftwareSerial BTSerial(blueTx, blueRx); // 2
void setup() {
BTSerial.begin(9600); // 3
}
void loop() {
if(BTSerial.available() > 0) { // 4
int val = BTSerial.read();
doRemote(val); // 5
}
}
1. 블루투스 연결을 통해 시리얼 통신을 수행한다. 시리얼 통신을 소프트웨어적으로 구현하기
위해 SoftwareSerial 라이브러리를 사용한다.
2. SoftwareSerial 객체로 BTSerial을 생성한다. 이 때 TXD 와 RXD가 연결된 핀번호를
입력해 준다.
3. 통신 초기화. 시리얼 통신 채널을 열고 속도를 9600 으로 지정한다.
4. 블루투스로 부터 전달되는 신호가 있는지 확인한다.
5. 전달된 신호가 있다면 그 값을 읽어 val 변수에 저장하고, 이에 따라 컨트롤 동작을 수행
한다.
#include <SoftwareSerial.h>
const char bt_name[] = "REMOTE_CAR";
const char bt_pwd[] = "9999";
int bTx=2;
int bRx=3;
SoftwareSerial BT(bTx, bRx);
bool sendMessage(String command) {
BT.print(command);
String result = BT.readString();
if(result.startsWith("OK")) return true;
return false;
}
void loop()
{
}
void setup()
{
Serial.begin(9600);
BT.begin(9600);
String settingState;
Serial.println("Processing...");
settingState = "Handshake";
if(!sendMessage("AT")) goto ERROR;
settingState = "Set Name";
if(!sendMessage(String("AT+NAME") + bt_name)) goto ERROR;
settingState = "Set Password";
if(!sendMessage(String("AT+PIN") + bt_pwd)) goto ERROR;
// 1:1200, 2:2400, 3:4800, 4:9600, 5:19200,
// 6:28400, 7:57600, 8:115200
settingState = "Set Speed";
if(!sendMessage(String("AT+BAUD4"))) goto ERROR;
Serial.print("BT_NAME : ");
Serial.println(bt_name);
Serial.print("BT_PWD : ");
Serial.println(bt_pwd);
Serial.println("BT_BAUD : 9600");
Serial.println("Setting Complete!");
return;
ERROR:
Serial.println("Setting Fail : " + settingState);
}
HC-06 모듈은 기본값으로
- 이름 : HC06
- 비밀번호 : 1234
로 설정되어 있다.
이 값을 임의로 변경하고자 할 때
AT 명령을 통해 변경할 수 있다.
- 이름변경 : AT+NAMEREMOTE_RC
- 비번변경 : AT+PIN1234
- 속도변경 : AT_BAUD4
변경에 성공하면 OK 값을 응답받게 된다.
Servo 모터 연결 (조향장치)
SG90 Micro Servo Motor
VCC (빨) : 5V에 연결
GND (갈) : GND 에 연결
SIG (주) : D8 에 연결
#include <Servo.h> // 1
#define CENTER 90
#define LEFT 50
#define RIGHT 130
int HandlePin = 8;
Servo handle; // 2
void setup() {
handle.attach(HandlePin); // 3
handle.write(CENTER); // 4
}
void loop() {
}
void doRemote(int val) {
//HANDLE
if(val == 'l') {
handle.write(LEFT); // 5
} else if(val == 'c') {
handle.write(CENTER); // 5
} else if(val == 'r') {
handle.write(RIGHT); // 5
}
}
1. Servo 라이브러리를 사용한다.
2. Servo 객체로 handle을 생성한다.
3. 연결된 핀 번호를 지정하여 서보모터를
연결한다.
4. 초기값 설정. 초기값으로 모터의 회전 위
치를 중앙(90도)에 오도록 조정한다.
5. 명령에 따라서 핸들을 왼쪽(130도) 또는
오른쪽(50도)으로 조정한다.
DC 모터 연결 (구동장치)
H-Bridge DC Motor Driver
MOTOR A / B : 모터에 연결
VCC : 전원(+)에 연결
GND : 전원(-)에 연결
A-IA : D5 에 연결
A-IB : D6 에 연결
B-IA : D10 에 연결
B-IB : D11 에 연결
int MotorPin1 = 5;
int MotorPin2 = 6;
int MotorPin3 = 10;
int MotorPin4 = 11;
void setup() {
pinMode(MotorPin1, OUTPUT); // 1
pinMode(MotorPin2, OUTPUT);
pinMode(MotorPin3, OUTPUT);
pinMode(MotorPin4, OUTPUT);
}
void loop() {
}
void doRemote(int val) {
//MOTOR
if(val == 'f') {
digitalWrite(MotorPin1, HIGH); // 2
digitalWrite(MotorPin2, LOW);
digitalWrite(MotorPin3, HIGH);
digitalWrite(MotorPin4, LOW);
} else if(val == 's') {
digitalWrite(MotorPin1, LOW);
digitalWrite(MotorPin2, LOW);
digitalWrite(MotorPin3, LOW);
digitalWrite(MotorPin4, LOW);
} else if(val == 'b') {
digitalWrite(MotorPin1, LOW);
digitalWrite(MotorPin2, HIGH);
digitalWrite(MotorPin3, LOW);
digitalWrite(MotorPin4, HIGH);
}
}
1. 핀모드 설정
2. 제어 신호에 따라 전진, 정지, 후진을 수
행한다.
전진 : 양 모터에 모두 정방향 신호 전달
정지 : 양 모터에 모두 LOW 값 전달
후진 : 양 모터에 모두 역방향 신호 전달
전체 회로
#include <SoftwareSerial.h>
#include <Servo.h>
#define CENTER 90
#define LEFT 50
#define RIGHT 130
int blueTx=2;
int blueRx=3;
int HandlePin = 8;
int MotorPin1 = 5;
int MotorPin2 = 6;
int MotorPin3 = 10;
int MotorPin4 = 11;
Servo handle;
SoftwareSerial BTSerial(blueTx, blueRx);
void setup() {
BTSerial.begin(9600);
handle.attach(HandlePin);
pinMode(MotorPin1, OUTPUT);
pinMode(MotorPin2, OUTPUT);
pinMode(MotorPin3, OUTPUT);
pinMode(MotorPin4, OUTPUT);
handle.write(CENTER);
digitalWrite(MotorPin1, LOW);
digitalWrite(MotorPin2, LOW);
digitalWrite(MotorPin3, LOW);
digitalWrite(MotorPin4, LOW);
}
void loop() {
if(BTSerial.available() > 0) {
int val = BTSerial.read();
doRemote(val);
}
}
void doRemote(int val) {
//HANDLE
if(val == 'l') {
handle.write(LEFT);
} else if(val == 'c') {
handle.write(CENTER);
} else if(val == 'r') {
handle.write(RIGHT);
}
//MOTOR
else if(val == 'f') {
digitalWrite(MotorPin1, HIGH);
digitalWrite(MotorPin2, LOW);
digitalWrite(MotorPin3, HIGH);
digitalWrite(MotorPin4, LOW);
} else if(val == 's') {
digitalWrite(MotorPin1, LOW);
digitalWrite(MotorPin2, LOW);
digitalWrite(MotorPin3, LOW);
digitalWrite(MotorPin4, LOW);
} else if(val == 'b') {
digitalWrite(MotorPin1, LOW);
digitalWrite(MotorPin2, HIGH);
digitalWrite(MotorPin3, LOW);
digitalWrite(MotorPin4, HIGH);
}
}
전체 소스
Mobile Part
(Android)
모바일 리모트 컨트롤러

아두이노 RC카 만들기

  • 1.
  • 2.
    Bluetooth 통신 연결 HC-06Bluetooth module (Slave) VCC : 5V에 연결 GND : GND 에 연결 TXD : D2 에 연결 RXD : D2 에 연결
  • 3.
    #include <SoftwareSerial.h> //1 int blueTx=2; int blueRx=3; SoftwareSerial BTSerial(blueTx, blueRx); // 2 void setup() { BTSerial.begin(9600); // 3 } void loop() { if(BTSerial.available() > 0) { // 4 int val = BTSerial.read(); doRemote(val); // 5 } } 1. 블루투스 연결을 통해 시리얼 통신을 수행한다. 시리얼 통신을 소프트웨어적으로 구현하기 위해 SoftwareSerial 라이브러리를 사용한다. 2. SoftwareSerial 객체로 BTSerial을 생성한다. 이 때 TXD 와 RXD가 연결된 핀번호를 입력해 준다. 3. 통신 초기화. 시리얼 통신 채널을 열고 속도를 9600 으로 지정한다. 4. 블루투스로 부터 전달되는 신호가 있는지 확인한다. 5. 전달된 신호가 있다면 그 값을 읽어 val 변수에 저장하고, 이에 따라 컨트롤 동작을 수행 한다.
  • 4.
    #include <SoftwareSerial.h> const charbt_name[] = "REMOTE_CAR"; const char bt_pwd[] = "9999"; int bTx=2; int bRx=3; SoftwareSerial BT(bTx, bRx); bool sendMessage(String command) { BT.print(command); String result = BT.readString(); if(result.startsWith("OK")) return true; return false; } void loop() { } void setup() { Serial.begin(9600); BT.begin(9600); String settingState; Serial.println("Processing..."); settingState = "Handshake"; if(!sendMessage("AT")) goto ERROR; settingState = "Set Name"; if(!sendMessage(String("AT+NAME") + bt_name)) goto ERROR; settingState = "Set Password"; if(!sendMessage(String("AT+PIN") + bt_pwd)) goto ERROR; // 1:1200, 2:2400, 3:4800, 4:9600, 5:19200, // 6:28400, 7:57600, 8:115200 settingState = "Set Speed"; if(!sendMessage(String("AT+BAUD4"))) goto ERROR; Serial.print("BT_NAME : "); Serial.println(bt_name); Serial.print("BT_PWD : "); Serial.println(bt_pwd); Serial.println("BT_BAUD : 9600"); Serial.println("Setting Complete!"); return; ERROR: Serial.println("Setting Fail : " + settingState); } HC-06 모듈은 기본값으로 - 이름 : HC06 - 비밀번호 : 1234 로 설정되어 있다. 이 값을 임의로 변경하고자 할 때 AT 명령을 통해 변경할 수 있다. - 이름변경 : AT+NAMEREMOTE_RC - 비번변경 : AT+PIN1234 - 속도변경 : AT_BAUD4 변경에 성공하면 OK 값을 응답받게 된다.
  • 5.
    Servo 모터 연결(조향장치) SG90 Micro Servo Motor VCC (빨) : 5V에 연결 GND (갈) : GND 에 연결 SIG (주) : D8 에 연결
  • 6.
    #include <Servo.h> //1 #define CENTER 90 #define LEFT 50 #define RIGHT 130 int HandlePin = 8; Servo handle; // 2 void setup() { handle.attach(HandlePin); // 3 handle.write(CENTER); // 4 } void loop() { } void doRemote(int val) { //HANDLE if(val == 'l') { handle.write(LEFT); // 5 } else if(val == 'c') { handle.write(CENTER); // 5 } else if(val == 'r') { handle.write(RIGHT); // 5 } } 1. Servo 라이브러리를 사용한다. 2. Servo 객체로 handle을 생성한다. 3. 연결된 핀 번호를 지정하여 서보모터를 연결한다. 4. 초기값 설정. 초기값으로 모터의 회전 위 치를 중앙(90도)에 오도록 조정한다. 5. 명령에 따라서 핸들을 왼쪽(130도) 또는 오른쪽(50도)으로 조정한다.
  • 7.
    DC 모터 연결(구동장치) H-Bridge DC Motor Driver MOTOR A / B : 모터에 연결 VCC : 전원(+)에 연결 GND : 전원(-)에 연결 A-IA : D5 에 연결 A-IB : D6 에 연결 B-IA : D10 에 연결 B-IB : D11 에 연결
  • 8.
    int MotorPin1 =5; int MotorPin2 = 6; int MotorPin3 = 10; int MotorPin4 = 11; void setup() { pinMode(MotorPin1, OUTPUT); // 1 pinMode(MotorPin2, OUTPUT); pinMode(MotorPin3, OUTPUT); pinMode(MotorPin4, OUTPUT); } void loop() { } void doRemote(int val) { //MOTOR if(val == 'f') { digitalWrite(MotorPin1, HIGH); // 2 digitalWrite(MotorPin2, LOW); digitalWrite(MotorPin3, HIGH); digitalWrite(MotorPin4, LOW); } else if(val == 's') { digitalWrite(MotorPin1, LOW); digitalWrite(MotorPin2, LOW); digitalWrite(MotorPin3, LOW); digitalWrite(MotorPin4, LOW); } else if(val == 'b') { digitalWrite(MotorPin1, LOW); digitalWrite(MotorPin2, HIGH); digitalWrite(MotorPin3, LOW); digitalWrite(MotorPin4, HIGH); } } 1. 핀모드 설정 2. 제어 신호에 따라 전진, 정지, 후진을 수 행한다. 전진 : 양 모터에 모두 정방향 신호 전달 정지 : 양 모터에 모두 LOW 값 전달 후진 : 양 모터에 모두 역방향 신호 전달
  • 9.
  • 10.
    #include <SoftwareSerial.h> #include <Servo.h> #defineCENTER 90 #define LEFT 50 #define RIGHT 130 int blueTx=2; int blueRx=3; int HandlePin = 8; int MotorPin1 = 5; int MotorPin2 = 6; int MotorPin3 = 10; int MotorPin4 = 11; Servo handle; SoftwareSerial BTSerial(blueTx, blueRx); void setup() { BTSerial.begin(9600); handle.attach(HandlePin); pinMode(MotorPin1, OUTPUT); pinMode(MotorPin2, OUTPUT); pinMode(MotorPin3, OUTPUT); pinMode(MotorPin4, OUTPUT); handle.write(CENTER); digitalWrite(MotorPin1, LOW); digitalWrite(MotorPin2, LOW); digitalWrite(MotorPin3, LOW); digitalWrite(MotorPin4, LOW); } void loop() { if(BTSerial.available() > 0) { int val = BTSerial.read(); doRemote(val); } } void doRemote(int val) { //HANDLE if(val == 'l') { handle.write(LEFT); } else if(val == 'c') { handle.write(CENTER); } else if(val == 'r') { handle.write(RIGHT); } //MOTOR else if(val == 'f') { digitalWrite(MotorPin1, HIGH); digitalWrite(MotorPin2, LOW); digitalWrite(MotorPin3, HIGH); digitalWrite(MotorPin4, LOW); } else if(val == 's') { digitalWrite(MotorPin1, LOW); digitalWrite(MotorPin2, LOW); digitalWrite(MotorPin3, LOW); digitalWrite(MotorPin4, LOW); } else if(val == 'b') { digitalWrite(MotorPin1, LOW); digitalWrite(MotorPin2, HIGH); digitalWrite(MotorPin3, LOW); digitalWrite(MotorPin4, HIGH); } } 전체 소스
  • 11.
  • 12.