2015학년도

기계설계프로젝트 최종 보고서

과제명 : 신호 추적 카트

(2014년 9월 1일 ~ 2015년 5월 27일)

팀명: Grace

기계공학 설계프로젝트 최종보고서를

붙임과 같이 제출합니다.

2015. 06. 11.

대구대학교 기계자동차공학부(기계공학전공)

제 출 문

대구대학교 기계자동차공학부 학부장 귀하

본 보고서를 대구대학교 기계자동차공학부 설계프로젝트 과제 “신호 추적 카트”의 결과보고서로 제출합니다. (과제기간 : 14. 09. 01 ~ 15. 06. 11)

2015. 06. 11.

담당교수 :  이 동 활   (인)

지도교수 :  황 우 석   (인)

대표학생 :  정 광 수   (인)

참여학생 :  권 기 범   (인)

김 연 중   (인)

이 동 호   (인)

신 재 화   (인)

장 현 우   (인)

보고서 작성 윤리 서약서

대구대학교 기계자동차공학부 학부장 귀하

본인은 보고서를 작성함에 있어 다음과 같이 연구 윤리 및 보고서 작성 윤리를 준수하였음을 서약합니다.

1. 본인은 다른 학생의 보고서를 복사(copy)하지 않았습니다.

2. 본인은 다른 사람의 보고서 내용 중 전부 또는 일부를 무단으로 도용하거나 인터넷에서 내려받기(download)하여 대체하지 않았습니다.

3. 본인은 보고서에 참고자료를 인용할 경우 원본의 출처를 반드시 표시하였습니다.

2015. 06. 11.

대표학생 :  정 광 수   (인)

참여학생 :  권 기 범   (인)

김 연 중   (인)

이 동 호   (인)

신 재 화   (인)

장 현 우   (인)

목  차

최종보고 요약문 제1장 과제내용 및 목표 제1절 목적 및 필요성 제2절 과제의 목표 제3절 기대효과 및 활용방안 제2장 개념설계 및 해석 제1절 개념설계 제2절 해석 목표 설정 제3절 해석 조건 및 과정 제4절 해석 결과 및 보완 제3장 기구부 제1절 모터 선정 과정 제2절 모터 체결 방식 결정 제3절 기타 부품 선정 제4절 도면 제5절 제작 제4장 제어부 제1절 제어 부품 선정 제2절 실험 계획 제3절 실험 프로그램 및 회로도 제5장 시험 및 평가 제6장 결론 제1절 문제점 분석 제2절 제작비 제3절 총평 참고문헌	1 5 5 5 5 6 6 6 7 9 11 11 12 13 14 27 29 29 33 34 50 51 51 52 52 54

최종보고 요약문

과제명	신호 추적 카트
팀명	Grace
팀원	정광수, 권기범, 김연중, 이동호, 신재화, 장현우
과제기간	2014 년 9 월 1 일 ~ 2015 년 5 월 27 일
1. 과제내용 및 목표 과제내용 : 리모컨과 거리를 유지하며 주행하는 전동 카트 제작 목표 ○ 적재무게 : 30kg ○ 최대 속도 : 3.5km/h ○ 중량 20kg ○ 거리 감지 범위 : 최대 2m ○ 거리 유지 범위 1~2m ○ 주행 시간 1시간 30분 2. 개념설계 및 해석 <스케치 초안> <최종 설계안 변위 분포> <최종 설계안 응력 분포> 프로파일과 알루미늄 판재를 이용하여 몸체를 구성한다. 모터 2개를 이용한 후륜구동을 하며 리모컨을 이용하여 제어한다. 해석은 적재부 판재의 두께와 볼트 체결 개수를 목적으로 하였다. 판재의 두께와 볼트 체결 개수의 경우의 수를 합쳐 16가지의 경우의 수를 만들었다. 그리고 목표 안전율과 변위에 적합한 경우를 찾았다. 판재 두께 1mm, 볼트 체결 개수 1x2개 일 때의 경우를 분석한 결과 보강재가 필요하여 가운데에 프로파일을 추가하였다. 3. 기구부 요구 목표에 충족하는 모터를 찾은 결과 60W급의 모터를 2개 선정하였다. 다른 부품들음 모터를 기준으로 선정하였다. 바퀴 체결 방식은 과잉 설계를 피하기 위해 축 하나만을 이용하여 모터와 바퀴를 연결하기로 결정하였다. 결정된 사항에 맞추어 도면을 작성하고 제작을 하였다.

4. 제어부

초음파센서의 한계를 극복하기 위해 리모컨의 신호를 받는 카트 수신부 센서를 변형하였다. 두 수신부가 리모컨으로 받는 신호의 시간차를 이용하여 좌우 이동 방향을 판단한다. 이 방법을 이용하면 거리 측정이 어려워지므로 별도의 센서를 카트에 부착하여 사람과의 거리를 측정한다.

5. 시험 및 평가

센서의 사용법에 관한 실현 가능성을 확인해야 한다. 제어부에서 가정한 실험 방법을 통하여 좌우 이동 방향과 주행 여부를 결정할 값을 받을 수 있음을 확인하였다.

6. 결론

진행과정에서의 문제점을 확인하고 완성 가능성을 검토하였다. 기구부가 완성되었고 제어부 역시 실현가능함을 입증하여 일정에는 차질이 생겼으나 시제품에 적용 가능하다고 예측한다. 일부 충족시키지 못한 정량적 목표가 있으나 그것을 최소화하기 위한 과정이 있었고, 요구 기능은 수행할 수 있는 결과물이 나올 것이라 예상한다.

제1장 과제내용 및 목표

제1절 목적 및 필요성

카트의 특성 상 많은 힘을 들이지 않고도 많은 적재물을 운반할 수 있다. 이러한 장점 때문에 마트에서 많이 활용되는데 장애인, 노약자와 같은 신체적 불편함이 있는 사람들의 마트 이용이 어려운 것이 현실이다. 그 이유 중 하나는 카트를 혼자서 사용하는 데에 어려움을 느낄 수 있다는 점이다. 따라서 카트를 운반할 때 필요한 인력을 최소화할 필요성을 느꼈다.

제2절 과제의 목표

○ 적재 무게 : 30kg

○ 최대 속도 : 3.5km/h

○ 중량 : 20kg

○ 거리 감지 범위 : 최대 2m

○ 거리 유지 범위 :　1 ~ 2m

○ 주행 시간 : 1시간

제3절 기대효과 및 활용방안

실제 실생활에서 사용되고 있는 전동카트는 산업용으로 쓰이는 경우가 많은데 대부분이 높은 사양을 요구 하는 제품이고 가격 또한 200만원을 호가한다. 구동방식 또한 카트를 직접 조작하는 방식이 사용되고 있다. 그러므로 이 과제에서는 산업용카트가 아닌 일상생활에서 편리하게 사용하기 위해 기존의 제품보다 저가의 부품을 사용하여 사양을 조절한다.

제2장 개념설계 및 해석

제1절 개념설계

모터 2개를 이용하여 후륜구동을 하는 전동카트를 제작한다. 앞바퀴는 360°회전이 가능한 제품을 선정하여 별도의 동력 없이 동작을 용이하게 한다. 몸체는 뼈대를 먼저 구성하고 그 뼈대에 판재를 덮어 바닥면이나 벽면을 구성한다. 작동 방법은 카트를 직접 조작하는 것이 아닌  리모컨을 이용한다. 이때 리모컨은 별도의 조작 없이 신호를 송신한다. 카트가 신호를 받아 좌우 방향 및 주행 여부를 결정 할 수 있도록 하는 것을 목표로 한다.

제2절 해석 목표 설정

<적재부 판재>

카트의 주된 목적은 적재물 운반 기능이다. 주 기능을 수행하기 위해서 적재물의 하중을 견딜만한 강도를 가져야한다. 따라서 여러 조건에서 해석한 후 비교하여 최적화된 설계를 도출해낸다. 이 때 해석할 부품은 하중이 직접적으로 가해지는 판재로 정한다.

적재부 판재에 목표하중이 가해질 때 판재의 두께와 체결방법에 따라 변화되는 변위, 응력분포, 안전율을 비교하여 목표하중에 맞는 최적화된 두께와 체결방법을 구한다. 이 때 목표 수치는 국가기술표준원에서 권장하는 치수를 참고하여 안전율은 2~3, 변위는 5mm 이하를 목표로 한다.

출처 : 국가기술표준원, 2013, “안전‧품질표시대상 공산품 안전‧품질표시기준 개정 고시”, pp 392, 394

○ 설계변수

적재부 판재는 두께 4가지(0.2T, 0.5T, 1T, 2T)와 볼트 체결 개수 4가지(1x1, 1x2, 2x2, 2x3)를 변수로 정하면 16가지 경우의 수가 나온다. 16가지의 경우에 대해 최대 변위, 최대 응력, 최소 안전율을 한꺼번에 검토하는 것은 어려움이 있다. 따라서 처음에는 안전율에 가장 적합한 두께 및 체결 개수를 찾는다. 안전율이 적합한 것을 선택하였으므로 최대 응력을 고려할 필요가 없어진다. 아직 검토되지 않은 최대 변위가 적합한지 분석하고 만약 문제점이 발견되면 그것을 보완한다.

제3절 해석 조건 및 과정

○ 해석조건

▷ 재질

판재 : AL-5085

프레임 : AL-6063

볼트 : Alloy Steel

▷ 경계조건

각 프레임들이 기둥 프레임에 고정되어 판재를

지지하므로 기둥 프레임에 맞닿는 모든 면을 고정구속한다.

▷ 하중

적재부의 하중이 직접 가해지는 판재 윗면에 목표 적재 무게인 30kg의 하중을 가한다. 무게가 무거운 부품은 대부분 적재부 판재의 아래쪽에 위치한다. 따라서 자중은 판재의 변위나 안전율에 영향을 주지 않는다고 생각하여 생략한다.

<하중이 가해지는 면>

▷ 접촉

볼트와 판재의 접촉면

- 양방향 미끄러짐 접촉

볼트와 프레임

- 일체거동 접촉

프레임과 판재

- 양방향 미끄러짐 접촉

<접촉조건설명>

판재에 하중이 가해질 때 볼트 체결 부위의 변화를 확인하기 위한 접촉을 설정한다. 볼트가 프레임에 체결되어 판재를 고정한다. 따라서 판재는 볼트 접촉면과 프레임 모두와 미끄러짐이 발생하고 볼트와 프레임은 체결되었기 때문에 일체거동 접촉으로 정한다.

▷ 요소망

0.2mm 판재의 요소망을 생성할 때 최대 요소망의 크기를 기본 옵션으로 설정하면 형상의 일부가 잘리는 것을 확인하였다. 따라서 형상이 변하지 않는 적절한 요소망의 크기를 도출해내는 과정이 필요하다. 몇 번의 시행착오 끝에 최대 요소망의 크기는 35mm가 가장 적절하다는 결론을 도출하였다.

○ 설계변수

<판재의 두께와 볼트 체결 개수의 변화에 따른 최소 안전율의 변화>

설계 문제 정의에서 결정한 16가지 설계 변수의 관한 안전율 해석을 실시하였다. 그 결과를 위와 같이 나타내었다. 그림만으로는 응력이 집중되는 분포 파악은 가능하지만 한 눈에 비교하기는 어려워 다음 절에서 결과를 분석한다.

제4절 해석 결과 및 보완

○ 해석결과

<해석결과 변수에 따른 최소 안전율의 변화표>

안전율 1이상이면 사용 가능하지만 판재가 파손될 경우 적재물과 판재 밑에 있는 제어부가 손상될 수 있다. 두 가지 모두 카트의 기능을 상실하는 문제가 발생하므로 일정 수준 이상의 안전율을 요구한다. 따라서 일반적으로 통용되는 안전율인 2~3에 해당되는 경우인 판재 두께 1mm, 볼트 체결 개수 1x2개의 해석 결과 중 최대 변위가 목표에 적합한지 분석한다.

○ 결과분석

<변위 분포>                             <응력 분포>

설계 문제를 정의할 때 안전율은 2~3을 목표로 정하였다. 여러 가지 경우에 대해 해석을 하였지만 이 경우를 만족하는 경우는 판 두께 1mm, 볼트 체결 개수 1x2개뿐이었다. 따라서 위 경우에 대해서 응력과 변위에 대한 분석을 하고 필요하다면 수정 절차를 거쳐 최종설계안을 결정한다.

목표 하중이 가해질 때 볼트 체결부 주변에 응력이 가장 높게 발생되는 것을 볼 수 있다. 이 응력이 과도하게 높으면 판재가 계속 처지면서 볼트 체결 부위가 찢어져서 프레임과 떨어질 수 있다. 위 결과물은 안전율이 적정 범위에 해당되는 것을 선정하였기 때문에 파손 가능성은 낮다.

변위의 경우 최대 10mm가 처지는 것을 확인하였다. 최대 변위 목표인 5mm보다 2배 큰 결과값이 나타났다. 따라서 판재 중심부에 보강재를 설치하여 다시 분석을 하였다.

○ 보완

최대 변위 : 1.09mm            최대 응력: 2.07kg[eqn: {} _{f}]/mm[eqn: {} ^{2}]         최소 안전율 : 13.62

판재 중심부에 프레임을 추가하여 처짐을 최소화하였다. 안전율이 목표보다 높아졌지만 프레임의 가격이 저렴한 편이고 변위와 안전율 모두 기준을 만족해야 하므로 위와 같은 설계안으로 결정한다.

제3장 기구부

제1절 모터 선정 과정

기구부 부품 선정은 모터의 성능이 결정되어야 수월하게 이루어지므로 설계 목표에 적절한 모터를 선정한다.

○ 중량 : 카트의 무게 + 적재물의 무게

W = 20kg+30kg = 50kg

○ 속도 : 과제의 목표 최고 속도

V = 3.5km/h = 0.9722m/s

○ 뒷바퀴의 지름 : D = 6inch = 0.1524m

○ 마찰계수 : μ = 0.2

○ 바퀴의 회전수 : f = [eqn: {V} over {pi D} = {0.9722m/s} over {pi *0.1524m} =2.03`Cycle/s=`121.8rpm]

○ 관성모멘트 : J = [eqn: {WD ^{2}} over {8} = {50kg` TIMES `(0.1524m) ^{2}} over {8} =0.145161`kg BULLET m ^{2} =1451.61kg BULLET cm ^{2}]

○ 가속토크 : 가속시간이 2s라 가정할 때 (t=2s)

[eqn: T _{a}] = [eqn: {2 pi fJ} over {gt} = {2 pi TIMES 2.03Cycle/s TIMES 0.145161kg BULLET m ^{2}} over {9.81m/s ^{2} TIMES 2s} =0.0944kg BULLET m=9.44kg BULLET cm]

○ 등속토크 : [eqn: T _{m}] = [eqn: {mu WD} over {4} = {0.2 TIMES 50kg TIMES 0.1524m} over {4} =0.381kg BULLET m=38.1kg BULLET cm]

○ 총 토크 : T = [eqn: T _{a} +T _{m} =9.44kg BULLET cm+38.1kg BULLET cm=47.54kg BULLET cm]

사용되는 모터는 2개이므로 모터 하나 당 요구되는 토크는 총 토크의 절반인 [eqn: 23.77kg BULLET cm]이다. SPG 사의 S9D SERIES 40W가 25:1 비율의 감속기를 함께 사용할 때 토크가 [eqn: 24.6kg BULLET cm]이다. 요구 토크에 거의 근접하지만 어느 정도 여유가 있어야 구동에 용이하므로 SPG 사의 S9D SERIES 60W를 25:1의 감속기와 함께 사용하기로 한다.

	DC Geared Motor (S9D SERIES 60W)	출력 : 60W 회전수 : 124rpm 감속비 : 25 토크 : 32.8[eqn: kg _{f} BULLET cm]

<선정 된 모터의 성능>

제2절 모터 체결 방식 결정

	하우징 (UCPH2)	축경 : 12mm 사이즈 : 127 * 40 * 101 mm
	커플링 (SOH-25C)	외경 : 25.5mm 내경 : 12mm 상용 토크 : 25.5[eqn: kg _{f} BULLET cm]

<선정되지 못한 커플링과 하우징>

과제 초기에는 커플링으로 축과 모터를 연결하고 하우징을 이용해 하중을 버티는 바퀴 체결 방법을 생각하였다. 그러나 모터가 차지하는 공간 때문에 하우징과 커플링을 사용하는 경우 바퀴가 과도하게 튀어나오는 문제가 발생한다. 또한 처음 예상과는 다르게 하우징을 2개씩 사용해야 하므로 축의 길이는 더욱 길어질 수 있다. 축이 길어져 바퀴가 과도하게 돌출될 경우 운반에 불편함이 생길 수 있으므로 다른 방안을 생각할 필요가 생겼다.

전문가의 자문을 받은 결과 기어드 모터만으로 하중을 지지하는데 큰 무리가 없다는 것을 알게 되었다. 또한 에어바퀴를 사용하므로 충격이 어느 정도 완화되는 효과도 기대할 수 있다. 따라서 하우징과 커플링을 이용하는 모터 체결은 과잉 설계라 결론지었다. 최종적으로는 축 하나만을 이용하여 모터와 바퀴를 직결하는 방법을 선택하였다.

<초기 모터 체결 방식>                       <수정 후 모터 체결 방식>

제3절 기타 부품 선정

위 과정에서 계산한 모터의 요구 성능을 기준으로 구동부 부품들을 선정한다. 몸체를 이루는 부품은 해석 결과를 토대로 선정한다.

	배터리 (SLD 18-12)	전압 : 12V 용량 : 18Ah 무게 : 5.8kg 사이즈 : 181 * 76 * 167 mm
	뒷바퀴 (에어바퀴)	외경 : 160mm 내경 : 12mm 허용 하중 : 80kg
	앞바퀴 (PVC 회전 바퀴)	외경 : 101.6mm 전체높이 : 140mm 허용 하중 : 80kg
	프로파일 (30 x 30)	재질 : A6063S-T5 단중량 : 1.106kg/m
	알루미늄 판재 (A5052)	재질 : A5052 두께 : 1mm
	모터 브라켓 (SPL-9SA)	중량 : 270g 재질 : 알루미늄
	브라켓 (YKBK-DC3030)	재질 : ALDC-8 30mm 프로파일용 연결 부품
	볼트 (YKB-WD)	재질 : Steel(SCM45) 표면처리 : 니켈, 아연, 무전해 니켈 사이즈 : M6*15
	너트 (YKB-T M6)	재질 : SWCH 10A 표면처리 : 아연, 니켈 사이즈 : M6*15

제4절 도면

제5절 제작

○ 프로파일 조립

프로파일은 절단면이 거칠면 안되고 길이 또한 정확해야 제작이 용이하다. 또한 긴 프로파일을 옮기는 것은 어려움이 있으므로 제작할 길이에 맞추어 절단된 제품을 구매한다. 각 절단된 프로파일을 브라켓과 너트를 이용하여 체결한다. 이 때 별도의 드릴링은 요구되지 않는다.

○ 바퀴 연결

모터와 모터 브라켓은 동일 제조사의 제품을 구매하였으므로 구성된 제품과 볼트만으로 체결이 가능하다. 축은 복잡한 형상은 아니지만 직접 가공할 시 정밀성이 떨어져 바퀴가 회전하지 않을 가능성이 있다. 그리고 개당 6만원대로 비교적 낮은 가격에 제작이 가능했기 때문에 외주 가공을 하였다. 바퀴. 축, 모터브라켓이 끼워진 모터를 연결하고 축의 뚜껑과 볼트를 이용하여 체결을 완료하였다.

○ 프로파일, 판재 체결

프로파일과 역시 절단면이 정확해야하고 운반을 쉽게 하려면 절단을 하여야 하므로 도면에 맞게 절단된 판재를 구매한다. 판재의 두께가 얇아 구멍을 뚫는 것은 어려움이 없으므로 볼트 체결을 위한 드릴링은 직접 하였다. 드릴링을 마친 판재를 프로파일과 볼트를 이용하여 체결한다.

○ 전체 조립

바닥 판재에 바퀴 연결을 위한 드릴링을 한다. 그리고 볼트를 이용하여 앞바퀴와 조립된 뒷바퀴를 연결한다.

제4장 제어부

제1절 제어 부품 선정

○ 모터 드라이버

이 과제의 제어 대상은 모터이므로 목적에 적절한 모터 드라이버를 선정하여야 한다. 처음에는 가격을 과도하게 중시하여 모터의 출력만을 고려하여 모터 드라이버를 선정하였다. 그 결과 모터 드라이버의 중요한 기능이 빠진 모터 드라이버를 선정하였다. PWM 제어는 가능하나 모터의 회전방향이 한 방향만 지원되고, 정지 기능 또한 없어서 위험한 상황일 때 대처가 힘들 가능성이 있다. 따라서 아래의 네 가지 핀을 모두 가지고 있는 모터 드라이버를 재선정하였다.

PWM : Duty 비로 모터의 출력을 제어한다.

DIR : 모터의 회전방향을 결정한다. 정주행, 역주행 제어가 가능해진다

STOP : 모터의 정지기능을 수행한다. 이 때 전원은 계속 공급되므로 ENA와는 다른 기능이다.

ENA : 모터의 작동여부를 결정한다. 이 핀의 신호가 Low 신호일 경우 작동이 중지된다.

	모터 드라이버 (NT-DC20A)	200W급 모터 1개 구동 가능 방열판 제공 PWM, DIR, STOP, ENA 핀 보유

이 과제에 사용되는 모터는 60W이지만 방열, 가격, 보유한 핀을 종합하여 위와 같은 모터 드라이버를 선정하였다.

○ 적외선 센서

	적외선센서 (GP2Y0A21YK)	공칭 주파수 : 40kHz 감지 거리 : 0.1 ~ 0.8m

(1) 적외선이란

광선을 송신하고 수신하는 두 개의 눈이 초점을 가지는 조건에서 초점과의 각도를 측정하여 삼각형 기하학으로 계산하여 거리를 측정한다. 적외선은 인간이 식별할 수 있는 가시광선에서 빛의 파장이 긴 영역인 빨간색보다 파장이 더 큰 영역의 광선이라는 뜻으로 적외선이라는 이름을 사용한다. 보통 TV리모컨에서 TV에 신호를 전달 할 때 적외선을 많이 사용하고 우리 눈에는 보이지 않는 빛이다.

(2) 적외선 센서 장단점

적외선은 실내 형광등에 포함되어 있는 광선과 구분되지 않고 실외의 태양광에도 적외선이 겹치면 우리가 사용하는 적외선을 식별하기 곤란한 경우가 발생한다. 그리고 색상의 변화에도 민감하게 반응하지만 흑색은 적외선을 잘 흡수하고 흰색은 적외선을 반사하는 특징이 있다. 이런 특징을 이용하여 라인트레이서 센서로도 사용된다.

(3) 거리 측정 원리

적외선 거리 측정 센서의 단점을 보완하기 위한 방법으로 삼각측량법을 사용한다. 센서와 장애물과의 거리에 따라 반사되어 돌아오는 빛의 반사각이 변화됨으로써 PSD에 입사되는 위치가 변화된다. PSD에 위상이 다른 두개의 출력(I1,I2)을 얻음으로 거리 = Ref + {(I1-I2)/(I1+I2) }*a 를 통하여 구할 수 있다. (Ref= 기준전압, a=가중치)

(4) 선정 불가 이유

감지 거리가 다른 센서에 비해 짧고 감지 대상의 색상에 영항을 크게 받는다. 또한 거리값을 전압으로 받는데 그 값이 비선형이므로 속도 계산에 어려움이 있다. 단순한 거리 감지는 가능하지만 특정 위치를 파악하는 것 또한 불가능하므로 적외선 센서를 사용하지 않는다.

○ 초음파 센서

	초음파센서 (SRF-05)	공칭 주파수 : 40kHz 감지 거리 : 0.3 ~ 3m 방향각 : 30。
	초음파센서 (XNQ25-25AT/R)	공칭 주파수 : 25kHz 감지 거리 : 0.2 ~ 5m 방향각 : 50 ± 15。

(1) 작동 원리

초음파센서는 20kHz 이상의 주파수를 가지는 음파를 사용한다. 초음파센서에는 압전효과가 가장 널리 사용되는데, 압전기를 통하여 전기에너지와 기계적에너지로 변환한다. 발신부는 역압전현상으로 교류전압을 짧은 시간동안 교차하여 걸어주면 분극의 부분이 수축과 팽창을 반복하연서 짧은 주파수를 지속적으로 발생한다. 송신부는 정압전현상으로 검사체에서 되돌아오는 초음파 신호를 받을 때 발생하여 진동자가 파동을 받으면 전압이 발생한다.

(2) 거리 측정 방법

거리를 측정하는 방법으로는 발신부에서 초음파를 쏘는 순간부터 되돌아와 받는 순간까지의 시간을 프로그램으로 측정하며, 초음파의 속도 V(T)=331.5+0.6T를 사용하여 속도를 구할 수 있다. 초음파는 발신부에서 발사되어 수신부까지 반사되어 돌아오는 것이므로 거리를 구하는 방법은 측정된시간*V(T)/2를 사용하면 물체의 거리를 계산할 수 있게 된다.

(3) 사용 시 문제점

일반적인 초음파 센서 사용 방법으로는 거리 측정은 가능하나 측정 대상이 어느 위치에 있는지는 알 수 없다. 문제를 해결하기 위한 방법으로 통신을 병행하는 방법이 있다. 하지만 통신에 대한 이해도가 부족한 상태에서 제어와 관련된 항목을 늘리는 것은 과제의 성공률을 떨어뜨릴 우려가 있다. 그리고 센서를 사용하는 방법으로는 과도한 수단이라 생각하였다. 따라서 센서만을 이용하여 간접적으로나마 문제를 해결할 방법에 관한 이론을 세우고 실험을 하기로 하였다.

○ 초음파 센서 사용법에 대한 대안

처음에는 과제의 방향을 일부 바꿀 생각으로 라인 트레이서를 생각하였다. 하지만 단순히 움직이기 위한 라인트레이서는 이미 보편화가 되어 있어 도전할 가치가 떨어진다. 만약 라인 트레이서를 이용한다면 이 역시 깊이 있는 연구가 요구되었다. 과제의 방향을 바꿔가며 라인 트레이서를 사용할 필요는 없으므로 다른 방안을 생각하였다.

다른 대안으로 생각한 것은 통신을 이용한 RC카 제작이었다. 위 항목에서 언급한 것처럼 초음파 센서 사용에 무작정 통신을 이용하는 방법을 추가하는 것은 과제를 실패할 가능성이 생길 수 있다. 따라서 통신을 이용하여 리모컨을 이용한 모터 제어를 하려고 하였다. 하지만 이 과제는 리모컨을 별도로 조작하지 않아도 카트가 따라오는 것이 목적이다. 리모컨이라는 항목에 얽매여 단순한 RC카를 만드는 것 또한 의미없는 과제로 끝날 가능성이 있었다.

이처럼 거리 측정 센서가 아닌 다른 방법으로 과제를 수행할 방법을 검토하였으나 다른 방법 역시 깊이 있는 연구가 필요하였다. 또한 과제의 요구 기능에 맞지 않는 방향으로 흘러 갈 수도 있었다. 따라서 가장 처음 생각했던 초음파 센서의 특징을 이용하여 목표에 근접할 수 있는 방법을 검토하였다.

(1) 주파수가 다른 센서 이용

‣ 이론

이러한 문제를 해결하기 위해 주파수가 다른 초음파 센서를 사용하여 각각 역할을 부여한다. 좌우 방향을 파악하기 위한 센서와 거리만을 측정하기 위한 센서로 나누고 주파수가 다른 센서를 선정하여 간섭을 최소화한다.

XNQ25-25AT/R(25kHz)를 이용하여 리모컨에서 카트까지 도달하는 신호의 시간차가 있을 것이다. 이 시간차를 이용하여 좌우 방향을 파악한다. 이러한 사용법으로는 리모컨에서 신호를 쏘는 시점을 알 수 없어 거리 측정이 불가능하다. 따라서 카트의 SRF05(40kHz)를 이용하여 거리 측정을 한다.

‣ 한계

XNQ25-25AT/R의 작동이 불가능하였다. SRF05와 달리 모듈로 된 제품이 아니라서 바로 사용할 수 없었다. SRF05와 같은 방법으로 사용하려면 별도의 회로 제작이 요구된다. 또한 데이터시트도 구하기 힘든 제품이라 신뢰성을 더욱 잃었다. 따라서 쉽게 접할 수 있는 SRF05만으로 문제를 해결할 방법을 찾아야했다.

(2) SRF05 이용

SRF05는 신호를 쏘고 반사되어 오는 시간을 재는 구조이므로 다른 SRF05의 신호를 받는 것은 무리가 있다. 카트 수신부가 리모컨 송신부의 신호를 받으려면 수신부로 사용하는 센서의 구조를 변경할 필요가 생겼다. 카트 수신부가 초음파를 발생시키지 않기 위해 신호가 발사되는 부분을 제거하였다.

다음 단계는 앞에서 세운 이론과 거의 동일하다. 리모컨에서 발사된 신호를 카트의 수신부 센서 2개가 받는다. 이 때 두 수신부가 신호를 받는 시간차를 이용하여 좌우 방향을 예측한다. 이 역시 리모컨 신호가 발사된 시점을 알 수 없어 거리 측정을 불가능하다. 따라서 카트에 거리 측정용 센서를 별도로 장착한다.

제2절 실험 계획

○ 회로도 초안

<시스템 구성도>

리모컨의 신호를 카트의 두 센서가 수신하여 좌우 방향 감지를 하는 기능, 카트의 초음파 센서 하나가 거리 측정을 하는 기능, 두 정보를 종합하여 모터를 제어하는 기능을 가정하여 구성도를 그려보았다. 위 구성대로 목적을 달성하기 위해 몇 가지 실험에 대한 시나리오를 구상하였다.

○ 실험 시나리오

(1) ATmega128에 초음파 센서를 2개 연결하여 센서 간 신호 송수신 확인

(2) ATmega128에 초음파 센서 3개를 연결하여 1개의 센서가 송신을 하면 2개의 센서가 수신하는 것을 확인

(3) ATmega8에 초음파 센서 1개를 부착시켜 신호를 송신하면 ATmega128에 있는 초음파 센서 2개가 수신하는 것을 확인

(4) 시나리오 3번의 회로에 거리 측정용 센서를 ATmega128에 부착시킨 후 모든 센서를 동시 작동하여 충돌이 발생하는지 확인

제3절 실험 프로그램 및 회로도

○ 실험 시나리오(1)

ATmega128에 송신용 센서와 수신용 센서를 연결하여 센서들끼리 신호를 주고 받는 것을 LCD에 거리값으로 표현한다.

#include <avr/io.h>

#include "lcd_portd.h"

#include "UART0_printf.h"

#include <stdio.h>

#define F_CPU 16000000UL  // 16 MHz

#include <util/delay.h>

#define Trigger_1       {PORTD|=1;   PORTF|=1; } //초음파 트리거

#define Trigger_0       {PORTD&=~1;  PORTF&=~1;} //초음파 트리거

#define Echo            (PIND&2) //초음파 에코

//

unsigned int range=0,count=0;

char srange[100];

//

void getEcho(void)

{

while(!Echo);                 // high가 될때까지 대기 //

TCNT1=0; TCCR1B=2;        // 카운터 시작, 8분주 = 0.5us //

while(Echo);                 // low가 될때까지 대기 //

TCCR1B=8;                  // 카운터 정지 //

range=TCNT1/58;            // Cm로 변경 //

}

int main(void)

{

DDRD=1; DDRF=1; DDRB=1;

int k=0;                      // PC0 ouput Trigger, PC1 input Echo

lcd_init(); // lcd 리셋

TCCR1A=0; TCCR1B=8;       // CTC mode

TIMSK=0b00000001;

TCCR0=0b00000101;

Usart0_init();

lf();

lf();

lcd_clear();

while(1)

{

Trigger_1; _delay_us(10); Trigger_0;    // 10uS

getEcho(); _delay_ms(10);

if((count%70)==0) sprintf(srange,"%04d",range);

Gotoxy(0,0);

lcd_str(srange);

}

}

○실험 시나리오(2)

ATmega128에 송신용 센서 1개와 수신용 센서 2개를 연결한다. 수신용 센서가 받은 각 거리값을 측정하 센서에 도달한 신호의 거리차를 계산한다. 거리값 2개와 그 거리차 LCD에 표현한다.

#include <avr/io.h>

#include "lcd_portd.h"

#include "UART0_printf.h"

#include <stdio.h>

#define F_CPU 16000000UL  // 16 MHz

#include <util/delay.h>

#define Trigger_1       {PORTD|=1;  PORTB|=1;  PORTF|=1; } //초음파 트리거

#define Trigger_0       {PORTD&=~1; PORTB&=~1; PORTF&=~1;} //초음파 트리거

#define Echo1           (PIND&2) //초음파 에코

#define Echo2           (PINB&2) //초음파 에코

//

unsigned int range1=0,range2=0,range3=0,count=0;

char srange[100];

//

ISR(TIMER0_OVF_vect)

{

TCNT0=131;	count++;

if(count>=100) count=0;

}

void getEcho(void)

{

while(!Echo1);                  // high가 될때까지 대기 //

TCNT1=0; TCCR1B=2;          // 카운터 시작, 8분주 = 0.5us //

range1=0; range2=0;

while((Echo1)||(Echo2))         // low가 될때까지 대기 //

{

while((!Echo1)&&(range1==0)) range1=TCNT1/58;

while((!Echo2)&&(range2==0)) range2=TCNT1/58;

}

TCCR1B=8;                   // 카운터 정지 //

if(range1==0) range1=TCNT1/58;

if(range2==0) range2=TCNT1/58;

}

int main(void)

{

DDRD=1; DDRF=1; DDRB=1;

int k=0;                      // PC0 ouput Trigger, PC1 input Echo

lcd_init(); // lcd 리셋

TCCR1A=0; TCCR1B=8;        // CTC mode

TIMSK=0b00000001;

TCCR0=0b00000101;

Usart0_init();

lf();

lf();

lcd_clear();

while(1)

{

k++;;

if(k>100) {Trigger_1; _delay_us(10); Trigger_0; getEcho(); _delay_ms(10); k=0;}

if(range1>range2) range3=range1-range2;

else range3=range2-range1;

if((count%70)==0) sprintf(srange,"%04d %04d %04d",range1,range2,range3);

Gotoxy(0,0);

lcd_str(srange);

}

}

○실험3과 실험4에 사용할 리모컨 코드

실험3과 실험4에서는 무선으로 신호를 주고 받는 것을 목표로 한다. 아래의 코드는 ATmega8에 연결된 초음파 센서에서 신호를 발신하는 내용이다.

#include <avr/io.h>

#include "lcd_portd.h"

#include "UART0_printf.h"

#include <stdio.h>

#define F_CPU 16000000UL  // 16 MHz

#include <util/delay.h>

#include <avr/interrupt.h>

#define Trigger_1       PORTD|=1   //초음파 트리거

#define Trigger_0       PORTD&=~1 //초음파 트리거

#define Echo           (PIND&2)    //초음파 에코

int main(void)

{

DDRD=1;                    // PC0 ouput Trigger, PC1 input Echo

while(1)

{

Trigger_1; _delay_us(10); Trigger_0;    // 10uS

_delay_ms(20);

}

}

○실험 시나리오(3)

ATmega8에서 발신된 초음파센서 신호를 ATmega128에 연결된 초음파센서 2개가 받는다. 이때 신호가 받는 것을 확인하기 위해 LCD의 숫자값이 변하는지 관측한다. 만약 신호를 받는다면 수신부의 두 센서가 신호를 받는 거리를 측정한다. 하지만 서로 다른 MCU에서 만든 신호이므로 신호가 발사된 시점을 알 수 없다. 이는 거리값이 정확하지 않다는 것을 의미한다. 따라서 거리값이 아닌 두 신호의 거리차를 계산하기로 한다. 수신부 센서가 측정한 거리차를 이용하여 송신부 센서가 어느쪽으로 치우쳐 있는지 파악한다.

#include <avr/io.h>

#include "lcd_portd.h"

#include "UART0_printf.h"

#include <stdio.h>

#define F_CPU 16000000UL  // 16 MHz

#include <util/delay.h>

#define Trigger_1       {PORTD|=1;  PORTB|=1; }   //초음파 트리거

#define Trigger_0       {PORTD&=~1; PORTB&=~1;} //초음파 트리거

#define Echo1           (PIND&2) //초음파 에코

#define Echo2           (PINB&2) //초음파 에코

//

unsigned int range1=0,range2=0,range3=0,count=0,mode=0;

char srange[100];

//

ISR(TIMER0_OVF_vect)

{

TCNT0=131;	count++;

if(count>=100) count=0;

}

void getEcho(void)

{

while(!Echo1);               // high가 될때까지 대기 //

TCNT1=0; TCCR1B=2;       // 카운터 시작, 8분주 = 0.5us //

range1=0; range2=0;

while((Echo1)||(Echo2))       // low가 될때까지 대기 //

{

while((!Echo1)&&(range1==0)) range1=TCNT1/58;

while((!Echo2)&&(range2==0)) range2=TCNT1/58;

}

TCCR1B=8;                 // 카운터 정지 //

if(range1==0) range1=TCNT1/58;

if(range2==0) range2=TCNT1/58;

}

int main(void)

{

DDRD=1; DDRB=1;

int k=0,s=0,t=0;               // PC0 ouput Trigger, PC1 input Echo

lcd_init(); // lcd 리셋

TCCR1A=0; TCCR1B=8;       // CTC mode

TIMSK=0b00000001;

TCCR0=0b00000101;

Usart0_init();

lf();

lf();

lcd_clear();

while(1)

{

k++;;

if(k>100) {Trigger_1; _delay_us(10); Trigger_0; getEcho(); k=0;}

if(range1>range2) range3=range1-range2;

else range3=range2-range1;

if((count%70)==0) sprintf(srange,"%04d %04d %04d",range1,range2,range3);

Gotoxy(0,0);

lcd_str(srange);

}

}

○실험 시나리오(4)

실험 시나리오(3)만으로는 발신부와의 거리를 알 수 없다. 따라서 수신부에 거리를 계측하기 위한 SRF05를 추가하고 발신부와의 거리를 측정한다. 이 때 다른 센서들과의 신호 충돌이 없는지 확인한다.

#include <avr/io.h>

#include "lcd_portd.h"

#include "UART0_printf.h"

#include <stdio.h>

#define F_CPU 16000000UL  // 16 MHz

#include <util/delay.h>

#define Trigger_1       {PORTD|=1;  PORTB|=1; }   //초음파 트리거

#define Trigger_0       {PORTD&=~1; PORTB&=~1;} //초음파 트리거

#define Trigger_11      {PORTF|=1; } //초음파 트리거 장애물

#define Trigger_00      {PORTF&=~1;} //초음파 트리거 장애물

#define Echo1           (PIND&2) //초음파 에코

#define Echo2           (PINB&2) //초음파 에코

#define Echo3           (PINF&2) //초음파 에코 장애물

//

unsigned int range1=0,range2=0,range3=0,range4=0,count=0,mode=0,mo=0;

char srange[100],srange1[100];

//

ISR(TIMER0_OVF_vect)

{

TCNT0=131;	count++;

if(count>=100) count=0;

}

void getEcho(void)

{

if(mo==0)

{

while(!Echo1);               // high가 될때까지 대기 //

TCNT1=0; TCCR1B=2;       // 카운터 시작, 8분주 = 0.5us //

range1=0; range2=0;

while((Echo1)||(Echo2))       // low가 될때까지 대기 //

{

while((!Echo1)&&(range1==0)) range1=TCNT1/58;

while((!Echo2)&&(range2==0)) range2=TCNT1/58;

}

TCCR1B=8;                 // 카운터 정지 //

if(range1==0) range1=TCNT1/58;

if(range2==0) range2=TCNT1/58;

}

if(mo==1)

{

while(!Echo3);               // high가 될때까지 대기 //

TCNT1=0; TCCR1B=2        // 카운터 시작, 8분주 = 0.5us //

while(Echo3);               // low가 될때까지 대기 //

TCCR1B=8;                 // 카운터 정지 //

range4=TCNT1/116;         // Cm로 변경 //

}

}

int main(void)

{

DDRD=1; DDRB=1; DDRE=1;

DDRA=0xff; DDRF=1;

int k=0,s=0,t=0,i=0;                // PC0 ouput Trigger, PC1 input Echo

lcd_init(); // lcd 리셋

TCCR1A=0; TCCR1B=8;           // CTC mode

TIMSK=0b00000001;

TCCR0=0b00000101;

Usart0_init();

lf();

lf();

lcd_clear();

while(1)

{

k++;

if(k>100) {mo=0; Trigger_1; _delay_us(10); Trigger_0; getEcho(); k=0; i=1;}

if(range1>=range2) range3=range1-range2;

if(range1<range2) range3=range2-range1;

if(i==1)

{

if((range1<1000)&&(range2<1000))

{mo=1; Trigger_11; _delay_us(10); Trigger_00; getEcho();}

i=0;

}

if((count%70)==0) sprintf(srange,"%04d %04d ",range1,range2);

if((count%70)==0) sprintf(srange1,"%04d %04d",range3,range4);

Gotoxy(0,0);

lcd_str(srange);

Gotoxy(0,1);

lcd_str(srange1);

}

}

○ 모터 제어 방법에 대한 메커니즘

(1) 모터 2개에 대한 Duty 비를 결정할 필요가 있다. Duty 비를 20등분하여 각 모터에 대한 변수를 설정한다. 거리 측정용 센서로 측정한 거리가 0~1m이면 Duty 비에 대한 변수를 0, 1~1.3m 거리 내에 있으면 +5, 1.3~1.6m 거리 내에 있으면 +10, 1.6~2m 거리 내에 있으면 +15의 값을 부여한다. 그리고 각 모터에 대한 변수를 (L, R)이라 설정한다.

(2) 리모컨의 신호를 받은 두 방향 센서가 각각 측정한 거리값의 차를 구한다. 거리차의 범위에 따라 구간을 나누어 특정한 변수 x를 부여한다. 수신방향에 따라 좌우 모터의 변수 부호를 다르게 설정한다.

(3) (1), (2)의 과정에서 구한 값을 더한다.

○ 모터 제어 방법에 대한 예시

(1) 메커니즘(3)에서 구한 값을 모터 제어 할 때의 Duty 비로 이용한다. 예를 들어 리모컨이 왼쪽으로 치우쳐 있어서 (x1, x2)=(+2, -2)의 값을 받았다고 가정한다. 그리고 카트와 사람의 거리가 1.5m 떨어져 있다고 가정하면 (L, R)=(+10, +10)의 값을 받는다. 두 값을 더하면 (+12, +8)이 되는데 이 값을 두 모터의 Duty 비에 대한 변수로 각각 활용하면 리모컨이 있는 방향으로 주행을 한다.

(2) 카트와 사람의 거리가 0.5m라면 (0,0)을 받고, 방향 센서가 측정한 값이 (+2, -2)를 받는다. 두 값을 더하면 (+2, -2)가 나오는데 마이너스 값은 모터의 역주행을 의미한다. 각 모터에 대한 변수값이 부호만 다르고 크기는 같으므로 한 모터는 정회전, 나머지 모터는 역회전을 한다. 따라서 카트는 제자리에서 회전하는 경우가 된다.

○ 센서를 이용한 모터 주행에 대한 프로그램 코드

#include <avr/io.h>

#include "lcd_portd.h"

#include "UART0_printf.h"

#include <stdio.h>

#define F_CPU 16000000UL  // 16 MHz

#include <util/delay.h>

#define Trigger_1       {PORTD|=1;  PORTB|=1; } //초음파 트리거

#define Trigger_0       {PORTD&=~1; PORTB&=~1;} //초음파 트리거

#define Trigger_11       {PORTF|=1; } //초음파 트리거 장애물

#define Trigger_00       {PORTF&=~1;} //초음파 트리거 장애물

#define Echo1            (PIND&2) //초음파 에코

#define Echo2            (PINB&2) //초음파 에코

#define Echo3            (PINF&2) //초음파 에코 장애물

//

unsigned int range1=0,range2=0,range3=0,range4=0,count=0,mode=0,mo=0;

char srange[100],srange1[100];

//

ISR(TIMER0_OVF_vect)

{

TCNT0=131;   count++;

if(count>=80) count=0;

}

void getEcho(void)

{

if(mo==0)

{

while(!Echo1);               // high가 될때까지 대기 //

TCNT1=0; TCCR1B=2;          // 카운터 시작, 8분주 = 0.5us //

range1=0; range2=0;

while((Echo1)||(Echo2))   // low가 될때까지 대기 //

{

while((!Echo1)&&(range1==0)) range1=TCNT1/58;

//Echo1 신호를 받고 range1이 0이면 거리 계산

while((!Echo2)&&(range2==0)) range2=TCNT1/58;

//Echo2 신호를 받고 range2이 0이면 거리 계산

}

TCCR1B=8;                 // 카운터 정지 //

if(range1==0) range1=TCNT1/58;

if(range2==0) range2=TCNT1/58;

}

if(mo==1)

{

while(!Echo3);               // high가 될때까지 대기 //

TCNT1=0; TCCR1B=2;         // 카운터 시작, 8분주 = 0.5us //

while(Echo3);                // low가 될때까지 대기 //

TCCR1B=8;                   // 카운터 정지 //

range4=TCNT1/116;            // Cm로 변경 //

}

}

int main(void)

{

DDRD=1; DDRB=1; DDRF=1;

DDRA=0xff; DDRE=0xff;

int k=0,s=0,t=0,i=0,y=0;            // PC0 ouput Trigger, PC1 input Echo

lcd_init(); // lcd 리셋

TCCR1A=0; TCCR1B=8;           // CTC mode

TIMSK=0b00000001;

TCCR0=0b00000101;

Usart0_init();

lf();

lf();

lcd_clear();

while(1)

{

k++;

if(k>100) {mo=0; Trigger_1; _delay_us(10); Trigger_0; getEcho(); k=0; i=1;}

if(range1>=range2) range3=range1-range2;

if(range1<range2) range3=range2-range1;

if(i==1)

{

if((range1<1000)&&(range2<1000)) {mo=1; Trigger_11;

_delay_us(10); Trigger_00; getEcho();}

i=0;

}

t=0; y=0;

if(range4<=100) {t=0; y=0;}

if(range4>100) {t=5; y=5;}

if(range4>130) {t=10; y=10;}

if(range4>160) {t=15; y=15;}

if(range1>range2)

{

if(range3<=5){t=t+1; y=y-1;}

if(5<range3<=10){t=t+2; y=y-2;}

if(10<range3<=15){t=t+3; y=y-3;}

if(15<range3<=20){t=t+4; y=y-4;}

}

if(range1<range2)

{

if(range3<=5){t=t-1; y=y+1;}

if(5<range3<=10){t=t-2; y=y+2;}

if(10<range3<=15){t=t-3; y=y+3;}

if(15<range3<=20){t=t-4; y=y+4;}

}

if((t>=0)&&(y>=0)) mode=0;

if((t>=0)&&(y<0)) mode=1; y=abs(y);

if((t<0)&&(y>=0)) mode=2; t=abs(t);

if(mode==0)

{

if((count%k)<t)PORTA = 0b00001001; //_delay_ms(20); // on

if((count%k)>=t)PORTA = 0b00000000; //_delay_ms(10); // off

if((count%k)<y)PORTE = 0b00001101; //_delay_ms(20); // on

if((count%k)>=y)PORTE = 0b00000000; //_delay_ms(10); // off

}

if(mode==1)

{

if((count%k)<t)PORTA = 0b00001101; //_delay_ms(20); // on

if((count%k)>=t)PORTA = 0b00000000; //_delay_ms(10); // off

if((count%k)<y)PORTE = 0b00001101; //_delay_ms(20); // on

if((count%k)>=y)PORTE = 0b00000000; //_delay_ms(10); // off

}

if(mode==2)

{

if((count%k)<t)PORTA = 0b00001001; //_delay_ms(20); // on

if((count%k)>=t)PORTA = 0b00000000; //_delay_ms(10); // off

if((count%k)<y)PORTE = 0b00001001; //_delay_ms(20); // on

if((count%k)>=y)PORTE = 0b00000000; //_delay_ms(10); // off

}

if((count%70)==0) sprintf(srange,"%04d %04d ",range1,range2);

if((count%70)==0) sprintf(srange1,"%04d %04d",range3,range4);

Gotoxy(0,0);

lcd_str(srange);

Gotoxy(0,1);

lcd_str(srange1);

}

}

제5장 시험 및 평가

5장 3절의 실험 시나리오 4에서 얻은 거리값과 수신용 센서에 도달한 신호의 거리차를 이용하여 모터를 2개 제어한다. 센서의 사용법이 일부 변형되어 그 사용법이 타당한지 확인할 필요가 있다. 그리고 송신되는 신호가 2가지가 있는데 이 신호끼리 간섭이 있는지 확인하여야 한다.

평가 항목	시험 방법	결과
거리 측정용 센서의 거리값	LCD의 측정값과 자를 이용하여 비교	3~30cm까지 연속적으로 미미한 오차가 발생 목표로 하는 2m까지 대략적인 측정은 가능하다고 예상
리모컨과 수신용 센서 간의 좌우 감지 범위	LCD의 값이 급격히 변화하는 각도를 측정	수신용 센서를 기준으로 좌우 30°
리모컨과 수신용 센서 간의 상하 감지 범위	LCD의 값이 급격히 변화하는 각도를 측정	수신용 센서를 기준으로 상하 15°
카트의 거리 측정 센서와 리모컨의 발신용 센서의 신호 충돌 여부	거리 측정용 센서와 리모컨의 신호를 받는 센서를 각각 사용할 때와 같이 사용할 때의 값을 비교	모든 센서들을 같이 사용하는 것에 의해 LCD의 측정값이 급격히 변하는 것은 없었다.
모터 제어의 정밀성	두 수신용 센서가 받는 거리값의 차이와 거리 측정 센서의 거리값을 이용하여 모터 제어	좌우 이동 방향과 주행 여부를 결정할 수 있는 가능성 확인

제6장 결론

제1절 문제점 분석

방향의 치우침을 나타내는 변수값이 안정적이지 않고 튀는 문제가 발생하였다. 리모컨과 수신부 센서가 마주 보는 각도가 어긋나면 측정 변수값이 변하는 문제점이 있었다. 또한 리모컨의 치우침을 신호의 도달 시간차를 이용하여 거리값으로 표현하였지만, 이것은 임의의 값이며 각도로 변환하는 것이 불가능했다.

거리 측정 센서는 측정 대상을 지정하는 것이 불가능하다는 문제점이 있다. 방향 제어가 정확하다면 거리 측정 센서가 측정자 혹은 리모컨을 측정하도록 유도할 수 있다. 하지만 방향 제어에서 오차가 생겨서 카트가 항상 사용자를 향하지 못할 수 있다. 이로 인해 거리 측정 센서는 사용자나 리모컨이 아닌 다른 장애물을 인지하여 우리가 원하는 거리 측정값을 구하지 못한다.

또한 사용자나 리모컨을 측정하더라도 사용자와 리모컨 사이의 거리차 또한 오차의 원인이 될 수 있다.

센서의 사용 방법에 대한 가능성은 어느 정도 입증하였으므로 모터 주행에 관한 경우의 수를 생각하고, 기구부에 적용하면서 시행착오를 겪어야 한다. 하지만 모터 실험을 하는 도중에 모터 드라이버의 퓨즈가 타버리는 문제가 발생하였다. 모터의 성능보다 허용 가능한 전력이 높은 제품을 사용하였고 전류가 흐르고 있는 동안에도 문제가 발생하지 않아 예상하지 못하였다. 사용이 끝나고 드라이버에 연결된 선을 뺄 때 퓨즈가 타버렸는데, 드라이버 하나가 사용 불가능해지면서 일정에 차질이 발생하였다. 모터 제어 일정이 늦춰지면서 기구부에 적용하여 주행에 관한 시행착오를 겪는 일정이 늦어졌다.

그러나 기구부가 완성이 된 상태이고, 카트가 리모컨을 따라올 가능성에 대한 검토도 완료가 된 상태이다. 따라서 모터 드라이버를 수리 혹은 재구매하면 모터 제어와 관련된 프로그램을 만들고 시제품에 적용할 수 있다.

제2절 제작비

품목	개수	가격(원)
모터 (S9D60-12)	2	227,260
모터 브라켓 (SPL-9SA)	2	36.300
모터 드라이버 (NT-DC20A)	2	143,000
배터리 (SLD 18-12)	1	39,600
초음파센서 (SRF-05)	4	134,200
Atemega128 보드 (KD-128PRO-C)	1	82,500
소켓 점퍼 케이블 (CH254)	2	17,460
프로파일 (30X30L) 6m	2	125,950
볼트/너트	200
브라켓	50
우레탄 바퀴 (2.5 inch)	2
알루미늄 판재 (A5052)	1	55,770
소형 모터 샤프트	2	66,000
총액		928,040

첫 가격조사에서는 제작 비용으로 70만원대를 예상하였다. 정량적 목표에 맞는 부품만을 고려하여 선정하느라 DIR, STOP과 같은 기능은 고려하지 않았다. 모터 제어에 요구되는 기능을 고려하여 부품을 선정 하는 과정에서 드라이버의 가격이 증가 하였다. 또한 케이블, 볼트, 너트와 같은 부속품들을 추가적으로 구매하면서 예상보다 가격이 증가하였다. 기존에 선별을 끝낸 부품들도 일부는 발주 과정에서 문제가 발생하였다. 발주에 요구되는 서류를 받을 수 없는 업체들이 몇몇 있었는데 가격은 더 저렴할지도 모르나 제조사 혹은 판매사에 대한 신뢰성이 떨어진다 생각하여 발주 업체를 변경하였다. 이러한 시행 착오를 겪으면서 예상보다 23만원 가량 제작 비용이 증가하였다.

제3절 총평

목표 선정에서 깊이 있는 검토가 이루어지지 않아 목적을 달성하지 못한 항목이 있다. 그 중 하나는 중량인데 목표 중량 20kg을 이루기 위한 과정 중 하나가 판재 두께에 관한 해석이었다. 초기에는 판재의 두께를 2mm로 예상하였으나 1mm로 변경되면서 7kg가량 중량을 줄일 수 있었다. 그러나 모터, 배터리, 바퀴의 무게가 무겁고 쇼핑카트에서 모티브를 가져 온 큰 디자인 때문에 목표 중량을 초과하였다.

감지 범위와 거리 또한 모호하게 기술하여 센서에 관한 실험 결과를 평가하면서 기준을 새로 작성하여야 했다. 실험 결과에서 거리센서가 감지하는 거리, 리모컨과 수신용 센서끼리 신호를 주고받는 각도를 상하와 좌우로 나누어 검토하였다. 그 결과 측정 가능 거리는 약 2m, 리모컨 신호를 받을 수 있는 좌우 각도 30°로 초음파 센서가 가진 성능에서 크게 벗어나지 않았다. 하지만 상하 각도가 조금만 어긋나도 리모컨의 신호를 잘 받지 못하는 현상을 보였다. 이는 시제품에 수신용 센서를 부착할 때 고려해야 할 사항이 될 것이다.

정량적 목표를 무리하게 정하였거나 프로젝트 진행 과정에서 변수가 생겨서 목표를 만족시키지 못한 항목이 있다. 또한 개발 동기를 얻었던 마트에서의 활용 가능성 또한 미지수이다. 하지만 이 과제에서 가장 어려울 것이라 예상한 신호 추적과 관련된 요구 기능들에 대해 그 가능성을 입증하였다.

[참고문헌]

[1] 국가기술표준원, 2013, “안전‧품질표시대상 공산품 안전‧품질표시기준 개정 고시”, pp. 392, 394

[2] 박상철 외 3인, 2000, “Level up OrCAD", 성안당

[3] 나한근, 2007, “센서 응용기술”, 기전연구사

[4] 김종오 외 1인, 2014, “알기쉬운 최신 센서기술”, 복두출판사