PSoC4 BLE (Bluetooth Low Energy)

IoTで話題になっているBLE (Bluetooth Low Energy)について検討してみます。

PSoCでは、CY8CKIT-042-BLE Bluetooth Low Energy Pioneer Kitというのがあり、これを使用するとある程度までは動かせそうです。

日本での購入は次のところから。

共立エレショップ:

http://eleshop.jp/shop/g/gF36121/

モジュールだけであれば、アマゾンからも購入可能。

https://www.amazon.co.jp/CYPRESS-CY8CKIT-142-PSoC-4-BLE/dp/B014W54PC2

テスト用のAndroidアプリ

https://play.google.com/store/apps/details?id=com.cypress.cysmart&hl=ja

Cypressのサイトから、ツール一式をダウンロードします。

http://japan.cypress.com/documentation/development-kitsboards/cy8ckit-042-ble-bluetooth-low-energy-ble-pioneer-kit

下記のものをインストールする必要があります(要ログイン)

CY8CKIT-042-BLE-A Kit Only (Kit Design Files, Documentation, Examples)

その後、チュートリアルに沿ってテスト用プログラムを生成、アプリと通信してみます。

http://www.cypress.com/file/234851/download

ボード:

回路系:

RGB LED

チュートリアルプログラム:

ハードウェアコンフィグレーション

出力ポート x3 , BLE x1

出力ポート(Alert_LED, Advertising_LED, Disconnect_LED) を下記のようにコンフィグレーションします。

LED

BLEのコンフィグレーション

ピンコンフィグレーション

プログラム

main.c

/* ========================================

*

* Copyright YOUR COMPANY, THE YEAR

* All Rights Reserved

* UNPUBLISHED, LICENSED SOFTWARE.

*

* CONFIDENTIAL AND PROPRIETARY INFORMATION

* WHICH IS THE PROPERTY OF your company.

*

* ========================================

*/

#include "project.h"

#define LED_ON (0u)

#define LED_OFF (1u)

#define NO_ALERT (0u)

#define MILD_ALERT (1u)

#define HIGH_ALERT (2u)

#define LED_TOGGLE_TIMEOUT (50u)

#define LED_TOGGLE_TIMEOUT_FAST (10u)

void StackEventHandler(uint32_t event, void *eventParam);

void IasEventHandler(uint32_t event, void *eventParam);

uint8_t alertLevel;

int main(void)

{

CYBLE_API_RESULT_T apiResult;

CyGlobalIntEnable; /* Enable global interrupts. */

apiResult = CyBle_Start(StackEventHandler);

if (apiResult != CYBLE_ERROR_OK)

{

CYASSERT(0);

}

CyBle_IasRegisterAttrCallback(IasEventHandler);

for(;;)

{

static uint8 toggleTimeout = 0;

CYBLE_BLESS_STATE_T blessState;

uint8_t intrStatus;

CyBle_ProcessEvents();

switch(alertLevel)

{

case NO_ALERT:

Alert_LED_Write(LED_OFF);

break;

case MILD_ALERT:

toggleTimeout++;

if(toggleTimeout == LED_TOGGLE_TIMEOUT)

{

Alert_LED_Write(Alert_LED_Read() ^ 0x01);

Disconnect_LED_Write(Alert_LED_Read());

toggleTimeout = 0;

}

break;

case HIGH_ALERT:

Disconnect_LED_Write(LED_OFF);

toggleTimeout++;

if(toggleTimeout == LED_TOGGLE_TIMEOUT_FAST)

{

Alert_LED_Write(Alert_LED_Read() ^ 0x01);

toggleTimeout = 0;

}

break;

}

CyBle_EnterLPM(CYBLE_BLESS_DEEPSLEEP);

intrStatus = CyEnterCriticalSection();

blessState = CyBle_GetBleSsState();

if (blessState == CYBLE_BLESS_STATE_ECO_ON ||

blessState == CYBLE_BLESS_STATE_DEEPSLEEP)

{

CySysPmDeepSleep();

} else if (blessState != CYBLE_BLESS_STATE_EVENT_CLOSE)

{

CySysPmSleep();

}

else

{

}

CyExitCriticalSection(intrStatus);

}

}

void StackEventHandler(uint32_t event, void *eventParam)

{

switch(event)

{

case CYBLE_EVT_STACK_ON:

case CYBLE_EVT_GAP_DEVICE_DISCONNECTED:

CyBle_GappStartAdvertisement(CYBLE_ADVERTISING_FAST);

Advertising_LED_Write(LED_ON);

alertLevel = NO_ALERT;

break;

case CYBLE_EVT_GAP_DEVICE_CONNECTED:

Advertising_LED_Write(LED_OFF);

Disconnect_LED_Write(LED_OFF);

break;

case CYBLE_EVT_GAPP_ADVERTISEMENT_START_STOP:

if(CyBle_GetState() == CYBLE_STATE_DISCONNECTED)

{

Advertising_LED_Write(LED_OFF);

Disconnect_LED_Write(LED_ON);

CySysPmSetWakeupPolarity(CY_PM_STOP_WAKEUP_ACTIVE_HIGH);

CySysPmStop();

}

break;

default:

break;

}

}

void IasEventHandler(uint32_t event, void *eventParam)

{

if (event == CYBLE_EVT_IASS_WRITE_CHAR_CMD)

{

CyBle_IassGetCharacteristicValue(CYBLE_IAS_ALERT_LEVEL,

sizeof(alertLevel), &alertLevel);

}

}

/* [] END OF FILE */