3) Control de Led’s con Visión Artificial y Arduino – MediaPipe, Detección de Manos
Acerca del Tutorial
Este vídeo te voy a explicar conceptos relacionados con la comunicación serial desde Anaconda Python y es necesario que entiendas el concepto más no que tengas el conversor de USB a Serial que indico al inicio .
Enlaces:
Codigo Python – 06_SerialCOM
import serial
import time
# conda install pyserial
# Crear conexión serial
ser = serial.Serial('COM7', 9600, timeout=1)
time.sleep(2) # Tiempo para establecer la conexión serial
while 1:
MyValor = 45
print(f"Enviando MyValor: {MyValor}")
ser.write(serial.to_bytes([MyValor]))
time.sleep(0.5)
MyValor = 90
print(f"Enviando MyValor: {MyValor}")
ser.write(serial.to_bytes([MyValor]))
time.sleep(0.5)
MyValor = 135
print(f"Enviando MyValor: {MyValor}")
ser.write(serial.to_bytes([MyValor]))
time.sleep(0.5)
MyValor = 180
print(f"Enviando MyValor: {MyValor}")
ser.write(serial.to_bytes([MyValor]))
time.sleep(0.5)
MyValor = 225
print(f"Enviando MyValor: {MyValor}")
ser.write(serial.to_bytes([MyValor]))
time.sleep(0.5)
ser.close()
Codigo Arduino – ArdChar_01
#include < SoftwareSerial.h >
SoftwareSerial CondaSer(10,11); // 10 RX, 11 TX.
int MyCharIN;
void setup()
{
Serial.begin(115200);
CondaSer.begin(9600);
Serial.println("Iniciando....");
}
void loop()
{
if(CondaSer.available())
{
MyCharIN = CondaSer.read();
Serial.println(MyCharIN);
}
}
Codigo Arduino – ArdChar_02
// Declaración de los pines de los LEDs
byte led_1 = 3;
byte led_2 = 4;
byte led_3 = 5;
byte led_4 = 6;
byte led_5 = 7;
byte ByteIn;
void setup()
{
Serial.begin(9600);
// Configura los pines como salidas
pinMode(led_1, OUTPUT);
pinMode(led_2, OUTPUT);
pinMode(led_3, OUTPUT);
pinMode(led_4, OUTPUT);
pinMode(led_5, OUTPUT);
digitalWrite(led_1, LOW);
digitalWrite(led_2, LOW);
digitalWrite(led_3, LOW);
digitalWrite(led_4, LOW);
digitalWrite(led_5, LOW);
}
void loop()
{
if (Serial.available())
{
ByteIn = Serial.read();
if((ByteIn > 0)&&(ByteIn <= 50))
{
digitalWrite(led_1, 1); digitalWrite(led_2, 0); digitalWrite(led_3, 0); digitalWrite(led_4, 0); digitalWrite(led_5, 0);
}
if((ByteIn > 50)&&(ByteIn <= 100))
{
digitalWrite(led_1, 1); digitalWrite(led_2, 1); digitalWrite(led_3, 0); digitalWrite(led_4, 0); digitalWrite(led_5, 0);
}
if((ByteIn >100)&&(ByteIn <= 150))
{
digitalWrite(led_1, 1); digitalWrite(led_2, 1); digitalWrite(led_3, 1); digitalWrite(led_4, 0); digitalWrite(led_5, 0);
}
if((ByteIn >150)&&(ByteIn <= 200))
{
digitalWrite(led_1, 1); digitalWrite(led_2, 1); digitalWrite(led_3, 1); digitalWrite(led_4, 1); digitalWrite(led_5, 0);
}
if(ByteIn >200)
{
digitalWrite(led_1, 1); digitalWrite(led_2, 1); digitalWrite(led_3, 1); digitalWrite(led_4, 1); digitalWrite(led_5, 1);
}
}
}
Codigo Python – 01_4_Detección
import cv2
import mediapipe as mp
import serial
import time
ser = serial.Serial('COM5', 9600, timeout=1)
# Inicializa MediaPipe Drawing Utilities para dibujar las manos
mp_drawing = mp.solutions.drawing_utils
# Inicializa MediaPipe Hands
mp_hands = mp.solutions.hands
# Configura los parámetros de detección de manos
hands = mp_hands.Hands(
static_image_mode=False, # Modo de video en tiempo real
max_num_hands=1, # Detectar hasta 2 manos
min_detection_confidence=0.5, # Umbral de confianza de detección
)
# Iniciar captura de video
cap = cv2.VideoCapture(0)
while cap.isOpened():
success, image = cap.read()
if not success:
print("Ignorando frame vacío.")
break
# voltea la imagen horizontalmente - Flip
# realiza la conversion BGR a RGB
image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
# Procesa la imagen y detecta las manos
results = hands.process(image)
# print("multi_handedness",results.multi_handedness)
# print("multi_hand_landmarks",results.multi_hand_landmarks)
# Convierte la imagen a BGR para OpenCV
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
# Dibuja las manos detectadas
height, width, _ = image.shape
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
thumb_tip_landmark = hand_landmarks.landmark[mp_hands.HandLandmark.THUMB_TIP]
idx_fin_tip_landmark = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP]
thumb_tip_x = thumb_tip_landmark.x
thumb_tip_y = thumb_tip_landmark.y
idx_fin_tip_x = idx_fin_tip_landmark.x
idx_fin_tip_y = idx_fin_tip_landmark.y
thumb_tip_x_int = int(thumb_tip_x*width)
thumb_tip_y_int = int(thumb_tip_y*height)
idx_fin_tip_x_int = int(idx_fin_tip_x*width)
idx_fin_tip_y_int = int(idx_fin_tip_y*height)
cv2.circle(image, (thumb_tip_x_int,thumb_tip_y_int), 15, (255,0,0),5)
cv2.circle(image, (idx_fin_tip_x_int,idx_fin_tip_y_int), 15, (0,255,0),5)
resta_coordenadas = abs(idx_fin_tip_y_int - thumb_tip_y_int)
print(f"resta_coordenadas: {resta_coordenadas}")
if resta_coordenadas > 255:
resta_coordenadas = 255
ser.write(serial.to_bytes([resta_coordenadas]))
# Mostrar la imagen
cv2.imshow('Detector de Manos', image)
if cv2.waitKey(5) & 0xFF == 27:
break
ser.close()
cap.release()
cv2.destroyAllWindows()