본문 바로가기
아두이노

핸드 트래킹을 활용한 RGB LED 색상 제어 프로젝트

by 모빌리티키즈 2024. 12. 27.
728x90
반응형

소개

안녕하세요! 오늘은 Python과 Media Pipe 라이브러리를 사용하여 핸드 트래킹을 통해 RGB LED의 색상을 제어하는 재미있는 프로젝트를 소개해 드리겠습니다. 이 프로젝트는 손의 위치를 추적하고, Arduino와 직렬 통신을 통해 데이터를 전송하여 LED의 색상을 변경하는 방법을 탐구합니다.

준비물

  • Python 설치된 컴퓨터
  • Media Pipe 라이브러리
  • Arduino 보드 (예: Arduino Uno)
  • RGB LED
  • 저항기
  • 브레드보드 및 점퍼 와이어

1. Media Pipe 설정

먼저, Python 환경에서 Media Pipe 라이브러리를 설치하고 설정합니다. Media Pipe는 손의 위치와 자세를 추적하는 데 매우 유용합니다.

python
pip install mediapipe
pip install opencv-python

2. 핸드 트래킹 코드 작성

Media Pipe와 OpenCV를 사용하여 손의 위치를 추적하는 코드를 작성합니다. 이 코드는 손가락의 좌표를 얻어낼 수 있습니다.

python
import cv2
import mediapipe as mp

mp_hands = mp.solutions.hands
hands = mp_hands.Hands()
mp_draw = mp.solutions.drawing_utils

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    img_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    result = hands.process(img_rgb)
    
    if result.multi_hand_landmarks:
        for hand_lms in result.multi_hand_landmarks:
            mp_draw.draw_landmarks(frame, hand_lms, mp_hands.HAND_CONNECTIONS)
            
            for id, lm in enumerate(hand_lms.landmark):
                h, w, c = frame.shape
                cx, cy = int(lm.x * w), int(lm.y * h)
                print(id, cx, cy)
    
    cv2.imshow("Hand Tracking", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

3. Arduino와 직렬 통신 설정

이제 Arduino와 Python을 직렬 통신으로 연결합니다. Arduino는 핸드 트래킹 데이터를 받아 RGB LED의 색상을 변경할 수 있습니다.

cpp
#include <Arduino.h>

int redPin = 9;
int greenPin = 10;
int bluePin = 11;

void setup() {
  Serial.begin(9600);
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
}

void loop() {
  if (Serial.available() > 0) {
    int redValue = Serial.parseInt();
    int greenValue = Serial.parseInt();
    int blueValue = Serial.parseInt();
    
    analogWrite(redPin, redValue);
    analogWrite(greenPin, greenValue);
    analogWrite(bluePin, blueValue);
  }
}

4. Python에서 데이터 전송

Python 코드를 수정하여 손의 위치에 따라 RGB 값을 계산하고, 이를 Arduino로 전송합니다.

python
import serial

arduino = serial.Serial('COM3', 9600)

def send_rgb_to_arduino(r, g, b):
    arduino.write(f"{r} {g} {b}\n".encode())

# 핸드 트래킹 코드 안에 추가
    if result.multi_hand_landmarks:
        for hand_lms in result.multi_hand_landmarks:
            mp_draw.draw_landmarks(frame, hand_lms, mp_hands.HAND_CONNECTIONS)
            
            # 예시로 손목 좌표를 사용하여 RGB 값 결정
            wrist = hand_lms.landmark[0]
            r = int(wrist.x * 255)
            g = int(wrist.y * 255)
            b = int((wrist.z + 0.5) * 255)  # z 값은 -0.5 ~ 0.5 범위로 가정
            
            send_rgb_to_arduino(r, g, b)

공급

  1. 직렬 케이블을 사용하여 Arduino에 연결할 수 있는 노트북
  2. 모든 유형의 Arduino, 이 경우 Arduino Nano를 사용하고 있습니다.
  3. 직렬 케이블, 4개는 LED에 전원을 공급하기 위해 1개가 필요하고 3개는 색상 통신에 필요합니다.
  4. RGB 4핀 LED
  5. 브레드보드
  6. 직렬 케이블(케이블은 데이터를 전송할 수 있어야 함)

1 단계 : 작동 원리

 

코드 및 추가 파일 세부 정보

HandTrackingColor-main.zip
0.00MB

2단계: Arduino Circut 조립

다이어그램에 따라 RGB LED를 연결합니다. 이러한 핀은 Arduino 코드에서 핀을 업데이트하는 한 변경할 수 있습니다.

const int redPin = 9; // Connect to red pin of RGB LED
const int greenPin = 10; // Connect to green pin of RGB LED
const int bluePin = 11; // Connect to blue pin of RGB LED

3단계: 아두이노 코드 업로드

Arduino의 케이블을 컴퓨터에 연결하고 올바른 포트를 선택했는지 확인하십시오. 나중에 Python 코드를 수정할 때 사용할 수 있도록 이 포트의 이름을 기록해 두십시오. Arduino IDE를 사용하여 업로드 버튼을 사용하여 다음 코드를 Arduino에 업로드 할 수 있습니다. Arduino 파일은 아래에 첨부되어 있습니다

4단계: Python 코드

이제 Python 코드를 설정합니다. 이렇게 하려면 첨부된 Python 파일을 다운로드한 다음 라이브러리가 설치되어 있는지 확인합니다. 명령으로 이 작업을 수행할 수 있습니다.

pip install opencv-python
pip install mediapipe
pip install pyserial

이제 Arduino IDE에서 얻은 직렬 포트가 이제 사용됩니다. Python 프로그램이 Arduino와 성공적으로 통신하려면 올바른 포트를 선택해야 합니다. Arduino IDE에서 가져온 직렬 포트와 일치하도록 코드에서 이 줄을 변경합니다. ' ' 안의 텍스트만 변경합니다.

ser = serial.Serial('/dev/cu.usbserial-210', 9600)

또한! 나는 웹캠이 내장 된 내 노트북을 사용하고 있으며 USB 웹캠을 사용하고 있다면 0을 1로 변경할 수 있습니다. (0은 노트북 카메라, 1은 외부 카메라)

videoCap = cv2.VideoCapture(0)

첨부 파일

5단계: 실행

  1. Arduino가 올바른 포트에 연결되어 있는지 확인하십시오.
  2. 아두이노 IDE에서 시리얼 모니터를 닫거나 아두이노 IDE 애플리케이션을 종료하십시오.
  3. Python 파일이 저장된 디렉토리로 이동한 다음 명령을 사용합니다.
파이썬 main.py
  1. 그러면 손을 추적하고 LED를 제어하는 창이 나타납니다!

 

728x90
반응형