nRF51로 BLE MIDI 광고

9346 단어 미디nRF51BLE
BLE MIDI 란, Bluetooth SIG 로 정해져 있는 것은 아니기 때문에 몇개의 사양이 있습니다만,
이번에는 iOS의 GarageBand와 연결하고 싶기 때문에 Apple의 BLE MIDI를 사용합니다.

사양은 이쪽,
Apple Bluetooth Low Energy MIDI Specification

그 사양에 따르면 BLE MIDI의 UUID는


이름
UUID


서비스
03B80E5A-EDE8-4B33-A751-6CE34EC4C700

I/O Characteristic
7772E5DB-3868-4112-A1A9-F2669D106BF3


여기까지 알면 SDK에 샘플로 들어있는 ble_nus (Nordic UART Service)를,
조금 만지면 광고까지 할 수 있어야합니다.

그리고 ble_nus의 UUID는 여기.


이름
UUID


서비스
6E400001-B5A3-F393-E0A9-E50E24DCCA9E

TX Characteristic
6E400002-B5A3-F393-E0A9-E50E24DCCA9E

RX Characteristic
6E400003-B5A3-F393-E0A9-E50E24DCCA9E


ble_nus.c에 따르면 서비스 추가 방법은
uint8_t         uuid_type;
ble_uuid128_t   nus_base_uuid = {{0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0,
                                  0x93, 0xF3, 0xA3, 0xB5, 0x00, 0x00, 0x40, 0x6E}};
ble_uuid_t      ble_uuid;
uint16_t        service_handle;

// Add custom base UUID.
sd_ble_uuid_vs_add(&nus_base_uuid, &uuid_type);

ble_uuid.type = uuid_type;
ble_uuid.uuid = BLE_UUID_NUS_SERVICE; // 0x0001

// Add service.
sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY,
                         &ble_uuid,
                         &service_handle);


Characteristic은
ble_gatts_char_md_t      char_md;
ble_gatts_attr_t         attr_char_value;
ble_uuid_t               char_uuid;
ble_gatts_attr_md_t      attr_md;
ble_gatts_char_handles_t rx_handles;

// 省略するけど char_md と attr_char_value をいろいろ設定

char_uuid.type = uuid_type;
char_uuid.uuid = BLE_UUID_NUS_RX_CHARACTERISTIC; // 0x0002;

// Add RX Characteristic.
sd_ble_gatts_characteristic_add(service_handle,
                                &char_md,
                                &attr_char_value,
                                &rx_handles);


방법을 알았기 때문에,
이것을 BLE MIDI로 바꿉니다.

첫째, Base UUID에서
Service UUID의 일부를 0으로 변경하면,03B80000-EDE8-4B33-A751-6CE34EC4C700 가 되기 때문에, 전후 뒤집어서...
ble_uuid128_t   midi_base_uuid = {{0x00, 0xC7, 0xC4, 0x4E, 0xE3, 0x6C, 0x51, 0xA7,
                                   0x33, 0x4B, 0xE8, 0xED, 0x00, 0x00, 0xB8, 0x03}};

다음으로 Service
0으로 변경한 곳을 uuid로 지정합니다.
ble_uuid.type = uuid_type;
ble_uuid.uuid = 0x0E58;

// Add service.
sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY,
                         &ble_uuid,
                         &service_handle);


그리고는, Characteristic이지만,
Service와 Base UUID가 다릅니다.

여기서 꽤 꽤 있었습니다만.
결국, Base UUID를 또 하나 만들면 잘 되었습니다.
uint8_t         char_uuid_type;
ble_uuid128_t   midi_char_uuid = {{0xF3, 0x6B, 0x10, 0x9D, 0x66, 0xF2, 0xA9, 0xA1,
                                   0x12, 0x41, 0x68, 0x38, 0x00, 0x00, 0x72, 0x77}};
ble_uuid_t      char_uuid;

// Add custom base UUID.
sd_ble_uuid_vs_add(&midi_char_uuid, &char_uuid_type);

char_uuid.type = char_uuid_type;
char_uuid.uuid = 0xE5DB;


좋았다.
지금까지 가능하면 GarageBand에 연결할 수 있습니다.
그리고는, Apple의 사양과 MIDI의 사양대로 노트 보내거나 하는 것 뿐이므로 간단합니다.

뭔가 만들었어.



BLE MIDI를 사용해, 야채를 악기로 해 놀는 디바이스를 만들어 보았습니다.
Maker Faire에 나오면 꼬마들에게 대인기.
모처럼의 무선인데 케이블 가득합니다 죄송합니다.

좋은 웹페이지 즐겨찾기