2 분 소요



이번 예제는, NU40 DK에 ADC로 신호를 전달(Function Generator)하고, 해당 신호를 BLE 통신을 통하여 휴대폰 앱에서 확인해보는 예제입니다.


준비물

NU40 DK, 디바이스 트리 파일
납, 인두기, 페이스트 등 납땜 준비물
Function Generator
오실로스코프
무납땜 PCB 브레드 보드
악어클립
보드랑 연결할 선(솔리드 와이어, 전선 등)
J-link
프로그래밍 핀
강인한 멘탈


Setp 1. Device Tree

NU40 Dev kit 보드 정의 파일이 아직 Zephyr 메인스트림에 포함되지 않았기 때문에, 보드 파일을 직접 개인 로컬 NCS 디렉토리에 복사해야 ADC 기능을 정상적으로 사용할 수 있습니다.
(이거 몰라가지고, 앱이랑 하드웨어 세팅 다 만들어놓고 하루 종일 삽질 했네요 ㅜㅜ)

https://github.com/Nucode01/NU40_Devkit-devicetree


위 링크에 들어가면 NU40_Devkit_devicetree 깃허브가 있습니다.
집파일로 다운 받은 후, nu40_b_dev02 폴더를 ncs/(사용자 버전)/zephyr/boards/arm 디렉토리에 붙여넣기

└── ncs/
    └── v2.9.0/
        ├── zephyr/
        │   └── boards/
        │       └── arm/
        │           ├── ...
        │           ├── ...
        │           ├── nu40_b_dev02
        │           └── ...
        ├── bootloader
        ├── modules
        ├── nrf
        ├── tools
        ├── toolchain
        └── ...


Step 2. NU40 DK, 납땜

Function Generator로 만든 파형을 ADC input으로 보드에 인가하고 해당 정보를 BLE 통신을 통해 휴대폰 앱에서 그래프를 보기 위해서는

보드에 ADC 핀과, GND 핀에 연결해줄 전선과 납땜 해주어야 합니다.
(굳이 땜질을 하지 않고 테스트 해보아도 되지만 저는 직땜하였습니다.)

https://nucode.gitbook.io/nuseries/ble-zigbee-thread-module-and-dk/nu40
위 NU40의 DataSheet를 참고해서, 어디에 납땜을 할지 정하고 진행하시면 됩니다.

저는 P0.03, GND 그리고 P0.28, GND 총 4군데에 납땜을 진행했습니다.
4군데에 진행을 한 이유는, 냉납이나, 혹시나 하드웨어적인 문제가 생기면 다른 핀으로 시도해보기 위함입니다.


Step 3. HW 세팅


먼저 Function Generator 설정은 아래와 같습니다.

  • High Z load 설정
  • Vpp = 3V 설정
  • Offset = 1.5V 설정

그리고 악어핀으로 GND와 Output 채널에 물려주고, 무납땜 PCB 브레드보드에 솔리드 와이어 등으로 연결해줍니다.

이렇게 연결해준 뒤에, 같은 줄에 오실로스코프로 연결할 선도 꼽아주고, 보드랑 연결할 선도 꼽아줍니다

오실로스코프 먼저 연결해서, 3.3V 안넘어가지는지 확인하고 보드에 연결하시는걸 추천합니다, 잘못하면 보드 터져요~

납땜했던 보드선과 마저 연결해주면 HW 준비는 끝입니다.


Step 4. Firmware Code

vs code에서 Build & Flash 할거기 때문에, 어떻게 해야하는지 모르는 분들은 이전글들을 참고해주세요

먼저 펌웨어 관련 파일들이 모여있는 디렉토리에서, prj.conf 파일을 ADC를 사용할 수 있게 수정해줍니다.

# Enable the UART driver
CONFIG_UART_ASYNC_API=y
CONFIG_NRFX_UARTE0=y
CONFIG_SERIAL=y

CONFIG_GPIO=y

# Make sure printk is printing to the UART console
CONFIG_CONSOLE=y
CONFIG_UART_CONSOLE=y

CONFIG_HEAP_MEM_POOL_SIZE=2048

CONFIG_BT=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_DEVICE_NAME="Nordic_UART_Service"
CONFIG_BT_MAX_CONN=1
CONFIG_BT_MAX_PAIRED=1

# Enable the NUS service
CONFIG_BT_NUS=y

# Enable bonding
CONFIG_BT_SETTINGS=y
CONFIG_FLASH=y
CONFIG_FLASH_PAGE_LAYOUT=y
CONFIG_FLASH_MAP=y

# Enable DK LED and Buttons library
CONFIG_DK_LIBRARY=y

# This example requires more stack
CONFIG_MAIN_STACK_SIZE=1152
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048

# Config logger
CONFIG_LOG=y
CONFIG_USE_SEGGER_RTT=y
CONFIG_LOG_BACKEND_RTT=y
CONFIG_LOG_BACKEND_UART=n
CONFIG_LOG_PRINTK=n

CONFIG_ASSERT=y

# ADC 드라이버 활성화
CONFIG_ADC=y

CONFIG_BT_DEVICE_NAME="NU40_ADC"


그리고 아래 main.c 코드 다운받으셔서 빌드 및 플래시 해주세요

main.c 파일 다운로드

중요한 부분은 ADC핀 설정 #define 입니다, 본인이 납땜한 ADC핀이 Data Sheet 상 어디인지 확인 후 코드 수정 하셔야합니다.

...

#define LOG_MODULE_NAME peripheral_uart
LOG_MODULE_REGISTER(LOG_MODULE_NAME);

// 데이터 전송 속도 조절 (5Hz)
#define SAMPLES_PER_PACKET 20 
// 5Hz 패킷 속도를 위한 200ms 대기
#define ADC_SLEEP_MS 200        

// ADC 설정 (nRF52840 기준)
#define ADC_NODE DT_NODELABEL(adc) // Devicetree에서 ADC 가져오기
#define ADC_RESOLUTION 12         // 12비트 해상도

// #define ADC_CHANNEL_ID 1          // P0.03은 AIN1 (채널 1)
// #define ADC_PORT SAADC_CH_PSELP_PSELP_AnalogInput1 // P0.03 핀

#define ADC_CHANNEL_ID 4          // 1 -> 4로 변경
#define ADC_PORT SAADC_CH_PSELP_PSELP_AnalogInput4 // AIN1 -> AIN4로 변경

#define ADC_GAIN ADC_GAIN_1_6     // 1/6 게인
#define ADC_REFERENCE ADC_REF_INTERNAL  // 0.6V 내부 기준 전압

...

위 코드까지 구웠다면 HW들은 전부 준비가 되었고 이제 어플쪽만 만들어주면 됩니다.


APP

Flutter나 기타 다른 언어를 사용하신다면 별도로 개발하시고
저는 C# .NET MAUI 기반의 앱을 만들었습니다.

Platforms/Android/AndroidManifest.xml 의 블루투스 관련 권한 설정 해주시고

MainPage.xamlMainPage.xaml.cs 코드는 아래 다운로드해서 안드로이드 폰으로 빌드해서 사용하시면 됩니다.

App 파일 다운로드

실행하면 아래처럼 실시간 사인파를 볼 수 있습니다(function generator의 파형)


짜잔

끝~

댓글남기기