소개
안녕하세요! 오늘은 Python과 Media Pipe 라이브러리를 사용하여 핸드 트래킹을 통해 RGB LED의 색상을 제어하는 재미있는 프로젝트를 소개해 드리겠습니다. 이 프로젝트는 손의 위치를 추적하고, Arduino와 직렬 통신을 통해 데이터를 전송하여 LED의 색상을 변경하는 방법을 탐구합니다.
준비물
- Python 설치된 컴퓨터
- Media Pipe 라이브러리
- Arduino 보드 (예: Arduino Uno)
- RGB LED
- 저항기
- 브레드보드 및 점퍼 와이어
1. Media Pipe 설정
먼저, Python 환경에서 Media Pipe 라이브러리를 설치하고 설정합니다. Media Pipe는 손의 위치와 자세를 추적하는 데 매우 유용합니다.
pip install mediapipe
pip install opencv-python
2. 핸드 트래킹 코드 작성
Media Pipe와 OpenCV를 사용하여 손의 위치를 추적하는 코드를 작성합니다. 이 코드는 손가락의 좌표를 얻어낼 수 있습니다.
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의 색상을 변경할 수 있습니다.
#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로 전송합니다.
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)
공급
- 직렬 케이블을 사용하여 Arduino에 연결할 수 있는 노트북
- 모든 유형의 Arduino, 이 경우 Arduino Nano를 사용하고 있습니다.
- 직렬 케이블, 4개는 LED에 전원을 공급하기 위해 1개가 필요하고 3개는 색상 통신에 필요합니다.
- RGB 4핀 LED
- 브레드보드
- 직렬 케이블(케이블은 데이터를 전송할 수 있어야 함)
1 단계 : 작동 원리
코드 및 추가 파일 세부 정보
2단계: Arduino Circut 조립
다이어그램에 따라 RGB LED를 연결합니다. 이러한 핀은 Arduino 코드에서 핀을 업데이트하는 한 변경할 수 있습니다.
3단계: 아두이노 코드 업로드
Arduino의 케이블을 컴퓨터에 연결하고 올바른 포트를 선택했는지 확인하십시오. 나중에 Python 코드를 수정할 때 사용할 수 있도록 이 포트의 이름을 기록해 두십시오. Arduino IDE를 사용하여 업로드 버튼을 사용하여 다음 코드를 Arduino에 업로드 할 수 있습니다. Arduino 파일은 아래에 첨부되어 있습니다
4단계: Python 코드
이제 Python 코드를 설정합니다. 이렇게 하려면 첨부된 Python 파일을 다운로드한 다음 라이브러리가 설치되어 있는지 확인합니다. 명령으로 이 작업을 수행할 수 있습니다.
이제 Arduino IDE에서 얻은 직렬 포트가 이제 사용됩니다. Python 프로그램이 Arduino와 성공적으로 통신하려면 올바른 포트를 선택해야 합니다. Arduino IDE에서 가져온 직렬 포트와 일치하도록 코드에서 이 줄을 변경합니다. ' ' 안의 텍스트만 변경합니다.
또한! 나는 웹캠이 내장 된 내 노트북을 사용하고 있으며 USB 웹캠을 사용하고 있다면 0을 1로 변경할 수 있습니다. (0은 노트북 카메라, 1은 외부 카메라)
5단계: 실행
- Arduino가 올바른 포트에 연결되어 있는지 확인하십시오.
- 아두이노 IDE에서 시리얼 모니터를 닫거나 아두이노 IDE 애플리케이션을 종료하십시오.
- Python 파일이 저장된 디렉토리로 이동한 다음 명령을 사용합니다.
- 그러면 손을 추적하고 LED를 제어하는 창이 나타납니다!
'아두이노' 카테고리의 다른 글
2단계 인증(2FA) 핸드폰 잠금: 도어락 보안 강화 (0) | 2025.02.03 |
---|---|
아두이노 7447 디스플레이 공통 양극 (0) | 2025.01.03 |
VR 몰입감 상승을 위한 혁신적인 핑거 링 V2 프로젝트 (3) | 2024.11.29 |
VR 몰입을 위한 혁신적인 HID 마우스 컨트롤러 DIY 프로젝트(손가락 마우스) (2) | 2024.11.29 |
아두이노 튜토리얼: 2채널 광커플러 릴레이 모듈 (0) | 2024.11.25 |