본문 바로가기
아두이노(SPL-duino)

아두이노로 거리센서 2개와 서브모터를 이용해서 다가오는 탁구공 치기

by 민서아빠(과학사랑) 2014. 9. 14.

 

아두이노를 이용하여 탁구공 막기.hwp
다운로드

 

거리센서 2개와 서브모터를 이용해서 다가오는 탁구공을 치는 것을 만들어 보았습니다.

잘 이용하면 속력에 대한 수업을 할때도 유용하게 사용할 수 있을 것 같네요

 

만드는 김에 그냥 치는 것이 아니라 골기퍼처럼 공을 막아내는 것도 구상해 보았습니다.

구상한 것은 아래한글로 정리해 두었습니다.

 

나중에 시간될때 만들어 봐야 겠습니다

 

1. 속력이 일정하지 않은 공이 굴러올때 쳐내기

 

센서1과 센서2를 10cm 간격으로 설치하고 서브모터에 나무젓가락을 연결하여 10cm 떨어진 곳에 위치 시킨다.

 

 

공이 임의의 방향에서 굴러오면 p1 을 지날때 시간 t1을 측정하고 p2를 지날때 시간 t2를 측정하여 p1에서 p2 까지 오는데 걸리는 시간(t2-t1)을 측정한다.

 

공이 p2를 지나는 순간 서브모터는 t2-t1만큼 딜레이 시켰다가 90도 회전을 시킨다. 그럼 공이 p3를 지나는 순간 야구배트로 공을 치듯이 공을 쳐내게 된다.

 

딜레이 시간과 각도를 조절하면 원하는 방향으로 공을 쳐 낼 수도 있다.

 

또한 센서1과 센서2의 거리를 변화시켜도 거의 같은 결과를 얻어 낼 수 있다.

<SPL_duino 소스)

//아날로그 0 번에 첫번째 거리센서 장착

//아날로그 1번에 두번째 거리센서 장착

//디지털9번에 서브모터 장착

 

//첫번째 센서 지나갈때 시간

unsigned long t1 = 0

//두번째 센서 지나갈때 시간

unsigned long t2 = 0

// 시간차이

unsigned long xdiff = 0

 

 

procedure loop

//모터 원위치

ServoWrite(9, 0)

 

//아날로그 0번 센서에 입력값을 a0에 저장

a0 = AnalogRead(0)

//첫번째 센서에 탁구공이 지나가면 작동(센서앞에 거리가 가까워 졌는지 체크)

while (a0 < 250)

//첫번째 센서에 물체가 지나간 시간을 기록함

t1 = millis()

//두번째 센서에 물체가 지나갈 때 까지 계속 읽음

while (a1 < 250)

//두번쩨 센서에서 거리를 기록함

a1 = AnalogRead(1)

//두번째 센서에 물체가 지나간 시간을 기록함

t2 = millis()

 

 

//두 센서간에 탁구공이 지나가는 데 걸린 시간을 알아냄

xdiff= t2 - t1

 

// 걸린 시간만큼 기다렸다가

delay(xdiff)

//서브모터 120도 회전

ServoWrite(9, 120)

delay(1000)

end

 

// 아래는 구상만 해 보았습니다. 잘 꾸미면 재미있는 게임이 될 수도 있을 것 같네요. 골기퍼가 공을 막아내는...

 

2. 탁구공이 임의 방향에서 골기퍼를 향해 굴러오면 위에서 20cm 지역을 지나가는 순간 골기퍼가 회전하여 공을 막아내는 것을 만들어 보자

 

경기장 규격은 세로 30cm 가로 20cm 로 하고

세로를 10cm 씩 나누어 맨 위에 센서1 위에서 10cm 떨어진 곳에 센서2를 장착한다.

그리고 맨아래 중심에 서브모터를 단 골기퍼를 준비한다.

골대는 위에서 25cm 되는 곳에 길이가 15cm 정도되게 만들어 놓는다.(조금 더 크게 만들어도 된다.)

 

 

 

일단 공이 임의의 방향으로 굴러들어오는 것을 분석하여 골키퍼가 얼마만큼 회전할 것인지를 결정하면 된다.

만약 공이 p1, p2 점을 거쳐 p3 위치로 이동한다고 가정하고 분석해 보자.

 

L2의 거리를 알아내면 골키퍼를 몇도 만큼 회전시켜야 할지를 알 수 있다.

공이 p1을 지날때 센서로부터 p1 까지의 거리를 측정하고 공이 p2를 지날때 센서로부터 p2까지의 거리를 측정한다.

p2에서 p1을 빼고 L1거리를 더하면 L2의 거리를 계산해 낼 수 있다.

L2 = p2 - p1 +L1

 

이제 p3까지 회전각도가 몇도인지 g1 각도를 구해서 그만큼 회전시키면 된다.

g1 각도는 arcsin(L2/10) 을 하면 된다. (골키퍼 반지름이 10cm 이므로 10으로 나눈다)

(아두이노 명령어 g1 = asin(L2/10)*180/PI

 

사실 실제 공이 굴러가는 각도와는 약간의 차이가 생긴다. 골기퍼가 정확하게 막기 위해서는 g2만큼 더 회전해야 한다. 이건 숙제로 남겨 두도록 하겠다. 일단 g1까지만 회전시켜도 왠만한 공은 다 막아낼 수 있다.

 

 

3. 공을 미리 가서 막는 것이 아니라 공이 도달할때 골키펴 끝 빨간색 사각형으로 공을 쳐내도록 만들어 보자.

 

공이 오는 시간을 예측해서 공을 쳐내게 하려면 공이 얼마나 빨리 다가오는지 속도를 구해야 한다. 속도를 구하기 위해서는 p1을 지날때 시간 t1을 측정하고 p2를 지날때 시간 t2를 측정한 후 t2에서 t1을 빼주면 시간차이를 알수 있다.

거리는 10cm 이므로 골기퍼에게 다가오는 속력을 계산할 수 있다. 굳이 속력을 계산하지 않더라도 공이 p3에 도착하는 시간은 p2를 통과한 후 t2-t1만큼의 시간 후에 도달한다는 것을 예측할 수 있다.

골키퍼의 서브모터가 공이 p2를 통과하는 순간부터 t2-t1시간만큼 기다렸다가 회전해서 공을 막으면 p3를 지나는 공을 바깥쪽으로 쳐 낼 수 있게 된다.