본문 바로가기

분류 전체보기894

Windows ] USB 시리얼 포트 변경하는 법 장치관리자 - 포트 - 오른쪽클릭 - 속성 포트설정 - 고급 - COM 포트번호 변경 2022. 7. 12.
STM32 ] GPS 를 이용한 자율주행 메카넘휠 프로젝트 인원 : 2인 사용 Tool : STM32Cube IDE, 앱인벤터 사용 언어 : C 소개영상 2022.07.03 - [MCU/STM32 (ARM Cortex-M)] - STM32 ] NEO-6M 모듈 사용 , GPS 데이터 파싱하는 법 - 프로젝트 준비과정 (1) STM32 ] NEO-6M 모듈 사용 , GPS 데이터 파싱하는 법 - 프로젝트 준비과정 (1) NEO-6M, GPS 수신 모듈 GPS는 Global Positioning Sytem 의 약자로 미국이 개발 및 관리하는 위성항법 시스템이다. 그리고 GPS 수신 모듈은 지구 궤도를 돌고 있는 위성으로부터 나온 데이터의 분석을 통해 eteo.tistory.com 2022.07.02 - [MCU/STM32 (ARM Cortex-M)] - S.. 2022. 7. 12.
MFC ] 시리얼 통신으로 LED 제어하기 (1) 깃허브 주소: https://github.com/joeteo/LEDSerialCMD GitHub - joeteo/LEDSerialCMD Contribute to joeteo/LEDSerialCMD development by creating an account on GitHub. github.com https://github.com/joeteo/MFC_test01.git GitHub - joeteo/MFC_test01 Contribute to joeteo/MFC_test01 development by creating an account on GitHub. github.com 첨부된 zip파일에서 필요한 부분을 머지하고 다이얼로그의 도구들과 메시지인 OnReceive와 OnThreadClosed는 직접 추가.. 2022. 7. 9.
MFC ] 통계자료, 스레드 Thread 를 사용하여 로드하기 깃허브 주소 : https://github.com/joeteo/CarAccidentList.git GitHub - joeteo/CarAccidentList Contribute to joeteo/CarAccidentList development by creating an account on GitHub. github.com 무거운 프로세스나 무한루프로 동작해야할 작업이 있다면 쓰레드를 생성해서 백그라운드로 작업을 넘기면 된다. 이전에 만든 교통사고 통계조사 프로그램에서 시간이 오래 걸릴 수 있는 파일 불러오기 부분을 스레드를 사용한 버전으로 수정하였다. UINT Load(LPVOID LpData) { CCarAccidentListDlg* target = (CCarAccidentListDlg*)(LpData.. 2022. 7. 9.
MFC ] 통계자료, 자식 다이얼로그 생성하고 부모 다이얼로그와 상호참조하기 리소스뷰 다이얼로그에서 리소스 추가 다이얼로그 새로 만들기 자식 다이얼로그 ID 바꿔주기 자식 다이얼로그의 클래스 추가 CNewDlg 라는 이름으로 생성하고 기본 클래스는 CDialogEx가 된다. 자식 다이얼로그에도 리스트 컨트롤을 만들고 변수 추가 자식 다이얼로그에는 처음 클래스 생성시 생성자, 소멸자, DoDataExchange 함수밖에 없다. 필요한 경우 가상함수에서 OnInitDialog와 메시지에서 Ondestroy를 추가한다. 부모 다이얼로그 .cpp 파일에서 자식 다이얼로그의 헤더를 추가하고 코드를 작성한다. 자식 다이얼로그 클래스를 생성하고 자식에게 부모 다이얼로그의 포인터를 넘겨주고 키워드 검색결과가 담긴 벡터를 주소로 넘긴 후 DoModal() 을 호출하여 새 창을 연다. Modal .. 2022. 7. 8.
MFC ] new 로 동적할당 한 건 창이 닫히기 전에 OnDestroy() 에서 delete로 해제하기 생성자에서 동적할당한건 소멸자에서 해제하면 될텐데 생성자가 아닌 곳에서 동적할당 한 것인데 할당해제할 시기가 마땅치 않은 경우 창이 닫히기 전에 해제하면 다음과 같이 해제하면 메모리 누수를 막을 수 있다. 프로젝트 - 클래스 마법사 해당되는 다이얼로그에서 메시지, WM_DESTORY 를 추가한다. 아래와 같이 OnDestory() 함수 안에 new 로 동적할당 한 것을 모두 delete 하는 코드를 추가한다. 큰 의미는 없지만 delete 후에 .clear() 까지 해줬다. void CCarAccidentListDlg::OnDestroy() { if (DC.getList().size() != 0) { for (int i = 0; i < DC.getList().size(); i++) { delete DC... 2022. 7. 6.
앱 인벤터 ] GPS 모듈, 지자기센서 디버깅용 간단 어플 만들기 - 프로젝트 준비과정 (3) 메카넘휠에 올라간 MCU와 통신하기 위한 어플의 블루투스 부분은 다른 팀원이 담당하고 센서의 정확도 확인용으로 개인적으로 간단히 만들어본 어플이다. 메뉴에서 연결 - AI 컴패니언을 통해 실시간으로 디버깅하며 어플을 만들 수 있다. 다 만들고 난 후 .apk 파일로 빌드한다. 스마트폰의 위치센서와 방향센서의 값을 확인한다. 방향센서의 값은 실시간으로 변하는데, 위도, 경도 값은 위성에서 받아오는거라 딜레이도 있고, 치명적으로 실외에서도 값이 계속 튀고 정확하지 않았다. 2022. 7. 6.
MFC ] CString -> string 변환, string-> CString 변환 CString -> string변환 CString cstr = _T("hello"); string str = CT2CA(cstr); string -> CString 변환 string str = "HELLO"; CString cstr; cstr = str.c_str(); 참고로 이거는 CString 타입을 선언 동시 초기화로 변환하면서 대입할 수가 없어서 위에처럼 단계를 거쳐서 했다. 2022. 7. 4.
MFC ] 통계 데이터 List Control (리스트 컨트롤) 에 로드하기 Data.h #pragma once #include #include using namespace std; #define COLUMN_NUMBER 13 #define LOCATION_NUMBER 11 class Data { private: CString siDo; CString siGunGoo; int accidentCount[LOCATION_NUMBER]; public: Data(string _siDo, string _siGunGoo, string* _accidentCount); CString& GetSiDo(); CString& GetSiGunGoo(); int GetAccidentCount(int idx); }; Data.cpp #include "pch.h" #include "Data.h" Data:.. 2022. 7. 4.
MFC ] Class 를 이용한 음료수 자판기 Drink.h #pragma once #include using namespace std; class Drink { public: CString name; int price; int stock; public: CString getName() const; void setName(const CString& name); int getPrice() const; void setPrice(int price); int getStock() const; void setStock(int stock); }; 멤버변수는 다 private으로 하고 getter, setter를 만들어 두었다. Drink.cpp #include "pch.h" #include "Drink.h" CString Drink::getName() const.. 2022. 7. 4.
라즈베리 파이 ] root 비밀번호 까먹었을 때 바꾸는 법 1. 라즈베리파이의 SD카드를 뽑아서 리더기에 넣고 PC의 USB 단자에 연결한다. 2. SD카드 안의 cmdline.txt 파일을 열어 수정한다. 문장 맨 마지막에 한 칸 띄우고(엔터치지 말고) 아래 문장을 추가한 후 저장한다.init=/bin/sh 3. 다시 SD카드를 라즈베리파이에 꽂고 전원을 연결한다. CLI 창이 뜨면 # 다음에 아래 명령어를 입력해 루트 시스템을 마운트한다. mount -o remount, rw / 4. passwd 사용자id를 친다. root 비밀번호를 까먹었다면 passwd root 라고 치고 새로운 비밀번호를 입력한다.passwd pi 5. sync 를 입력한다.sync 6. exec /sbin/init 으로 재부팅한다.exec /sbin/init 7. GUI 환경으로 재.. 2022. 7. 3.
STM32 ] NEO-6M 모듈 사용 , GPS 데이터 파싱하는 법 - 프로젝트 준비과정 (1) NEO-6M, GPS 수신 모듈 GPS는 Global Positioning Sytem 의 약자로 미국이 개발 및 관리하는 위성항법 시스템이다. 그리고 GPS 수신 모듈은 지구 궤도를 돌고 있는 위성으로부터 나온 데이터의 분석을 통해 현재 위치의 위도, 경도, 시간 등을 시리얼 통신을 통해 받아 볼 수 있는 모듈이다. 여러 송출원에서 신호를 쏘고 이를 모듈에서 수신하여 자신의 현재 위치를 계산하여 알아내는데, 수신기의 위치를 특정하기 위해서는 최소 4개의 위성이 필요하다. 이 중 3개 이상의 위성이 정확한 시간과 변위를 측정한 뒤 삼각점의 위치를 구하는 삼변 측량기법으로 위치를 파악하고, 3개 위성이 각각 측정하는 세 개의 범위가 서로 교차되는 지점이 수신기의 위치가 된다. 나머지 1개의 위성은 시간 오차.. 2022. 7. 3.
STM32 ] 지자기 센서 HMC5883L 으로 방위각 측정하기 - 프로젝트 준비 과정 (2) HMC5883L 은 3축 마그네틱 감지센서 (Magnetometer) 로 나침반처럼 방위각을 알아낼 수 있어 Compass module 이라고 불린다. I2C 통신을 사용하여 데이터를 추출한다. 요즘에는 HMC5883L 모듈이 단종되어 QMC5883L 이라는 칩이 유통되고 있는데 QMC5883L 모듈은 I2C slave address 와 register address 가 달라서 다른 라이브러리를 써야 한다. 나는 HMC5883L 모듈을 사용하였다. Specification Datasheet 참고. 지자기장(Magnetic field of the Earth) 은 지구의 내부로부터 태양풍과 만나는 곳까지 뻗어있는 자기장인데, 태양풍은 태양으로부터 방사되는 하전입자들의 흐름이다. 지구 표면에서의 규모 범위는 .. 2022. 7. 2.
MFC ] CString -> int 변환, int -> CString 변환 CString -> int 변환 CString m_val1 = _T("1234"); int temp=0; temp = _ttoi(m_val1); int -> CString 변환 int result = 4321; CString m_result; m_result.Format(_T("%d"), result); 2022. 7. 2.
MFC ] 간단한 음료수 자판기 + Static Text 글씨 크기 키우기 + 버튼 캡션 개행(\n)하기 해당 Static Text의 ID를 변경하여 특정하고 OnInitDialog()에 다음 내용 추가 CFont font; LOGFONT logfont; ::ZeroMemory(&logfont, sizeof(logfont)); logfont.lfHeight = 18; font.CreateFontIndirect(&logfont); GetDlgItem(IDC_STATIC_TITLE)->SetFont(&font);; font.Detach(); 버튼 캡션에 개행 넣기 // VDMachineDlg.h: 헤더 파일 // #pragma once #define COLA_PRICE500 #define CIDAR_PRICE600 #define FANTA_PRICE700 #define WATER_PRICE400 // CVDMa.. 2022. 7. 2.
MFC ] 간단한 계산기 + 라디오 버튼 체크상태 확인하기 라디오 버튼 체크상태 확인하기 ((CButton*)GetDlgItem(IDC_RADIO1))->GetCheck() // SimpleCalDlg.h: 헤더 파일 // #pragma once // CSimpleCalDlg 대화 상자 class CSimpleCalDlg : public CDialogEx { // 생성입니다. public: CSimpleCalDlg(CWnd* pParent = nullptr);// 표준 생성자입니다. // 대화 상자 데이터입니다. #ifdef AFX_DESIGN_TIME enum { IDD = IDD_SIMPLECAL_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV 지원입니.. 2022. 7. 2.
MFC ] 새 프로젝트 만들기, 환경설정 비주얼 스튜디오에서 새 프로젝트로 MFC앱을 선택하고 없으면 '추가 도구 및 기능 설치'를 한다. 애플리케이션 종류는 대화 상자 기반 선택 C++ 개발환경으로 바꾸기 나중에 다시 일반 설정으로 돌아갈 수 있다. 화면 오른쪽에 자주 쓰는 도구상자와 속성 도킹해두기 리소스 뷰 아래 경로 또는 리소스파일.rc를 클릭해 GUI를 볼 수 있다. 2022. 7. 2.
아두이노 ] 릴레이 모듈 + 흡입펌프 다루기 릴레이 모듈 Relay module 릴레이 모듈이란 낮은 전압/전류로 더 높은 전압/전류를 스위칭 할 수있게끔 해주는 부품이다. 릴레이의 원리 : 모듈 내부에 전류가 흐르면 자기장이 형성되는 전자석(철심에 코일을 감은 형태)이 있다. 그래서 신호부(사진상 모듈의 오른쪽)에 전기신호가 들어와서 전류가 흐르면 아래 그림처럼 자석이 열려있는 스위치를 끌어달여 ON 시켜준다. 구동부(모듈 사진상 왼쪽)의 COM은 공통단자이고 NO는 Normally Open, NC는 Nomally Closed 를 뜻한다. 릴레이 모듈은 중국산이 많기 때문에 NO가 常闭 NC가 常开 로 써있을 수도 있다. COM단자는 항상 물려있어야 하고 보통 NO, NC 둘 중 하나만 쓰는데 릴레이 모듈 SIG핀에 HIGH 신호가 들어왔을 때 .. 2022. 6. 30.
STM32 ] 힙 heap , 스택 Stack 메모리 사이즈 설정하는 법 MX툴에서 Project Manager - Project - Linker Settting 에서 설정할수 있다. byte 단위로 디폴트 값은 아래와 같다. Heap Size 512 byte Stack Size 1,024 byte Build Analyzer 를 통해 램 사용량은 확인하고 필요에 따라 조정해 주면 된다. 저 값을 조정하고 Code generate를 하면 STM32F429ZITX_FLASH.ld 파일의 아래 부분이 수정된다. 다만 여기서 수정하는 것은 Minimum Heap Size, Minimum Stack Size일 뿐이며 Heap과 Stack의 고정된 크기를 의미하지는 않는다. 알다시피 Heap은 램에서 .data와 .bss 영역 뒤에서부터 시작해 사용되면 위로 쌓이고 Stack은 램의 끝.. 2022. 6. 30.
STM32 ] 메모리 영역 구분 ( Code, Data, BSS, Heap, Stack ) 구분 내용 저장위치 사용 code = text 함수, 제어문, 상수 등 ROM 컴파일 시 크기가 결정되고 이후 변하지 않음 data 초기값이 있는 전역변수, 정적변수 ROM bss 초기값이 없는 전역변수, 정적변수 (0으로 초기화) RAM heap 동적할당된 지역변수 RAM 런타임에 사용되고 heap은 낮은주소에서 높은주소로 데이터가 쌓이고, stack은 높은주소에서 낮은주소로 데이터가 쌓인다. stack 정적할당된 지역변수 RAM 정적할당된 지역변수는 메모리의 Stack Segment에 저장되며 선언된 함수가 종료되면 메모리에서 사라진다. 그리고 초기화된 전역변수와 정적변수는 Data Segment에 저장되는데 Data Segment는 ROM(Read Only Memory)에 있어서 한번 선언되면 값을.. 2022. 6. 30.
라즈베리 파이 ] 포트포워딩으로 원격 접속하기 + CPU 온도 확인 + 열린 포트 확인 시작메뉴 - Preferences - Raspberry Pi Configuration - Interfaces 에서 SSH 포트를 허용한다. ifconfig 명령어로 wlan0의 ip주소를 확인한다. 여기까지만 해도 동일 네트워크라면 Tera Term이나 Putty 같은 툴을 이용해서 SSH(Secure Shell) 접속해 CLI로 사용할 수 있다. 다음 GUI 원격접속을 위해 선택할 수 있는 옵션이 VNC 와 RDP가 있다. VNC는 5900 포트를 사용하고 RDP는 3899 포트를 사용한다. 그중에 RDP(Remote Desktop Protocol)는 마이크로소프트에서 개발한 원격 접속 프로토콜 윈도우 환경에서 원격접속 한다면 RDP를 사용하는게 여러모로 좋다고 한다. xrdp 패키지 설치 다음 원격 .. 2022. 6. 30.
STM32 ] PWM Edge-aligned mode(UP/DOWN), Center-aligned mode PWM mode 1 or PWM mode 2 일 때 파형 오실로스코프로 확인 Clock configuration TIM3, Channel 3, PB0핀 사용 100Hz 설정 테스트용 소스코드 UP 카운터 PWM mode 1 UP 카운터 PWM mode 2 DOWN 카운터 PWM mode 1 DOWN 카운터 PWM mode 2 지금 파라미터 세팅이 100Hz에 ARR값은 100-1인데 Center-aligned Mode일 땐 0부터 99까지 카운트하고 다시 1까지 돌아오는게 한 주기 니까 주기는 업 또는 다운 카운터일때에 비해 2배인 20ms이고 주파수는 절반인 50Hz가 오실로스코프에 찍인다. UP/DOWN 카운터 PWM mode 1 UP/DOWN 카운터 PWM mode 2 2022. 6. 29.
STM32 ] TIM 2,3,4 인터럽트를 사용하여 LED 1,2,3을 각각 0.1, 0.5, 1초 간격으로 토글하는 예제 기초 예제이긴 하지만 기록을 위해 남긴다. 먼저 클락설정부터 해준다. SYS clock은 최대인 180MHz로 했고 APB1 Timer clocks는 90MHz이다. datasheet의 20페이지 또는 90페이지를 확인하면 각각의 타이머가 어떤 버스의 클락소스를 사용하는지 확인할 수 있다. 타이머 2,3,4를 모두 enable 시키고 파라미터 세팅에서 Prescaler와 ARR을 설정해준다. 각각 0.1초, 0.5초, 1초를 뽑아내려면 주기는 주파수의 역수이니까 10Hz, 2Hz, 1Hz로 설정하면 된다.\ -1 해주는 이유는 0부터 카운트 하기 때문이다. 타이머 셋 다 인터럽트를 켠다. 각각 MX_TIM2_Init(); 함수를 따라가보면 아까 MX툴에서 설정해둔 값이 들어가 있는것을 볼 수 있다. LE.. 2022. 6. 29.
STM32 ] 플래시 메모리 지우고 다시 쓰기 + 리틀 엔디안과 빅 엔디안 + ST-link utility 사용법 STM32F429의 플래시메모리는 NOR플래시로 2MB가 있는데 2개의 Bank로 나뉘고 Bank당 각각 12개의 섹터가 있어서 총 섹터 0번부터 섹터 23번까지 24개의 섹터로 구성되어 있다. 플래시 메모리를 읽을 때는 그냥 메모리 읽듯 읽으면 되는데 쓸 때는 먼저 지우고 써야 한다. 그리고 지울 때는 최소 섹터 단위로 지워야 한다. 레파지토리의 보드 펌웨어 폴더 안에 있는 예제파일을 사용하였다. 경로는 아래와 같다. 일단 메인 함수 아래에서 MX로 자동 생성되는 설정 코드는 빼고, 플래시 메모리를 지우고 다시 쓰기한 부분 코드를 분석해 가져오고 빌드한 뒤에 오류가나면 오류가 나는 첫줄 부터 원인을 찾아가면서 빠진 부분을 소스파일과 헤더파일에서 계속 복사 붙여넣기 하는 식으로 머지한다. 이렇게 해도 안.. 2022. 6. 28.
C++ ] 이중 포인터와 포인터 배열의 차이 이중 포인터 #define _CRT_SECURE_NO_WARNINGS #define _CRTDBG_MAP_ALLOC #include #include int main() { int** pptr; pptr = new int* [4]; pptr[0] = new int[4]; pptr[1] = new int[2]; pptr[2] = new int[5]; pptr[3] = new int; delete[] pptr[0]; delete[] pptr[1]; delete[] pptr[2]; delete pptr[3]; delete[] pptr; _CrtDumpMemoryLeaks(); return 0; } 포인터와 배열은 서로 호환적이다. 그래서 이중 포인터를 이차원 배열로 본다면 행과 열을 가변적으로 둘 수 있는 이차.. 2022. 6. 28.
C++ ] 교통사고 통계자료 필터 프로그램 (2) - vector 사용 , 파입입출력 깃허브 주소 : https://github.com/joeteo/CarAccident main.cpp #include #include "AccidenData.h" #include "AccidentList.h" #include enum { PRINTLIST = 1, SUBTOTAL, EXIT }; using namespace std; int main() { AccidentList handler; handler.readListFromFile(); while(1) { system("cls"); int select; handler.DispMenu(); cin >> select; switch(select) { case PRINTLIST: handler.searchList(); break; case SUBTOTAL:.. 2022. 6. 28.
C++ ] 2021 교통사고 통계자료 필터 프로그램 (1) + 파일 입출력 부분합 기능까지 구현하였다. main.h #pragma once #define COLUMN_NUMBER 13 #define ROW_NUMBER 229 enum { PRINTLIST=1, SUBTOTAL, EXIT }; main.cpp #include #include "AccidenData.h" #include "AccidentList.h" #include "main.h" #include using namespace std; int main() { AccidentList list; list.readListFromFile(); while(1) { system("cls"); int select; list.DispMenu(); cin >> select; switch(select) { case PRINTLIST:.. 2022. 6. 28.
C++ ] 상속을 이용한 주차타워 이전에 사용한 동물호텔과 코드가 거의 같다. main.cpp #include #include "Parking.h" #include using namespace std; int main(void) { Parking parkingHandler; while (true) { int select; system("cls"); parkingHandler.DispMenu(); cout > select; switch (select) { case INBOUND: parkingHandler.InBound(); break; case OUTBOUND: parkingHandler.OutBound(); break; case VIEW: parkingHandler.ViewList(); break; case EXIT: cout 2022. 6. 24.
C++ ] 상속/가상함수를 이용한 동물호텔 main.h #include #include "Hotel.h" #include using namespace std; int main(void) { Hotel hotelHandler; while(true) { int select; system("cls"); hotelHandler.DispMenu(); cout > select; switch (select) { case CHECKIN: hotelHandler.CheckIn(); break; case CHECKOUT: hotelHandler.CheckOut(); break; case VIEW: hotelHandler.ViewList(); break; case EXIT: cout 2022. 6. 24.
CISC 와 RISC CISC (Complex Instruction Set Computer) 연산에 처리되는 복잡하고 기능이 많은 명령어 집합을 수백 개 이상 탑재하고 있는 프로세서 과거에는 PC 메모리 용량이 크지 않아서 소프트웨어의 용량을 줄이기 위해 하나의 명령어로 여러 작업을 수행하도록 CISC를 많이 사용하였다. 가변 길이 명령어 형식이어서 명령어를 먼저 해석한 후에 실행한다, 명령어 해석에 필요한 회로가 복잡해 병렬 처리가 쉽지 않다 트랜지스터 집적에 있어서 효율성이 떨어지기 때문에, 전력 소모가 크고, 속도가 느리고, 가격이 비싸다는 등의 단점이 있다. 복합적이고 기능이 많기 때문에 하위 호환성이 좋다. 호환성이 필요한 범용 컴퓨터, intel 사의 프로세서에 주로 사용된다. RISC (Reduced Instru.. 2022. 6. 23.