코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
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