아두이노 드론
-
쿼드콥터 (Quadcopter)
[ZMR250] 7. 코드 최적화
지금까지 제어한 코드의 경우 loop()함수를 4ms 의 주기로 계산 및 제어하였다. 다음 목표인 플립을 구현하기 위해 조금 더 빠르고 높은 주기로 계산하기 위해 코드를 수정했다. 우선 드론에 전원을 넣으면 PWM 핀을 초기화하면서 최저 값을 넣어주지 않아 가끔식 ESC 세팅 모드로 진입하는 경우가 있었다. 그래서 초기화와 동시에 최저 PWM 제어를 추가하였다. 기존 double 데이터 타입의 rawVector 변수를 int16_t 의 정수형 타입으로 수정하여 더욱 빠른 계산을 할 수 있도록 수정하였다. 그리고 계산주기를 2.5ms 로 줄여 최대 250Hz -> 400Hz의 연산이 가능하도록 수정할 것이다. 플립을 구현하기 위해 -90도 ~ 90도의 인식 범위를 -180 ~ 180으로 360 인식이 가능..
-
쿼드콥터 (Quadcopter)
[ZMR250] 6. PID 튜닝 및 비행
앞서 기체의 상태를 피드백하여 모터를 제어하는 PID 제어를 공부했다. 나아가 드론은 다양한 외란의 영향을 받기 때문에 2중 PID 구조를 가져야하는 등의 여러가지를 알아보았다. 이번 시간에는 PID를 튜닝하고 몇몇 코드를 수정하여 기체가 잘 비행할 수 있도록 수정할 것이다. 먼저 P.I.D제어는 실시간으로 기체의 현 상태를 피드백 제어하기 때문에 주기적인 제어가 필요하다. 우리는 DT를 피드백 제어값에 반영하지 않았기 때문에 DT를 고정시킬 수 있는 수식을 추가해야한다. 아두이노에 DT 값을 주어 추가적인 계산을하면 loop() 함수를 한번 실행하여 계산하는 시간이 매우 커지고, 최악의 경우 드론 추락의 원인으로 자리잡기도한다. 그렇기게 안정적인 DT 를 잡아주는 것이 좋다. 먼저 빠르고 간편하게 PI..
-
쿼드콥터 (Quadcopter)
[ZMR250] 5. 기체 PID 제어하기
제작 중인 드론은 모터가 4개인 쿼드콥터로 두 개의 모터가 한쌍으로 서로 다른 회전 방향으로 반발력을 상쇄하여 기체를 안정적으로 상승시킬 수 있는 구조이다. 하지만 모든 모터를 같은 속도로 제어한다고 기체가 안정적으로 날 수 있는 것은 아니다. 기체의 현재 상태를 무시하고 모터를 작동하면 주변 환경으로부터 드론에 주는 영향을 피드백받아 제어할 수가 없기 때문에 많은 드론 제어시스템이 PID 제어를 사용한다. PID 제어는 주어진 목표와 현재 상태의 오차를 [ 비례 + 적분 + 미분 ] 계산으로 피드백하여 장치를 제어하는 이론이다. 제어 수식값은 위와 같이 나타나는데, 목표값과 현재의 값의 차이를 오차값 e(t)로 두고 각각 비례, 적분, 미분의 값을 모두 더하여 제어 값에 반영한다. PID 제어기는 위와..
-
쿼드콥터 (Quadcopter)
[ZMR250] 4. MPU6050 센싱 + 변속기 제어하기
앞서 송수신기를 연결하고, 그 값을 읽어들이는 것까지 무선조종의 모든 것을 제작하였다. 이번에는 MPU6050 IMU의 값을 읽어들여 변속기를 제어하는 것까지 해볼 것이다. 수신기 코드에서 [ 새 탭 ]을 눌러 [ Sensor ]라는 이름의 탭을 추가해준다. 위 5개의 변수를 만들어준다. 순서대로 각도를 저장하는 변수, 각가속도를 저장하는 변수, 루프 주기를 저장하는 변수, 센서의 초기보정값을 저장하는 변수와 주기를 저장할 때 사용하는 시간 변수이다. 그리고 센서를 초기화하기 위해서 InitMPU() 라는 함수를 만들어 주었다. MPU6050의 레지스터 제어 및 데이터시트 분석에 관한 포스팅을 다음 포스팅을 참고하고 다시 오길 바란다. [MPU6050] 1. 데이터 시트를 통해 센서 값 확인하기 구글에 ..
-
쿼드콥터 (Quadcopter)
[ZMR250] 3. 인터럽트 수신 및 송수신기 세팅, 바인딩
기체 프레임과 모든 부품의 준비는 끝났다. 이제는 송수신기를 연결하고, 제어기로 값을 읽어 기체를 제어하기만 하면 된다. 먼저 송신기와 수신기를 연결하여 서로가 통신이 되도록 하여야한다. 바인딩은 송신기와 수신기의 주파수를 동일하게하여 연결하는 작업을 말하는데, 그 작업은 간단하다. 조종기에는 왼쪽하단에 [ BIND KEY ] 가 있고, 수신기의 경우 바인드를 위한 쇼트핀을 함께 제공한다. 수신기의 [ B/VCC ] 포트에 쇼트핀을 연결하고 전원을 켠다. 이후 송신기의 [ BIND KEY ]를 누른 상태로 전원을 켜면 두 송수신기 사이에 연결이 성공적으로 된 것이다. 조종기에는 총 10개의 신호를 보낼 수 있는 부품들이 있는데, 조이스틱 4개, 토글 스위치 4개, 가변저항 2개이다. FS-IA6 수신기는..
-
쿼드콥터 (Quadcopter)
[ZMR250] 2. 프레임과 부품 조립 및 제어기 제작
1편에서 주문한 부품들을 조립하고 제어기를 제작하여 연결할 것이다. 구매한 부품들을 잘 정리하여 조립시 수량에 문제가 없는지 잘 체크한다. 먼저 프레임을 조립한다. 프레임의 경우 앞뒤 구분이 따로 없기 때문에 임의로 정하여 제작하면된다. 그리고 프레임의 상단부에는 고무부싱과 짐벌 판을 조립한다. (이거 조립하기 되게 힘들다..) RS2205 모터를 프레임에 장착하고 중앙에 전원 분배 모듈을 고정한다. 모터의 경우 CW, CCW 방향에 맞춰 대각선으로 마주보는 모터가 동일한 회전방향을 가지도록 조립한다. 변속기를 프레임에 고정하고, 각 변속기의 전원케이블을 전원 모듈에 납땜한다. 항상 납땜 후에는 테스터기를 사용해서 합선이 일어난 곳은 없는지 확인하며 진행한다. (냉납 현상 역시 없어야 한다) 변속기와 모..
아두이노 제어/통신
-
통신 (Communication)
[Serial] 3. C# 아두이노 센서값 실시간 동기화하기
이전에는 아두이노에 시리얼 값을 전송하여 RGB LED를 제어하였다. 이번에는 반대로 아두이노에서 측정한 센서값을 데스크탑 C# 프로그램에 동기화를 해보자 윈도우 폼을 위와 같이 심플하게 구성한다. TrackBar의 Value 범위는 0 - 1000으로 설정한다. 센서는 HC-SR04 초음파 센서를 mm 단위로 측정하여 C# 프로그램에 송신 및 동기화할 것이다. 실시간 동기화를 위해서는 쓰레드가 필요하다. 쓰레드를 사용하기 위해 using 해주자 거리변수 Distance와 쓰레드 객체를 만든다. Thread1의 Update 레퍼런스 값은 함수이다. Update 함수는 static 으로 정의하자 쓰레드 자동시작 및 종료를 위해서 폼을 열고 닫을 때 이벤트 코드를 작성해준다. 이전 타이머 이벤트 함수를 위와..
-
통신 (Communication)
[Serial] 2. C# 아두이노 실시간 제어하기
이전 포스팅에서 아두이노의 내장 LED를 제어하는 간단한 통신 제어 프로그램을 만들었다. 이번에는 데스크탑에서 송신한 데이터를 아두이노가 수신받아 RGB LED를 실시간으로 제어할 수 있도록 해볼 것이다. 회로는 11번 ~ 9번까지 순서대로 R, G, B를 연결해준다. 윈도우 폼을 대충 이렇게 만들어보았다. TrackBar의 경우 0 ~ 200까지의 범위를 가지도록 세팅하였다. 그리고 타이머를 추가하여 상시 Enable이 될 수 있도록 상태를 조정한다. Interval 주기는 원하는 값으로 설정한다. 1000으로 지정하면 1초 주기로 데이터를 전달하도록 제작될 것이다. 기본 값 100 or 50ms가 적당하다고 판단된다. 타이머가 Interval 주기때마다 호출하는 함수를 위와 같이 작성한다. 시리얼 프..
-
통신 (Communication)
[Serial] 1. C# 아두이노와 시리얼 통신하기
C#을 사용해서 아두이노와 시리얼 통신을 해보겠다. C#은 C++과 다르게 Serial 객체를 선언하면 쉽게 그 시리얼 정보를 읽어서 사용할 수 있다. C# 윈도우 폼을 사용해서 아두이노의 기본 LED를 제어해볼 것이다. 윈도우 폼은 위와 같이 구성한다. 먼저 시리얼 포트를 선택할 수 있도록 시리얼 포트를 콤보박스에 넣어야 한다. 콤보박스를 클릭하면 시리얼 포트를 새로고침해서 콤보박스에 넣어주게 할 것이다. IO.Ports 객체를 불러와 using 한다. 콤보박스 클릭시 시리얼 정보를 콤보박스에 새로고침한다. 아두이노와의 연결을 위한 SerialPort 객체를 Form1 클래스 내에 선언한다. 다른 호출 함수, 쓰레드 등에서 공유가 가능해야하기에 Form1 클래스 내에 선언한다. 만약 서로 다른 Form..
-
통신 (Communication)
[Serial] 2. C++ 아두이노와 프로토콜 통신하기
이전 시간에는 아두이노 공식 포럼에서 제공한 시리얼 클래스 라이브러리를 사용하여 아두이노와 시리얼 통신을 해보았다. 이번에는 단순 시리얼 통신이 아니라 프로토콜을 직접 만들어서 통신을 해보겠다. 프로토콜 통신은 전자장비 간에 통신하는 규칙을 말하며 직접 만들어서 통신이 가능하게끔 만들어 볼 것이다. 규칙은 간단하게 가장 앞 기호가 "#"이 들어가면 다음 명령어와 값에 따라 아두이노를 제어할 수 있도록 만들어보자 이전 프로젝트 파일을 열어서 수정을 해보자 cpp 코드는 입력된 내용을 아두이노로 전달하고, 아두이노는 입력된 값을 검산하여 규칙에 맞다면 내장 LED를 제어한다 여기서의 프로토콜 규칙은 다음과 같다. '#'으로 시작하며 '+'로 구분을 하고, 앞 뒤로 커맨드와 데이터 값으로 분류하는 것이다. c..
-
통신 (Communication)
[Serial] 1. C++ 아두이노와 시리얼 통신하기
아두이노는 UART 시리얼 통신을 통해 컴퓨터와 데이터를 주고 받는다. 이번에는 C++을 사용하여 아두이노와 시리얼 통신을 하여 데이터를 주고 받아보자 아두이노 공식 포럼에서는 C++를 사용한 시리얼 통신 라이브러리를 제공하고 있다. https://playground.arduino.cc/Interfacing/CPPWindows/ Arduino Playground - CPPWindows Interfacing... Arduino and C++ (for Windows) As I found it pretty hard finding the good information, or an already working code to handle Serial communication on windows based syste..
-
제어 (Control)
[MPU6050] 2. 각도값 계산 및 진동 제거하기
지난 게시글에서 데이터시터의 기본 정보를 확인하여 센서로부터 값을 읽어오는 것을 해보았다. 이번에는 읽은 값을 계산하여 각도를 계산해보자 MPU6050은 칩에 점의 방향으로 X, Y, Z축을 찾을 수 있다. 위 데이터 역시 데이터시트에서 가져온 자료이다. 해당 센서에 대한 모든 정보를 데이터시트를 통해 계산하면된다. 먼저 가져온 중력가속도의 값을 계산하여 각도를 측정해보자 X축과 Y축의 각도를 각각 계산하기위해서는 바닥을 가르키는 중력의 값을 알아야한다. 따라서 X축의 기울기를 구하기위해 Y, Z 중력가속도 벡터를 합한다. 이후 중력가속도와 X축을 atan 함수를 통해 계산하면 각도값을 얻을 수 있다. 하지만 atan, atan2 함수는 RAD 단위를 출력하기 떄문에 RAD_TO_DEG 를 곱하여 DEG..