ESC와 서보 라이브러리 연동 원리 설명
원본 영상 20:07드론 모터 제어를 위해 서보 모터 제어 라이브러리를 활용합니다. 이 라이브러리가 브러시리스 모터 제어 원리와 호환된다는 점을 확인했으며, 신호선은 9번 핀을 사용하도록 설정합니다. 이는 서보 모터 제어 방식과 브러시리스 모터 제어 방식이 동일한 원리를 공유하기 때문에 가능합니다.
서보 라이브러리로 드론 모터를 제어하는 과정에서 다양한 제어 방식과 RPM 측정 시도가 있었으나, 센서 한계로 측정 난관에 부딪혔습니다.
이 채널 새 영상도 이렇게 정리해 드릴까요?
드론 모터 제어를 위해 서보 모터 제어 라이브러리를 활용합니다. 이 라이브러리가 브러시리스 모터 제어 원리와 호환된다는 점을 확인했으며, 신호선은 9번 핀을 사용하도록 설정합니다. 이는 서보 모터 제어 방식과 브러시리스 모터 제어 방식이 동일한 원리를 공유하기 때문에 가능합니다.
브러시리스 모터를 사용하기 위해서는 천(1000)과 이천(2000) 값을 설정해야 합니다. 이 값들이 왜 사용되는지에 대한 상세한 원리는 명확히 설명되지 않았으며, '나도 모른다'는 답변과 함께 해당 값들의 적용을 안내했습니다.
모터의 속도 값은 0에서 180 사이로 설정할 수 있지만, 안전을 위해 60까지만 제한하기로 결정했습니다. 너무 높은 속도는 위험할 수 있으며, 전기 소모량이 많아질 수 있기 때문입니다. 이는 실험자의 안전을 고려한 조치입니다.
시리얼 모니터를 통해 모터 시동 테스트를 진행했습니다. 0을 입력하면 모터가 멈추고, 1을 입력하면 10의 속도로 회전하도록 설정했습니다. ESC의 부팅 시간을 고려하여 1~2초의 딜레이를 추가했으며, 시리얼 통신을 통해 모터가 의도대로 작동하는지 확인했습니다. 이 테스트는 코드의 기본 동작을 검증하는 중요한 단계였습니다.
가상의 드론 시동 제어 커맨드가 구현되었습니다. 's'를 입력하면 모터가 기본적인 속도로 회전을 시작하여 시동이 걸리고, '+'를 입력하면 속도가 증가하며, '-'를 입력하면 속도가 감소합니다. 'e'를 입력하면 시동이 꺼지는 개념으로 작동합니다. 이를 위해 시동 상태를 확인하는 boolean 변수를 사용했으며, 시동이 걸린 상태에서만 속도 조절이 가능하도록 로직을 설계했습니다. 이 방식은 사용자가 직관적으로 드론을 제어하는 가상 환경을 제공합니다. 시동 여부를 판단하는 변수는 예상치 못한 오작동을 방지하는 데 중요한 역할을 합니다.
아두이노의 메인 루프는 사람의 눈보다 훨씬 빠르게 동작하므로, 버튼을 한 번 눌러도 여러 번 인식되는 문제가 발생합니다. 이러한 현상은 접점 두 개가 가까워지면서 번개처럼 여러 번 신호가 발생하기 때문입니다. 이를 해결하기 위해 약 200밀리초의 짧은 지연 시간을 적용하는 디바운싱(debouncing) 처리를 통해 버튼 인식이 안정화되었습니다.
버튼을 이용한 모터 시동 및 속도 제어 테스트를 진행했습니다. 시동 버튼을 누르면 모터가 대기 상태로 진입하여 드론이 날아갈 준비를 합니다. 이어서 속도 조절 버튼을 눌러 모터의 회전 속도를 수동으로 제어하고, 실제 모터의 회전 변화를 확인했습니다. 이 과정에서 버튼 입력에 따른 모터의 반응을 검증했습니다.
향후 연구 계획으로 로드셀을 이용한 정밀한 추력 측정을 준비 중입니다. 드론 모터를 로드셀 위에 올려놓고 회전 속도에 따른 추진력을 측정하여, 시리얼 플로터를 이용해 그래프로 시각화할 예정입니다. 이를 통해 드론 모터의 성능을 객관적으로 분석하고 벤치마크 데이터를 확보할 계획입니다.
기존 버튼 방식의 속도 제어를 가변저항 방식으로 변경했습니다. 특히 슬라이드형 가변저항이 조작감을 높일 것이라고 판단했습니다. 가변저항은 아날로그 입력 A0 핀에 연결하여, 저항값의 변화에 따라 모터 속도를 제어하도록 설계되었습니다. 이를 통해 보다 직관적이고 미세한 속도 조절이 가능해졌습니다.
가변저항을 통해 입력되는 아날로그 값(0~1023)을 모터 제어에 적합한 범위(0~60)로 매핑하기 위해 map 함수를 사용했습니다. 이 함수는 입력 범위에 비례하여 출력 값을 결정하며, 퍼센트 페이지 방식으로 비율을 조정하여 정확한 모터 속도 제어를 가능하게 합니다. 이를 통해 가변저항의 물리적인 움직임이 실제 모터 속도에 비례하도록 했습니다.
가변저항 값이 너무 낮을 때 모터가 시동이 꺼지는 현상을 방지하기 위해, 모터 파워의 하한값을 10으로 고정했습니다. 이는 현재 가변저항 값이 10보다 낮을 경우에도 모터가 완전히 멈추지 않고 최소한의 속도로 회전하도록 하여 안정성을 확보합니다. 미래에 발생할 수 있는 잠재적 오류를 예측하여 코딩에 반영한 것입니다.
모터 제어 시스템에 온오프 버튼을 도입한 것이 '신의 한 수'였다고 평가했습니다. 가변저항만으로 모터를 제어할 경우, 가변저항 값에 오류가 발생하면 모터가 갑자기 풀 파워로 돌아버릴 위험이 있기 때문입니다. 온오프 버튼은 이러한 의도치 않은 작동을 방지하여 시스템의 안전성을 크게 향상시켰습니다. 우연히 구현한 기능이지만, 그 중요성이 재평가된 사례입니다.
모터 제어 방식을 조이스틱으로 변경했습니다. 기존의 전역 변수 '파워'를 '펜 스피드(Fan Speed)'로 변경하여, 조이스틱의 위치에 따라 속도를 증감하도록 설계했습니다. 조이스틱을 활용함으로써 절대적인 값 제어의 한계를 벗어나, 사용자가 더욱 동적으로 속도를 조절할 수 있는 기반을 마련했습니다. 시동이 걸렸을 때는 펜 스피드 10, 꺼졌을 때는 0으로 초기화됩니다.
모터 속도 변화의 부드러움을 위해 100ms의 딜레이를 추가하기로 결정했습니다. 속도가 급격하게 변하는 대신 점진적으로 올라가도록 하여 조작감을 향상시키기 위함입니다. 프로펠러 크기와 관련된 안전 문제도 고려했으며, 시청자 의견을 반영하여 루프 반복 제어에 딜레이를 적용함으로써 부드러운 속도 조절이 가능하도록 했습니다.
인터럽트 기능을 활용하여 모터 RPM(분당회전수) 측정을 시도했습니다. 적외선 근접 센서의 원리는 발광부에서 나가는 광선이 프로펠러 날개에 반사되어 돌아오는 것을 수광부가 감지하는 것입니다. 이 센서가 날개의 통과를 '있다'와 '없다' 신호로 변환하면 펄스가 생성됩니다. attachInterrupt 함수를 사용하여 신호가 발생할 때마다 카운트를 증가시키는 로직을 설계했습니다. 이를 통해 모터의 회전 수를 직접 측정하려는 목적이 있었습니다.
메인 함수와 인터럽트 함수가 변수를 공유할 때 'volatile' 키워드의 사용이 필요합니다. 이 키워드를 변수 이름 앞에 명시적으로 붙여야 컴파일러가 해당 변수를 최적화 과정에서 임의로 변경하지 않고, 메인 함수와 인터럽트 함수 모두에서 올바르게 접근하고 업데이트할 수 있도록 합니다. 이는 변수 공유 시 발생할 수 있는 문제를 방지하기 위함입니다.
실제 RPM 측정 결과, 예상과 달리 센서 노이즈로 인해 불규칙한 카운트 현상이 발생했습니다. 프로펠러가 한 번 지나갔음에도 불구하고 30과 같은 높은 값이 측정되는 문제가 나타났습니다. 이는 센서의 감도가 너무 예민하여 짧은 시간 안에 여러 번 신호를 인식하는 데서 비롯된 것으로 보입니다. 디바운싱과 유사하게 너무 짧은 시간에 호출되는 신호는 무시하는 필터링 기법이 필요하다는 결론에 도달했습니다.
적외선 센서를 이용한 프로펠러 속도 측정 시 항상 실제보다 2배 높은 수치가 측정되는 이상 현상이 발생했습니다. 프로펠러가 한 번 회전할 때 센서 카운트가 2회 발생하는 것으로 파악되었습니다. 이는 기기 자체의 문제이거나 센서 인식 방식의 특성으로 추정되며, 최종 결과 도출 시 측정된 카운터 값을 2로 나누어 보정하는 전략을 수립했습니다.
1밀리초(1000분의 1초) 이내의 신호 변화를 무시하도록 설정하여 노이즈 필터링을 시도했습니다. 이 로직은 모터가 아무리 빠르게 회전하더라도 1밀리초가 경과해야 한 번 호출되도록 만듭니다. 이로 인해 이론상 1초에 최대 1,000번의 호출만 가능하며, 이는 초당 500회전(30,000 RPM)이 측정 가능한 상한선으로 설정되는 결과를 가져왔습니다.
모터 속도가 올라갈수록 측정값이 증가하다가 특정 단계(14단계) 이후 급감하는 현상이 발견되었습니다. 고속 회전 시 적외선 근접 센서가 프로펠러 날개를 '항상 있는 상태'로 인식하기 때문입니다. 이러한 결과로 드론 모터의 RPM 측정에 적외선 센서는 부적합하다는 결론에 도달했습니다. 즉, 센서의 물리적인 한계로 인해 고속 회전을 정확히 감지할 수 없었습니다.
센서 오작동 원인 규명을 위해 원시 데이터 모니터링 테스트를 실시할 예정입니다. 인터럽트 기능 대신 2번 핀의 디지털 상태를 1밀리초 간격으로 미친 듯이 빠르게 출력하여 비교할 계획입니다. 이를 통해 모터가 천천히 돌 때와 빠르게 돌 때의 펄스 변화를 직접 관찰하여, 고속 회전 시 감지가 누락되는 상황을 코드적으로 증명하려 합니다. 이러한 테스트는 문제의 근본 원인을 파악하는 데 중점을 둡니다.
향후 RPM 측정 방법과 추진력 측정 방법을 개발하고, 이를 기반으로 그래프를 자동으로 그리는 기능을 추가할 예정입니다. 모터의 속도를 자동으로 올리면서 데이터를 수집하여, 해당 모터에 대한 벤치마크 데이터를 확보하는 것이 목표입니다. 이 데이터를 통해 모터의 성능을 평가하고, A4 용지로 리포트를 출력하는 기능을 구현할 계획입니다.
신호 처리의 중요성을 강조하며, 시간 영역(Time domain)의 데이터를 주파수 영역(Frequency domain)으로 변환하는 푸리에 변환(FFT)에 대해 언급했습니다. 소리 분석은 주파수 영역에서 이루어져야 하며, C# 환경에서 이를 구현할 수 있는 방법을 가지고 있다고 밝혔습니다. 이는 원하는 결과를 반드시 구현할 수 있으며, 불가능한 것은 없다는 자신감을 내비친 것입니다. 현재의 지식 한계를 인정하면서도 기술적 가능성을 시사했습니다.
자막에서 근거가 되는 대목을 찾아 답합니다.
이 채널 새 영상도 이렇게 정리해 드릴까요?
심심한녹칸다에 새 영상이 올라오면, 방금 읽으신 것처럼 정리해서 메일로 보내 드릴게요.
숏츠는 빼고 보내 드려요. 메일이 필요 없어지면 언제든 구독을 끄실 수 있어요.