본문 바로가기

분류 전체보기

(32)
PID제어 피드백 제어란 뭘까? 드론을 원하는 각도로 움직이기 위해서는 자세 센서에서 출력되는 오일러 각도, 각속도 그리고 조종기(SBus data)의 값을 이용하여 피드백 구조로 제어하여야 한다. 피드백 구조를 사용하지 않는다면 조종기로 드론에 명령을 내려도 명령을 정확인 수행하지 못한다. 예를 들어, 제자리에서 왼쪽 모터에 30만큼 힘을 주면 10도만큼 오른쪽으로 기울어진다고 가정해보자. 하지만 드론이 제자리에서 오른쪽으로 이미 조금 기울어져 있다면 왼쪽 모터에 30만큼 힘을 주었을 때, 10도보다 더 오른쪽으로 기울어질 것이다. 그러므로 자세 센서에서 드론의 현재 오일러 각도를 분석한다. 그리고 드론은 조종기에서 내린 명령 각도에서 현재 각도를 뺀 값만큼을 움직인다. 예를 들어 조종기에서 30도만큼 기울이라는..
PyQt란? 나의 최종 목표는 드론의 자율주행이기 때문에 드론을 지상에서 제어할 수 있는 시스템을 만들어야한다. 비행중에 PID Gain값을 수정하거나 좌표를 통해 자율비행하고 현재 속력, 비행시간, 배터리 잔량 등등을 알 수 있게할 것이다. 그러려면 PC에서 GUI프로그램을 통해 사용자에게 입력받고 드론과 통신해야한다. GUI 프로그램 개발은 1학년 때 스마트팜 점프 업 캠프에서 조금 배웠지만 열심히하지않아서 잘 기억이 안난다. 그 때 PyQt를 썼었는데 다시 공부해서 PyQt로 GCS를 개발해보려한다. PyQt란 뭔까? Qt는 컴퓨터 프로그래밍에서 GUI 프로그램 개발에 널리 쓰이는 크로스 플랫폼 프레임워크이다. -위키백과 - 크로스 플랫폼은 여러 종류의 컴퓨터 플랫폼에서 작동할 수 있다는 뜻이다. Qt는 C++..
[STM32] Basic Timer Basic Timer를 이용해 1초에 한 번씩 UART로 문자열 출력하기 드론을 개발할 때, 일정시간마다 자세센서의 값을 읽어오거나 PID계산을 해야한다. 어떻게 시간을 잴 수 있을까? Basic Timer를 이용하면 된다. stm32의 타이머 종류에는 크게 Advanced-control timer, General purpose timer, Basic Timer가 있다. 오늘은 DAC 트리거 및 시간 기반 타이머로 사용되는 Basic Timer를 사용해보겠다. 위 데이터 시트를 보면 Basic Timer는 TIM6, TIM7으로 사용할 수 있다는걸 알 수 있다. 그리고 사용하는 클럭을 알아야한다. TIM6는 APB1 timer clock을 사용하고 Cube MX 툴에서 108MHz라는 걸 알 수 있다. ..
[STM32]UART 인터럽트 송수신 실습 폴링 방식의 단점은 개념 카테고리에서 설명했었다. 그렇다면 인터럽트로 데이터를 수신하고 받은 데이터를 PC에 출력하는 프로그램을 작성해보자. 먼저, Cube Mx에서는 usart1을 비동기로 활성화 해주고 Global interrupt를 enable해줘야한다. 우리가 알아야하는 함수는 3가지다. 1. HAL_UART_Receive_IT() - UART 수신 인터럽트를 설정하는 함수다. 2. void USART1_IRQHandler(void) - uart1번을 사용한다고 했을 때, 수신인터럽트가 발생하면 이 함수로 이동하여 IRQ_Handler를 실행하고 HAL_UART_RxCpltCallback()으로 이동한다. 3. HAL_UART_RxCpltCallback() - 결론적으로 이 함수를 호출하므로, 인..
미친남자의 시집 뾰족한 연필 난 화가 날 때마다 연필을 깎는다. 뾰족한 연필을 보고 있으면 마음이 아프다. 뾰족한 연필일 수록 더 진하게 나오지만 그만큼 더 쉽게 부러진다. 내가 중학교 2학년 때 태어나서 처음 지은 시다. 자꾸 화가 날 때마다 험한 말을 하는 내 자신이 부끄럽고 친구들에게 상처를 주어서 미안했다. 앞으로는 친구들과 사이좋게 지내고싶어서 욕을 연필 심에 비유하여 시를 지었다. 욕을 하면 강하게 감정을 전달하지만 그만큼 상대에게 상처를 주고 나를 약하게 만든다. 수학 문제 너를 처음 보았을 때 내 머릿속은 복잡하여 온통 혼란으로 가득 찼다. 그러다 너를 바라보고 또 바라보고 비로서 너를 알게 되었을 때 내 마음은 행복으로 가득 찼다. 짝사랑 내가 받은 사랑만큼 돌려줄 수 없는 슬픔을 아십니까? 나는 당신을..
Byte order 컴퓨터 메모리에 데이터가 저장될 때 어떻게 저장될까? Byte order는 쉽게 데이터를 저장할 때 낮은주소부터 또는 높은주소부터 저장하는 방식을 말하는데, 크게 리틀엔디안과 빅엔디안 방식이 있다. 한 번 알아보자. 리틀 엔디안 예전에 16진수 두 자리(0x00~0xFF)가 왜 1Byte인지 몰랐는데 나처럼 헷갈리는 사람이 있을 것 같아 먼저 설명하겠다. 2진수 4자리로 표현할 수 있는 개수는 2의 4승이므로 총 16개다. 2진수 한 자리당 1bit이므로, 0000~1111은 16가지를 표현할 수 있다는 뜻이다. 16진수 1자리로 표현 할 수 있는 개수는 16개다. 즉, 16진수 1자리(0x0 ~ 0xF)는 4bits라는 뜻이므로 16진수 2자리(0x00~0xFF)는 1byte이다. 이걸 설명한 이유는 ..
함수 포인터 함수포인터란? 함수를 저장하는 포인터, 함수 포인터를 주고받거나 함수 포인터로 함수를 호출할 수 있다. 용도 1. 함수를 배열이나 구조체에 넣을 수 있다. 2. 함수자체를 함수의 매개 변수로 넘겨주고, 반환 값으로 가져올 수 있다. 저장될 함수의 반환 값 자료형 (*함수포인터이름)(매개변수); 함수이름은 함수의 메모리 주소이므로 함수 포인터에 저장할려면 함수 포인터 이름 = 저장할 함수 이름 수포인터란? 함수를 저장하는 포인터, 함수 포인터를 주고받거나 함수 포인터로 함수를 호출할 수 있다. 용도 1. 함수를 배열이나 구조체에 넣을 수 있다. 2. 함수자체를 함수의 매개 변수로 넘겨주고, 반환 값으로 가져올 수 있다. 함수 포인터를 응용하면 함수를 고정된 형태가 아닌 데이터 형태로 취급할 수 있습니다. ..
Cube MX란? Cube MX는 ST사의 MCU를 GUI를 통해 타이머, 통신(Uart, I2C, SPI), 인터럽트, DMA, GPIO 등의 기본적인 설정을 하면 자동으로 코드를 생성해주는 툴이다. 그 외에도 MCU의 핀 배열이나 동작 클럭을 확인할 수 있다.
크기가 명시된 정수 자료형 모든 컴퓨터에서 int는 4byte의 정수형 변수일까? 아니다 CPU의 비트 수에 따라서 int의 크기는 달라질 수 있다. 이런 문제를 해결하기 위해 stdint.h 헤더파일을 이용해서 int자료형의 크기를 명시해줄 수 있다. int8_t는 8bit의 부호가 있는 정수자료형을 뜻한다. 앞에 u가 붙게 되면 unsigned를 의미하며 부호가 없다(자연수)는 뜻이다. - ex) uint8_t 8대신에 16, 32, 64를 넣어서 비트 수를 바꿀 수 있다.
DMA 방식 왜 DMA를 사용할까? 폴링은 프로그램에 의한 입출력 방식이여서 CPU가 계속 주변장치를 감시하기 때문에 CPU의 효율이 떨어진다고 했다. 이런 점을 개선하기 위해 CPU개입없이 주변장치와 상호작용하는 DMA(Direct Memory Access)가 개발되었다. 그럼 CPU개입이 적은 인터럽트를 사용하면 되지 않을까? 인터럽트를 사용하더라도 여전히 CPU는 데이터 전송을 하기위해 개입하게 되고, 입출력하는 시간이 길어지게 되면 CPU는 입출력하는 동안 다른 일을 못하게 된다. DMA 과정 그럼 CPU는 무엇을 하면 될까? CPU는 DMAC(DMA controller)에게 입출력 관련 정보만 주고 다른일을 계속 하면된다. 입출력 정보에는 뭐가 있을까? CPU는 DMAC에게 어떤 source를 보내는지, 목..