전체 글 34

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..

압출 스크류의 온도 설정과 Feed, Melting Zone

무언가 작은 가루나 혹은 필렛등을 녹여서 길게 압출해야 되는 기구를 설계, 제작해야 했는데, 간단하게 압출부는 Kit를 사용하려 했습니다. 그래서 DIY 키트를 알아보니 과연 있더군요. 최근 위와 같은 DIY 키트를 사용했는데, 온도 컨트롤러, 온도센서, 압출기 등이 포함되어 있었습니다. 이 키트에서 기본적으로 온도 센서와 열선을 3개를 제공했기에 3개를 적정온도로 사용하면 되겠다 싶었습니다. 하지만 결과적으로 PLA, ABS를 사용할 때에는 마지막 1개는 off를 해두고 사용해야 할 만큼, 과한 열이 공급되어서 플라스틱 필렛들이 역류하는 현상이 발생했습니다. 온도 관련 설정을 잘못하다 보니 아래 영상처럼 역류합니다. 시간이 지날수록 아래쪽에서 뭔가 올라오는 것이 일이 잘못되고 있음을 직감적으로 느낄 수..

Mechanical 2023.02.20

[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..