pedal.md - dingdongdengdong/astra_ws GitHub Wiki
ํ์คํ๋ ํต์ ํจํท ํํ๋ก ๋ณํํ์ฌ ๋ก๋ด์๊ฒ ์ ๋ฌํ๋ ๋ถ๋ถ์ main.cpp์ comm.cpp ํ์ผ์ ๊ฑธ์ณ ๊ตฌํ๋์ด ์์ต๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-
main.cpp์์ ๋ฐ์ดํฐ ์ค๋น ๋ฐ ํจํท ์ ์ก ํธ์ถ:-
loop()ํจ์ ๋ด์์ ์๋ ๋ก๊ทธ ์ผ์ ๊ฐ 8๊ฐ๋ฅผanalogRead()ํจ์๋ฅผ ํตํด ์ฝ์ด์uint16_t analog[8]๋ฐฐ์ด์ ์ ์ฅํฉ๋๋ค. -
for๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ์ด 8๊ฐ์uint16_t๊ฐ ๊ฐ๊ฐ์htons()ํจ์๋ฅผ ํตํด ๋คํธ์ํฌ ๋ฐ์ดํธ ์์๋ก ๋ณํํฉ๋๋ค. ์ด ๋ณํ์ ์๋ก ๋ค๋ฅธ ์์คํ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ํด์ํ๊ธฐ ์ํ ํ์คํ ๊ณผ์ ์ ๋๋ค. -
comm_send_blocking(COMM_TYPE_FEEDBACK, (uint8_t *)analog);ํจ์๋ฅผ ํธ์ถํ์ฌ ๋ณํ๋ ์๋ ๋ก๊ทธ ๋ฐ์ดํฐ ๋ฐฐ์ด (analog)์COMM_TYPE_FEEDBACKํ์ ์ ํจํท ํ์ด๋ก๋๋ก ์ฌ์ฉํ์ฌ ์ ์ก์ ์์ฒญํฉ๋๋ค. ์ฌ๊ธฐ์(uint8_t *)analog๋ 16๋นํธ ์ ์ ๋ฐฐ์ด์ 8๋นํธ ๋ฐ์ดํธ ๋ฐฐ์ด์ฒ๋ผ ์ทจ๊ธํ์ฌcomm_send_blockingํจ์์ ์ ๋ฌํ๊ธฐ ์ํ ํ์ ์บ์คํ ์ ๋๋ค.
-
-
comm.cpp์์ ํจํท ๊ตฌ์ฑ ๋ฐ ์ค์ ์ ์ก:-
comm_send_blockingํจ์๋main.cpp๋ก๋ถํฐ ํจํท ํ์ (COMM_TYPE_FEEDBACK)๊ณผ ์ค์ ๋ฐ์ดํฐ ๋ฐฐ์ด (payload, ์ฆmain.cpp์์ ์ ๋ฌ๋analog๋ฐฐ์ด์ ๋ฐ์ดํธ ๋ฐ์ดํฐ)์ ์ธ์๋ก ๋ฐ์ต๋๋ค. - ์ด ํจ์๋ ์ ์๋ ํต์ ํ๋กํ ์ฝ์ ๋ฐ๋ผ ํจํท์ ๊ตฌ์ฑํฉ๋๋ค.
- ๋จผ์ ํจํท์ ์์์ ์๋ฆฌ๋ ํค๋ ๋ฐ์ดํธ
0x5A๋ฅผserial_send_blockingํจ์๋ฅผ ํตํด ์ ์กํฉ๋๋ค. - ๊ทธ ๋ค์, ์ธ์๋ก ๋ฐ์ ํจํท ํ์
(์:
COMM_TYPE_FEEDBACK)์ 1๋ฐ์ดํธ๋ก ๋ณํํ์ฌ ์ ์กํฉ๋๋ค. - ๋ง์ง๋ง์ผ๋ก, ์ธ์๋ก ๋ฐ์
payload๋ฐฐ์ด์ ๋ด๊ธด ๋ฐ์ดํฐ๋ฅผcomm_payload_size๋ฐฐ์ด์์ ํด๋น ํจํท ํ์ ์ ๋ํด ์ ์๋ ํฌ๊ธฐ๋งํผserial_send_blockingํจ์๋ฅผ ๋ฐ๋ณต ํธ์ถํ์ฌ ์์ฐจ์ ์ผ๋ก ์ ์กํฉ๋๋ค.
- ๋จผ์ ํจํท์ ์์์ ์๋ฆฌ๋ ํค๋ ๋ฐ์ดํธ
-
๋ฐ๋ผ์ main.cpp๋ ์๋ณธ ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ํต์ ์ ์ํ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ ํ์(๋ฐ์ดํธ ์์ ๋ณํ)์ผ๋ก ์ค๋นํ๋ ์ญํ ์ ํ๊ณ , comm.cpp์ comm_send_blocking ํจ์๊ฐ ์ด ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ์ ์๋ ํ์คํ๋ ํจํท ๊ตฌ์กฐ(ํค๋ + ํ์
+ ํ์ด๋ก๋)์ ๋ง์ถฐ ์๋ฆฌ์ผ ํฌํธ๋ฅผ ํตํด ์ค์ ๋ก ์ ์กํ๋ ์ญํ ์ ์ํํฉ๋๋ค. ์ด ๋ ๋ถ๋ถ์ด ํจ๊ป "ํ์คํ๋ ํต์ ํจํท ํํ๋ก ๋ณํํ์ฌ ๋ก๋ด์๊ฒ ์ ๋ฌ"ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
#include "comm.h" // ํต์ ๊ด๋ จ ํจ์ ๋ฐ ํ์
์ ์๋ฅผ ํฌํจํ๋ ํค๋ ํ์ผ
#include <string.h> // memcpy ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ํค๋ ํ์ผ
#include <Arduino.h> // Arduino ํ๋ซํผ์์ Serial ํต์ ๋ฑ์ ์ฌ์ฉํ๊ธฐ ์ํ ํค๋ ํ์ผ
// @brief ์๋ฆฌ์ผ ํต์ ์ ์ด๊ธฐํํ๋ ํจ์.
// ๋ก๋ด ์์คํ
๊ณผ ์ธ๋ถ ์ ์ด ์ฅ์น(์: ํ๋ฌ ์ธํฐํ์ด์ค) ๊ฐ์ ํต์ ์ ์ค์ ํฉ๋๋ค.
// ์๋ฆฌ์ผ ํฌํธ๋ฅผ ์ง์ ๋ ๋ณด๋ ์๋๋ก ์์ํ๊ณ ํฌํธ๊ฐ ์ค๋น๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
// @return ์ค๋ฅ ๋ฐ์ ์ true, ์ ์ ์ false๋ฅผ ๋ฐํํฉ๋๋ค. (์ด ์ฝ๋์์๋ ํญ์ false ๋ฐํ)
bool serial_init(void) {
Serial.begin(921600); // ์๋ฆฌ์ผ ํต์ ์์ (๋ณด๋ ์๋ 921600 bps). ํต์ ์๋๋ ์์คํ
์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ์กฐ์ ๋ฉ๋๋ค.
while (!Serial) delay(1); // ์๋ฆฌ์ผ ํฌํธ๊ฐ ์ด๋ฆด ๋๊น์ง ๋๊ธฐ. ํต์ ์ค๋น ์ํ ํ์ธ.
return false; // ์ด๊ธฐํ ์ฑ๊ณต์ ๋ํ๋
}
// @brief ๋จ์ผ ๋ฌธ์๋ฅผ ๋ธ๋กํน ๋ฐฉ์์ผ๋ก ์๋ฆฌ์ผ ํฌํธ๋ก ์ ์กํ๋ ํจ์.
// ํ๋ฌ ์ํ์ ๊ฐ์ ์ ์ด ๋ช
๋ น์ด๋ ํผ๋๋ฐฑ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ์ดํธ๋ฅผ ์ ์กํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
// ๋ฌธ์๊ฐ ์ ์ก๋ ๋๊น์ง ํจ์ ์คํ์ด ์ฐจ๋จ๋ฉ๋๋ค.
// @param c ์ ์กํ 1๋ฐ์ดํธ ๋ฐ์ดํฐ์
๋๋ค.
// @return ์ค๋ฅ ๋ฐ์ ์ true, ์ ์ ์ false๋ฅผ ๋ฐํํฉ๋๋ค. (์ด ์ฝ๋์์๋ ํญ์ false ๋ฐํ)
bool serial_send_blocking(uint8_t c) {
Serial.write(c); // ์๋ฆฌ์ผ ํฌํธ๋ก 1๋ฐ์ดํธ ๋ฐ์ดํฐ ์ ์ก
return false; // ์ค๋ฅ๊ฐ ์์์ ๋ํ๋
}
// @brief ์๋ฆฌ์ผ ์์ ๋ฒํผ์์ ๋จ์ผ ๋ฌธ์๋ฅผ ๋
ผ๋ธ๋กํน ๋ฐฉ์์ผ๋ก ํด๋งํ๋ ํจ์.
// ์ธ๋ถ ์์คํ
์ผ๋ก๋ถํฐ ์ ์ด ๋ช
๋ น ๋ฑ์ ์์ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
// ์์ ๋ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ์ฆ์ ๋ฐํ๋ฉ๋๋ค.
// @param c ์์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ uint8_t ํฌ์ธํฐ์
๋๋ค.
// @return ๋ฐ์ดํฐ ์์ ์ false, ์์ ํ ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋ ์ค๋ฅ ๋ฐ์ ์ true๋ฅผ ๋ฐํํฉ๋๋ค.
bool serial_recv_poll(uint8_t *c) {
// ๊ฒฝ๊ณ : ์ด ํจ์๋ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์์ ํ์ง ์์ ์ ์์ต๋๋ค (non-thread safe). ๋จ์ผ ๋ฃจํ ํ๊ฒฝ์์ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
if (Serial.available()) { // ์์ ๋ฒํผ์ ์ฝ์ ๋ฐ์ดํฐ๊ฐ ์๋์ง ํ์ธ
*c = Serial.read(); // ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ c๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ
return false; // ๋ฐ์ดํฐ ์์ ์ฑ๊ณต
} else {
return true; // ์์ ํ ๋ฐ์ดํฐ ์์
}
}
// @brief ํต์ ์ ์ฌ์ฉ๋๋ ๊ฐ ๋ฐ์ดํฐ ํจํท ํ์
์ ๋ํ ํ์ด๋ก๋(์ค์ ๋ฐ์ดํฐ)์ ํฌ๊ธฐ๋ฅผ ์ ์ํ๋ ๋ฐฐ์ด.
// COMM_TYPE ์ด๊ฑฐํ์ ์์์ ๋ง๊ฒ ๊ฐ ํ์
์ ํ์ด๋ก๋ ํฌ๊ธฐ๋ฅผ ๋ช
์ํฉ๋๋ค.
// ํ๋ฌ ์ธํฐํ์ด์ค์ ๊ฒฝ์ฐ, ์ผ์ ๋ฐ์ดํฐ(FEEDBACK) ๋๋ ๋ก๋ด ์ ์ด ๋ช
๋ น(CTRL) ๋ฑ์ ํฌ๊ธฐ๊ฐ ์ฌ๊ธฐ์ ์ ์๋ฉ๋๋ค.
int comm_payload_size[] = {
16, // COMM_TYPE_PING: ์ฐ๊ฒฐ ํ์ธ์ฉ ํ ํจํท ํ์ด๋ก๋ ํฌ๊ธฐ
16, // COMM_TYPE_PONG: ํ ์๋ต์ฉ ํ ํจํท ํ์ด๋ก๋ ํฌ๊ธฐ
16, // COMM_TYPE_FEEDBACK: ํ๋ฌ ์ผ์ ๋ฐ์ดํฐ์ ๊ฐ์ ๋ก๋ด์ ํผ๋๋ฐฑ ํจํท ํ์ด๋ก๋ ํฌ๊ธฐ (์: 8๊ฐ์ ์๋ ๋ก๊ทธ ์ผ์ ๊ฐ)
};
// @brief ํน์ ๋ฐ์ดํฐ ํจํท ํ์
์ ์์ ์ `comm_recv_poll_last` ํจ์์์ ๋ฌด์ํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ฐฐ์ด.
// ํ๋ฌ ์ธํฐํ์ด์ค์ ๊ฐ์ด ์ค์๊ฐ์ฑ์ด ์ค์ํ ์์คํ
์์๋ ์ต์ ๋ฐ์ดํฐ๋ง ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ผ๋ถ ํจํท์ ๋ฌด์ํ ์ ์์ต๋๋ค.
// true๋ก ์ค์ ๋ ํจํท ํ์
์ `comm_recv_poll_last` ํธ์ถ ์ ์ต์ ๋ฐ์ดํฐ๋ก ๊ฐฑ์ ๋์ง ์๊ณ ์ฆ์ ๋ฐํ๋ฉ๋๋ค.
bool comm_type_importance[] = {
false, // COMM_TYPE_PING: ํ ํจํท์ ๋ฌด์ ๊ฐ๋ฅ (์ฃผ๊ธฐ์ ์ธ ์ํ ํ์ธ ๋ชฉ์ ์ด ์๋๋ผ๋ฉด)
false, // COMM_TYPE_PONG: ํ ํจํท์ ๋ฌด์ ๊ฐ๋ฅ
false, // COMM_TYPE_FEEDBACK: ํ๋ฌ ํผ๋๋ฐฑ ๋ฐ์ดํฐ๋ ๋ฌด์ ๊ฐ๋ฅ (ํญ์ ์ต์ ์ํ๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์ค์)
};
// @brief ๋ฐ์ดํฐ ํจํท์ ๋ธ๋กํน ๋ฐฉ์์ผ๋ก ์๋ฆฌ์ผ ํฌํธ๋ก ์ ์กํ๋ ํจ์.
// ํจํท ํค๋(0x5A), ํจํท ํ์
, ํ์ด๋ก๋ ๋ฐ์ดํฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ ์กํฉ๋๋ค.
// ํ๋ฌ ์ธํฐํ์ด์ค์์๋ ์ฃผ๋ก ์ผ์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ด ์์คํ
์ผ๋ก ์ ์กํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
// @param type ์ ์กํ ๋ฐ์ดํฐ ํจํท์ ํ์
์
๋๋ค (comm_type_t).
// @param payload ์ ์กํ ์ค์ ๋ฐ์ดํฐ๊ฐ ๋ด๊ธด uint8_t ๋ฐฐ์ด์
๋๋ค. (์: 8๊ฐ์ ์๋ ๋ก๊ทธ ์ผ์ ๊ฐ)
// @return ์ ์ก ์ค ์ค๋ฅ ๋ฐ์ ์ true, ์ ์ ์ false๋ฅผ ๋ฐํํฉ๋๋ค.
bool comm_send_blocking(comm_type_t type, const uint8_t payload[]) {
bool ret;
// ํจํท ์์์ ์๋ฆฌ๋ ํค๋ ๋ฐ์ดํธ ์ ์ก (0x5A)
ret = serial_send_blocking(0x5A);
if (ret) return true; // ์ ์ก ์ค๋ฅ ์ ์ฆ์ ๋ฐํ
// ํจํท ํ์
๋ฐ์ดํธ ์ ์ก (์: COMM_TYPE_FEEDBACK)
ret = serial_send_blocking((uint8_t)type);
if (ret) return true; // ์ ์ก ์ค๋ฅ ์ ์ฆ์ ๋ฐํ
// ํจํท ํ์ด๋ก๋ ๋ฐ์ดํฐ ์ ์ก (์: ์๋ ๋ก๊ทธ ์ผ์ ๊ฐ)
for (int i = 0; i < comm_payload_size[type]; ++i) {
ret = serial_send_blocking(payload[i]);
if (ret) return true; // ์ ์ก ์ค๋ฅ ์ ์ฆ์ ๋ฐํ
}
return false; // ์ ์ก ์ฑ๊ณต
}
// ์์ ๋ฒํผ: ํจํท ํค๋ (1 ๋ฐ์ดํธ) + ํจํท ํ์
(1 ๋ฐ์ดํธ) + ์ต๋ ํ์ด๋ก๋ ํฌ๊ธฐ
// ์ธ๋ถ ์์คํ
(๋ก๋ด)์ผ๋ก๋ถํฐ์ ์ ์ด ๋ช
๋ น ๋ฑ์ ์์ ์ ์ฅํ๋ ๋ฒํผ์
๋๋ค.
static uint8_t recv_buf[2 + COMM_PAYLOAD_SIZE_MAX];
// ์์ ๋ฒํผ์ ํ์ฌ ์ฑ์์ง ์์น๋ฅผ ๋ํ๋ด๋ ํฌ์ธํฐ
static int recv_buf_p;
// @brief ์๋ฆฌ์ผ ํฌํธ์์ ๋ฐ์ดํฐ ํจํท์ ์์ ํ๋ ๋
ผ๋ธ๋กํน ํจ์.
// ๋ฐ์ดํฐ๊ฐ ์์ ํ ์์ ๋ ๋๊น์ง ๋ด๋ถ์ ์ผ๋ก ํด๋งํ๋ฉฐ, ์์ ๋ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ์ฆ์ ๋ฐํ๋ฉ๋๋ค.
// ์ ํจํ์ง ์์ ๋ฐ์ดํฐ๋ ์ ์ ์๋ ํ์
์ ํจํท์ ๊ฒฝ๊ณ ๋ฅผ ์ถ๋ ฅํ๊ณ ๋ฌด์ํฉ๋๋ค.
// ํ๋ฌ ์ธํฐํ์ด์ค์์๋ ๋ก๋ด ์์คํ
์ผ๋ก๋ถํฐ์ ์ํ ์ ๋ณด๋ ์ค์ ๊ฐ ๋ฑ์ ์์ ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
// @param type ์์ ๋ ๋ฐ์ดํฐ ํจํท์ ํ์
์ ์ ์ฅํ comm_type_t ํฌ์ธํฐ์
๋๋ค.
// @param payload ์์ ๋ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ uint8_t ๋ฐฐ์ด์
๋๋ค.
// @return ๋ฐ์ดํฐ ํจํท ์์ ์ฑ๊ณต ์ false, ์์ ํ ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋ ์ค๋ฅ ๋ฐ์ ์ true๋ฅผ ๋ฐํํฉ๋๋ค.
bool comm_recv_poll(comm_type_t *type, uint8_t payload[]) {
bool ret;
while (true) {
uint8_t buf;
ret = serial_recv_poll(&buf);
if (ret) return true; // ์์ ํ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด true ๋ฐํ
// ์์ ๋ฒํผ์ ์์ (recv_buf_p == 0)์์ ๋ฐ์ดํฐ๊ฐ ํจํท ํค๋(0x5A)๊ฐ ์๋๋ฉด ๋ฌด์
if (recv_buf_p == 0 && buf != 0x5A) {
Serial.println("comm: warning: Received wrong byte!"); // ์๋ชป๋ ์์ ๋ฐ์ดํธ ๊ฒฝ๊ณ
recv_buf_p = 0; // ๋ฒํผ ์ด๊ธฐํ
continue; // ๋ค์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆผ
}
// ์์ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฒํผ์ ์ ์ฅํ๊ณ ๋ฒํผ ํฌ์ธํฐ ์ฆ๊ฐ
recv_buf[recv_buf_p++] = buf;
// ์ด์ค์
: ์์ ๋ฒํผ๊ฐ ์ค๋ฒํ๋ก์ฐ๋์ง ์๋๋ก ํ์ธ. ๋ฒํผ ํฌ๊ธฐ๊ฐ ์ถฉ๋ถํ์ง ๊ฒ์ฌ.
assert(recv_buf_p <= sizeof recv_buf);
// ํจํท ํ์
์์ ํ (recv_buf_p == 2), ์ ์ ์๋ ํ์
์ธ์ง ํ์ธ
// ์ ์ ์๋ ํ์
์ด๋ฉด ๊ฒฝ๊ณ ๋ฅผ ์ถ๋ ฅํ๊ณ ๋ฒํผ๋ฅผ ๋ฆฌ์
if (recv_buf_p == 2 && recv_buf[1] >= (sizeof comm_payload_size) / (sizeof comm_payload_size[0])) {
Serial.println("comm: warning: Received wrong type!"); // ์ ์ ์๋ ํจํท ํ์
๊ฒฝ๊ณ
recv_buf_p = 0; // ์์ ์ํ๋ฅผ ์ด๊ธฐํ
continue; // ์๋ชป๋ ํ์
์์ ์ ๋ค์ ํจํท์ ๊ธฐ๋ค๋ฆผ
}
// ์์ ํ ๋ฐ์ดํฐ ํจํท์ด ์์ ๋์๋์ง ํ์ธ
// ์์ ๋ฒํผ์ ํฌ๊ธฐ๊ฐ ํค๋(1) + ํ์
(1) + ํด๋น ํ์
์ ํ์ด๋ก๋ ํฌ๊ธฐ์ ๊ฐ์ผ๋ฉด ์์ ํ ํจํท
if (recv_buf_p >= 2 && recv_buf_p == 2 + comm_payload_size[recv_buf[1]]) {
// ์์ ๋ ํ์ด๋ก๋ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅ ๋ฒํผ๋ก ๋ณต์ฌ
*type = (comm_type_t)recv_buf[1]; // ์์ ๋ ํจํท ํ์
์ค์
memcpy(payload, recv_buf + 2, comm_payload_size[recv_buf[1]]); // ํ์ด๋ก๋ ๋ฐ์ดํฐ ๋ณต์ฌ
// ์์ ๋ฒํผ ์ด๊ธฐํ
recv_buf_p = 0;
break; // ์์ ํ ํจํท ์์ ์๋ฃ
}
// TODO: ๋ฐ์ดํฐ ์์ ์ค ํ์์์ ๋ฉ์ปค๋์ฆ ์ถ๊ฐ ํ์. ์ผ์ ์๊ฐ ๋ด์ ํจํท์ด ์๋ฃ๋์ง ์์ผ๋ฉด ์ค๋ฅ ์ฒ๋ฆฌ.
}
return false; // ๋ฐ์ดํฐ ํจํท ์์ ์ฑ๊ณต
}
// @brief ์๋ฆฌ์ผ ์์ ๋ฒํผ๋ฅผ ๊ฐ๋ฅํ ํ ๋น์ฐ๊ณ ๊ฐ์ฅ ๋ง์ง๋ง์ ์์ ๋ ๋ฐ์ดํฐ ํจํท์ ๋ฐํํ๋ ํจ์.
// ํ๋ฌ ์ธํฐํ์ด์ค์ ๊ฐ์ด ํญ์ ์ต์ ์ ์ด/ํผ๋๋ฐฑ ๋ฐ์ดํฐ๊ฐ ์ค์ํ ๊ฒฝ์ฐ, ์ค๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฒ๋ฆฌ๊ณ ์ต์ ๋ฐ์ดํฐ๋ง ์ฒ๋ฆฌํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
// ์ฌ๋ฌ ๊ฐ์ ํจํท์ด ๋น ๋ฅด๊ฒ ์์ ๋ ๊ฒฝ์ฐ, ์ค๊ฐ ํจํท๋ค์ ๋ฒ๋ ค์ง๊ณ ๊ฐ์ฅ ์ต์ ํจํท๋ง ์ฒ๋ฆฌ๋ฉ๋๋ค.
// ์ด๋ ์์คํ
๊ฐ์ ์ฃผ๊ธฐ๋ฅผ ๋๊ธฐํํ๊ณ ์ค์๊ฐ์ฑ์ ํ๋ณดํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
// ์ค์๋๊ฐ ๋ฎ์ ํจํท์ ๋ฌด์๋ ์ ์์ต๋๋ค.
// @param type ์์ ๋ ๋ง์ง๋ง ๋ฐ์ดํฐ ํจํท์ ํ์
์ ์ ์ฅํ comm_type_t ํฌ์ธํฐ์
๋๋ค.
// @param payload ์์ ๋ ๋ง์ง๋ง ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ uint8_t ๋ฐฐ์ด์
๋๋ค.
// @return ๋ฐ์ดํฐ ํจํท ์์ ์ฑ๊ณต ์ false, ์์ ํ ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋ ์ค๋ฅ ๋ฐ์ ์ true๋ฅผ ๋ฐํํฉ๋๋ค.
bool comm_recv_poll_last(comm_type_t *type, uint8_t payload[]) {
bool last_ret = true; // ๋ง์ง๋ง ์์ ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅ (๊ธฐ๋ณธ๊ฐ: ๋ฐ์ดํฐ ์์)
// ์ต์ํ ํ ๋ฒ comm_recv_poll์ ํธ์ถํ์ฌ ๋ฐ์ดํฐ ์์ ์ ์๋
bool ret = comm_recv_poll(type, payload);
// ๋ฐ์ดํฐ๊ฐ ๋ ์ด์ ์์ ๋๊น์ง comm_recv_poll์ ๋ฐ๋ณต ํธ์ถํ์ฌ ๋ฒํผ๋ฅผ ๋น์
while (!ret) {
// ํ์ฌ ์์ ๋ ํจํท์ ์ค์๋๋ฅผ ํ์ธ
if (comm_type_importance[*type]) {
// ์ค์ ํจํท์ธ ๊ฒฝ์ฐ, ๋ฒํผ๋ฅผ ๋น์ฐ์ง ์๊ณ ํ์ฌ ํจํท์ ์ฆ์ ๋ฐํ (์: ๊ธด๊ธ ์ ์ง ๋ช
๋ น ๋ฑ)
return ret;
}
// ์ค์ํ์ง ์์ ํจํท์ธ ๊ฒฝ์ฐ, ํ์ฌ ์์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ ๋ค์ ํจํท ์์ ์๋
last_ret = ret;
ret = comm_recv_poll(type, payload);
}
// ๋ฐ์ดํฐ๊ฐ ๋ ์ด์ ์์ ๋ (ret์ด true๊ฐ ๋ ๋), ๋ง์ง๋ง์ผ๋ก ์ฑ๊ณต์ ์ผ๋ก ์์ ํ๋ ๊ฒฐ๊ณผ (last_ret)๋ฅผ ๋ฐํ
return ret = last_ret;
}
// @brief ํต์ ๋ชจ๋์ ์ด๊ธฐํํ๋ ํจ์.
// ์๋ฆฌ์ผ ํต์ ์ ์ค์ ํ๊ณ ์์ ๋ฒํผ๋ฅผ ์ฌ์ฉํ ์ค๋น๋ฅผ ํฉ๋๋ค.
// @return ์ด๊ธฐํ ์ค ์ค๋ฅ ๋ฐ์ ์ true, ์ ์ ์ false๋ฅผ ๋ฐํํฉ๋๋ค.
bool comm_init(void) {
bool ret = serial_init(); // ์๋ฆฌ์ผ ํต์ ์ด๊ธฐํ
if (ret) return true; // ์ด๊ธฐํ ์ค๋ฅ ์ ์ฆ์ ๋ฐํ
recv_buf_p = 0; // ์์ ๋ฒํผ ํฌ์ธํฐ ์ด๊ธฐํ (๋ฒํผ ๋น์ฐ๊ธฐ)
return false; // ์ด๊ธฐํ ์ฑ๊ณต
}#include <Arduino.h> // Arduino ํ๋ซํผ์์ ์๋ ๋ก๊ทธ ์ฝ๊ธฐ ๋ฑ์ ์ฌ์ฉํ๊ธฐ ์ํ ํค๋ ํ์ผ
#include "main.h" // ๋ฉ์ธ ํจ์ ๊ด๋ จ ์ ์ (ํ์ํ๋ค๋ฉด)
#include "comm.h" // ์ปค์คํ
ํต์ ํค๋ ํ์ผ: ์๋ฆฌ์ผ ํต์ ํ๋กํ ์ฝ ์ ์
#include <lwip/sockets.h> // ๋คํธ์ํฌ ๋ฐ์ดํธ ์์ ๋ณํ ํจ์ (htons)๋ฅผ ์ํ ํค๋ (ESP32 ๋ฑ์์ ์ฌ์ฉ)
// @brief Arduino ๋ณด๋์ ์ด๊ธฐ ์ค์ ์ ์ํํ๋ ํจ์.
// ์๋ ๋ก๊ทธ ์
๋ ฅ ํด์๋ ์ค์ , ํต์ ๋ชจ๋ ์ด๊ธฐํ ๋ฑ์ ์ํํฉ๋๋ค.
void setup() {
// ์๋ ๋ก๊ทธ-๋์งํธ ์ปจ๋ฒํฐ(ADC)์ ํด์๋๋ฅผ 12๋นํธ๋ก ์ค์ ํฉ๋๋ค (0-4095).
// ์ด๋ ํ๋ฌ ์ผ์์ ๊ฐ์ ์๋ ๋ก๊ทธ ์
๋ ฅ์ ์ ๋ฐ๋๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
analogReadResolution(12);
// ๋ก๋ด ์์คํ
๊ณผ์ ์๋ฆฌ์ผ ํต์ ๋ชจ๋์ ์ด๊ธฐํํฉ๋๋ค.
// comm.cpp์ ์ ์๋ comm_init ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
comm_init();
}
// @brief ๋ก๋ด ์์คํ
์ ๋ฉ์ธ ์คํ ๋ฃจํ ํจ์.
// ์ฃผ๊ธฐ์ ์ผ๋ก ํ๋ฌ ์ผ์ ๊ฐ์ ์ฝ๊ณ , ์ด๋ฅผ ํต์ ํจํท์ผ๋ก ๊ตฌ์ฑํ์ฌ ๋ก๋ด ์์คํ
์ผ๋ก ์ ์กํฉ๋๋ค.
void loop() {
// ESP32์ ๊ฒฝ์ฐ ADC 2๋ Wi-Fi ์ฌ์ฉ ์ ์ ์ฝ์ด ์์ ์ ์์ต๋๋ค.
// (์ฐธ๊ณ : https://blog.mjyai.com/2022/10/28/esp32-arduino-ads1115-adc-benchmark/)
// ์ฌ๊ธฐ์๋ 8๊ฐ์ ์๋ ๋ก๊ทธ ์ผ์ ๊ฐ์ ์ ์ฅํ ๋ฐฐ์ด์ ์ ์ธํฉ๋๋ค.
// ์ด ๊ฐ๋ค์ ํ๋ฌ์ ๊ฐ ์ถ(์ ์ง, ์ข์ฐ, ํ์ ๋ฑ)์ ํด๋นํ ์ ์์ต๋๋ค.
uint16_t analog[8];
analog[0] = analogRead(36); // ์๋ ๋ก๊ทธ ํ 36์์ ๊ฐ ์ฝ๊ธฐ (์: ์ ์ง/ํ์ง ํ๋ฌ)
analog[1] = analogRead(39); // ์๋ ๋ก๊ทธ ํ 39์์ ๊ฐ ์ฝ๊ธฐ (์: ์ข์ฐ ์กฐํฅ ํ๋ฌ)
analog[2] = analogRead(34); // ์๋ ๋ก๊ทธ ํ 34์์ ๊ฐ ์ฝ๊ธฐ
analog[3] = analogRead(35); // ์๋ ๋ก๊ทธ ํ 35์์ ๊ฐ ์ฝ๊ธฐ
analog[4] = analogRead(32); // ์๋ ๋ก๊ทธ ํ 32์์ ๊ฐ ์ฝ๊ธฐ
analog[5] = analogRead(33); // ์๋ ๋ก๊ทธ ํ 33์์ ๊ฐ ์ฝ๊ธฐ
analog[6] = analogRead(25); // ์๋ ๋ก๊ทธ ํ 25์์ ๊ฐ ์ฝ๊ธฐ
analog[7] = analogRead(26); // ์๋ ๋ก๊ทธ ํ 26์์ ๊ฐ ์ฝ๊ธฐ
// ์๋ฆฌ์ผ ๋ชจ๋ํฐ๋ก ์๋ ๋ก๊ทธ ๊ฐ๋ค์ ์ถ๋ ฅํ์ฌ ๋๋ฒ๊น
ํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
// Serial.printf("%hu %hu %hu %hu %hu %hu %hu %hu\n", analog[0], analog[1], analog[2], analog[3], analog[4], analog[5], analog[6], analog[7]);
// ์๋ ๋ก๊ทธ ๊ฐ๋ค์ 16๋นํธ ์ ์์ด๋ฏ๋ก, ๋คํธ์ํฌ ์ ์ก์ ์ํด ๋ฐ์ดํธ ์์๋ฅผ ๋ณํํฉ๋๋ค.
// htons: Host to Network Short (16๋นํธ ๋ฐ์ดํฐ ๋ณํ)
for (int i = 0; i < 8; ++i) analog[i] = htons(analog[i]);
// ์ฝ์ ์๋ ๋ก๊ทธ ๊ฐ๋ค (ํ๋ฌ ์ํ)์ COMM_TYPE_FEEDBACK ํจํท์ผ๋ก ๊ตฌ์ฑํ์ฌ ์ ์กํฉ๋๋ค.
// ์ด ํจํท์ ๋ก๋ด ์์คํ
์ผ๋ก ์ ๋ฌ๋์ด ๋ก๋ด ์ ์ด์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
comm_send_blocking(COMM_TYPE_FEEDBACK, (uint8_t *)analog);
// 100ms ์ง์ฐ.
// ์ด๋ ํ๋ฌ ์ํ๋ฅผ ๋ก๋ด์ผ๋ก ์ ์กํ๋ ์ฃผ๊ธฐ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
// ์ ์ด ์์คํ
์ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ์กฐ์ ๋ ์ ์์ต๋๋ค.
delay(100);
// ์ฐธ๊ณ : ์ด ์ฝ๋๋ ํ๋ฌ ์ผ์ ๊ฐ์ ์ฝ์ด ๋ก๋ด์ผ๋ก ์ ์กํ๋ ๋ถ๋ถ๋ง ๊ตฌํ๋์ด ์์ต๋๋ค.
// ๋ก๋ด ์์คํ
์์ ์ด ํผ๋๋ฐฑ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ํด์ํ๊ณ ๋ก๋ด ์์ง์์ผ๋ก ๋ณํํ๋์ง๋
// ๋ก๋ด ์ธก์ ์ํํธ์จ์ด์์ ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ํ, ๋ก๋ด์ผ๋ก๋ถํฐ์ ์๋ต ์์ ๋ก์ง์
// comm_recv_poll ๋๋ comm_recv_poll_last ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๊ฐ ๊ตฌํ๋ ์ ์์ต๋๋ค.
}์ด ์ฝ๋๋ ๋ก๋ด ์์คํ ์ ์ ์ดํ๊ธฐ ์ํ ํ๋ฌ ์ธํฐํ์ด์ค์ ์ญํ ์ ์ํํ๋ ์๋ฒ ๋๋ ๋ณด๋(์: ESP32)์์ ์คํ๋ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค.
-
Analog Read (์๋ ๋ก๊ทธ ๊ฐ ์ฝ๊ธฐ):
setup()ํจ์์์ ADC ํด์๋๋ฅผ ์ค์ ํ ํ,loop()ํจ์์์๋ ์ฃผ๊ธฐ์ ์ผ๋ก 8๊ฐ์ ์๋ก ๋ค๋ฅธ ํ์์ ์๋ ๋ก๊ทธ ๊ฐ์ ์ฝ์ต๋๋ค. ์ด ์๋ ๋ก๊ทธ ๊ฐ๋ค์ ๋ฌผ๋ฆฌ์ ์ธ ํ๋ฌ์ ์์ง์์ด๋ ๋๋ฅด๋ ์ ๋๋ฅผ ์ผ์(์: ํฌํ ์ผ๋ฏธํฐ)๋ฅผ ํตํด ๋์งํธ ๊ฐ์ผ๋ก ๋ณํํ ๊ฒ์ ๋๋ค. ๊ฐ ์๋ ๋ก๊ทธ ์ ๋ ฅ์ ๋ก๋ด์ ํน์ ์ ์ด ๋ณ์(์: ์ ์ง ์๋, ์กฐํฅ ๊ฐ๋, ๋ธ๋ ์ดํฌ ๊ฐ๋ ๋ฑ)์ ๋งคํ๋ ์ ์์ต๋๋ค. -
๋ฐ์ดํฐ ์ ์ก (
comm_send_blocking): ์ฝ์ 8๊ฐ์ ์๋ ๋ก๊ทธ ๊ฐ๋ค์ 16๋นํธ ์ ์ ํํ์ด๋ฏ๋ก, ํต์ ์ผ๋ก ์ ์กํ๊ธฐ ์ ์ ๋คํธ์ํฌ ๋ฐ์ดํธ ์์๋ก ๋ณํ๋ฉ๋๋ค (htons). ์ด๋ ๊ฒ ๋ณํ๋ ๋ฐ์ดํฐ๋COMM_TYPE_FEEDBACKํ์ ์ ํจํท ํ์ด๋ก๋๋ก ์ฌ์ฉ๋์ดcomm_send_blockingํจ์๋ฅผ ํตํด ์๋ฆฌ์ผ ํฌํธ๋ก ์ ์ก๋ฉ๋๋ค. ์ด ํจํท์ ๋ก๋ด ์์คํ ์ด ์์ ํ์ฌ ํ๋ฌ์ ํ์ฌ ์ํ๋ฅผ ํ์ ํ๊ณ ๋ก๋ด์ ์์ง์์ ๊ฒฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. -
์ฃผ๊ธฐ์ ์ธ ์ ์ก:
loop()ํจ์๋ 100ms์ ์ง์ฐ์ ํฌํจํ๊ณ ์์ด, ํ๋ฌ ์ํ ๋ฐ์ดํฐ๊ฐ ์ฝ 10Hz์ ์ฃผ๊ธฐ๋ก ๋ก๋ด ์์คํ ์ ์ ์ก๋ฉ๋๋ค. ์ด ์ฃผ๊ธฐ๋ ์ ์ด์ ๋ฐ์์ฑ๊ณผ ์์คํ ๋ถํ ์ฌ์ด์ ๊ท ํ์ ๊ณ ๋ คํ์ฌ ์ค์ ๋ฉ๋๋ค.
์ด ์ฝ๋๋ ํ๋ฌ ํ๋์จ์ด๋ก๋ถํฐ ์๋ ๋ก๊ทธ ์ ๋ ฅ์ ๋ฐ์ ๋์งํธํํ๊ณ , ์ด๋ฅผ ํ์คํ๋ ํต์ ํจํท ํํ๋ก ๋ณํํ์ฌ ๋ก๋ด์๊ฒ ์ ๋ฌํ๋ ์๋ฌด๋ฅผ ์ํํฉ๋๋ค. ๋ก๋ด ์์คํ ์ธก์์๋ ์ด ํจํท์ ์์ ํ๊ณ ํด์ํ์ฌ ๋ก๋ด์ ์ค์ ์์ง์ ๋ช ๋ น์ ์์ฑํ๊ฒ ๋ฉ๋๋ค.