pedal.md - dingdongdengdong/astra_ws GitHub Wiki

ํ‘œ์ค€ํ™”๋œ ํ†ต์‹  ํŒจํ‚ท ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋กœ๋ด‡์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋ถ€๋ถ„์€ main.cpp์™€ comm.cpp ํŒŒ์ผ์— ๊ฑธ์ณ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. 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 ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ํƒ€์ž… ์บ์ŠคํŒ…์ž…๋‹ˆ๋‹ค.
  2. 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; // ์ดˆ๊ธฐํ™” ์„ฑ๊ณต
}

main.cpp with Comments (Tailored for Pedal Control)

#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์˜ ์ฃผ๊ธฐ๋กœ ๋กœ๋ด‡ ์‹œ์Šคํ…œ์— ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ด ์ฃผ๊ธฐ๋Š” ์ œ์–ด์˜ ๋ฐ˜์‘์„ฑ๊ณผ ์‹œ์Šคํ…œ ๋ถ€ํ•˜ ์‚ฌ์ด์˜ ๊ท ํ˜•์„ ๊ณ ๋ คํ•˜์—ฌ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๋Š” ํŽ˜๋‹ฌ ํ•˜๋“œ์›จ์–ด๋กœ๋ถ€ํ„ฐ ์•„๋‚ ๋กœ๊ทธ ์ž…๋ ฅ์„ ๋ฐ›์•„ ๋””์ง€ํ„ธํ™”ํ•˜๊ณ , ์ด๋ฅผ ํ‘œ์ค€ํ™”๋œ ํ†ต์‹  ํŒจํ‚ท ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋กœ๋ด‡์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์ž„๋ฌด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๋ด‡ ์‹œ์Šคํ…œ ์ธก์—์„œ๋Š” ์ด ํŒจํ‚ท์„ ์ˆ˜์‹ ํ•˜๊ณ  ํ•ด์„ํ•˜์—ฌ ๋กœ๋ด‡์˜ ์‹ค์ œ ์›€์ง์ž„ ๋ช…๋ น์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ