CCD 센서의 각도에 따라 검출 가능한 거리가 멀어질수록 정확도가 떨어지게 됩니다. 센서에 상이 맺히기 때문에 근거리에서는 높은 해상도를 가지며 장거리에서는 낮은 해상도를 가지게 되겠습니다.
아래 그림은 3D Max를 이용하여 간단하게 설계하였습니다. 예전에 "3D Max 무작정 따라하기" 책을 통해서 한번 배워두니 두고두고 써먹네요. ㅎ
출력 결과 센서를 단단하게 고정 할 수 있었습니다.
현재 사용 중인 센서는 128 x 1 센서를 사용하고 있습니다. 픽셀 수가 얼마 안 되어 전체적인 sampling 속도가 빠릅니다 값을 shift 하며 하나씩 ADC로 읽어오게 됩니다. 분해능이 12bit이며 하나의 픽셀에 4096 값을 가지게 됩니다. 이 의미는 얼마 없는 픽셀을 통해서 세분화하여 레이저 거리를 추정할 수 있게 됩니다.
MPU 내부에 실수 연산자가 존재하지 않아 실수연산을 많이 하게 되면 전체적인 속도가 늦어지기 때문에 대부분 연산은 정수 연산을 사용하였고 최종 출력 때에만 형 변환을 통해 연산량을 줄이는 작업을 하였습니다.
마지막으로 제일 중요한 부분은 레이저 데이터의 선형화입니다.
여기서 말하는 선형화는 데이터 분포를 수치화하여 수식으로 표현하는 걸 말합니다.
표현된 수식을 통해 정확한 mm 로 표현해주는 작업을 말합니다.
1차원은 간단하게 가능하지만 2차원 센서에서는 고민해야 하는 부분이 많기 때문에 이 부분도 나중에 포스팅해보려고 노력하겠습니다.
아래의 그래프는 Calibration 과정입니다.
Calibration을 하는 이유는 아래 그림처럼 비선형 형태로 그래프가 나타나기 때문에 선형화 작업이 필요합니다.
Row값은 원본 값이며 와 Estimation 값은 거리 값을 넣어서 추정된 값 입니다. lookup Table 간격이 5cm 간격이며 대충 눈대중으로 값을 넣다 보니 오차가 많이 증가 했습니다. ㅠㅜ 나중에 다시 실험 해야겠습니다.
estimation 은 지수 형태를 가지게 되고 로그로 역수를 구하여 실제 거리값을 계산 할 수 있게됨니다.
실제 거리와 추정된 거리
최악의 오차 ㅋ
0에 수렴해야 최상 입니다.
제작 후기
틈틈이 실험하면서 Laser Distance Sensor를 제작할 수 있었습니다. 128개밖에 없는 Array CCD 사용하였고 12bit ADC를 통해 픽셀값을 읽어 내고 레이저 분포의 중심을 찾아내었습니다. 픽셀의 이동은 0~128의 정수를 갖지만, 레이저 분포의 중심을 찾게 되면 실수 값으로 나타낼 수 있습니다. 이후에 0~128.0의 값을 실제 거리 값으로 변환하는 과정으로 비선형 모델을 선형모델로 근사하여 실제 거리를 구합니다.
arm core를 통해서 구현하면서 사용하는 하드웨어의 사양을 고려하였습니다.
MPU 내부에 FPU가 없으므로 대부분 연산은 정수로 계산하였고 결과를 출력할 때 자릿수 이동을 통해 연산 속도를 개선하였습니다.
돈을 모아서 꼭 전기스쿠터를 만들어봐야겠다고 생각했지만 그때 당시 상상과 현실을 돈이 없다는 게 문제였습니다. ㅋ 고등학교 3학년 겨울 방학 때 알바를 열심히 뛰어서 자금을 마련 후 전기스쿠터 제작 프로젝트를 시작했었고 약 100 정도 들어갔던 기억이 듭니다.
아래의 사진은 그때 당시 전기스쿠터 몸체만 저렴하게 판매하는 링크를 통해 국내에서 약 30~40 정도에 구매하여 배터리, 컨트롤러, 전기배선을 구성하면 따로 용접 없이도 전기스쿠터를 창작할 수 있었습니다.
하지만 역경은 이때부터였습니다. 배터리를 저렴하고 가볍게 만들기 위해 납산 배터리 대신 니켈수소 배터리를 이용하여 자작 배터리를 만들기 시작했습니다. 배터리를 중고로 구매한 탓에 죽은 셀들이 몇몇 보였고 살아 있는 배터리를 선별하여 구성하였습니다.
아래의 사진과 같이 배선의 흔적을 보실 수 있을 겁니다. 절연의 개념이 그 당시에는 지식이 부족했기 때문에 나중에 문제가 터진 적도 있었죠. 문제는 충전 중에 폭발하는 문제가 있었지만 불나기 전에 수습할 수 있어서 정말 다행이었습니다.
당시 터졌을 때를 기억하자면 니켈수소 배터리는 충전 중 화학반응를 통해 배터리 발열이 발생합니다. 배터리 한 셀의 용량은 1.2v 4.3a 이였고 충전전압은 그 당시 1.5v 0.5a 로 충전가능하도록 납산 충전기를 개조하여 Feedback 저항값을 조정하면 전압과 전류를 컨트롤 하여 충전 하였지만 8시간 정도 충전중에 폭발 했습니다. 초기 충전때는 문제가 없었지만 방전 후 충전시 문제가 발생하였고 그때 당시에는 멘탈이 무너지고 원인을 분석하고 인터넷 검색을 통해 원인을 찾았습니다.
니켈수소는 충전중 화학반응을 통해 발열이 발생하고 발열에 따라 배터리 저항값이 변하기 때문에 위의 사진처럼 30개 직렬 36v를 만들어 사용하기에는 셀 불안정을 초래합니다. 그뿐만 아니라 중고 셀이기 때문에 그 위험이 더 증가하게 되고 충전 전류가 높았기 때문에 배터리 중심 부분은 열이 빠져나가지 못해 고르지 못한 전압이 분배되었고 실제로 폭발 이후 중심부에서부터 셀 폭발을 확인했습니다.
폭발을 방지하기 위해서는 중고 배터리를 구매하는 것보다는 새 배터리를 사용하는 것이 안정합니다. 또는 중고 배터리를 구매하더라도 개별로 구매하시지 말고 하나의 세트로 구매하는 것이 안전하다고 생각됩니다. (니켈 말고도 모든 배터리 내에서)
배터리 분해하여 재활용하는 것도 위험하겠죠? ㅋ
그래도 저렴하게 사용해야겠다고 생각이 드신다면 연속적으로 충전하는 것보다 충전 중 일정 주기로 쉬었다 충전하는 방법이 안전하겠습니다.
참고로 일반적인 배터리보다 큰 배터리여서 그런지 폭발력도 배가 되었습니다. 배터리 제작하시는 분은 충분히 공부하시고 조심하세요.
휴즈 대신 차단기를 이용하여 간혈적으로 휴즈가 나갈 때 난감함을 해결해 주었습니다.
실제로 휴즈가 없었다면 위험한 상황이 있었습니다. 모터 정지상태에서 무리한 출력 때문에 컨트롤러 내부 Mosfet 이 터지면서 접점이 돼버리는 상황이 있었습니다. 이 때문에 풀로드 상태로 모터가 달려가려 했지만 차단기 덕분에 살았던 기억이 있습니다. ㅋ
버튼 기능은 속도제한 기능합니다. 현제 컨트롤러에 사용되는 액셀레이터는 가변저항값을 통해 속도를 조절합니다. 저항값을 제안 한다면 처음 타는 사람에게 안전하게 승차 할 수 있을 것 입니다. (글쓴이의 악셀레이터는 홀 센서였습니다.)
36v 1000W 모터를 듀얼로 구성하여 강력한 주행 성능을 발휘합니다.
모터 분리 후 모터에 대해 탐구한 사진입니다. 1kw 이어서 그런지 페라이트 자석에도 불구하고 강력한 자력을 가졌습니다.
아래의 사진은 유압 브레이크입니다. 디스크와 브레이크의 마찰이 있어 분해하였고 어떻게 브레이크가 이루어지는지 보았습니다.
간단하게 유압 브레이크 액셀은 지렛대 역할을 하는 작은 펌프이고 작은 펌프가 큰 펌프를 지속적으로 밀어내어 큰 힘을 내는 원리입니다.
2개의 큰 펌프 내에는 고무링이 들어가 있으며 브레이크액을 통해 부드럽게 동작합니다. (발가락은 애교로 넘어가 주세요. ㅋ)
전기스쿠터 1호
전기스쿠터 2호 1학년 대학생 시절 때입니다. 기계공학과로 착각하실 수 있으시겠지만 임베디드 소프트웨어 전공입니다.