1. ์๊ฐ
์์ ์๋ 52832๊ฐ์ ํํ ๋ธ๋ฆฌ์ง ์ค๊ตญ ์คํธ๋ ์ธ ๊ฒ์ด์ง๋ฅผ ๊ฐ์ถ nrfXNUMX ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ์ฉ ํต์ ํ๋กํ ์ฝ์ ๊ฐ๋ฐํ๋ ์์ ์ด ํฌํจ๋์์ต๋๋ค.
์ดํดํ ์ ์๋ ์ ๋ณด๊ฐ ๋ถ์กฑํ์ฌ ์์ ์ด ์ฝ์ง ์์ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ์ง์์ ์ธ ๋ฒ์ ์ ๋ฐ์ดํธ, ์ผ๋ถ ์ค๋ณต์ฑ ๋ฐ ํผ๋์ค๋ฌ์ด ๊ธฐ๋ฅ ๋ฑ "์ ์ ๊ทผ์"์ Nordic Semiconductor ์์ฒด์ SDK์ ์์ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์ต๋๋ค. ๋๋ ์ฒ์๋ถํฐ ๋ชจ๋ ๊ฒ์ ์์ฑํด์ผํ์ต๋๋ค.
๋๋ ์ด ์นฉ์ BLE ์คํ๊ณผ ์๋์ง ์ ์ฝ ๋ชจ๋๋ฅผ ์ํ ์ ์ฒด "์ํ" ์ธํธ๊ฐ ์๋ค๋ ์ฌ์ค์ ๋ฐํ์ผ๋ก ์ด ์ฃผ์ ๊ฐ ์๋นํ ๊ด๋ จ์ฑ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ง๋ง ์ด ์ฃผ์ ์ ๋ํด ๋ง์ ๊ธฐ์ฌ๊ฐ ์์ฑ๋์์ผ๋ฏ๋ก ๊ธฐ์ ์ ์ธ ๋ถ๋ถ์ ๋๋ฌด ๊น์ด ๋ค์ด๊ฐ์ง๋ ์๊ฒ ์ต๋๋ค.
2. ํ๋ก์ ํธ ์ค๋ช
์ฒ :
- Adafruit Feather nRF52 Bluefruit LE(๋ฌด์จ ์ผ์ด ์์๋์ง)
- ADC HX711
- ์ค๊ตญ ์คํธ๋ ์ธ ๊ฒ์ด์ง 2๊ฐ (50x2kg)
- ํ๋ก๊ทธ๋๋จธ ST-LINK V2
์ํํธ์จ์ด:
- IDE VSCODE
- NRF SDK 16
- ์คํOCD
- ํ๋ก๊ทธ๋๋จธ ST-LINK V2
๋ชจ๋ ๊ฒ์ด ํ๋์ ํ๋ก์ ํธ์ ์์ผ๋ฏ๋ก Makefile์ ์กฐ์ ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค(SDK์ ์์น ์ง์ ).
3. ์ฝ๋ ์ค๋ช
GPIOTE ๋ชจ๋์ ์ฌ์ฉํ์ฌ ์์ ๋ฐ ์ด๋ฒคํธ ๋ฐ์ธ๋ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์ฃผ๋ณ ์ฅ์น์ ์์ ํ๊ณ PPI ๋ชจ๋์ ์ฌ์ฉํ์ฌ ํ๋ก์ธ์์ ์ฐธ์ฌ ์์ด ํ ์ฃผ๋ณ ์ฅ์น์์ ๋ค๋ฅธ ์ฃผ๋ณ ์ฅ์น๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํฉ๋๋ค.
ret_code_t err_code;
err_code = nrf_drv_gpiote_out_init(PD_SCK, &config);//ะฝะฐัััะฐะตะฒะฐะตะผ ะฝะฐ ะฒัั
ะพะด
nrf_drv_gpiote_out_config_t config = GPIOTE_CONFIG_OUT_TASK_TOGGLE(false);//ะฑัะดะตะผ ะฟะตัะตะดะตัะณะธะฒะฐัั ะฟะธะฝ ะดะปั ะธะผะฟัะปััะฐ
err_code = nrf_drv_gpiote_out_init(PD_SCK, &config);//ะฝะฐัััะฐะตะฒะฐะตะผ ะฝะฐ ะฒัั
ะพะด
PD_SCL ๋๊ธฐํ ๋ผ์ธ์ ์ถ๋ ฅ์ ๊ตฌ์ฑํ์ฌ 10ฮผs ์ง์ ์๊ฐ์ ํ์ค๋ฅผ ์์ฑํฉ๋๋ค.
nrf_drv_gpiote_in_config_t gpiote_config = GPIOTE_CONFIG_IN_SENSE_HITOLO(false);// ะฟะตัะตั
ะพะด ััะพะฒะฝั ั ะฒััะพะบะพะณะพ ะฝะฐ ะฝะธะทะบะธะน
nrf_gpio_cfg_input(DOUT, NRF_GPIO_PIN_NOPULL);// ะฝะฐ ะฒั
ะพะด ะฑะตะท ะฟะพะดััะถะบะธ
err_code = nrf_drv_gpiote_in_init(DOUT, &gpiote_config, gpiote_evt_handler);
static void gpiote_evt_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
nrf_drv_gpiote_in_event_disable(DOUT);//ะพัะบะปััะฐะตะผ ะฟัะตััะฒะฐะฝะธะต
nrf_drv_timer_enable(&m_timer0);//ะฒะบะปััะฐะตะผ ัะฐะนะผะตั
}
HX711์ ์ค๋น ์ํ๋ฅผ ์ฝ๋๋ก DOUT ๋ฐ์ดํฐ ๋ผ์ธ์ ๊ตฌ์ฑํ๊ณ , ๋ ๋ฒจ์ด ๋ฎ์ผ๋ฉด ์ธํฐ๋ฝํธ๋ฅผ ๋นํ์ฑํํ๊ณ ํ์ด๋จธ๋ฅผ ์์ํ์ฌ PD_SCL ์ถ๋ ฅ์์ โโํด๋ก ํ์ค๋ฅผ ์์ฑํ๋ ํธ๋ค๋ฌ๊ฐ ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channel1);
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_ppi_channel_assign(m_ppi_channel1, nrf_drv_timer_event_address_get(&m_timer0, NRF_TIMER_EVENT_COMPARE0), nrf_drv_gpiote_out_task_addr_get(PD_SCK));// ะฟะพะดะบะปััะฐะตะผ ัะฐะนะผะตั ะบ ะฒัั
ะพะดั
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_ppi_channel_enable(m_ppi_channel1);// ะฒะบะปััะฐะตะผ ะบะฐะฝะฐะป
APP_ERROR_CHECK(err_code);
nrf_drv_gpiote_out_task_enable(PD_SCK);
// gpiote ํ์ฑํ
๊ทธ๋ฐ ๋ค์ PPI ๋ชจ๋์ ์ด๊ธฐํํ๊ณ ํ์ด๋จธ๋ฅผ PD_SCL ์ถ๋ ฅ์ ์ฐ๊ฒฐํ์ฌ ๋น๊ต ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ 10ฮผs ์ง์ ์๊ฐ์ ํ์ค๋ฅผ ์์ฑํ๊ณ GPIOTE ๋ชจ๋๋ ์ผญ๋๋ค.
nrf_drv_timer_config_t timer_cfg = NRF_DRV_TIMER_DEFAULT_CONFIG;// ะฟะพ ัะผะพะปัะฐะฝะธั
timer_cfg.frequency = NRF_TIMER_FREQ_1MHz;// ัะฐะบัะธััะตะผ ะฝะฐ ัะฐััะพัะต 1ะะณั
ret_code_t err_code = nrf_drv_timer_init(&m_timer0, &timer_cfg, timer0_event_handler);
APP_ERROR_CHECK(err_code);
nrf_drv_timer_extended_compare(&m_timer0,
NRF_TIMER_CC_CHANNEL0,
nrf_drv_timer_us_to_ticks(&m_timer0,
10),
NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK,
true);// ััะฐะฑะฐััะฒะฐะตั ะฟะพ ััะฐะฒะฝะตะฝะธั
์ ๋ก ํ์ด๋จธ์ ๊ทธ ํธ๋ค๋ฌ๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
if(m_counter%2 != 0 && m_counter<=48){
buffer <<= 1;// ะฟะตัะตะผะตะฝะฝะฐั ััะธัะฐะฝะฝัั
ะดะฐะฝัั
c_counter++;// ััะตััะธะบ ะฟะพะปะพะถะธัะตะปัะฝัั
ะธะผะฟัะปััะพะฒ
if(nrf_gpio_pin_read(DOUT))buffer++;//ััะธััะฒะฐะตะผ ัะพััะพัะฝะธะต ะฒั
ะพะดะฐ
}
๊ฐ์ฅ ํฅ๋ฏธ๋ก์ด ์ผ์ ํ์ด๋จธ ํธ๋ค๋ฌ์์ ๋ฐ์ํฉ๋๋ค. ํ์ค์ฃผ๊ธฐ๋ 20ฮผs์ ๋๋ค. ์ฐ๋ฆฌ๋ ํ์ ํ์ค(์์น ์์ง๋ฅผ ๋ฐ๋ผ)์ ๊ด์ฌ์ด ์๊ณ ๊ทธ ์๊ฐ 24๊ฐ ์ดํ์ด๊ณ ์ด๋ฒคํธ๊ฐ 48๊ฐ์ธ ๊ฒฝ์ฐ ๊ฐ ํ์ ์ด๋ฒคํธ์ ๋ํด DOUT์ ์ฝ์ต๋๋ค.
๋ฐ์ดํฐ์ํธ์ ๋ฐ๋ฅด๋ฉด ํ์ค ์๋ 25๊ฐ ์ด์์ด์ด์ผ ํ๋ฉฐ ์ด๋ 128์ ์ด๋์ ํด๋นํ๋ฉฐ(์ฝ๋์์๋ 25๊ฐ์ ํ์ค๋ฅผ ์ฌ์ฉํจ) ์ด๋ ๋ฐ์ดํฐ ํ๋ ์์ ๋์ ๋ํ๋ด๋ 50๊ฐ์ ํ์ด๋จธ ์ด๋ฒคํธ์ ๋์ผํฉ๋๋ค.
++m_counter;// ััะตััะธะบ ัะพะฑััะธะน
if(m_counter==50){
nrf_drv_timer_disable(&m_timer0);// ะพัะบะปััะฐะตะผ ัะฐะนะผะตั
m_simple_timer_state = SIMPLE_TIMER_STATE_STOPPED;//
buffer = buffer ^ 0x800000;
hx711_stop();//jะพัะบะปััะฐะตะผ hx711
}
๊ทธ๋ฐ ๋ค์ ํ์ด๋จธ๋ฅผ ๋๊ณ ๋ฐ์ดํฐ ์ํธ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ HX711์ ์ ์ ๋ ฅ ์๋น ๋ชจ๋๋ก ์ ํํฉ๋๋ค.
static void repeated_timer_handler(void * p_context)
{
nrf_drv_gpiote_out_toggle(LED_2);
if(m_simple_timer_state == SIMPLE_TIMER_STATE_STOPPED){
hx711_start();// ะฒะบะปััะฐะตะผ hx711
nrf_drv_gpiote_out_toggle(LED_1);
m_simple_timer_state = SIMPLE_TIMER_STATE_STARTED;
}
}
/**@brief Create timers.
*/
static void create_timers()
{
ret_code_t err_code;
// Create timers
err_code = app_timer_create(&m_repeated_timer_id,
APP_TIMER_MODE_REPEATED,
repeated_timer_handler);
APP_ERROR_CHECK(err_code);
}
์ฐ๋ฆฌ๋ 10์ด ๊ฐ๊ฒฉ(๊ทํ์ ์ฌ๋์ ๋ฐ๋ผ ๋ค๋ฆ)์ผ๋ก RTC ํ์ด๋จธ์ ์ด๋ฒคํธ๋ฅผ ์์ํ๊ณ ํธ๋ค๋ฌ์์ HX711์ ์คํํ์ฌ DOUT ๋ผ์ธ์ ์ธํฐ๋ฝํธ๋ฅผ ๋ฐ์์ํต๋๋ค.
ํ ๊ฐ์ง ์ ์ด ๋ ์์ต๋๋ค. ๋ก๊ทธ๋ UART(์ ์ก ์๋ 115200, TX - 6ํ, RX - 8ํ)๋ฅผ ํตํด ์ถ๋ ฅ๋ฉ๋๋ค. ๋ชจ๋ ์ค์ ์ sdk_config.h์ ์์ต๋๋ค.
์กฐ์ฌ ๊ฒฐ๊ณผ
๊ด์ฌ์ ๊ฐ์ ธ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด ๊ธฐ์ฌ๊ฐ ์ ์ฉํ๊ณ ๊ฐ๋ฐ์๊ฐ ์๋ฃจ์ ์ ์ฐพ๋ ๋ฐ ์์๋๋ ๊ท์คํ ์๊ฐ์ ๋จ์ถํ๋ ๋ฐ ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ถ์ ๋ฝ์ด ํ๋ซํผ์ ์ฌ์ฉํ๋ ๊ธฐ์ ์ ์ ๊ทผ ๋ฐฉ์์ ์๋์ง ํจ์จ์ฑ ์ธก๋ฉด์์ ๋งค์ฐ ํฅ๋ฏธ๋กญ๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค.
PS
ํ๋ก์ ํธ๋ ์์ง ๊ฐ๋ฐ ์ค์ด๋ฏ๋ก ์ด ์ฃผ์ ์ ๊ด์ฌ์ด ์๋ค๋ฉด ๋ค์ ๊ธฐ์ฌ์์๋ ๋ฌด๊ฒ ์ผ์ ๊ต์ ๋ฐ BLE ์คํ ์ฐ๊ฒฐ์ ์ํ ์๊ณ ๋ฆฌ์ฆ์ ์ค๋ช ํ๋ ค๊ณ ํฉ๋๋ค.
์ฌ๋ฃ
์ถ์ฒ : habr.com