๐ Bluetooth ๋?
2.4GHz ์ฃผํ์ ๋์ญ์ ์ฌ์ฉํ๋ ๊ทผ๊ฑฐ๋ฆฌ ๋ฌด์ ํต์ ๊ธฐ์ ์ด๋ฉฐ ์ ๋ ฅ ์๋ชจ๊ฐ ์ ๊ณ , ์ฐ๊ฒฐ์ด ๊ฐํธํ ํน์ง์ ๊ฐ์ง๋ ํต์ ์ด๋ค.
์์ดํ์ด์ ๋น๊ตํ์ฌ ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ๋ค.
ํน ์ฑ | ์์ดํ์ด | ๋ธ๋ฃจํฌ์ค |
์ฃผํ์ ๋์ญ | 2.4GHz, 5GHz | 2.4GHz |
์ต๋ ๋ฐ์ดํฐ ์๋ | 9.6Gbps | 24Mbps |
์ ๋ ฅ ์๋น | ๋์ | ๋ฎ์ |
์ฐ๊ฒฐ ๋ฒ์ | 100m | 10m |
๋ณด ์ | ๋์ | ๋ฎ์ |
์ฌ์ฉ ์ฉ๋ | ์ธํฐ๋ท ์ฐ๊ฒฐ, ๋์ฉ๋ ๋ฐ์ดํฐ ์ ์ก | ๊ทผ๊ฑฐ๋ฆฌ ์ฅ์น ์ฐ๊ฒฐ, ์ํ ๋ฐ์ดํฐ ์ ์ก |
๋ธ๋ฃจํฌ์ค ๋ชจ๋ [zs-040]
- zs-040์ ๋ธ๋ฃจํฌ์ค 4.0์ ์ง์ํ๋ฉฐ 2.4GHz ์ฃผํ์ ๋์ญ, 1Mbps ์๋๋ฅผ ๊ฐ์ง๋ ๋ธ๋ฃจํฌ์ค ํต์ ๋ชจ๋์ด๋ค.
- uart ๋ํ ์ง์ํ๋ค.
- F429zi MCU์๋ ๋ธ๋ฃจํฌ์ค ๊ธฐ๋ฅ์ด ์์ด ๋ธ๋ฃจํฌ์ค ๋ชจ๋์ด ๋ฐ๋ก ํ์ํ๋ค
- ํด๋น ๋ชจ๋์ uart๋ก ์ฌ์ฉํ ๋์ bluetooth๋ก ์ฌ์ฉํ ๋ ๋ชจ๋ rxd๋ gpio_in๋ก ์ค์ ํ PA9 ํ์, txd๋ gpio_out๋ก ์ค์ ํ PA10 ํ์ ์ฐ๊ฒฐํ๋ค.
- uart ์ผ๋๋ 5V์ ์ ์์ bluetooth ์ผ๋๋ 3.3V ์ ์์ VCC์ ์ฐ๊ฒฐํ๋ค,
๐ ์ค์ต ๋ชฉํ
- zs-040 ๋ชจ๋ - MCU ์ฐ๊ฒฐ
- bluetooth ํต์ ์ ์ํ bluetooth.h, bluetooth.c ํ์ผ ์์ฑ
- ์ค๋งํธํฐ -- zs-040 bluetooth ์ฐ๊ฒฐ๋จ ํ์ธ ๋ฐ led ์ ์ด, pwm ์ ์ด ํ์ธ
๐ ์ค์ต ๊ฒฐ๊ณผ
https://github.com/Tobbyvv/stm32-project/tree/main/rtos_msg_q
zs-040 ๋ชจ๋ - MCU ์ฐ๊ฒฐ
VCC - CN8 7๋ฒ 3.3V (uart๋ฅผ ์ฌ์ฉํ ๋ 5V์ ์ฐ๊ฒฐ)
GND - CN8 11๋ฒ GND
RXD - CN12 PA9
TXD - CN12 PA10
bluetooth ํต์ ์ ์ํ bluetooth.h, bluetooth.c ํ์ผ ์์ฑ
2.1 bluetooth.h
#ifndef INC_BLUETOOTH_H_
#define INC_BLUETOOTH_H_
#ifdef __cplusplus
extern "C" {
#endif
void bt_init(void);
void bt_QPut(const void *msg_ptr, uint8_t msg_prio, uint32_t timeout);
#ifdef __cplusplus
}
#endif
#endif /* INC_BLUETOOTH_H_ */
2.2 bluetooth.c
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stdbool.h>
#include <ctype.h>
#include <string.h>
#include "cmsis_os.h"
#include "main.h"
#include "uart.h"
#include "bluetooth.h"
// ๋ธ๋ฃจํฌ์ค ๋ฉ์์ง ํ์ ํธ๋ค
static osMessageQueueId_t msgBufQ_handle;
// ๋ธ๋ฃจํฌ์ค ํ์คํฌ์ ํธ๋ค
static osThreadId_t btTask_handle;
// ๋ธ๋ฃจํฌ์ค ํ์คํฌ์ ์์ฑ
static const osThreadAttr_t btTask_attributes = {
.stack_size = 256 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
static void btProc_Task(void *arg);
void bt_init(void)
{
// ๋ธ๋ฃจํฌ์ค ํ์คํฌ๋ฅผ ์์ฑ
btTask_handle = osThreadNew(btProc_Task, NULL, &btTask_attributes);
if (btTask_handle == NULL) {
printf("%s : %d\r\n", __func__, __LINE__);
while (1);
}
// ๋ธ๋ฃจํฌ์ค ๋ฉ์์ง ํ๋ฅผ ์์ฑ
msgBufQ_handle = osMessageQueueNew(5, sizeof(MSG_T), NULL);
if (msgBufQ_handle == NULL) {
printf("%s : %d\r\n", __func__, __LINE__);
while (1);
}
printf("Bluetooth Initialized...\r\n");
}
// ๋ธ๋ฃจํฌ์ค ๋ฉ์์ง ํ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ํจ์
void bt_QPut(const void *msg_ptr, uint8_t msg_prio, uint32_t timeout)
{
// ๋ธ๋ฃจํฌ์ค ๋ฉ์์ง ํ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ธ๋ค.
osMessageQueuePut(msgBufQ_handle, msg_ptr, msg_prio, timeout);
}
// ๋ธ๋ฃจํฌ์ค ์ํ ์ฝ๋ฐฑ ํจ์
void (*cbf)(void);
// ๋ธ๋ฃจํฌ์ค ์ํ
uint8_t s_state = 0;
// ๋ธ๋ฃจํฌ์ค ๋ฉ์์ง ๋ฒํผ
char msg_buf[101];
// ๋ธ๋ฃจํฌ์ค ์ํ S0 ํจ์
void func_s0(void)
{
// MSG_T ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ธํ๋ค.
MSG_T qTx, qRx;
// ๋ธ๋ฃจํฌ์ค ์ํ๊ฐ S0์ด๋ฉด "BT status : S0"๋ฅผ ์ถ๋ ฅ
if (s_state == 0) {
printf("BT status : S0\r\n");
// qTx ๊ตฌ์กฐ์ฒด๋ฅผ ์ค์
qTx.id = E_MSG_UART2_TX_N_CHECK;
strcpy(msg_buf, "AT");
qTx.len = strlen(msg_buf);
qTx.timeout = 1000;
qTx.pData = (uint8_t *)msg_buf;
// UART์ qTx ๊ตฌ์กฐ์ฒด๋ฅผ ๋ณด๋
uart_QPut(&qTx, 0, osWaitForever);
// ๋ธ๋ฃจํฌ์ค ์ํ๋ฅผ S1๋ก ๋ณ๊ฒฝ
s_state++;
} else {
// MSG_T ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฉ์์ง ํ์์ ๊ฐ์ ธ์จ๋ค.
osStatus_t sts = osMessageQueueGet(msgBufQ_handle, &qRx, NULL, osWaitForever);
// ํ์์์์ด ๋ฐ์ํ๋ฉด ๋ธ๋ฃจํฌ์ค ์ํ๋ฅผ S0์ผ๋ก ๋ณ๊ฒฝ
if (sts == osErrorTimeout) {
s_state = 0;
} else if (sts == osOK) {
switch (qRx.id) {
case E_MSG_BT_RX : {
if (memcmp(qRx.pData, "OK", 2) == 0) {
printf("BT status : S1\r\n");
cbf = func_s1; // callback function
s_state = 0;
return;
}} break;} // switch
s_state = 0;
} // else if (sts == osOK) {}}
// ๋ธ๋ฃจํฌ์ค ์ํ S1 ํจ์
void func_s1(void)
{
// MSG_T ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ธ
MSG_T qTx, qRx;
// ๋ธ๋ฃจํฌ์ค ์ํ๊ฐ S1์ด๋ฉด "BT status : S1"๋ฅผ ์ถ๋ ฅ
if (s_state == 1) {
printf("BT status : S1\r\n");
// MSG_T ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฉ์์ง ํ์์ ๊ฐ์ ธ์ด
osStatus_t sts = osMessageQueueGet(msgBufQ_handle, &qRx, NULL, 300);
// ํ์์์์ด ๋ฐ์ํ๋ฉด UART์ "AT"์ ๋ณด๋
if (sts == osErrorTimeout) {
qTx.id = E_MSG_UART2_TX_N_CHECK;
qTx.len = strlen("AT");
qTx.timeout = 1;
qTx.pData = (uint8_t *)"AT";
uart_QPut(&qTx, 0, 0);
} else if (sts == osOK) {
// ๋ฉ์์ง ํ์์ ๊ฐ์ ธ์จ ๋ฉ์์ง์ ID๊ฐ E_MSG_BT_RX ์ด๋ฉด
if (qRx.id == E_MSG_BT_RX) {
// ๋ฉ์์ง ํ์์ ๊ฐ์ ธ์จ ๋ฉ์์ง์ ๋ฐ์ดํฐ๋ฅผ UART์ ๋ค์ ๋ณด๋
qTx.id = E_MSG_UART2_TX;
qTx.len = qRx.len;
qTx.pData = qRx.pData;
uart_QPut(&qTx, 0, 0);
}}}}
static void btProc_Task(void *arg)
{
// ๋ธ๋ฃจํฌ์ค ์ํ ์ฝ๋ฐฑ ํจ์๋ฅผ func_s0๋ก ์ค์
cbf = func_s0;.
printf("Bluetooth Thread Start...\r\n");
osDelay(500);
cbf(); // ๋ธ๋ฃจํฌ์ค ์ํ ์ฝ๋ฐฑ ํจ์ํธ์ถ
for (;;) {
cbf();
}}
์ค๋งํธํฐ -- zs-040 bluetooth ์ฐ๊ฒฐ๋จ ํ์ธ ๋ฐ led ์ ์ด, pwm ์ ์ด ํ์ธ
bluetooth ์ฐ๊ฒฐ์ ์ฑ๊ณตํ์์ผ๋ ๋ฌด๋ฃ ์ดํ์ terminal์ ํตํด ๋ฉ์์ง๋ฅผ ์ ๋ฌํ์์ผ๋ s1 ํจ์๊ฐ ๋์ํ์ง ์์
์ต๊ทผ์๋ bluetooth 4.0์ ๊ฑฐ์ ์ฌ์ฉํ์ง ์๋๊ฒ์ผ๋ก ๋ณด์ ์ดํ์์ 4.0 ๋ฒ์ ๊ฐ์ ํต์ ์ ์ง์ํ์ง ์๋๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
(โป 4.0 ๋ฒ์ ์ ๋ง๋ ๋ฉ์์ง ์ก์์ ์ด ๊ฐ๋ฅํ bluetooth ์ดํ apk ํ์ผ์ ์ฐพ์๋ณด์์ผ๋ ์ฐพ์ง ๋ชปํ์์)
'embedded' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[protocol] CAN ํต์ ์ด๋ก ์ ๋ฆฌ (0) | 2023.10.14 |
---|---|
[protocol] UDS ์ด๋ก ์ ๋ฆฌ (0) | 2023.10.13 |
[stm32] RTOS ์ค์ต (0) | 2023.09.18 |
[stm32] RTOS ์ด๋ก ์ ๋ฆฌ (0) | 2023.09.11 |
[stm32] I2C ํต์ ์ค์ต (0) | 2023.09.11 |