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のサイトから、ツール一式をダウンロードします。
下記のものをインストールする必要があります(要ログイン)
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 */