BLE Nano로 LED 제어 ~BLE Nano + NeoPixel + Android~
BLE Nano 바이너리 생성
우선 BLE Nano의 제어 프로그램을 만들고 있습니다.
NeoPixel 라이브러리 내장
BLE GATT 통신의 샘플 코드에, NeoPixel 의 제어용 라이브러리 편입해 갑니다.
이전 기사에서 사용한 RedBearNano_NeoPixels_Example 중에서 다음 두 소스를 BLE_GATT_Example에 복사합니다.
그런 다음 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, 코멘트 감사합니다!)
Reference
이 문제에 관하여(BLE Nano로 LED 제어 ~BLE Nano + NeoPixel + Android~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/maki02/items/86e4b9348755a6d5bb41
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(BLE Nano로 LED 제어 ~BLE Nano + NeoPixel + Android~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/maki02/items/86e4b9348755a6d5bb41텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)