オムロンのOKAO Vision HVC-C1BとBLE通信します。

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_ButtonSense by Bluetooth Low Energy

オムロン OKAO Vision(ヒューマンビジョンコンポ)HVC-C1BとRedBearLab nRF51822 mbedでBLE通信を行うサンプルです。

HVC-C1Bは、人、手、顔、性別、年齢、表情、顔の向き、視線、目の閉じを推定し、値を返してくれます。 http://plus-sensing.omron.co.jp/egg-project/

main.cppの最初の定義の部分(IDや欲しい項目)を変更すると使えます。 欲しい項目を1に要らない項目は0にしてください。

タイムアウトの処理が入っていませんが、もし入れたい場合は、LEDのHartBeatの処理に追加すれば簡単に出来ると思います。

下記のような感じでメッセージが帰ってきます。

#Look at HVC-C1B peerAddr[d5 32 26 3b 47 3d] rssi -76, isScanResponse 0, AdvertisementType 0
# St#HVC-C1B Connect
#SCAN Stop
ate 1 Wait for Caracteristic Found
#short:
#  C UUID-2a00 valueAttr[3] props[0]
#short:
#  C UUID-2a01 valueAttr[5] props[0]
#short:
#  C UUID-2a04 valueAttr[7] props[0]
#short:
#  C UUID-2a05 valueAttr[10] props[0]
#long:
#  C UUID-35100003d13a4f398ab3bf64d4fbb4b4 valueAttr[14] props[0]
#HVCNotifyCharacteristic Found
#long:
#  C UUID-35100002d13a4f398ab3bf64d4fbb4b4 valueAttr[17] props[0]
#HVCWriteCharacteristic Found
#long:
#  C UUID-35100004d13a4f398ab3bf64d4fbb4b4 valueAttr[19] props[0]
#HVCDeviceCharacteristic Found
# discovery terminated CallBack 0
# State 2 Notify Enable
#send data 1
#State=2 Wited
# State3 kidoukakunin
#send data 1
#received HVX callback for handle 14; type notification
#received HVX callback for handle 14; type notification
# State3 HVC-C1B      1 1 0 96090000
# State4 DataSending
#send data 1
#received HVX callback for handle 14; type notification
#received HVX callback for handle 14; type notification
#received HVX callback for handle 14; type notification
HumanDetect:1
Human(0):x=199,y=251,size=330,depend=774
HandDetect:0
FaceDetect:1
Face(0):x=227,y=230,size=158,depend=670
FaceDirection(0):holizon=20,vertical=0,angle=15,depend=120
FaceOld(0):old=64,depend=333
FaceSex(0):Sex=0,depend=111
FaceLook(0):holizon=-2,vertical=-2
FaceEyeClose(0):xleft=229,right=326
FaceExpression(0):TopExpression=5,TopScore=46,look=-74
# State4 DataSending
#send data 1

Committer:
rgrover1
Date:
Mon Jul 06 09:30:41 2015 +0000
Revision:
0:2dec89c76f68
Child:
1:e4ee755844de
A client to go with BLE_Button. Demonstrates the enabling of notifications.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 0:2dec89c76f68 1 /* mbed Microcontroller Library
rgrover1 0:2dec89c76f68 2 * Copyright (c) 2006-2015 ARM Limited
rgrover1 0:2dec89c76f68 3 *
rgrover1 0:2dec89c76f68 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 0:2dec89c76f68 5 * you may not use this file except in compliance with the License.
rgrover1 0:2dec89c76f68 6 * You may obtain a copy of the License at
rgrover1 0:2dec89c76f68 7 *
rgrover1 0:2dec89c76f68 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 0:2dec89c76f68 9 *
rgrover1 0:2dec89c76f68 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 0:2dec89c76f68 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 0:2dec89c76f68 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 0:2dec89c76f68 13 * See the License for the specific language governing permissions and
rgrover1 0:2dec89c76f68 14 * limitations under the License.
rgrover1 0:2dec89c76f68 15 */
rgrover1 0:2dec89c76f68 16
rgrover1 0:2dec89c76f68 17 #include "mbed.h"
rgrover1 0:2dec89c76f68 18 #include "ble/BLE.h"
rgrover1 0:2dec89c76f68 19 #include "ble/DiscoveredCharacteristic.h"
rgrover1 0:2dec89c76f68 20 #include "ble/DiscoveredService.h"
rgrover1 0:2dec89c76f68 21
rgrover1 0:2dec89c76f68 22 #include "ble_gatt.h"
rgrover1 0:2dec89c76f68 23
rgrover1 0:2dec89c76f68 24 BLE ble;
rgrover1 0:2dec89c76f68 25
rgrover1 0:2dec89c76f68 26 Gap::Handle_t connectionHandle = 0xFFFF;
rgrover1 0:2dec89c76f68 27
rgrover1 0:2dec89c76f68 28 DigitalOut alivenessLED(LED1, 1);
rgrover1 0:2dec89c76f68 29 bool foundButtonCharacteristic = false;
rgrover1 0:2dec89c76f68 30 DiscoveredCharacteristic buttonCharacteristic;
rgrover1 0:2dec89c76f68 31
rgrover1 0:2dec89c76f68 32 void periodicCallback(void) {
rgrover1 0:2dec89c76f68 33 alivenessLED = !alivenessLED; /* Do blinky on LED1 while we're waiting for BLE events */
rgrover1 0:2dec89c76f68 34 }
rgrover1 0:2dec89c76f68 35
rgrover1 0:2dec89c76f68 36 void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params) {
rgrover1 0:2dec89c76f68 37 if (params->peerAddr[0] != 0x29) { /* !ALERT! Update this filter to suit your device. */
rgrover1 0:2dec89c76f68 38 return;
rgrover1 0:2dec89c76f68 39 }
rgrover1 0:2dec89c76f68 40 printf("adv peerAddr[%02x %02x %02x %02x %02x %02x] rssi %d, isScanResponse %u, AdvertisementType %u\r\n",
rgrover1 0:2dec89c76f68 41 params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0],
rgrover1 0:2dec89c76f68 42 params->rssi, params->isScanResponse, params->type);
rgrover1 0:2dec89c76f68 43
rgrover1 0:2dec89c76f68 44 ble.gap().connect(params->peerAddr, Gap::ADDR_TYPE_RANDOM_STATIC, NULL, NULL);
rgrover1 0:2dec89c76f68 45 }
rgrover1 0:2dec89c76f68 46
rgrover1 0:2dec89c76f68 47 void serviceDiscoveryCallback(const DiscoveredService *service) {
rgrover1 0:2dec89c76f68 48 if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
rgrover1 0:2dec89c76f68 49 printf("S UUID-%x attrs[%u %u]\r\n", service->getUUID().getShortUUID(), service->getStartHandle(), service->getEndHandle());
rgrover1 0:2dec89c76f68 50 } else {
rgrover1 0:2dec89c76f68 51 printf("S UUID-");
rgrover1 0:2dec89c76f68 52 const uint8_t *longUUIDBytes = service->getUUID().getBaseUUID();
rgrover1 0:2dec89c76f68 53 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
rgrover1 0:2dec89c76f68 54 printf("%02x", longUUIDBytes[i]);
rgrover1 0:2dec89c76f68 55 }
rgrover1 0:2dec89c76f68 56 printf(" attrs[%u %u]\r\n", service->getStartHandle(), service->getEndHandle());
rgrover1 0:2dec89c76f68 57 }
rgrover1 0:2dec89c76f68 58 }
rgrover1 0:2dec89c76f68 59
rgrover1 0:2dec89c76f68 60 void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP) {
rgrover1 0:2dec89c76f68 61 printf(" C UUID-%x valueAttr[%u] props[%x]\r\n", characteristicP->getShortUUID(), characteristicP->getValueHandle(), (uint8_t)characteristicP->getProperties().broadcast());
rgrover1 0:2dec89c76f68 62 if (characteristicP->getShortUUID() == 0xa001) { /* !ALERT! Update this filter to suit your device. */
rgrover1 0:2dec89c76f68 63 buttonCharacteristic = *characteristicP;
rgrover1 0:2dec89c76f68 64 foundButtonCharacteristic = true;
rgrover1 0:2dec89c76f68 65 }
rgrover1 0:2dec89c76f68 66 }
rgrover1 0:2dec89c76f68 67
rgrover1 0:2dec89c76f68 68 void discoveryTerminationCallback(Gap::Handle_t connectionHandle) {
rgrover1 0:2dec89c76f68 69 printf("terminated SD for handle %u\r\n", connectionHandle);
rgrover1 0:2dec89c76f68 70 }
rgrover1 0:2dec89c76f68 71
rgrover1 0:2dec89c76f68 72 void connectionCallback(const Gap::ConnectionCallbackParams_t *params) {
rgrover1 0:2dec89c76f68 73 if (params->role == Gap::CENTRAL) {
rgrover1 0:2dec89c76f68 74 connectionHandle = params->handle;
rgrover1 0:2dec89c76f68 75 ble.gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback);
rgrover1 0:2dec89c76f68 76 ble.gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback/*, 0xa000, 0xa001*/);
rgrover1 0:2dec89c76f68 77 }
rgrover1 0:2dec89c76f68 78 }
rgrover1 0:2dec89c76f68 79
rgrover1 0:2dec89c76f68 80 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) {
rgrover1 0:2dec89c76f68 81 printf("disconnected\r\n");
rgrover1 0:2dec89c76f68 82 }
rgrover1 0:2dec89c76f68 83
rgrover1 0:2dec89c76f68 84 void hvxCallback(const GattHVXCallbackParams *params) {
rgrover1 0:2dec89c76f68 85 printf("received HVX callback for handle %u; type %s\r\n", params->handle, (params->type == BLE_HVX_NOTIFICATION) ? "notification" : "indication");
rgrover1 0:2dec89c76f68 86 for (unsigned index = 0; index < params->len; index++) {
rgrover1 0:2dec89c76f68 87 printf(" %02x", params->data[index]);
rgrover1 0:2dec89c76f68 88 }
rgrover1 0:2dec89c76f68 89 printf("\r\n");
rgrover1 0:2dec89c76f68 90 }
rgrover1 0:2dec89c76f68 91
rgrover1 0:2dec89c76f68 92 int main(void) {
rgrover1 0:2dec89c76f68 93 Ticker ticker;
rgrover1 0:2dec89c76f68 94 ticker.attach(periodicCallback, 1);
rgrover1 0:2dec89c76f68 95
rgrover1 0:2dec89c76f68 96 ble.init();
rgrover1 0:2dec89c76f68 97 ble.gap().onConnection(connectionCallback);
rgrover1 0:2dec89c76f68 98 ble.gap().onDisconnection(disconnectionCallback);
rgrover1 0:2dec89c76f68 99
rgrover1 0:2dec89c76f68 100 ble.gap().setScanParams(500, 400);
rgrover1 0:2dec89c76f68 101 ble.gap().startScan(advertisementCallback);
rgrover1 0:2dec89c76f68 102
rgrover1 0:2dec89c76f68 103 ble.gattClient().onHVX(hvxCallback);
rgrover1 0:2dec89c76f68 104
rgrover1 0:2dec89c76f68 105 while (true) {
rgrover1 0:2dec89c76f68 106 if (foundButtonCharacteristic && !ble.gattClient().isServiceDiscoveryActive()) {
rgrover1 0:2dec89c76f68 107 foundButtonCharacteristic = false; /* need to do the following only once */
rgrover1 0:2dec89c76f68 108
rgrover1 0:2dec89c76f68 109 /* Note: Yuckiness alert! The following needs to be encapsulated in a neat API.
rgrover1 0:2dec89c76f68 110 * It isn't clear whether we should provide a DiscoveredCharacteristic::enableNoticiation() or
rgrover1 0:2dec89c76f68 111 * DiscoveredCharacteristic::discoverDescriptors() followed by DiscoveredDescriptor::write(...). */
rgrover1 0:2dec89c76f68 112 uint16_t value = BLE_HVX_NOTIFICATION;
rgrover1 0:2dec89c76f68 113 ble.gattClient().write(GattClient::GATT_OP_WRITE_REQ,
rgrover1 0:2dec89c76f68 114 connectionHandle,
rgrover1 0:2dec89c76f68 115 buttonCharacteristic.getValueHandle() + 1, /* HACK Alert. We're assuming that CCCD descriptor immediately follows the value attribute. */
rgrover1 0:2dec89c76f68 116 sizeof(uint16_t), /* HACK Alert! size should be made into a BLE_API constant. */
rgrover1 0:2dec89c76f68 117 reinterpret_cast<const uint8_t *>(&value));
rgrover1 0:2dec89c76f68 118 }
rgrover1 0:2dec89c76f68 119 ble.waitForEvent();
rgrover1 0:2dec89c76f68 120 }
rgrover1 0:2dec89c76f68 121 }