전체 글 324

BLE GAP을 BLE Sniffer로 측정하기

안녕하세요. 오늘은 이전에 알아봤던 BLE GAP를 BLE Sniffer로 측정해보겠습니다.측정 할 장비는 이전글에서 사용했었던 ESP32 beacon 프로젝트입니다.(https://wowon.tistory.com/373)측정장비는 NRF52832 USB이고 wireshark를 사용합니다.(A) 스마트폰 nRF 앱으로 측정한 데이터입니다.(B) sniffer장비로 측정한 데이터입니다.로그에서 찍히는 데이터는 크게 두 부분으로 나뉩니다.- nRF Sniffer for Bluetooth LESniffer 장비가 BLE 기기가 보낸 무선 신호(RF) 를 수신하고, 그 신호로부터 신호 세기(RSSI), 채널 번호, 타임스탬프 등의 물리 계층(PHY) 정보를 계산하여 Wireshark로 전달한 데이터 - Bl..

지식/BLE 2025.11.08

BLE GAP 예시를 통해서 알아보기

안녕하세요. 오늘은 BLE GAP에 대해 알아보겠습니다.GAP(Generic Access Profile)은 기기가 서로 어떻게 찾고 연결하는지 관리를 합니다.GAP는 프로파일 계층에서 최상위에 존재합니다.GAP가 실제로 어떻게 사용하는지 ESP32와 스마트폰앱(nRF Connect)를 이용해서 알아보겠습니다.ESP32에 넣은 예제는 "Bluedroid_Beacon" 입니다. 비콘으로 동작하는 펌웨어입니다.FW : https://github.com/espressif/esp-idf/tree/master/examples/bluetooth/ble_get_started/bluedroid/Bluedroid_Beacon스마트폰앱으로 보면 위의 그림처럼 나와있는데 두개의 데이터빼고 GAP 데이터입니다.- Device ..

지식/BLE 2025.11.02

ESP32 Command Line 개발환경

안녕하세요. ESP32 커맨드라인 컴파일을 해보겠습니다.1. 아래의 사이트에 들어가서 컴파일에 필요한 파일을 다운로드받습니다.https://dl.espressif.com/dl/esp-idf/?idf=4.42. 설치된 커맨드 프로그램을 킵니다.3. SDK에 들어가서 example을 다른곳으로 옮깁니다. (다운받은경로\frameworks\esp-idf-v5.2.6\examples\get-started\hello_world)4. 프로젝트의 경로에가서 아래의 커맨드를 하나씩 입력합니다.타겟보드 설정 : idf.py set-target esp32s3옵션설정 : idf.py menuconfig빌드 : idf.py build플래시: idf.py –p COM12 flash모니터 : Idf.py –p COM12 moni..

ESP32/ESP32_RTOS 2025.10.26

ESP32 vscode개발환경 만들기(ESP-IDF)

안녕하세요. 오늘은 ESP32 vscode로 개발환경을 만들어보겠습니다.1. vscode를 설치합니다.https://code.visualstudio.com/download2. EXTENSIONS에서 ESP-IDF를 설치합니다.3.좌측에 ESP-IDF 아이콘을 클릭 후 Configure ESP-IDF Extension을 클릭하고 ADVANCE를 클릭합니다.4. ESP-IDF container directory는 SDK이고 ESP-IDF Tools directory는 개발도구입니다. 경로를 정하고 Configure Tools를 클릭합니다.5. 그 다음 또 툴을 설치하는게 나오는데 Donwload Tools를 클릭합니다. 6.설치가 완료되면 이제 예제를 불러와봅니다. ESP-IDF:Show Example Pr..

ESP32/ESP32_RTOS 2025.10.26

Speaker 만들기 2편 (SD카드에 있는 wav파일 재생)

안녕하세요. 오늘은 SD카드에있는 wav 파일을 재생시켜보겠습니다.1편에서와 같이 ESP32와 MAX98357A를 이용합니다.*선 연결SD카드1. CS → GPIO5 (SD_CS) 2. MOSI → GPIO23 (DI) 3. MISO → GPIO19 (DO) 4. SCK → GPIO18 (CLK)MAX98357A1. BCLK → GPIO26 (I2S Bit Clock) 2. LRC → GPIO25 (I2S Left/Right Clock, WS) 3. DIN → GPIO22 (I2S Data Out, SD)* 코드의 흐름1. SD카드 초기화2. SD카드에있는 특정 wav파일 정보 읽기3. wav파일 정보를가지고 I2S 초기화4. wav 파일 재생5. wav 파일 재생이 끝나면 ..

WAV 파일에대해 알아보기

안녕하세요. 오늘은 WAV파일에대해 알아보겠습니다.이 글의 목적은 MCU에서 WAV파일을 읽을때 알아야 할 내용을 알아보는게 목적입니다.WAVE파일은 RIFF(Resource Interchange File Format)구조를 사용합니다. RIFF 구조는 아래의 그림과 같습니다. 일반적으로 44바이트가 파일정보이고, 나머지가 음원데이터입니다.RIFF구조는 chunk단위를 사용합니다. chunk단위는 구조가 ID(4바이트),SIZE(4바이트),DATA(N바이트)로 이루어집니다.WAV파일은 세가지 영역으로 구분됩니다. 위에있는 WAV파일을 RIFF 구조에맞게 해석해보겠습니다.(리틀 엔디안 방식)1. RIFF1) ChunkID (4바이트)ChunkID입니다.2) ChunkSize (4바이트) 파일의 크기입니다..

지식/프로토콜 2025.09.07

파이썬으로 사인파,사각파,삼각파,톱니파 음원 만들기

안녕하세요. 파이썬으로 사인파, 사각파, 삼각파, 톱니파 음원을 만들어보겠습니다.WAVE_TYPE에 원하는 파형을 입력하면 됩니다. ("sine" or "square" or "triangle" or "sawtooth")WAV파일 파라미터에는 원하는 WAV파일 정보를 입력하면 됩니다.파이썬을 실행시키면 아래와같은 wav파일이 소스코드가있는 디렉토리에 만들어집니다.파일명은 _Hz_Hz_bit__sec.wav가 됩니다.import numpy as npimport waveimport os# === 파형 종류 선택 ===# "sine", "square", "triangle", "sawtooth"WAVE_TYPE = "square"# WAV 파일 파라미터sample_rate = 48000 # 48 kHzdura..

C언어로 링버퍼 구현하기

안녕하세요. 오늘은 C언어로 링버퍼를 구현해보겠습니다. 1) 링버퍼가 필요한 이유펌웨어에서 링버퍼는 주로 UART 통신에서 많이 사용됩니다. UART 수신은 일반적으로 인터럽트에서 데이터가 들어오는데, 인터럽트 안에서 곧바로 데이터를 처리하면 지연이나 오류가 발생할 수 있습니다. 그래서 인터럽트에서는 단순히 받은 데이터를 링버퍼에 저장해 두고, 메인 루프나 다른 Task에서 필요할 때 버퍼에서 꺼내 처리하는 구조를 사용합니다. 이 방식은 데이터 손실을 막고, 시스템을 안정적으로 동작하게 해줍니다.2) 링버퍼란링버퍼란 FIFO(First in, First out)방식의 처리방식입니다. 일반적으로 큐와 비슷하지만 배열의 처음과 끝이 연결된 것처럼 동작하는것이 특징입니다.예를들어서 배열의길이가 4인 ..

Speaker 만들기 1편 (ESP32, MAX98357A, I2S)

안녕하세요. 해당 시리즈에서는 ESP32, MAX98357A, SD카드를 이용해서 SD카드에있는 음원파일을 출력해보고 최종적으로는 ESP32대신 STM32를 이용해서 Speaker 보드를 만들어보겠습니다.① ESP32와 MAX98357A 소개, 그리고 PCM 개념ESP32는 ESP32 WROOM 32를 이용했고 앰프는 MAX98357A를 이용합니다.ESP32와 MAX98357A는 I2S 통신을 합니다.I2S 통신은 오디오 데이터를 PCM 형태로 주고받는 인터페이스입니다. PCM(Pulse Code Modulation)은 아날로그 소리를 일정 주기마다 디지털 숫자로 저장한 것을 의미합니다. PCM 변환 과정은 3단계입니다.1. 샘플링(Sampling)- 아날로그 파형을 일정한 시간 간격으로 잘라서 측정 (..

STM32/STM32_USBtoUART STM32로 USB to UART 모듈 만들기 8편(UART RX를 DMA방식으로 변경)

안녕하세요.기존에는 UART RX가 인터럽트방식이였는데 DMA 방식으로 변경해보겠습니다. (BASE 코드 : 6편)기존의 방식으로 문제가 되는 상황을 재현해보겠습니다.baudrate를 빠른속도로 설정하고 대량의 데이터를 한번에 보내면 Overrun error(ORE)가 걸립니다.ORE는 데이터 레지스터를 읽지 않은 상태에서 새 데이터가 도착한경우 발생합니다. 테라텀으로 아래의 대량의 텍스트를 보내보겠습니다.11만 수신하고 수신을 멈췄습니다. (ORE 발생)지금 코드에서는 ORE가 발생하고나서 RX를 하지않습니다. 그 이유는 수신인터럽트에서 HAL_UART_Receive_IT를 호출해줘야하는데 ORE가 걸려서 HAL_UART_Receive_IT를 호출하지않았기때문입니다. 이때 ORE발생할때 복구하려면 HA..