- nRF52 개발 키트 :
- Segger 임베디드 스튜디오
- nRF52DK가있는 DHT11
- BLE (Bluetooth Low Energy)를 사용하는 방법은 무엇입니까?
- BLE 서비스 / 특성 다이어그램
- nRF52 BLE 프로그램 설명
- nRF Connect를 사용하여 프로그램 테스트
피트니스 밴드, 스마트 워치 및 기타 웨어러블 장치로 인해 Bluetooth 5 / Bluetooth Low Energy 사용이 점점 더 인기를 얻고 있습니다.통신 표준이 널리 채택되고 있습니다. BLE는 매우 적은 전력으로 짧은 거리에서 데이터를 교환 할 수 있도록 도와 주며, 이는 웨어러블과 같은 배터리로 작동하는 장치에 매우 중요합니다. 또한 무선 BLE 메시 네트워크를 설정하는 데 도움이됩니다.이 기능은 폐쇄 된 환경에서 여러 장치가 서로 통신해야하는 홈 자동화 장치에 유용합니다. 우리는 이미 Raspberry Pi와 함께 BLE를 사용하고 ESP32와 함께 BLE를 사용하여 몇 가지 기본 BLE 기능을 수행했습니다. 엔지니어들은 소형 배터리로 오랫동안 실행할 수있는 휴대용 무선 장치를 설계하기 위해 BLE를 실험하고 있으며 BLE와 함께 작동하는 데 사용할 수있는 여러 개발 키트가 있습니다. Arduino Nano 33에 대한 최근 리뷰에서 보드에 BLE 기능이있는 nRF52840이 있음을 확인했습니다.
이 튜토리얼에서는 BLE를 사용하여 온도 및 습도를 측정하기 위해 nRF52 DK 라고하는 흥미롭고 인기있는 또 다른 개발 기판을 살펴볼 것 입니다. 기본적으로 BLE 환경 감지 프로필은 다양한 환경 매개 변수를 지원하지만이 자습서는 온도 및 습도 값으로 만 제한됩니다. 이 솔루션은 Bluetooth 저에너지를 통해 스마트 폰과 연결되며 온도, 습도와 같은 환경 매개 변수에 대한 빈번한 업데이트를 제공합니다. DHT1 센서를 사용하고 온도 측정은 섭씨 0.01 도의 해상도로 수행되며 습도 측정은 0.01 %의 해상도로 수행됩니다.
nRF52 개발 키트:
nRF52DK 는 Bluetooth 저에너지 및 2.4GHz 무선 사물 인터넷 애플리케이션을위한 완벽한 프로토 타이핑 플랫폼입니다. 개발 키트는 오픈 소스, GCC 및 Keil, IAR 및 Segger Embedded Studio 등과 같은 상업용 통합 개발 환경과 같은 다양한 표준 Nordic Toolchain을 지원합니다. Nordic은 nRF52DK에 대한 완전한 지원을 포함하는 nRF52 용 본격적인 소프트웨어 개발 키트도 제공합니다.
nRF52DK는 512KB의 플래시 메모리와 64KB의 SRAM이 통합 된 nRF52832 ARM Cortex-M4F 마이크로 컨트롤러 로 구동됩니다. nRF52DK에는 통합 된 Segger J-Link On Board 디버거가 있어 외부 / 추가 jtag 디버그 장치없이 더 쉽고 빠른 디버깅을 제공합니다. Arduino Uno Rev3 호환 커넥터 도 포함됩니다. 마이크로 프로세서와 아날로그 및 디지털 입력의 인터페이스를 지원하며 I2C (Inter-Integrated Circuit), SPI (직렬 주변기기 인터페이스) 및 UART (Universal Asynchronous Receiver and Transmitter)와 같은 표준 통신 프로토콜도 포함합니다. 이 개발 키트는 스마트 폰, 노트북 및 태블릿과 연결하기 위해 Bluetooth Low Energy를 사용하여 단거리 무선 통신을 제공하는 내장 PCB 안테나로 설계되었습니다.
Segger 임베디드 스튜디오
개발 보드를 프로그래밍하기 위해 nRF52와 함께 Segger Embedded Studio를 사용합니다. Segger Embedded Studio는 특히 임베디드 시스템 개발을위한 강력한 C / C ++ 통합 개발 환경 (IDE)입니다. 이는 임베디드 C 프로그래밍, 개발 및 디버깅에 필요한 모든 것을 포함하는 완전한 올인원 솔루션을 제공합니다. 여기에는 ARM Cortex 장치를 지원하는 프로젝트 관리, 편집기, 디버거가 포함 된 임베디드 시스템 프로그래밍 및 개발을위한 완전한 워크 플로가 포함됩니다. 이 강력하고 사용하기 쉬운 IDE는 코드 크기 제한없이 정식 라이선스가있는 Nordic 고객에게 완전히 무료입니다. IDE는 아래 링크에서 다운로드 할 수 있습니다.
Segger Embedded Studio 다운로드
nRF52DK가있는 DHT11
DHT11은 저항성 유형 습도 측정 구성 요소와 NTC 유형 온도 측정 구성 요소를 갖춘 완전한 기능의 온도 및 습도 센서입니다. 우수한 품질, 빠른 응답 및 비용 효율성을 제공합니다. 기본적으로 모든 DHT11 센서는 실험실에서 보정되어 극도의 정확성과 신뢰성을 제공합니다. Single-Wire Serial Interface 시스템을 사용하여 통신하며 기타 사양은 아래와 같습니다.
DHT11의 사양:
- 습도 범위: 20 – 90 % RH
- 온도 범위: 섭씨 0 – 50도
- 습도 정확도: ± 5 % RH
- 온도 정확도: ± 2 ℃
DHT11의 타이밍 다이어그램:
DHT11 센서에서 데이터를 읽는 것은 위에 표시된 타이밍 다이어그램을 사용하면 비교적 간단합니다. 절차는 모든 컨트롤러와 유사하며 이미이 센서를 다음과 같은 다른 개발 플랫폼과 함께 사용했습니다.
- Raspberry Pi가있는 DHT11 센서
- PIC16F877A가있는 DHT11 센서
- STM32F103C8이있는 DHT11 센서
- NodeMCU가있는 DHT11 센서
DHT11 온도 및 습도 센서와 nRF52 개발 키트를 연결하려면 아래의 연결 다이어그램을 따르십시오.
커넥터 모듈을 사용하여 센서를 보드에 연결하므로 최종 설정은 다음과 같습니다.
DHT11과 통신하기위한 순서도:
아래 순서도는 nRF52DK와 DHT11 간의 통신에 사용할 프로그램 논리 흐름을 설명합니다.
데이터 형식:
BLE (Bluetooth Low Energy)를 사용하는 방법은 무엇입니까?
BLE 기능을 사용하는 방법을 이해하려면 아래에 설명 된 몇 가지 기본 용어를 이해해야합니다. ESP32 BLE 기사를 읽고 BLE에 대해 자세히 알아볼 수도 있습니다.
일반 액세스 프로필 (GAP)
Generic Access Profile은 BLE 주변 장치 와 중앙 장치 간의 통신을위한 연결을 설정하는 완전한 책임을집니다. GAP는 또한 장치 스캔 / 검색, 링크 계층 연결 설정, 링크 종료, 보안 기능의 핸드 셰이 킹 및 본격적인 장치 구성을 포함한 다양한 절차를 제공합니다. GAP는 다음 기기 상태에서 작동합니다.
GAP 상태 |
기술 |
대기 |
재설정시 장치 초기 상태 |
신문 |
이니시에이터 스캔에 도움이되는 데이터가 포함 된 장치 광고 |
스캐너 |
스캔 요청을 받아 광고주에게 보냅니다. |
창시자 |
링크를 설정하기 위해 연결 요청을 보냅니다. |
슬레이브 / 마스터 |
연결시, 장치는 광고주 인 경우 슬레이브, 개시자인 경우 마스터 |
일반 속성 프로필 레이어 (GATT)
GATT는 Generic Attribute Profile Layer의 약자로, 두 개의 BLE 장치 (Peripheral 및 Central) 간의 데이터 통신을 담당합니다. 데이터 통신은 데이터를 통신하고 저장하는 특성의 형태로 특징 지어집니다. BLE 장치는 아래와 같은 장치 통신에 대해 두 가지 역할을합니다.
- GATT 서버에는 읽기 및 쓰기에 사용될 특성 정보가 포함되어 있습니다. 이 튜토리얼에서는 DHT11 센서와 dev. 키트는 GATT 서버입니다.
- GATT 클라이언트는 GATT 서버에서 데이터를 읽고 씁니다. 스마트 폰은 센서 보드에 데이터를 읽고 쓰는 GATT 클라이언트입니다.
블루투스 SIG
Bluetooth SIG (Special Interest Group)는 Bluetooth 표준의 개발과 Bluetooth 기술 라이선스를 모니터링하는 표준 조직입니다. SIG 그룹은 Bluetooth 제품을 생산하거나 판매하지 않습니다. Bluetooth 사양 및 표준화를 정의합니다. Bluetooth 저에너지 프로파일 및 각 특성에 대한 고유 식별자를 정의합니다. GATT 프로필 사양은 아래 링크에서 찾을 수 있습니다.
GATT 프로필 사양
위 링크에 제공된 GATT 사양을 기반으로 아래 표에 나와있는 프로젝트에 필요한 고유 식별자를 수집했습니다.
프로필 / 특성 |
UUID |
GAP (일반 액세스) |
0x1800 |
GATT (일반 속성) |
0x1801 |
ESS (환경 감지) |
0x181A |
온도 |
0x2A6E |
습기 |
0x2A6F |
BLE 서비스 / 특성 다이어그램
BLE UUID
UUID |
16 비트 값 |
128 비트 UUID |
ESS 서비스 |
0x181A |
0000181A-0000-0000-0000-00000000000 |
임시 문자 |
0x2A6E |
00002A6E-0000-0000-0000-00000000000 |
습도 Char |
0x2A6F |
00002A6F-0000-0000-0000-00000000000 |
온도 특성
특성 |
기술 |
단위 |
0.01도 분해능의 섭씨 온도 |
체재 |
sint16 |
UUID |
0x2A6E |
십진수 지수 |
2 |
읽다 |
필수 |
습도 특성
특성 |
기술 |
단위 |
0.01 % 해상도의 백분율 |
체재 |
uint16 |
UUID |
0x2A6F |
십진수 지수 |
2 |
읽다 |
필수 |
nRF52 BLE 프로그램 설명
nRF52 개발 키트를 프로그래밍하기 위해 nRF5 SDK 를 사용할 것 입니다. nRF5 SDK는 nRF5 시리즈 SoC의 모든 주변 장치에 대한 수많은 Bluetooth 저에너지 프로파일, GATT Serializer 및 드라이버 지원과 통합 된 완전한 소프트웨어 개발 키트입니다. 이 SDK는 개발자가 nRF52 및 nRF51 시리즈 마이크로 컨트롤러를 사용하여 모든 기능을 갖춘 안정적이고 안전한 Bluetooth 저에너지 애플리케이션을 구축하는 데 도움이됩니다. 전체 프로그램은 여기에서 다운로드 할 수 있으며 코드 설명은 다음과 같습니다.
풀업 활성화를 사용하여 nrf52에서 DHT11 DATA 핀을 입력으로 구성합니다. nRF52가 DHT11 데이터 핀에 대해 적절한 PULLUP을 제공하는지 확인하려면 핀 상태가 높아야합니다.
/ * 입력으로 설정하고 신호가 당겨 지는지 확인 * / Data_SetInput (); DelayUSec (50); if (Data_GetVal () == 0) {return DHT11_NO_PULLUP; }
nRF52 마이크로 컨트롤러에서 시작 신호를 생성하고 승인 신호를 확인합니다.
/ * 시작 신호 보내기 * / Data_SetOutput (); Data_ClrVal (); 지연 MSec (20); / * 최소 18ms 동안 신호를 낮게 유지 * / Data_SetInput (); DelayUSec (50); / * 확인 신호 확인 * / if (Data_GetVal ()! = 0) {/ * 신호는 센서에 의해 낮게 당겨 져야합니다. * / return DHT11_NO_ACK_0; } / * 센서의 ack 신호를 위해 최대 100 us 대기 * / cntr = 18; while (Data_GetVal () == 0) {/ * 신호가 올라갈 때까지 기다립니다 * / DelayUSec (5); if (--cntr == 0) {return DHT11_NO_ACK_1; / * 여기서 ACK에 대한 신호가 올라와야합니다 * /}} / * 다시 내려갈 때까지 기다립니다, ack 시퀀스의 끝 * / cntr = 18; while (Data_GetVal ()! = 0) {/ * 신호가 다운 될 때까지 기다립니다 * / DelayUSec (5); if (--cntr == 0) {return DHT11_NO_ACK_0; / * 신호는 여기서 다시 0으로 내려 가야합니다 * /}}
이제 2 바이트의 온도, 2 바이트의 습도 및 1 바이트의 체크섬이 포함 된 40 비트 데이터를 읽으십시오.
/ * 이제 40 비트 데이터를 읽습니다. * / i = 0; 데이터 = 0; loopBits = 40; do {cntr = 11; / * wait max 55 us * / while (Data_GetVal () == 0) {DelayUSec (5); if (--cntr == 0) {return DHT11_NO_DATA_0; }} cntr = 15; / * wait max 75 us * / while (Data_GetVal ()! = 0) {DelayUSec (5); if (--cntr == 0) {return DHT11_NO_DATA_1; }} 데이터 << = 1; / * 다음 데이터 비트 * / if (cntr <10) {/ * 데이터 신호 높음> 30 us ==> 데이터 비트 1 * / 데이터-= 1; } if ((loopBits & 0x7) == 1) {/ * 다음 바이트 * / buffer = data; i ++; 데이터 = 0; }} while (-loopBits! = 0);
체크섬의 도움으로 데이터를 검증하십시오.
/ * test CRC * / if ((uint8_t) (buffer + buffer + buffer + buffer)! = buffer) {return DHT11_BAD_CRC; }
온도 및 습도 조작 및 저장
/ * 호출자의 데이터 값 저장 * / 습도 = ((int) buffer) * 100 + buffer; 온도 = ((int) 버퍼) * 100 + 버퍼;
nRF5 SDK 로거 서비스를 초기화합니다. nRF52 SDK는 로깅 제어 인터페이스라고으로 기능입니다 nrf_log 과 정보를 로그인하기위한 기본 백엔드를 사용합니다. 기본 백엔드는 직렬 포트입니다. 여기서 우리는 nrf_log 제어 인터페이스와 nrf_log 기본 백엔드를 모두 초기화합니다.
ret_code_t err_code = NRF_LOG_INIT (NULL); APP_ERROR_CHECK (err_code); NRF_LOG_DEFAULT_BACKENDS_INIT ();
nRF52 SDK에는 애플리케이션 타이머 기능이 있습니다. 애플리케이션 타이머 모듈을 사용하면 RTC1 주변 장치를 기반으로 여러 타이머 인스턴스를 만들 수 있습니다. 여기서 nRF5 애플리케이션 타이머 모듈을 초기화합니다. 이 솔루션에서는 두 개의 애플리케이션 타이머가 데이터 업데이트 간격에 사용됩니다.
ret_code_t err_code = app_timer_init (); APP_ERROR_CHECK (err_code);
nRF52 SDK에는 BLE 장치가 코인 셀 배터리에서 여러 달 동안 작동해야하기 때문에 완전한 기능의 전원 관리 모듈이 있습니다. 전력 관리는 BLE 애플리케이션에서 중요한 역할을합니다. nRF52 전원 관리 모듈은 완전히 동일하게 처리합니다. 여기서 nRF5 SDK의 전원 관리 모듈을 초기화합니다.
ret_code_t err_code; err_code = nrf_pwr_mgmt_init (); APP_ERROR_CHECK (err_code);
nRF52 SDK에는 Bluetooth 저에너지 중앙 및 주변 장치 스택을 특징으로하는 내장 된 Nordic Soft Device 펌웨어 16 진수 파일 이 있습니다. 이 우수한 프로토콜 스택에는 GATT, GAP, ATT, SM, L2CAP 및 링크 계층이 포함됩니다. 여기서는 nRF5 BLE Radio Stack (Nordic Soft Device)을 초기화 한 초기화 시퀀스를 따릅니다.
ret_code_t err_code; err_code = nrf_sdh_enable_request (); APP_ERROR_CHECK (err_code); // 기본 설정을 사용하여 BLE 스택을 구성합니다. // 애플리케이션 RAM의 시작 주소를 가져옵니다. uint32_t ram_start = 0; err_code = nrf_sdh_ble_default_cfg_set (APP_BLE_CONN_CFG_TAG, & ram_start); APP_ERROR_CHECK (err_code); // BLE 스택을 활성화합니다. err_code = nrf_sdh_ble_enable (& ram_start); APP_ERROR_CHECK (err_code); // BLE 이벤트에 대한 핸들러를 등록합니다. NRF_SDH_BLE_OBSERVER (m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
GAP는 장치 스캔 / 검색, 링크 설정, 링크 종료, 보안 기능 시작 및 구성을 담당합니다. GAP는 연결 간격, 슬레이브 대기 시간, 감독 시간 초과 등과 같은 주요 연결 매개 변수를 특징으로합니다. 여기에서 일반 액세스 프로파일 연결 매개 변수를 초기화합니다.
ret_code_terr_code; ble_gap_conn_params_tgap_conn_params; ble_gap_conn_sec_mode_t sec_mode; BLE_GAP_CONN_SEC_MODE_SET_OPEN (& sec_mode); err_code = sd_ble_gap_device_name_set (& sec_mode, (const uint8_t *) DEVICE_NAME, strlen (DEVICE_NAME)); APP_ERROR_CHECK (err_code); memset (& gap_conn_params, 0, sizeof (gap_conn_params)); gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL; gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL; gap_conn_params.slave_latency = SLAVE_LATENCY; gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT; err_code = sd_ble_gap_ppcp_set (& gap_conn_params); APP_ERROR_CHECK (err_code);
GATT는 BLE 주변 장치와 중앙 장치 간의 데이터 통신을 담당합니다. nRF52 GATT 모듈은 최대 ATT_MTU 크기를 협상하고 추적하는 데 유용합니다. 여기에서 nRF52 SDK 일반 속성 모듈을 초기화합니다.
ret_code_t err_code = nrf_ble_gatt_init (& m_gatt, NULL); APP_ERROR_CHECK (err_code);
GATT는 서비스 및 특성의 형태로 데이터 통신을 수행합니다. 여기서 우리는 온도 및 습도와 같은 특성의 초기화를 포함하는 GATT 환경 감지 서비스를 초기화합니다.
ret_code_terr_code; nrf_ble_qwr_init_t qwr_init = {0}; // 대기중인 쓰기 모듈을 초기화합니다. qwr_init.error_handler = nrf_qwr_error_handler; err_code = nrf_ble_qwr_init (& m_qwr, & qwr_init); APP_ERROR_CHECK (err_code); m_ess.notif_write_handler = ble_ess_notif_write_handler; err_code = ble_ess_init (& m_ess); APP_ERROR_CHECK (err_code);
광고는 BLE 애플리케이션 환경에서 중요한 역할을합니다. 패킷에는 주소 유형, 광고 유형, 광고 데이터, 장치 제조업체 별 데이터 및 스캔 응답 데이터의 정보가 포함됩니다. nRF52 SDK는 광고 모듈이 특징입니다. 여기서 우리는 매개 변수로 광고 모듈을 초기화합니다.
ret_code_terr_code; ble_advdata_t advdata; ble_advdata_t srdata; ble_uuid_t adv_uuids = {{ESS_UUID_SERVICE, BLE_UUID_TYPE_BLE}}; // 광고 데이터를 만들고 설정합니다. memset (& advdata, 0, sizeof (advdata)); advdata.name_type = BLE_ADVDATA_FULL_NAME; advdata.include_appearance = true; advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE; memset (& srdata, 0, sizeof (srdata)); srdata.uuids_complete.uuid_cnt = sizeof (adv_uuids) / sizeof (adv_uuids); srdata.uuids_complete.p_uuids = adv_uuids; err_code = ble_advdata_encode (& advdata, m_adv_data.adv_data.p_data, & m_adv_data.adv_data.len); APP_ERROR_CHECK (err_code); err_code = ble_advdata_encode (& srdata, m_adv_data.scan_rsp_data.p_data, & m_adv_data.scan_rsp_data.len); APP_ERROR_CHECK (err_code); ble_gap_adv_params_t adv_params; // 광고 매개 변수를 설정합니다. memset (& adv_params, 0, sizeof (adv_params)); adv_params.primary_phy = BLE_GAP_PHY_1MBPS; adv_params.duration = APP_ADV_DURATION; adv_params.properties.type = BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED; adv_params.p_peer_addr = NULL; adv_params.filter_policy = BLE_GAP_ADV_FP_ANY; adv_params.interval = APP_ADV_INTERVAL; err_code = sd_ble_gap_adv_set_configure (& m_adv_handle, & m_adv_data, & adv_params); APP_ERROR_CHECK (err_code);
BLE 연결은 첫 번째 연결 매개 변수 업데이트 지연, 다음 연속 지연, 업데이트 횟수, 연결 이벤트 핸들러 콜백 함수 및 연결 오류 콜백 이벤트 핸들러와 같은 다양한 연결 매개 변수로 처리되고 모니터링됩니다. 여기서는 연결 이벤트 및 오류 이벤트에 대한 초기화 BLE 연결 설정 매개 변수 및 콜백 이벤트 핸들러를 수행합니다.
ret_code_terr_code; ble_conn_params_init_t cp_init; memset (& cp_init, 0, sizeof (cp_init)); cp_init.p_conn_params = NULL; cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY; cp_init.next_conn_params_update_delay = NEXT_CONN_PARAMS_UPDATE_DELAY; cp_init.max_conn_params_update_count = MAX_CONN_PARAMS_UPDATE_COUNT; t_on_notify_cccd_handle = BLE_GATT_HANDLE_INVALID; cp_init.disconnect_on_fail = false; cp_init.evt_handler = on_conn_params_evt; cp_init.error_handler = conn_params_error_handler; err_code = ble_conn_params_init (& cp_init); APP_ERROR_CHECK (err_code);
시스템 초기화가 완료되면 여기에서 BLE 장치 이름 및 기능 정보를 알리는 것으로 시작합니다. 여기에서이 주변 장치는 스마트 폰 Ble 스캔 목록을 통해 볼 수 있습니다.
ret_code_terr_code; err_code = sd_ble_gap_adv_start (m_adv_handle, APP_BLE_CONN_CFG_TAG); APP_ERROR_CHECK (err_code);
메인 루프는 2 초 간격으로 실행되며, 읽기 또는 알림을 사용하여 연결된 스마트 장치에 대한 온도 및 습도 및 업데이트를 읽습니다.
for (;;) { uint16_t 온도, 습도; DHTxx_ErrorCode dhtErrCode; idle_state_handle (); if (updtmrexp) { dhtErrCode = DHTxx_Read (& 온도, & 습도); if (dhtErrCode == DHT11_OK) { NRF_LOG_INFO ("온도: % d 습도: % d \ n", 온도, 습도); if (temp_notif_enabled) { ble_ess_notify_temp (m_conn_handle, & m_ess, 온도); } else { ble_ess_update_temp (& m_ess, 온도); } if (humid_notif_enabled) { ble_ess_notify_humid (m_conn_handle, & m_ess, 습도); } else { ble_ess_update_humid (& m_ess, 습도); } } updtmrexp = false; } }
nRF Connect를 사용하여 프로그램 테스트
nRF Connect는 BLE 지원 주변 장치를 스캔하고 탐색 할 수있는 강력한 Bluetooth 저에너지 도구입니다. 모바일 용 nRF Connect는 광범위한 Bluetooth SIG 채택 표준 프로필을 지원합니다. 이를 사용하여 프로그램을 확인할 수 있으며, 앱을 설치 한 후 앱에서 BLE 장치를 검색하여 nRF52 보드를 휴대폰과 페어링 할 수 있습니다. 환경 감지 속성 내에서 아래 그림과 같이 업데이트되는 온도 및 습도 값을 확인할 수 있습니다.
Hariharan Veerappan 은 임베디드 제품 개발 분야에서 15 년 이상의 경험을 가진 독립 컨설턴트입니다. 그는 임베디드 펌웨어 / 리눅스 개발에 대한 컨설팅 서비스를 제공하고 기업 및 온라인 교육도 제공합니다. Hariharan은 전자 및 통신 공학 분야에서 공학 학사 학위를 받았으며 그의 기사와 튜토리얼을 통해 Circuit Digest 독자들과 자신의 경험과 생각을 공유합니다.