코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2015-07-03 14:26:30
안녕하세요. Sabo 입니다.
자 이번 시간은, 지난 Laser AWP 만들기 Part 1에 이어 표적지를 만들어 보도록 하겠습니다.
혹시라도 못보신 분들은 꼭!! PART 1의 내용을 정독하시고 총 한자루 만들어오셔야 진행 하실 수 있습니다.
표적을 만들기 전에 한가지 유의하셔야 할 점이 있습니다.
군대서 총 좀 쏴보신 분들은 아시겠지만 실제 사격은 일반 비비탄 총과 달리 맞추기 매우 매우 힘듭니다.
스코프를 달지 않는 이상 100m, 200m, 250m에 있는 표적은 정말 점 처럼 보인답니다.
저는 실제 사격의 리얼한 난이도를 구현하기 위해 맞추기 정말 힘든 표적을 만들겁니다.
나중에 맞추기 어렵다고 큰거 만들어 달라고 하지마세요.
조도센서를 이용하여 레이저 총을 인식하는 과녘을 만들어 봅니다.
자 일단 완성된 샷 먼저 갑니다. 보시면 조도센서의 머리 부분이 돌출되어 있습니다. 자 저희는 앞으로 레이저로 저 머리를 '정확히!' 맞추어야 합니다.
중앙에 있는 부분은 고휘도 White LED입니다. 대충 느낌 오시나요? 밝은 빛을 쏴줌으로써 시야를 방해하여 더욱 조준하기 어렵게 만들었습니다.
특히나 검정 표적지에 하얀 빛이라 그 효과는 아주 좋더군요.
좀더 확대한 사진 입니다. 조도센서(포토레지스터)의 다리가 들어갈 구멍을 폼보드에 뚫고 넣어주었습니다.
조도센서의 배치를 어떻게할지 고민했던 흔적들이 보이네요.
사실 이게 좀 힘든 작업입니다. 만능기판이나 PCB가 아닌 폼보드위에 납땜하는 사람은 저 밖에 없을 것 같네요.
납은 붙여야 겠고, 폼보드는 녹으면 안되고... 제한 사항이 많은 작업입니다.
오렌지보드와 지그비 쉴드입니다. 오렌지 보드가 밑 면이 평평한게 어디든 착착 잘 붙는게 늘 사용할 때마다 편리합니다.
한가지 TIP을 드리자면 양면 테잎보다는 글루건으로 보드를 붙이면 나중에 떼어낼 때도 쉽게 뗄 수 있답니다.
int a,b,c,d,e,f;
char list[] = {'1', '2', '3', '4', '5', '6'};
void setup()
{
Serial.begin(9600);
}
void loop()
{
if(Serial.available()) // 지그비 통신으로 데이터를 받을 경우
{
if(Serial.read()=='1') // 지그비 통신으로 1이 수신되었을 때
// 총에서 장전 버튼이 눌렸을 경우
{
while(!Serial.available()){} // 다음 데이터가 수신될 때 까지 대기
suffle(); // List 배열의 데이터를 랜덤으로 바꾸는 함수
if(Serial.read()=='2') // 지그비 통신으로 2가 수신되었을 때
// 총에서 발사 버튼이 눌렸을 경우
{
a = analogRead(A0); // 각 조도센서 값을 a~f 변수에 저장
b = analogRead(A1);
c = analogRead(A2);
d = analogRead(A3);
e = analogRead(A4);
f = analogRead(A5);
delay(100);
if(a<100){a==1;}else{Serial.write(list[0]);}
// 1번 조도 센서가 인식될 경우 리스트배열 0번 째 데이터 송신
if(b<100){b==1;}else{Serial.write(list[1]);}
// 2번 조도 센서가 인식될 경우 리스트배열 1번 째 데이터 송신
if(c<100){c==1;}else{Serial.write(list[2]);}
// 3번 조도 센서가 인식될 경우 리스트배열 2번 째 데이터 송신
if(d<100){d==1;}else{Serial.write(list[3]);}
// 4번 조도 센서가 인식될 경우 리스트배열 3번 째 데이터 송신
if(e<100){e==1;}else{Serial.write(list[4]);}
// 5번 조도 센서가 인식될 경우 리스트배열 4번 째 데이터 송신
if(f<100){f==1;}else{Serial.write(list[5]);}
// 6번 조도 센서가 인식될 경우 리스트배열 5번 째 데이터 송신
delay(750);
}
}
}
}
void suffle() // 랜덤 배열 함수
{
for (int a = 0; a < 6; a++) // 6회 반복
{
int r = random(a, 5); // 0~5 숫자 중 a숫자를 제외한 나머지 중 하나를 랜덤으로 추출한 후
// 변수 r에 저장
char temp = list[a]; // list 배열 a번째 데이터를 temp 변수에 저장
list[a] = list[r]; // list 배열 r번째 데이터를 list 배열 a번째에 저장
list[r] = temp; // temp 변수에 저장했던 처음 list 배열 a번째 데이터를
// list 배열 r번째에 저장
}
}
소스는 여느때와 같이 늘 단순합니다. 메인문에서는 통신 송수신에 대한 대기 함수와 아날로그 Read, 각 상황에 따른 조건문이 전부 입니다.
다만 suffle()이라고 만든 매크로 함수가 조금 복잡하게 느껴지실 수도 있습니다. suffle()은 간단하게 정리하자면 list 배열의 n번째 데이터를
n이외의 주소에 있는 데이터와 맞바꿈으로써 랜덤으로 배열의 데이터가 바뀌게 하는 역할 입니다.
사격도 사격이지만 사실 최초 이 장난감의 목적은 복불복 내기를 위해 만들었기 때문에 특정 조도센서가 정확히 맞추었더라도 총에서 어떤 주사위가 나올지는
아무도 모르게 만들었습니다. 정말 사격 실력으로 승부를 가리고 싶으신 분들은 suffle 함수만 제거해 주시면 됩니다.
SaBo