BLE UART Service는 Nordic사에서 거의 표준 처럼 제공하는 Service로 다양한 앱들이 이 표준을 따르고 있다. 그렇기 때문에 이 표준으로 작성하면 기존 앱을 사용해서 다양한 제어를 쉽게 해 볼 수 있다.
이번에는 BLE UART 서비스로 PWM LED를 제어 하는 예제를 작성해 보자.
가장 간단하게 BLE UART 서비스를 등록하고 데이터 수신후 처리 하는 코드로 기본 코드를 작성해 보자.
#include "Arduino.h"
#include "STM32WB.h"
#include "BLE.h"
BLEUart SerialBLE(BLE_UART_PROTOCOL_NORDIC);
void setup()
{
Serial.begin(115200);
while (!Serial) { }
BLE.begin();
BLE.setLocalName("STM32WB");
BLE.setAdvertisedServiceUuid(SerialBLE.uuid());
BLE.addService(SerialBLE);
BLE.advertise();
delay(1000);
}
void loop()
{
int c;
if (!BLE.advertising() && !BLE.connected())
{
BLE.advertise();
}
while ((c = SerialBLE.read()) >= 0)
{
ProcessBleUartParser(c);
}
delay(10);
}
UART 데이터를 파싱해서 원하는 기능을 수행 할 수 있다. BluefruitConnect 앱을 사용해서 PWM출력 테스트를 해 볼 수 있다.
#define PWM_PIN1 17 //PA1
typedef enum
{
CMD_IDEL,
CMD_PWM,
CMD_GPIO,
CMD_JOYSTIC,
} UART_CMD;
unsigned char rx_buf[32] = {0,};
unsigned int buf_index = 0;
UART_CMD cmd_status = CMD_IDEL;
void ProcessBleUartParser(unsigned char data)
{
if(cmd_status == CMD_IDEL)
{
if(data==0xE3)
{
cmd_status = CMD_PWM;
buf_index = 0;
Serial.println("PWM start:");
}
}
else if(cmd_status == CMD_PWM)
{
rx_buf[buf_index] = data;
if(buf_index==1)
{
Serial.println(rx_buf[0]);
analogWrite(PWM_PIN1, rx_buf[0]);
cmd_status = CMD_IDEL;
}
else buf_index++;
}
}
BLE 제어용 다양한 소프트웨어에서도 UART 처리 부분만 수정하면 쉽게 적용 할 수 있다.
#define CMD_IDEL 0
#define CMD_PWM 5
void ProcessBleUartParser(unsigned char data)
{
if(cmd_status == CMD_IDEL)
{
if(data==0xFF)
{
cmd_status = CMD_PWM;
buf_index = 0;
Serial.println("PWM start:");
}
}
else if(cmd_status == CMD_PWM)
{
rx_buf[buf_index] = data;
if(buf_index==4)
{
servo_pwm1 = (int)rx_buf[5];
analogWrite(PWM_PIN1, servo_pwm1);
cmd_status = CMD_IDEL;
}
else buf_index++;
}
}
반응형