Skip to content

Latest commit

ย 

History

History
425 lines (303 loc) ยท 14.1 KB

File metadata and controls

425 lines (303 loc) ยท 14.1 KB

โœ๏ธ ๋ชฉ์ฐจ

  1. ๐ŸŽฏ ๋ฒ”์šฉ RC์นด ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ
  2. ๐Ÿ“‹ ์ฃผ์š” ๊ธฐ๋Šฅ
  3. ๐Ÿšš์ž„๋ฒ ๋””๋“œ ์„ค๊ณ„๋„
  4. ๐Ÿ“Š ๋ฒ”์šฉ RC์นด ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ๋„
  5. ๐Ÿ› ๏ธ ๋™์‹œ์„ฑ ์ œ์–ด ๊ด€๋ จ ์ œํ•œ์กฐ๊ฑด ๊ตฌํ˜„ ๋‚ด์šฉ
  6. โœจ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ๊ตฌ์„ฑ
  7. ๐Ÿ› ๊ฐœ๋ฐœ์‹œ ๋ฌธ์ œ์ ๊ณผ ํ•ด๊ฒฐ (ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…)
  8. ๐Ÿ“ ์‹œ์Šคํ…œ ์ปค์Šคํ…€ ๊ฐ€์ด๋“œ
  9. ๐Ÿ‘ฌ ํŒ€์› ์†Œ๊ฐœ ๋ฐ ์—ญํ• 

์‹œ์—ฐ ๋งํฌ

RC์นด ํ”„๋กœ์ ํŠธ ์‹œ์—ฐ

RC์นด ํ”„๋กœ์ ํŠธ ์‹œ์—ฐ

๋…ธ์…˜ ํŽ˜์ด์ง€

ํ”„๋กœ์ ํŠธ ๋…ธ์…˜ ํŽ˜์ด์ง€

์›น ์ปจํŠธ๋กค๋Ÿฌ ๋งํฌ

์›น ์ปจํŠธ๋กค๋Ÿฌ ๋งํฌ

๋ธ”๋ฃจํŠธ์Šค ์•ฑ ์„ค์น˜ qr ์ฝ”๋“œ


๐ŸŽฏ๋ฒ”์šฉ RC์นด ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

RC ์นด ์ด๋ฏธ์ง€

RC ์นด์˜ ์ œ์–ด์™€ ๊ธฐ๊ธฐ ์ถ”๊ฐ€๋ฅผ ์ข€ ๋” ํ™•์žฅํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋ชจํ„ฐ ๋ฐ ์ œ์–ด ์žฅ์น˜ ํ™•์žฅ: DC ๋ชจํ„ฐ, ์„œ๋ณด ๋ชจํ„ฐ ๋“ฑ ๋‹ค์–‘ํ•œ ์ž„๋ฒ ๋””๋“œ ์ œ์–ด ์žฅ์น˜๋ฅผ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•˜๊ณ , ์‚ฌ์šฉ์ž ๋งž์ถค ์ œ์–ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ.
  • ์ œ์–ด ๋ฐฉ๋ฒ•์˜ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•: WebSocket API, Bluetooth ๋“ฑ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ RC ์นด๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ ์—ฐ์„ฑ์„ ์ œ๊ณต.
  • ํ™•์žฅ์„ฑ๊ณผ ์•ˆ์ •์„ฑ ๊ฐ•ํ™”: ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ๊ณผ ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ํ†ตํ•ด ์•ˆ์ •์ ์ด๋ฉฐ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ ๊ตฌ์ถ•.

๐Ÿ“‹ ์ฃผ์š” ๊ธฐ๋Šฅ

RC์นด device ๊ธฐ๋Šฅ

  1. DC ๋ชจํ„ฐ๋ฅผ ํ™œ์šฉํ•œ ์ „์ง„ ๋ฐ ํ›„์ง„ ๋ฐฉํ–ฅ ์ œ์–ด

    • RC์นด์˜ ์ „์ง„ ๋ฐ ํ›„์ง„ ๋ฐฉํ–ฅ์„ DC ๋ชจํ„ฐ๋กœ ์ •๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
  2. ์„œ๋ณด ๋ชจํ„ฐ๋ฅผ ์ด์šฉํ•œ ์˜คํ”ˆ์นด ๋ชจ๋“œ

    • ์„œ๋ณด ๋ชจํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฐจ๋Ÿ‰์˜ ์˜คํ”ˆ์นด ๋ชจ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  3. ์กฐ๋„ ์„ผ์„œ ๋ฐ LED๋ฅผ ํ™œ์šฉํ•œ ์˜คํ† ๋ผ์ดํŠธ ๊ธฐ๋Šฅ

    • ์ฃผ๋ณ€์˜ ๋ฐ๊ธฐ๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์ž๋™์œผ๋กœ ๋ผ์ดํŠธ๋ฅผ ์ผœ๊ณ  ๋„๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  4. ์Šคํ”ผ์ปค๋ฅผ ํ™œ์šฉํ•œ ๊ฒฝ์  ๊ธฐ๋Šฅ

    • ์Šคํ”ผ์ปค๋ฅผ ํ†ตํ•ด RC์นด์— ๊ฒฝ์  ์†Œ๋ฆฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์œ ์—ฐํ•œ ์ œ์–ด ๋ฐฉ๋ฒ•

RC์นด๋Š” ๋‹ค์–‘ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์›ํ•˜์—ฌ ์œ ์—ฐํ•œ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • WebSocket API : ์›น(Web) ํ™˜๊ฒฝ์„ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ ์ œ์–ด ๊ฐ€๋Šฅ
  • Bluetooth : ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ Bluetooth๋ฅผ ํ†ตํ•ด ์ œ์–ด ๊ฐ€๋Šฅ

๐Ÿšš์ž„๋ฒ ๋””๋“œ ์„ค๊ณ„๋„

image

๊ตฌ์„ฑ ์„ค๋ช…

1. ๊ฑด์ „์ง€ ์ŠคํŽ™

์ „์› ๊ณต๊ธ‰:

RC ์นด์˜ ๋ชจํ„ฐ ์ œ์–ด๋ฐ ์„œ๋ณด ๋ชจํ„ฐ, ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด ๋ณด๋“œ ์ „์› ๊ณต๊ธ‰์— ์‚ฌ์šฉ

๊ฐฏ์ˆ˜ : 2๊ฐœ

์ „์••: 3.7V

์šฉ๋Ÿ‰: 2000mAh

2. UART (๋ธ”๋ฃจํˆฌ์Šค ํ†ต์‹ )

์—ญํ• :

๋ธ”๋ฃจํˆฌ์Šค ๋ชจ๋“ˆ๊ณผ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด ๊ฐ„ ํ†ต์‹ ์„ ํ†ตํ•ด RC ์นด์˜ ์›๊ฒฉ ์ œ์–ด์ˆ˜ํ–‰

ํ™œ์šฉ: ์Šค๋งˆํŠธํฐ ๋“ฑ ์™ธ๋ถ€ ์žฅ์น˜์—์„œ ์กฐ์ข… ๋ช…๋ น์„ ์ „์†ก

3. ์„œ๋ณด ๋ชจํ„ฐ (Servo Motor)

์—ญํ• :

์˜คํ”ˆ ์นด ๋ชจ๋“œ ์ œ์–ด

RC ์นด์˜ ๊ฐ๋„ ๋ฐ ์กฐํ–ฅ ๋ฐฉํ–ฅ์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์กฐ์ •

4. DC ๋ชจํ„ฐ์™€ ์–ด๋Œ‘ํ„ฐ

์—ญํ• :

RC ์นด์˜ ๊ตฌ๋™ ๋ฐ ๋ฐฉํ–ฅ ์ œ์–ด

๋ชจํ„ฐ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ํ†ตํ•ด ์†๋„์™€ ๋ฐฉํ–ฅ์„ ์กฐ์ ˆ

2๊ฐœ์˜ DC ๋ชจํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ RC ์นด๋ฅผ ์›€์ง์ž„

5. LED ํ•€๊ณผ ์กฐ๋„ ์„ผ์„œ

์—ญํ• :

์ฃผ๋ณ€ ์กฐ๋„ ๊ฐ์ง€๋ฅผ ํ†ตํ•ด ์˜คํ† ๋ผ์ดํŠธ ๋ชจ๋“œ ๊ตฌํ˜„

์กฐ๋„ ์„ผ์„œ๊ฐ€ ์–ด๋‘์šด ํ™˜๊ฒฝ์„ ๊ฐ์ง€ํ•˜๋ฉด LED๊ฐ€ ์ž๋™์œผ๋กœ ์ผœ์ง

6. ์Šคํ”ผ์ปค

์—ญํ• :

RC ์นด ๊ฒฝ์ ์„ ๋‚ด๋„๋ก ํ•จ


๐Ÿ“Š๋ฒ”์šฉ RC์นด ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ๋„

image

  1. Controller RC ์นด์˜ ๋™์ž‘์„ ์ œ์–ดํ•˜๋ฉฐ, ํ˜„์žฌ ๋“ฑ๋ก๋œ Device ๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. Thread Pool์„ ์‚ฌ์šฉํ•ด ๋ณ‘๋ ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ํšจ์œจ์ ์ธ ๋ฆฌ์†Œ์Šค ํ™œ์šฉ๊ณผ ๋น ๋ฅธ ์‘๋‹ต์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

  2. Connection Handler ์™ธ๋ถ€ ์ž…๋ ฅ(Bluetooth, WebSocket, Remote)์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ๋™์‹œ ์—ฐ๊ฒฐ ์‹œ ๊ฒฝ์Ÿ ์กฐ๊ฑด ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด Mutex Lock์„ ์‚ฌ์šฉํ•ด ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

  3. IPC (Message Queue) ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ์œ„ํ•œ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ FIFO ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, Connection Handler์™€ Controller ๊ฐ„์˜ ์˜์‚ฌ์†Œํ†ต์„ ์ค‘์žฌํ•ฉ๋‹ˆ๋‹ค.

  4. Thread Pool Controller์™€ Connection Handler ๋ชจ๋‘์—์„œ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ๋ฆฌ์†Œ์Šค ์ตœ์ ํ™” ๋ฐ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๋„๋ชจํ•ฉ๋‹ˆ๋‹ค.

  5. ์™ธ๋ถ€ ์ œ์–ด ์†Œํ”„ํŠธ์›จ์–ด WebSocket API์™€ Bluetooth ๋ชจ๋“ˆ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ RC ์นด๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ› ๏ธ๋™์‹œ์„ฑ ์ œ์–ด ๊ด€๋ จ ์ œํ•œ์กฐ๊ฑด ๊ตฌํ˜„ ๋‚ด์šฉ

image

  1. IPC ๋ฉ”์‹œ์ง€ ํ

    ์—ญํ• : ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ (Handler โ†’ Controller).

    ํŠน์ง•: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์•ˆ์ •์  ํ”„๋กœ์„ธ์Šค ํ†ต์‹ 

// ๋ฉ”์‹œ์ง€ ํ ์†์„ฑ์˜ ์ดˆ๊ธฐํ™”
attr.mq_flags = 0;
attr.mq_maxmsg = 10;
attr.mq_msgsize = BUFSIZ;
attr.mq_curmsgs = 0;

// ๋ฉ”์‹œ์ง€ ํ ์˜คํ”ˆ
mq = mq_open(MESSAGE_QUEUE_NAME, O_CREAT | O_RDONLY, 0644, &attr);
if (mq == (mqd_t)-1) {
    perror("mq_open failed");
    return 1;
}

// ๋ฉ”์‹œ์ง€ ํ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Œ
n = mq_receive(mq, buf, sizeof(buf), NULL);
if (n == -1) {
    perror("mq_receive failed");
    continue;
}

// ๋ฉ”์‹œ์ง€ ํ๋กœ ์ „์†ก
if (mq_send(mq, buffer, strlen(buffer), 0) == -1) {
    perror("[Handler] Failed to send message");
}
  1. ์“ฐ๋ ˆ๋“œ ํ’€

    ๊ตฌ์„ฑ: Controller: Device Worker Thread Pool Handler: Connection Worker Thread Pool

    ์ด์œ : ์‹ค์‹œ๊ฐ„ ์ฒ˜๋ฆฌ ๊ฐ•ํ™” ๋ฆฌ์†Œ์Šค ํšจ์œจํ™” (์Šค๋ ˆ๋“œ ์žฌ์‚ฌ์šฉ) : Device ์ œ์–ด ์ด๋ฒคํŠธ ๋งˆ๋‹ค ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑ ๋ฐ ์ข…๋ฃŒํ•˜๋ฉด ๋ฆฌ์†Œ์Šค์™€ ์„ฑ๋Šฅ์— ๋ถ€๋‹ด์ด ์žˆ์–ด์„œ ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘์‹œ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•˜๊ฒŒ๋” ์„ค๊ณ„ ํ™•์žฅ์„ฑ ์œ ์ง€ : ๋””๋ฐ”์ด์Šค์™€ ์ œ์–ด ์žฅ์น˜๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด ํ•ด๋‹น ์“ฐ๋ ˆ๋“œ๋ฅผ ๋” ์ƒ์„ฑํ•˜๋ฉด ๋จ

// ๋ชจํ„ฐ ์ œ์–ด ์Šค๋ ˆ๋“œ๋ฅผ ์ดˆ๊ธฐํ™”
for (int i = 0; i < MAX_MOTOR_TYPES; i++) {
    motor_threads[i].motor_id = i;
    motor_threads[i].is_active = 0;
    pthread_mutex_init(&motor_threads[i].mutex, NULL);
    pthread_cond_init(&motor_threads[i].cond, NULL);
    pthread_create(&motor_threads[i].thread, NULL, motor_control_thread, &motor_threads[i]);
}
  1. ์ปค๋„ฅ์…˜ ๋™๊ธฐํ™”

    ๋ฌธ์ œ: ์ปค๋„ฅ์…˜ ๋‹ค์ค‘ ์ง€์› ์ƒํ™ฉ์—์„œ ์ œ์–ด ๋ช…๋ น์— ๋Œ€ํ•œ ๊ฒฝ์Ÿ ์กฐ๊ฑด์ด ๋ฐœ์ƒํ•จ, ์ œ์–ด ์†Œํ”„ํŠธ์›จ์–ด ๊ฐ„์— ๋™๊ธฐํ™” ํ•„์š”.

    ํ•ด๊ฒฐ: Mutex Lock ์‚ฌ์šฉ โ†’ ์—ฐ๊ฒฐ ๋‹จ์œ„ ๋™๊ธฐํ™” ๋ณด์žฅ

// ๋ชจํ„ฐ ์ œ์–ด ์Šค๋ ˆ๋“œ๋ฅผ ์ดˆ๊ธฐํ™”
for (int i = 0; i < MAX_MOTOR_TYPES; i++) {
    motor_threads[i].motor_id = i;
    motor_threads[i].is_active = 0;
    pthread_mutex_init(&motor_threads[i].mutex, NULL);
    pthread_cond_init(&motor_threads[i].cond, NULL);
    pthread_create(&motor_threads[i].thread, NULL, motor_control_thread, &motor_threads[i]);
}

โœจํ”„๋กœ์ ํŠธ ํŒŒ์ผ ๊ตฌ์„ฑ

1. main.c ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ์ž‘์ ์ด์ž root process

ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘๋˜๋ฉด child process ๋กœ
controller.c ์™€ handler.c๋ฅผ fork spawn์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

2. handler.c

RC์นด๋ฅผ ์ง์ ‘ ์ œ์–ดํ•˜๊ฑฐ๋‚˜ ์›น ํ†ต์‹  ๋ธ”๋ฃจํˆฌ์Šค ํ†ต์‹  ๋“ฑ๋“ฑ RC์นด ์ œ์–ด๋ฅผ ์œ„ํ•œ connection ์„ ํ•ธ๋“ค๋ง ํ•จ

connection์—์„œ ๋ณด๋‚ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ IPC๋กœ ๋ณด๋‚ด๋Š” ํŒŒ์ดํ”„๋ผ์ธ ์—ญํ• ์„ ํ•จ

3. controller.c

๋ฉ”์„ธ์ง€ ํ์˜ ๋ฐ์ดํ„ฐ๋ฅผ polling ํ•˜์—ฌ device ์žฅ์น˜๋ฅผ ์ œ์–ดํ•˜๋„๋ก ์‹คํ–‰ํ•จ

4. device_adaptor.c

connection์—์„œ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ๋ฅผ parsing ํ•˜์—ฌ ์ ํ•ฉํ•œ device worker thread ์— ๋™์ž‘ํ•˜๊ฒŒ ํ•œ๋‹ค. device_adaptor ์— ์ œ๊ณต๋œ ๊ทœ์•…์„ device ์‹คํ–‰ ๋ฉ”์„œ๋“œ์™€ ๊ตฌ์กฐ์ฒด , ๋ฌธ์ž์—ด ๊ตฌ์กฐ์ฒด ๋ณ€ํ™˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ปค์Šคํ…€ํ•˜๋ฉด ํ•ด๋‹น device๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ› ๊ฐœ๋ฐœ ์‹œ ๋ฌธ์ œ์ ๊ณผ ํ•ด๊ฒฐ (ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…)

1. ์œ ์—ฐํ•œ ํ™•์žฅ ๊ธฐ๋Šฅ ์ง€์›

  • ๋ฌธ์ œ: ์ •ํ˜•ํ™”๋œ ๋ฐ์ดํ„ฐ ํ˜•์‹ ํ•„์š”
  • ํ•ด๊ฒฐ ๋ฐฉ์•ˆ: JSON โ†” ๊ตฌ์กฐ์ฒด ๋ณ€ํ™˜์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํ‘œ์ค€ํ™” ๋ฐ ์œ ์—ฐ์„ฑ ํ™•๋ณด

2. DEVICE ์ œ์–ด ๋น„์šฉ ์ตœ์ ํ™”

  • ๋ฌธ์ œ: FORK ๋น„์šฉ ๋ฐ CONTEXT SWITCHING ๋ถ€๋‹ด
  • ํ•ด๊ฒฐ ๋ฐฉ์•ˆ: THREAD ๊ธฐ๋ฐ˜ ์ œ์–ด ์ฑ„ํƒ ๋ฐ THREAD POOL ํŒจํ„ด ์ ์šฉ์œผ๋กœ ์Šค๋ ˆ๋“œ ์ƒ์„ฑ/์ข…๋ฃŒ ๋น„์šฉ ์ตœ์†Œํ™”

3. ์ปค๋„ฅ์…˜ ๋™๊ธฐํ™”

  • ๋ฌธ์ œ: ์—ฌ๋Ÿฌ ์ปค๋„ฅ์…˜์ด ๋™์‹œ์— ์ ‘๊ทผ ์‹œ ๊ฒฝ์Ÿ ์กฐ๊ฑด ๋ฐœ์ƒ
  • ํ•ด๊ฒฐ ๋ฐฉ์•ˆ: MUTEX LOCK ์‚ฌ์šฉ, ์ปค๋„ฅ์…˜ ๋‹จ์œ„๋กœ ๋™๊ธฐํ™”ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๋ฐ ์—ฐ๊ฒฐ ์•ˆ์ •์„ฑ ๋ณด์žฅ

4. ์›น ๊ธฐ๋ฐ˜ ์‘๋‹ต๋ฅ  ์ตœ์ ํ™”

  • ๋ฌธ์ œ: HTTP ๋ฐฉ์‹์€ ์‹ ๋ขฐ์„ฑ๊ณผ ์•ˆ์ •์„ฑ์ด ๋†’์ง€๋งŒ, ๋ฉ”์‹œ์ง€ ๋‹จ์œ„๊ฐ€ ๋ฌด๊ฒ๊ณ  ๋А๋ฆฌ๋‹ค๋Š” ๋‹จ์  ์กด์žฌ
  • ํ•ด๊ฒฐ ๋ฐฉ์•ˆ: ์›น ์†Œ์ผ“ ํ”„๋กœํ† ์ฝœ ์ฑ„ํƒ์œผ๋กœ, ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” HTTP ์œ„์— ๋น ๋ฅด๊ณ  ์ž‘์€ ํ†ต์‹  ๊ฐ€๋Šฅ

๐Ÿ“์‹œ์Šคํ…œ ์ปค์Šคํ…€ ๊ฐ€์ด๋“œ

device ํ™•์žฅ ๊ฐ€์ด๋“œ


์ƒˆ๋กœ์šด ๋ชจํ„ฐ ํƒ€์ž… ์ถ”๊ฐ€ ๋ฐฉ๋ฒ•

์ƒˆ๋กœ์šด ๋ชจํ„ฐ ํƒ€์ž…์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  1. ๋ช…๋ น ๊ตฌ์กฐ์ฒด๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ตฌ์กฐ์ฒด์—๋Š” ๋ฐ˜๋“œ์‹œ id ํ•„๋“œ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • json ๋ฌธ์ž์—ด์„ ๊ตฌ์กฐ์ฒด๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ช…๋ น ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ชจํ„ฐ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

๋‹จ๊ณ„๋ณ„ ๊ฐ€์ด๋“œ

  • ํ™•์žฅํ•  device ๊ด€๋ จ ์ปค์Šคํ…€ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค (์ด๋ฒˆ ์˜ˆ์‹œ๋Š” survo.c ์„ ์ƒ์„ฑํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •)

1. ๋ช…๋ น ๊ตฌ์กฐ์ฒด ์ •์˜ํ•˜๊ธฐ

๋จผ์ €, survo.c ์— ์ƒˆ๋กœ์šด ๋ชจํ„ฐ ํƒ€์ž…์˜ ๋ช…๋ น ๊ตฌ์กฐ์ฒด๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
๊ตฌ์กฐ์ฒด์—๋Š” ๋ฐ˜๋“œ์‹œ id ํ•„๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ๋ชจํ„ฐ์˜ ๋™์ž‘์— ํ•„์š”ํ•œ ๋‹ค๋ฅธ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

typedef struct {
    int id;         // ๋ชจํ„ฐ ๊ณ ์œ  ID (ํ•„์ˆ˜ ํ•„๋“œ)
    int angle;      // ์„œ๋ณด ๋ชจํ„ฐ ํšŒ์ „ ๊ฐ๋„
    int duration;   // ๋™์ž‘ ์ง€์† ์‹œ๊ฐ„ (ms ๋‹จ์œ„)
} ServoMotorCommand;

json ๋ฌธ์ž์—ด์„ ๊ตฌ์กฐ์ฒด๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค

  • survo.c ์— ๋ฌธ์ž์—ด์„ ๊ตฌ์กฐ์ฒด๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค
  • dc_motor.c ํŒŒ์ผ์— ๊ตฌ์กฐ์ฒด ๋ณ€๊ฒฝ ํ•จ์ˆ˜ ์˜ˆ์‹œ๊ฐ€ ์ž‘์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค!
void* parse_servo_motor_message(const char* json_str) {
}

2. ๋ช…๋ น ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

  • ์•„๋ž˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.
  • survo.c ์— ๋ช…๋ น ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค
void handle_servo_motor_command(void* command) {
    ServoMotorCommand* servo_command = (ServoMotorCommand*)command;
    printf("์„œ๋ณด ๋ชจํ„ฐ ์ œ์–ด - ID: %d, ๊ฐ๋„: %d, ์ง€์† ์‹œ๊ฐ„: %dms\n", 
           servo_command->id, 
           servo_command->angle, 
           servo_command->duration);
}

3. ๋ชจํ„ฐ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

  • device_adaptor.c ํŒŒ์ผ์— ํ•ด๋‹น ํ•จ์ˆ˜์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค
#include "survo.c" // device_adaptor.c ํŒŒ์ผ์— ์ถ”๊ฐ€ 

void register_custom_device_handler() { // ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ํ•จ์ˆ˜์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€
    MotorHandler servo_motor_handler = {
        .handle_command = handle_servo_motor_command,
        .parse_message = parse_servo_motor_message,
    };
    register_motor_handler(1, servo_motor_handler); // ๋ชจํ„ฐ ID 1์— ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก
}

์ปดํŒŒ์ผ

 gcc -o controller controller.c -lpthread -lwiringPi -ljansson

์‹คํ–‰

gcc -o controller controller.c -lpthread -lwiringPi -ljansson
gcc -o handler handler.c -lpthread -lwiringPi -ljansson -lwebsockets
sudo ./main

๐Ÿ‘ฌํŒ€์› ์†Œ๊ฐœ ๋ฐ ์—ญํ• 

Profile Role

๊ฐ•๋ฏผ๊ธฐ
์ „์ฒด์ ์ธ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ ์„ค๊ณ„, ์ œ์–ด ์†Œํ”„ํŠธ์›จ์–ด์™€ ๋ชจํ„ฐ ์‚ฌ์ด์˜ ํŒŒ์ดํ”„๋ผ์ธ ๊ฐœ๋ฐœ, ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ ๊ตฌํ˜„

ํ™ฉ์šฉ์ง„
์›น๊ณผ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด ๊ฐ„ ์›น์†Œ์ผ“ ํ†ต์‹ ์„ ์œ„ํ•œ ์›น ํ”Œ๋žซํผ ๊ฐœ๋ฐœ, RC์นด dc๋ชจํ„ฐ ์กฐ๋ฆฝ, RC์นด์™€ ํ•ธ๋“ค๋Ÿฌ๊ฐ„ ๋ฐ์ดํ„ฐ ํ†ต์‹  ํ…Œ์ŠคํŠธ ์ง„ํ–‰

๊ฐ•์ธ์„
๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด5์™€ ์Šค๋งˆํŠธํฐ ๊ฐ„ ๋ธ”๋ฃจํˆฌ์Šค ํ†ต์‹ ์„ ์œ„ํ•œ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ, ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ ํ™•์žฅ

์ •๋ณด๊ฒฝ
RC์นด ์ „์ฒด ์กฐ๋ฆฝ ๋ฐ device ๋‹จ์˜ ์กฐ์ž‘ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ, ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ ํ™•์žฅ, RC์นด์™€ ํ•ธ๋“ค๋Ÿฌ๊ฐ„ ๋ฐ์ดํ„ฐ ํ†ต์‹  ํ…Œ์ŠคํŠธ ์ง„ํ–‰