3) Control de Led’s con Visión Artificial y Arduino – MediaPipe, Detección de Manos

Soluciones y Servicios de Robótica, Domótica e IoT

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()

Requieres de una Asesoría?

Contactanos

Innova Domotics

Todos los Cursos

Ardiuno e IoT
Ardiuno y Andriod
Ardiuno y Firebase
Visión Artificial y Raspberry
y mucho más ....

Tanto en Telegram como en WhatsApp doy a conocer el nuevo contenido que publico en las cuentas de TikTok y YouTube, todos altamente útiles y relacionados con Robótica, Domótica e IoT. Únete al canal de tu preferencia para mantenerte actualizado.