BLE Nano로 LED 제어 ~BLE Nano + NeoPixel + Android~

BLE Nano에서 NeoPixel의 LED 제어와 BLE GATT 통신을 확인했으므로 이번에는 이 두 가지를 맞춰 갑니다.

BLE Nano 바이너리 생성



우선 BLE Nano의 제어 프로그램을 만들고 있습니다.

NeoPixel 라이브러리 내장



BLE GATT 통신의 샘플 코드에, NeoPixel 의 제어용 라이브러리 편입해 갑니다.

이전 기사에서 사용한 RedBearNano_NeoPixels_Example 중에서 다음 두 소스를 BLE_GATT_Example에 복사합니다.
  • neopixel.cpp
  • neopixel.h

  • 그런 다음 main.cpp에서 neopixel.h를 읽고 m_strip을 전역 변수로 선언합니다.

    main.cpp
    #include "neopixel.h"
    neopixel_strip_t m_strip;
    

    그런 다음 main 함수에서 NeoPixel 초기화 코드를 추가합니다.

    main()
        uint8_t dig_pin_num = P0_15;
        uint8_t leds_per_strip = 8;
        // (中略)
        neopixel_init(&m_strip, dig_pin_num, leds_per_strip);
        neopixel_clear(&m_strip);
    

    또한 NeoPixel에 제어 신호를 출력하는 핀을 P0_15로 변경했습니다.

    GATT 통신에 따른 LED 표시 내용 변경 추가



    GATT 의 writeCharacteristics 에의 기입이 있을 때에 불려 가는 writeCharCallback 함수에 손을 더해 갑니다.

    샘플 코드에서 BLE Nano에서 LED가 켜지거나 꺼진 코드를 찾습니다.

    writeCharCallback()
            if(params->len == 1) {
                led = params->data[0];
                (params->data[0] == 0x00) ? printf("led on\n\r") : printf("led off\n\r"); // print led toggle
            }
    

    여기에 NeoPixel의 LED를 제어하는 ​​코드를 추가합니다.

    writeCharCallback()
        uint8_t error;
        uint8_t led_to_enable = 1;
        uint8_t red = 255;
        uint8_t green = 0;
        uint8_t blue = 159;
        // (中略)
            if(params->len == 1) {
                led = params->data[0];
    
                if (params->data[0] == 0x00) {
                    printf("led on\n\r");
                    error = neopixel_set_color(&m_strip, led_to_enable, red, green, blue);
                } else {
                    printf("led off\n\r");
                    error = neopixel_set_color(&m_strip, led_to_enable, 0, 0, 0);
                }
            }
    

    내장 된 NeoPixel 라이브러리는 LED를 켜려면 neopixel_set_color_and_show를 사용합니다.
    다만, BLE 스택과 동시에 사용하는 경우에는, neopixel_set_color 와 neopixel_show 로 나누도록(듯이) 주의 사항이 있습니다.
    (htps : // 기주 b. 이 m/ぁゔぁlc/n rf51-네오피ぇl/bぉb/마s r/네오피ぇl. c)

    따라서 GATT 통신 수신시 callback 함수는 neopixel_set_color로 색상을 지정합니다.
    그런 다음 무선 비활성 상태에서 NeoPixel에 제어 신호를 보냅니다 (후술).

    여기서 "00"을 받으면 led_to_enable(=1)번째 LED에 RGB(255,0,159)의 색을 표시하도록 값을 설정합니다.
    또, "00"이외의 경우는, RGB(0,0,0)의 값을 를 세트 합니다.

    BLE radio notification 설정



    그런 다음 라디오가 비활성 상태 일 때 NeoPixel에 제어 신호를 보내는 부분을 만듭니다.

    main.cpp
    #include "ble_radio_notification.h"
    
    void radio_callback_handler(bool radio_active)
    {
        if (radio_active == false)
        {
            neopixel_show(&m_strip);
        }
    }
    

    main()
        // (中略)
        ble.init(bleInitComplete);
        ble_radio_notification_init(NRF_APP_PRIORITY_LOW,
                                      NRF_RADIO_NOTIFICATION_DISTANCE_800US,
                                      radio_callback_handler);
    

    ble_radio_notification_init 에서 라디오가 active/비active 로 전환할 때 event handler 를 등록합니다.
    첫 번째 인수는 인터럽트 우선 순위이고 두 번째는 이벤트 발생까지의 시간차입니다.
    세 번째 인수에서 handler로 radio_callback_handler를 지정합니다.

    그런 다음 radio_callback_handler에서 라디오가 비활성 인 경우 neopixel_show를 호출합니다.
    이제 NeoPixel에 제어 신호가 전송됩니다.

    동작 확인



    LED 제어 핀을 P0_8에서 P0_15로 변경했으므로 LED로의 배선을 변경했습니다.



    위의 일과 같이 Android 앱(nRF Master Control Panel)을 사용하여 "00"값을 쓰면 무사히 켜졌습니다.



    또한 제어 핀이지만 P0_8 그대로는 작동하지 않았습니다.
    원인은 제대로 추구하고 있지 않지만, P0_8 은 STDIO 나 SPI 의 제어 핀이기도 하므로, 그 영향일지도 모릅니다.

    (BLE Nano의 핀 레이아웃은 htp : ///d db r b. 이 m/bぇ나노/에 있습니다)

    우선, 비어 있는 P0_15 로 변경해 보면 무사히 동작했습니다.
    단, 이 P0_15 핀은 옆으로 나오므로 배선이 어려워집니다.
    그래서 P0_5 핀으로 변경해 보았는데, P0_5에서도 무사히 움직였습니다.



    (2016 년 7 월 21 일 수정 mt08, 코멘트 감사합니다!)

    좋은 웹페이지 즐겨찾기