개발 30

ADC란? ADC의 기초 resolution, sampling

ADC란? ADC의 기초 resolution, sampling ADC는 Analog to Digital Converter로 아날로그 신호를 디지털 신호로 변경해 주는 변환기입니다. 아날로그 신호는 여러가지가 있지만, MCU로 수신되는 아날로그 신호는 기본적으로 전압입니다. 이 전압값을 기준으로 아날로그 신호를 재해석해야 한다. 재해석한 결과로 전류, 온도, 압력 등 여러 가지 값들을 도출해 낼 수 있습니다. 이 전압을 MCU에서 측정하는 것은 SAR, Delta-Sigma, Integrating 등으로 여러가지 방법이 있고, 각각의 방법에는 장, 단점이 있습니다. 각 방법에 대해서는 추후 알아보기로 하고, ADC의 기본을 알아보겠습니다. Sampling Rate ADC는 아날로그 신호로써 아래와 그래프를..

개발/임베디드 2023.10.02

[ESP32] wifi 연결시 특정 와이파이 기기(AP)에 연결안되던 점

ESP32를 사용하면서 wifi를 연결을 구현하고 싶을 때가 있습니다. 그런데, 간혹 가다가 정확한 코드에 정확한 SSID, PW를 입력했음에도 불구하고, 연결이 안 되던 적이 있었습니다. 여러 방면으로 원인을 찾아봤지만, 근본적인 원인은 찾지 못했고 단기적인 해결책만 찾았습니다. ※이는 개인적인 상황에서 해결책임으로 보편적인 해결책이 아닐 수 있습니다. 저의 상황은 다음과 같습니다. 사용한 예제코드는 ESP32의 예제 중 하나인 WifiClient입니다. /* * This sketch sends data via HTTP GET requests to data.sparkfun.com service. * * You need to get streamId and privateKey at data.sparkfun..

[ESP32] esp_timer 와 sleep 모드 동시 사용시 발생하는 간섭

[ESP32] esp_timer와 sleep 모드 동시 사용 시 발생하는 간섭 ESP-IDF에는esp_timer 가 있습니다. 해당 timer는 task에서 제어됩니다. sleep 모드도 같이 사용할 경우 task가 제대로 작동되지 않는 문제가 발생합니다. 이런 경우에는 하드웨어 타이머를 사용하는 것이 좋습니다. 따라서 esp_timer 보다는 FreeRTOS에서 제공하는 하드웨어 타이머 함수들을 사용하면, 타이머 인터럽트가 제대로 작동하지 않는 문제들을 해결할 수 있습니다. 저의 경우에는 esp_timer와 ble 기능과 modem sleep을 활성화하고 나면, esp_timer로 등록된 타이머 인터럽트 함수가 제대로 작동하지 않는 것을 확인했습니다. #include "freertos/FreeRTOS...

블루투스 AutoConnect 시 지속적으로 연결, 연결해제되는 문제

블루투스 AutoConnect 시 지속적으로 연결, 연결 해제되는 문제 Android와 ESP32 간에 블루투스(BLE)를 연결하고, 일정 거리 벌어진 뒤에 다시 가까이 오면 자동 연결되는 기능을 구현하다 보면, 안드로이드 앱은 계속해서 Connect를 시도하지만, 모종의 이유로 Connect -> Disconnect -> Connect... 가 반복됩니다. Bonding 데이터를 해제하고 다시 해도 안되며, 캐시의 문제일 가능성이 높습니다. 특히나 rsn:0x3d로 연결이 실패되는 경우에는 링크글(https://thinkanother.tistory.com/27)을 확인하시면, 캐시를 지우는 방법을 확인할 수 있습니다.

개발/통신 2022.12.20

[android/kotlin] Ble5.0 extension advertising 을 스캔하기

[android/kotlin] Ble5.0 extension advertising을 스캔하기 ESP나 nRF 칩으로 블루투스 기기를 만들면 간혹 블루투스 5.0 확장 advertising을 스캔해야 될 때가 있습니다. 구글 공식 문서에 따라서 코드를 작성하면, 일반적인 advertisimng 패킷을 스캔할 때에는 아래와 같이 작성하면 정상적으로 작동합니다. advertising 하는 기기를 찾을 수 있죠. var bluetoothAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter() var scanBLEBtn: Button = findViewById(R.id.BLE_Scan_Btn) scanBLEBtn.setOnClickListener { /..

[ESP32] RTC_SW_CPU_RST 에러

[ESP32] RTC_SW_CPU_RST ESP32로 특정 코드를 업로드하였는데, 계속해서 위와 같은 에러를 띄우고 재부팅을 한다면, menuconfig 같은 설정들을 저장하지 않았는지 확인해봅니다. 저의 경우 Vscode로 menuconfig를 설정을 다 해놓았지만, 저장하지 않고 바로 빌드 - 업로드하는 바람에 코드와 설정간의 차이로 계속 재부팅이 반복되는 현상이 있었는데, 원인은 저장을 하지 않았던 것입니다.

[ESP32 BLE 에러] BT_HCI: hcif disc complete: hdl 0x1, rsn 0x3e

[ESP32 BLE 에러] BT_HCI: hcif disc complete: hdl 0x1, rsn 0x3e 위와 같은 에러가 뜬다면, 특정 정보가 잘못되었을 경우에 발생합니다. 저의 경우에는 외부 크리스탈(External xtal)을 사용하였는데, 잘못된 주파수를 발진하고 있음에도 불구하고 프로그램이 잘못 되었음을 인지하지 못했습니다. 그래서 주파수 오류없이 본 코드로 들어갔다가 연결오류를 띄웠습니다. 해당 크리스탈을 제거하고, 노이즈 없이 새로 연결한 결과는 해당 오류가 나타나지 않았습니다. 0x3e의 에러는 블루투스 5.0 core 설명에서 다음과 같이 되어 있습니다. 연결시 특정 정보를 설정하지 못했음을 알리는 에러입니다. 더보기 2.59 CONNECTION FAILED TO BE ESTABLIS..

[ESP32 BLE 에러] BT_HCI: hcif disc complete: rsn 0x3d

[ESP32 에러] BT_HCI: hcif disc complete: rsn 0x3d 위와 같은 에러가 뜬다면, 기존에 ble 작업하면서, bonding 되어 있는 데이터를 삭제하고 다시 진행하면 됩니다. 안드로이드 개발 과정이라면, 블루투스 기기를 등록하고 해제를 반복하면서, 캐시가 쌓여있을 수 있습니다. 이는 캐시를 지우는 과정을 진행해야 합니다. 이 과정을 refresh라고 알려져 있습니다. 이 기능을 블루투스 기기와 연결 해제되었을 때 실행하도록 하면 됩니다. java를 사용하는 경우는 다음과 같습니다. private void refreshDeviceCache(BluetoothGatt gatt) { try { Method localMethod = gatt.getClass().getMethod("r..

ESP8266(ESP-01, ESP-01S) wifi client, 서버로 부터 데이터 받기

이번에는 wifi client - esp8266에 대해서 알아봅니다. 코드의 기능은 특정 서버에 데이터를 보내 응답을 받습니다. 따라서 esp8266은 client의 기능을 합니다. /* This sketch establishes a TCP connection to a "quote of the day" service. It sends a "hello" message, and then prints received data. */ #include #ifndef STASSID #define STASSID "your-ssid" #define STAPSK "your-password" #endif const char* ssid = STASSID; const char* password = STAPSK; const c..

[c/c++] PSTR(), F() 플래시 메모리에 값 저장

[c/c++] PSTR(), F() 플래시 메모리에 값 저장 아두이노나 다른 보드에서 메모리를 저장하는 부분은 SRAM과 FLASH로 나뉘어 있다고 보시면 됩니다. FLASH는 동작할 코드들이 저장되며, 컴퓨터에서 디스크(HD, SSD)에 해당됩니다. SRAM은 각종 변수가 저장되며, 컴퓨터의 RAM에 해당됩니다. 따라서 FLASH보다 용량이 적습니다. 아두이노의 공식사이트(https://www.arduino.cc/en/Tutorial/Foundations/Memory)에 따르면 아두이노의 메모리는 아래와 같이 되어 있습니다. 보시다시피 보통 FLASH에 비해 SRAM은 아주 작은 용량임을 알 수 있습니다. 실제로 코딩을 하다가 변수가 많이 사용되거나, 긴 문자열이 사용될 때에는 SRAM이 부족할 경우가..

개발/C와 C++ 2022.10.30