9V로도 은근히 속도가 빠르게 출력이 되네요~ 나중에 기회가 되면 초 경량화된 슈퍼카를 만들 계획인데 덕분에 많은 도움 될 것 같습니다.
코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2014-09-15 11:10:44
NO | 부품명 | 수량 | 상세설명 |
1 | 오렌지 보드 | 1 | 아두이노 호환보드 |
2 | 점퍼케이블 | 7 | 점퍼케이블 |
3 | 미니브레드보드 | 1 | 브레드보드 |
4 | 블루투스 모듈 | 1 | HC-05 |
5 | 아두이노 모터 쉴드 | 1 | 모터 쉴드 |
6 | 2.1mm DC 잭 | 1 | DC 잭 male |
7 | Amphibious vehicle kit (DC모터 내장) | 1 | 타미야 |
8 | 서보모터 | 1 | sg-90 |
9 | 9v 건전지 | 2 | 배터리 |
10 | 9v 어답터 | 2 | 어답터 |
11 | 케이블타이(선택) | 5 | 케이블타이 |
12 | 글루건(필수) | 1 | 글루건 |
13 | 커터칼 | 1 | 칼 |
14 | 니퍼 | 1 | 니퍼 |
15 | 스크류 드라이버 | 1 | +,- 혼합형 |
16 | 핸드드릴(선택) | 1 | 핸드드릴 |
17 | 인두기 | 1 | 인두기 |
18 | 납 | 1 | 납 |
19 | 안드로이드 스마트폰 | 1 | 안드로이드 |
부품명 | 오렌지 보드 | 미니 브레드보드 | 점퍼케이블 | 블루투스 모듈 | 아두이노 모터 쉴드 |
파트 | x1 | x1 | x7 | x1 |
부품명 | 2.1mm DC 잭 | Amphibious vehicle kit | 서보모터 | 9v 건전지 | 9v 어답터 |
파트 | x1 | x1 | x1 | x1 |
부품명 | 글루건 | 커터칼 | 니퍼 | 스크류 드라이버 | 인두기 |
파트 | x1 | x1 | x1 | x1 |
부품명 | 납 | 안드로이드 스마트폰 |
파트 | x1 | x1 |
#include <SoftwareSerial.h> // 블루투스 통신을 위한 SoftwareSerial 라이브러리
#include <Servo.h> // 서보모터를 제어하기 위한 라이브러리
SoftwareSerial BTSerial(6, 7); // SoftwareSerial(RX, TX)
byte buffer[1024]; // 데이터 수신 버퍼
int bufferPosition; // 버퍼에 기록할 위치
Servo servo;
int dcMotor = 12;
int dcSpeed = 3;
// DC모터의 움직임을 제어하는 핀(12)과 속도를 제어하는 핀(3)
int motorAngle = 0;
int motorSpeed = 0;
// 서보모터의 각도와, DC모터의 속도
void setup () {
servo.attach(5); // 5번핀에 연결된 서보모터
pinMode(dcMotor, OUTPUT);
BTSerial.begin(9600);
Serial.begin(9600);
bufferPosition = 0;
}
void loop () {
if (BTSerial.available()) { // 블루투스 통신이 가능할 경우
byte data = BTSerial.read();
buffer[bufferPosition++] = data;
// 블루투스에서 받아온 값을 byte data에 저장
Serial.println(data);
switch(data){ // 블루투스에서 받아온 값에 따라 맞는 동작을 함
case 'q': // q일경우 프로그레스바에 값을 속도로
speedSet();
break;
case 'w': // 스마트폰의 기울기(양수)에 따라 서보모터 각도 제어
angleSet(0);
break;
case 'e': // 스마트폰의 기울기(음수)에 따라 서보모터 각도 제어
angleSet(1);
break;
case 'j': // -60도 버튼을 눌렀을 경우
angleWrite(30);
break;
case 'i': // -30도 버튼을 눌렀을 경우
angleWrite(60);
break;
case 'k': // 0도 버튼을 눌렀을 경우
angleWrite(90);
break;
case 'o': // 30도 버튼을 눌렀을 경우
angleWrite(120);
break;
case 'l': // 60도 버튼을 눌렀을 경우
angleWrite(150);
break;
case 'F': // Forward 토글버튼을 눌렀을 경우(토글버튼에 불이 켜졌을 경우) 모터를 정방향으로 돌림
motorDirection(0, motorSpeed);
break;
case 'f': // Forward 토글버튼을 눌렀을 경우(토글버튼에 불이 꺼졌을 경우) 모터를 멈춤
motorDirection(0, 0);
break;
case 'B': // Back 버튼을 눌렀을 경우(토글버튼에 불이 켜졌을 경우) 모터를 역방향으로 돌림
motorDirection(1, motorSpeed);
break;
case 'b': // Back 버튼을 눌렀을 경우(토글버튼에 불이 꺼졌을 경우) 모터를 멈춤
motorDirection(1, 0);
break;
case '\n': // 문장이 끝낫을 경우
bufferPosition = 0;
break;
}
}
}
void speedSet() { // 프로그레스바에 맞는 값을 읽어 모터의 속도를 조절하는 함수
if (bufferPosition == 4) {
motorSpeed = (buffer[0]-48)*100 + (buffer[1]-48)*10 + (buffer[2]-48);
} else if (bufferPosition == 3) {
motorSpeed = (buffer[0]-48)*10 + (buffer[1]-48);
} else if (bufferPosition == 2) {
motorSpeed = buffer[0] - 48;
}
analogWrite(dcSpeed, motorSpeed);
}
void angleSet(boolean flag){ // 스마트폰에 기울기를 읽어 서보모터의 각도를 조절하는 함수
if(buffer[0] != 10){
if (bufferPosition == 4) {
motorAngle = (buffer[0]-48)*100 + (buffer[1]-48)*10 + (buffer[2]-48);
} else if (bufferPosition == 3) {
motorAngle = (buffer[0]-48)*10 + (buffer[1]-48);
} else if (bufferPosition == 2) {
motorAngle = buffer[0] - 48;
}
if(flag){ // flag가 0이면 왼쪽(기울기가 양수), flag가 1이면 오른쪽(기울기가 음수)
motorAngle *= -1;
}
Serial.print("motorAngle = ");
Serial.println(motorAngle);
motorAngle = map(motorAngle, 150, -150, 30, 150); // 서보모터의 각도로 범위를 재지정 해줌
servo.write(motorAngle);
}
}
void angleWrite(int angle){ // 서보모터의 각도 조절
servo.write(angle);
}
void motorDirection(boolean dir, int speedVal) { // Dc모터의 방향 및 속도 제어
motorSpeed = speedVal;
if (dir == 0) {
digitalWrite(dcMotor, HIGH);
} else {
digitalWrite(dcMotor, LOW);
}
analogWrite(dcSpeed, motorSpeed);
}
switch(data){ // 블루투스에서 받아온 값에 따라 맞는 동작을 함
case 'q': // q일경우 프로그레스바에 값을 속도로
speedSet();
break;
case 'w': // 스마트폰의 기울기(양수)에 따라 서보모터 각도 제어
angleSet(0);
break;
case 'e': // 스마트폰의 기울기(음수)에 따라 서보모터 각도 제어
angleSet(1);
break;
case 'j': // -60도 버튼을 눌렀을 경우
angleWrite(30);
break;
case 'i': // -30도 버튼을 눌렀을 경우
angleWrite(60);
break;
case 'k': // 0도 버튼을 눌렀을 경우
angleWrite(90);
break;
case 'o': // 30도 버튼을 눌렀을 경우
angleWrite(120);
break;
case 'l': // 60도 버튼을 눌렀을 경우
angleWrite(150);
break;
case 'F': // Forward 토글버튼을 눌렀을 경우(토글버튼에 불이 켜졌을 경우) 모터를 정방향으로 돌림
motorDirection(0, motorSpeed);
break;
case 'f': // Forward 토글버튼을 눌렀을 경우(토글버튼에 불이 꺼졌을 경우) 모터를 멈춤
motorDirection(0, 0);
break;
case 'B': // Back 버튼을 눌렀을 경우(토글버튼에 불이 켜졌을 경우) 모터를 역방향으로 돌림
motorDirection(1, motorSpeed);
break;
case 'b': // Back 버튼을 눌렀을 경우(토글버튼에 불이 꺼졌을 경우) 모터를 멈춤
motorDirection(1, 0);
break;
case '\n': // 문장이 끝낫을 경우
bufferPosition = 0;
break;
}
void speedSet() { // 프로그레스바에 맞는 값을 읽어 모터의 속도를 조절하는 함수
if (bufferPosition == 4) {
motorSpeed = (buffer[0]-48)*100 + (buffer[1]-48)*10 + (buffer[2]-48);
} else if (bufferPosition == 3) {
motorSpeed = (buffer[0]-48)*10 + (buffer[1]-48);
} else if (bufferPosition == 2) {
motorSpeed = buffer[0] - 48;
}
analogWrite(dcSpeed, motorSpeed);
}
void angleSet(boolean flag){ // 스마트폰에 기울기를 읽어 서보모터의 각도를 조절하는 함수
if(buffer[0] != 10){
if (bufferPosition == 4) {
motorAngle = (buffer[0]-48)*100 + (buffer[1]-48)*10 + (buffer[2]-48);
} else if (bufferPosition == 3) {
motorAngle = (buffer[0]-48)*10 + (buffer[1]-48);
} else if (bufferPosition == 2) {
motorAngle = buffer[0] - 48;
}
if(flag){ // flag가 0이면 왼쪽(기울기가 양수), flag가 1이면 오른쪽(기울기가 음수)
motorAngle *= -1;
}
Serial.print("motorAngle = ");
Serial.println(motorAngle);
motorAngle = map(motorAngle, 150, -150, 30, 150); // 서보모터의 각도로 범위를 재지정 해줌
servo.write(motorAngle);
}
}
void angleWrite(int angle){ // 서보모터의 각도 조절
servo.write(angle);
}
void motorDirection(boolean dir, int speedVal) { // Dc모터의 방향 및 속도 제어
motorSpeed = speedVal;
if (dir == 0) {
digitalWrite(dcMotor, HIGH);
} else {
digitalWrite(dcMotor, LOW);
}
analogWrite(dcSpeed, motorSpeed);
}
hihyo
9V로도 은근히 속도가 빠르게 출력이 되네요~ 나중에 기회가 되면 초 경량화된 슈퍼카를 만들 계획인데 덕분에 많은 도움 될 것 같습니다.
저는 아트로봇이라는 곳에서 파는 BLE보드 인 bluno라는 아두이노 보드로 안드로이드와 연동하려합니다.
하지만 어플을 실행하고 블루노와 블루투스를 연결하기위해 누르면 렉이걸려 어플이 멈춥니다...
이해 해결방안을 혹시 알고 계신지 궁금합니다. 핸드폰은 갤럭시 노트3입니다.
와 대단하시네요~ 저도 rc카 조종기앱을 만들었엇어요 ㅎㅎ 근데 질문이있는데 rc카에 센서를 장착해서 그 센서값을 조종기 앱 지정한 위치에 출력되도록 하고싶은데 어찌해야할까요....
서브모터를 모터쉴드에 연결할 때 선의 순서가 다릅니다. 브레드보드 레이아웃의 서브모터 선의 색깔과 모터쉴드의 소켓에 연결된 선의 순서에 맞춰야 하는군요.
서브모터와 모터쉴드의 선 연결 순서 문제로 시간을 많이 소모하였습니다.
몇가지 작동상의 문제가 있습니다.
1. 블루투스 페어링이 잘 떨어집니다.
2. 전후 조절 후 서브모터의 움직임이 비정상입니다.
김수현 2015-03-05 10:14:00
포스팅 잘 봤습니다. 제가 이번에 고3이 되어서 블루투스를 이용한 RC카를 제작하고자 이 글을 보게 되었습니다만.. 블루투스 조종 어플리케이션이 꽤 많더라구요 ㅇㅅㅇ; 다른 글 돌아다니면서 보니 BluCar라는 어플이 있던데 그러면 어플끼리 대응하는 게 약간씩 다를거라서 걱정이 됩니다. ㅇㅅㅇ 글쓴이 님의 코딩을 이용하여 BluCar라는 어플에서 구동시키려면 어떤 부분을 바꾸면 좋을지 알려주시면 정말 감사하겠습니다.