아두이노 우노와 블루투스로 RC카 원격 제어하기: 단계별 가이드
부품 및 소모품
- 아두이노 우노 (Arduino UNO) × 1
- 스파크펀 듀얼 H-브리지 모터 드라이버 L298 (SparkFun Dual H-Bridge motor drivers L298) × 1
- 3D 프린터 (일반) × 1
필요한 도구 및 기계
앱 및 온라인 서비스
- MIT 앱 인벤터 2 (MIT App Inventor 2)
- 아두이노 IDE (Arduino IDE)
프로젝트 소개
이 프로젝트는 블루투스를 이용해 RC카를 원격으로 제어하는 방법을 다룹니다. 필수 부품을 준비하고 소프트웨어를 작성한 후, 스마트폰 앱으로 자동차를 조종할 수 있게 됩니다. 이는 저의 두 번째 Hackster 프로젝트입니다.
소스 코드
아두이노 코드
char buffer[67];
byte Pino02 = 2;
byte Pino03 = 3;
byte Pino04 = 4;
byte Pino05 = 5;
byte Pino06 = 6;
byte Pino07 = 7;
byte Pino12 = 12;
byte Pino13 = 13;
void setup() {
Serial.begin(9600);
Serial.flush();
pinMode(Pino02, OUTPUT);
pinMode(Pino03, OUTPUT);
pinMode(Pino04, OUTPUT);
pinMode(Pino05, OUTPUT);
pinMode(Pino06, OUTPUT);
pinMode(Pino07, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}
void loop() {
if (Serial.available() > 0) {
int index = 0;
delay(100); // 버퍼가 채워질 시간 대기
int numChar = Serial.available();
if (numChar > 65) numChar = 65;
while (numChar--) {
buffer[index++] = Serial.read();
}
splitString(buffer);
}
}
void splitString(char* data) {
Serial.print("입력된 데이터: ");
Serial.println(data);
char* parameter;
parameter = strtok(data, " ,");
while (parameter != NULL) {
setLED(parameter);
parameter = strtok(NULL, " ,");
}
// 버퍼 초기화
for (int x = 0; x < 66; x++) {
buffer[x] = '\0';
}
Serial.flush();
}
void setLED(char* data) {
// 전진 좌회전
if (data[0] == 'A') {
analogWrite(9, 50); analogWrite(10, 50);
digitalWrite(Pino02, LOW); digitalWrite(Pino03, HIGH);
digitalWrite(Pino04, HIGH); digitalWrite(Pino05, LOW);
digitalWrite(12, HIGH); digitalWrite(13, LOW);
}
// 전진 우회전
if (data[0] == 'C') {
analogWrite(9, 50); analogWrite(10, 50);
digitalWrite(Pino02, HIGH); digitalWrite(Pino03, LOW);
digitalWrite(Pino04, LOW); digitalWrite(Pino05, HIGH);
digitalWrite(12, HIGH); digitalWrite(13, LOW);
}
// 후진 1단계
if (data[0] == 'B') {
analogWrite(9, 25); analogWrite(10, 25);
digitalWrite(Pino02, HIGH); digitalWrite(Pino03, LOW);
digitalWrite(Pino04, HIGH); digitalWrite(Pino05, LOW);
digitalWrite(12, LOW); digitalWrite(13, HIGH);
}
// 후진 2단계
if (data[0] == 'M') {
analogWrite(9, 75); analogWrite(10, 75);
digitalWrite(Pino02, HIGH); digitalWrite(Pino03, LOW);
digitalWrite(Pino04, HIGH); digitalWrite(Pino05, LOW);
digitalWrite(12, LOW); digitalWrite(13, HIGH);
}
// 후진 3단계
if (data[0] == 'N') {
analogWrite(9, 125); analogWrite(10, 125);
digitalWrite(Pino02, HIGH); digitalWrite(Pino03, LOW);
digitalWrite(Pino04, HIGH); digitalWrite(Pino05, LOW);
digitalWrite(12, LOW); digitalWrite(13, HIGH);
}
// 후진 4단계
if (data[0] == 'P') {
analogWrite(9, 175); analogWrite(10, 175);
digitalWrite(Pino02, HIGH); digitalWrite(Pino03, LOW);
digitalWrite(Pino04, HIGH); digitalWrite(Pino05, LOW);
digitalWrite(12, LOW); digitalWrite(13, HIGH);
}
// 후진 5단계
if (data[0] == 'L') {
analogWrite(9, 225); analogWrite(10, 225);
digitalWrite(Pino02, HIGH); digitalWrite(Pino03, LOW);
digitalWrite(Pino04, HIGH); digitalWrite(Pino05, LOW);
digitalWrite(12, LOW); digitalWrite(13, HIGH);
}
// 전진 1단계
if (data[0] == 'D') {
analogWrite(9, 25); analogWrite(10, 25);
digitalWrite(Pino02, LOW); digitalWrite(Pino03, HIGH);
digitalWrite(Pino04, LOW); digitalWrite(Pino05, HIGH);
digitalWrite(12, HIGH); digitalWrite(13, LOW);
}
// 전진 2단계
if (data[0] == 'H') {
analogWrite(9, 75); analogWrite(10, 75);
digitalWrite(Pino02, LOW); digitalWrite(Pino03, HIGH);
digitalWrite(Pino04, LOW); digitalWrite(Pino05, HIGH);
digitalWrite(12, HIGH); digitalWrite(13, LOW);
}
// 전진 3단계
if (data[0] == 'I') {
analogWrite(9, 125); analogWrite(10, 125);
digitalWrite(Pino02, LOW); digitalWrite(Pino03, HIGH);
digitalWrite(Pino04, LOW); digitalWrite(Pino05, HIGH);
digitalWrite(12, HIGH); digitalWrite(13, LOW);
}
// 전진 4단계
if (data[0] == 'K') {
analogWrite(9, 175); analogWrite(10, 175);
digitalWrite(Pino02, LOW); digitalWrite(Pino03, HIGH);
digitalWrite(Pino04, LOW); digitalWrite(Pino05, HIGH);
digitalWrite(12, HIGH); digitalWrite(13, LOW);
}
// 전진 5단계
if (data[0] == 'L') {
analogWrite(9, 225); analogWrite(10, 225);
digitalWrite(Pino02, LOW); digitalWrite(Pino03, HIGH);
digitalWrite(Pino04, LOW); digitalWrite(Pino05, HIGH);
digitalWrite(12, HIGH); digitalWrite(13, LOW);
}
// 정지
if (data[0] == 'U') {
digitalWrite(Pino02, LOW); digitalWrite(Pino03, LOW);
digitalWrite(Pino04, LOW); digitalWrite(Pino05, LOW);
digitalWrite(12, LOW); digitalWrite(13, LOW);
}
// 저속 전진
if (data[0] == 'E') {
analogWrite(9, 50); analogWrite(10, 50);
digitalWrite(Pino02, LOW); digitalWrite(Pino03, HIGH);
digitalWrite(Pino04, LOW); digitalWrite(Pino05, HIGH);
}
// 저속 후진
if (data[0] == 'F') {
analogWrite(9, 50); analogWrite(10, 50);
digitalWrite(Pino02, HIGH); digitalWrite(Pino03, LOW);
digitalWrite(Pino04, HIGH); digitalWrite(Pino05, LOW);
}
}
커스텀 파트 및 인클로저
arduinoslider2_dxxyKBsRDa.apk