nRF52840에서 OpenThread(2):Adafruit Feather를 통한 샘플 실행

개시하다


nRF52840에서 OpenTheread 개발을 계속합니다.
Nordic의 nRF5SDK for Thread and Zigbee의 단순함coap_client 및 단순coap_Adafruit Feathern RF 52840 Express(이하 Feather)를 사용하여 서버를 이동할 때의 메모입니다.이 샘플은 nRF52840DK를 위해 제작된 것이기 때문에 LED와 버튼 등의 배치가 다르다.따라서 절차를 간단하게 수정해야 한다.

환경과 기자재를 개발하다


개발 환경: SEGGER EmbedStudio
기자재: nRF52840DK
    : Adafruit Feather nRF52840 Express

simple_coap_client 및 단순coap_server


 simple_coap_클립넷에 쓰인 보드의 단추를 누르면 단순coap_서버(수신 측)의 LED를 제어할 수 있습니다.사라질 때 버튼을 누르면 빛이 나고, 빛이 날 때 버튼을 누르면 사라진다.

simple_coap_전송 측면의 수정 위치


 simple_coap_client (발송측) 에서 수정을 시작합니다.
main.c내에 제어 단추가 끊기는 방법이 있습니다 (main.c내 70행~100행).버튼 0을 누르면 사이드 LED를 유니캐스트 통신 제어를 통해 받는 방법, 버튼 1을 누르면 그룹 방송 통신 제어를 통해 사이드 LED를 받는 방법, 버튼 3을 누르면 공급 요청을 보내는 방법이 호출된다.
main.c
static void bsp_event_handler(bsp_event_t event)
{
    switch (event)
    {
        case BSP_EVENT_KEY_0:
            thread_coap_utils_unicast_light_request_send(THREAD_COAP_UTILS_LIGHT_CMD_TOGGLE);
            break;

        case BSP_EVENT_KEY_1:
        {
            m_command = ((m_command == THREAD_COAP_UTILS_LIGHT_CMD_OFF) ? THREAD_COAP_UTILS_LIGHT_CMD_ON :
                                                                          THREAD_COAP_UTILS_LIGHT_CMD_OFF);

            thread_coap_utils_multicast_light_request_send(m_command,
                                                           THREAD_COAP_UTILS_MULTICAST_REALM_LOCAL);
            break;
        }

        case BSP_EVENT_KEY_3:
            thread_coap_utils_provisioning_request_send();
            break;

        default:
            return; // no implementation needed
    }
}
nRF52840DK에는 4개의 단추가 있지만 Feather에는 이렇게 많은 단추가 없습니다.그래서 우선, 나는 버튼을 사용하지 않는 프로그램을 바꾸어 보았다.이 섹션의 코드는 다음 코드를 추가하여 주석을 달게 됩니다.
main.c
void send_multicast_request(){

    m_command = ((m_command == THREAD_COAP_UTILS_LIGHT_CMD_OFF) ? THREAD_COAP_UTILS_LIGHT_CMD_ON :
                                                                          THREAD_COAP_UTILS_LIGHT_CMD_OFF);

    thread_coap_utils_multicast_light_request_send(m_command,
                                                           THREAD_COAP_UTILS_MULTICAST_REALM_LOCAL);
}
그리고 main 문장에서send.multicast_request () 를 호출하기 위해main 문장을 수정합니다.
main.c
int main(int argc, char * argv[])
{
    log_init();
    scheduler_init();
    timer_init();

    thread_instance_init();
    thread_coap_init();
    thread_bsp_init();

    //ここから追加
    int count = 0;
    //ここまで追加

    while (true)
    {
        thread_process();
        app_sched_execute();

        //ここから追加
        count++;
        NRF_LOG_INFO("count : %d", count);
        if (count == 13000){
            send_multicast_request();
            count = 0;
        }
        //ここまで追加

        if (NRF_LOG_PROCESS() == false)
        {
            thread_sleep();
        }
    }
}
이렇게 되면 버튼을 누르면 수신 측 LED를 제어하는 프로그램이 1초마다 수신 측 LED를 자동으로 제어하는 프로그램으로 바뀐다.Feather가 13000을 계산하려면 1초 정도 걸릴 것 같습니다.사실 타이머도 사용할 수 있어 1초마다 제대로 불러내는 게 좋지만, 추가적인 항목이 많아 쉽게 만들 수 있다.

simple_coap_서버 (수신자) 의 수정 부분


다음은 단순.coap_서버의 수정입니다.
수신 측은 빛을 내는 LED만 바꾼다.다음 그림과 같이 Example 파일의 threadcoap_utils.c라는 파일이 있습니다.여기에는 송신자가 보낸 메시지를 바탕으로 LED를 제어하는 프로그램이 적혀 있다.

thread_coap_utils.c 안의 아래 부분에서 LED를 제어하고 있다.
thread_coap_utils.c
static void light_changed_default(thread_coap_utils_light_command_t light_command)
{
    switch (light_command)
    {
        case THREAD_COAP_UTILS_LIGHT_CMD_ON:
            LEDS_ON(BSP_LED_2_MASK);
            break;

        case THREAD_COAP_UTILS_LIGHT_CMD_OFF:
            LEDS_OFF(BSP_LED_2_MASK);
            break;

        case THREAD_COAP_UTILS_LIGHT_CMD_TOGGLE:
            LEDS_INVERT(BSP_LED_2_MASK);
            break;

        default:
            break;
    }
}
아래와 같이 변경되었습니다.다만 빛나는 LED를 변경했을 뿐이다.
thread_coap_utils.c
static void light_changed_default(thread_coap_utils_light_command_t light_command)
{
    //ここから追加
    int bluepin = NRF_GPIO_PIN_MAP(1,10);  // P1.10

    nrf_gpio_cfg_output(bluepin);
    //ここまで追加

    switch (light_command)
    {
        case THREAD_COAP_UTILS_LIGHT_CMD_ON:
            //LEDS_ON(BSP_LED_2_MASK);
            //ここから追加
            nrf_gpio_pin_write(bluepin,1);
            //ここまで追加
            break;

        case THREAD_COAP_UTILS_LIGHT_CMD_OFF:
            //LEDS_OFF(BSP_LED_2_MASK);
            //ここから追加
            nrf_gpio_pin_write(bluepin,0);
            //ここまで追加
            break;

        case THREAD_COAP_UTILS_LIGHT_CMD_TOGGLE:
            //LEDS_INVERT(BSP_LED_2_MASK);
            break;

        default:
            break;
    }
}
수정은 이것으로 끝냅니다.

동작 확인


simple_coap_서버에 기록된 사람의 LED가 파란색 소리를 내면 성공합니다.

좋은 웹페이지 즐겨찾기