á
á¡á á®á¡á ááºááœáẠáá¶áá¬ážáá áºááá¯ááºážááŸá ááá¯ááºáá»áá¯ážááœá² ááá¯ááºážáá¬ááŸá¯ááŸá áºáá¯áá«ááŸááá±á¬ nrf52832 ááá¯ááºáááá¯ááœááºáááá¯áá¬á¡ááœáẠáááºááœááºáá±ážáááá¯ááá¯áá±á¬ááᯠáá®ááœááºáááºáá¬áááºááŒá áºáááºá
áá»áœááºá¯ááºááẠá¥á¬ááºáááºá¥á¬ááºááœá±ážáááŒáá·áºáá®áá±á¬ á¡áá»ááºá¡áááºáá»á¬ážááŸáá·áº áááºááá¯ááºáá²á·ááá±á¬ááŒá±á¬áá·áº á¡áá¯ááºááẠááœááºáá°áááºááá¯ááºáá±á Nordic Semiconductor ááá¯ááºááá¯ááºá០SDK ááœáẠ"ááá±á¬ááºážááŸá¯áá¡ááŒá áº" ááœááºááŸáááẠ- á ááºáááºáááŒááºáá¬ážááŸááºážááœááºážáá¶ááŸá¯áá»á¬ážá á¡áá»áá¯á·áá±á¬ááœááºážáá¶ááŸá¯áá»á¬ážááŸáá·áºááŸá¯ááºááœá±ážáá±á¬áá¯ááºáá±á¬ááºááá¯ááºá áœááºážáá»á¬ážááŸááááºá á¡á¬ážáá¯á¶ážááᯠá¡á ááá± áá±ážáá²á·ááááºá
á€áá»á áºááºááœáẠBLE stack ááŸáá·áº á áœááºážá¡ááºáá»áœá±áá¬áá±ážáá¯ááºá¡ááœáẠ"goodies" á¡á á¯á¶áá«ááŸááááºáá°áá±á¬á¡áá»ááºá¡áá±á«áº á¡ááŒá±áá¶á á€á¡ááŒá±á¬ááºážá¡áá¬ááẠá¡áá±á¬áºáá±ážáá®áá»á±á¬áºáááºáᯠáá»áœááºáá±á¬áºáááºáá«áááºá áá«áá±ááá·áº áá®á¡ááŒá±á¬ááºážá¡áá¬áá²á· áááºáááºááŒá®áž áá±á¬ááºážáá«ážáá±á¬áºáá±á¬áºáá»á¬ážáá»á¬ážááᯠáá±ážáá¬ážáá¬ááŒá±á¬áá·áº áááºážááá¬ááá¯ááºážááᯠááááºááŒá®áž áááºáááºááŸáá¯ááºážááŸáá¯ááºáž áááŒá±á¬áá«áá°ážá
2. ááá±á¬áá»ááºááá±á¬áºááŒáá»ááº
áá¶-
- Adafruit Feather nRF52 Bluefruit LE (áááºááŸá¬ áá¬ááŒá áºááœá¬ážáá¬áá²)
- HX711 ADC
- ááá¯áẠstrain ááá¯ááºážááœá¬ 2 PCs á (á áxááá®ááá¯)á
- áááá¯ááááºáᬠST-LINK V2
software:
- IDE VSCODE
- NRF SDK áá
- OpenOCD
- áááá¯ááááºáᬠST-LINK V2
á¡áá¬á¡á¬ážáá¯á¶ážááẠááá±á¬áá»ááºáá áºáá¯áá²ááœáẠááŸááááºá áááºááẠMakefile ááᯠááŒááºáááºáááºáᬠááá¯ááẠ(áááºá SDK á áááºáá±áá¬ááᯠáááºááŸááºáá«)á
3. áá¯ááºáá±á¬áºááŒáá»ááº
áááá¯áááºáá¬ááá«áááºáá² á¡áá¶áá áºáá¯á០á¡ááŒá¬ážáá áºáá¯ááᯠáá±áá¬ááœáŸá²ááŒá±á¬ááºážááẠáá¯ááºáá±á¬ááºá áá¬áá»á¬ážááŸáá·áº á¡ááŒá áºá¡áá»ááºáá»á¬áž áá±á«ááºážá ááºááŸá¯á¡áá±á«áº á¡ááŒá±áá¶á á¡áá¶áá á¹á ááºážáá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºááẠGPIOTE áá±á¬áºáá»á°ážááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
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);//МаÑÑÑаеваеЌ Ма вÑÑ
ПЎ
ááŒá¬áá»ááẠ10 ÎŒs ááŒáá·áº áá²áá»áá¯ážá á¯á¶ááᯠáá¯ááºáá¯ááºáááºá¡ááœáẠPD_SCL áááºáá°ááŒá¯ááŒááºážáá»ááºážááᯠá¡ááœááºááœáẠáááºááŸááºáá±ážáá«áááºá
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 áá±áá¬ááá¯ááºážááᯠáá»áœááºá¯ááºááá¯á· configure áá¯ááºáááºá á¡ááá·áºáááá·áºáá«áá áá»áœááºá¯ááºááá¯á·ááẠááŒá¬ážááŒááºááá¯ááááºáᬠ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 áá±á¬áºáá»á°ážááᯠá áááºáá¯ááºáá±á¬ááºááŒá®áž ááŸáá¯ááºážááŸááºááŸá¯ááŒá áºáááºáá áºáá¯ááŒá áºáá±á«áºáá¬áá±á¬á¡áá« 10 ÎŒs ááŒá¬áá²áá»áá¯ážá á¯á¶ááá¯áá¯ááºáá¯ááºáááºá¡ááœáẠáá»áœááºá¯ááºááá¯á·á timer ááᯠPD_SCL á¡ááœááºááá¯á·áá»áááºáááºáᬠGPIOTE module ááá¯ááœáá·áºáá«á
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++;//ÑÑОÑÑваеЌ ÑПÑÑПÑМОе вÑ
ПЎа
}
á áááºáááºá á¬ážá áá¬á¡áá±á¬ááºážáá¯á¶ážá¡áá¬ááẠtimer handler ááœááºááŒá áºáááºá ááœá±ážáá¯ááºááŸá¯ááºážááẠ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 s ááŒá¬ážáá¬áááŒáá·áº RTC timer á០á¡ááŒá áºá¡áá»ááºáá»á¬ážááᯠáá»áœááºá¯ááºááá¯á· áá»áŸá±á¬áºááá·áºáá¬ážááŒá®áž DOUT ááá¯ááºážááœáẠá¡ááŸá±á¬áá·áºá¡ááŸááºááŒá áºá á±áá±á¬ HX711 ááᯠááá¯ááºááœááºáá°ááœáẠá áááºááá¯ááºáá«á
áá±á¬ááºáááºá¡áá»ááºáá áºáá¯ááŸááá«áááºá ááŸááºáááºážáá»á¬ážááẠUART (baud rate 115200á TX - 6 pinsá RX - 8 pins) ááŸáá áºááá·áº ááŸááºáááºážáá»á¬ážááᯠá¡ááœááºááœáẠsdk_config.h ááœáẠááŸááá±áá«áááºá
ááœá±á·ááŸááá»ááºáá»á¬áž
ááá·áºá¡á¬áá¯á¶á áá¯ááºááŸá¯á¡ááœáẠá¡á¬ážáá¯á¶ážááᯠáá»á±ážáá°ážáááºáá«áááºá á€áá±á¬ááºážáá«ážááẠá¡áá¯á¶ážáááºááŒá®áž ááŒá±ááŸááºážáá»ááºááŸá¬ááẠdeveloper áá»á¬ážá¡ááœáẠáááºááá¯ážááŸááá±á¬ á¡áá»áááºááᯠáá»áŸá±á¬á·áá»ááá¯ááºáááá·áºáááºáᯠáá»áŸá±á¬áºááá·áºáá«áááºá áááºážáááááºáá±á¬ááºážáá»á¬ážááœáẠNordic á¡áá¯á¶ážááŒá¯ááá·áºáááºážááá¬ááá¯ááºáá¬áá»ááºážáááºááŸá¯ááẠá áœááºážá¡ááºáááá±á¬ááºááŸá¯áááŸá¯áá±á¬áá·áºá០á¡ááœááºá áááºáááºá á¬ážá áá¬áá±á¬ááºážáááºáᯠáá»áœááºáá±á¬áºááá¯ááá¯áá«áááºá
PS
ááá±á¬áá»ááºááẠááœá¶á·ááŒáá¯ážááá¯ážáááºáá²ááŒá áºááŒá®ážá ááá¯á·ááŒá±á¬áá·áº á€á¡ááŒá±á¬ááºážá¡áá¬ááᯠá áááºáááºá á¬ážáá«áá áá±á¬ááºáá±á¬ááºážáá«ážááœáẠá¡áá±ážáá»áááºá¡á¬áá¯á¶áá¶áááááá¬áá»á¬ážááᯠáá»áááºááŸáááŒááºážá¡ááœáẠá¡ááºáááá¯áá®áááºá¡ááŒáẠBLE stack ááᯠáá»áááºáááºááŒááºážá¡ááœáẠáá«ááŒáá¯ážá á¬ážáá«áááºá
ÐаÑеÑОалÑ
ááá±á¬áá»ááºáá¯áẠ-
á¡ááºá¹áááááºááᯠHX711 á¡ááœááºáá±áá¬á á¬ááœáẠ-
strain gauges á áá¯ááºáá±á¬ááºáá»ááºáá±á¬áºááŒáá»ááº
source: www.habr.com