본문 바로가기

[ST_MICRO]/STM32WB

STM32WB55 SSM - Arduino BLE UART PWM 제어

 

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++;
      }
}

 

반응형