Comunicación PYTHON – ARDUINO con Pyserial | Mediapipe – OpenCV

Por Administrador

Bienvenidos a un nuevo tutorial. En comentarios de anteriores videos y posts, me habían pedido un tutorial para poder integrar Arduino con Python y realizar una pequeña aplicación con visión artificial, así que el día de hoy lo haremos. 

Vamos a utilizar un Arduino para encender dos leds, luego adaptaremos el código para poder usar el puerto serial, luego accederemos a este por medio de Python y finalmente usaremos el código del video de: Detecta si una persona lleva mascarilla 😷 | OpenCV con Python, para encender un led azul cuando si la lleve y un led rojo cuando no. 

CONTENIDO

  • Introducción a Arduino
  • Circuito
  • Encender y apagar dos leds con Arduino dependiendo si una persona lleva o no mascarilla realizando comunicación serial con Python
    • Programa que se cargará a Arduino
    • Programa en Python para comunicarse con Arduino mediante el puerto serial
    • Resultados

Introducción a Arduino

Figura 1: Página oficial de Arduino.

Antes de empezar, hablemos brevemente de Arduino. Según su web oficial: “Arduino es una plataforma electrónica de código abierto basada en hardware y software fáciles de usar”. Para poder hacer uso de esta necesitamos principalmente dos componentes: 

  • Por un lado tenemos una Placa de Circuito Impreso, esta posee un microcontrolador el cual podremos programar. Esta placa además cuenta con pines a los cuales podremos conectar periféricos de entrada y salida para darle la funcionalidad que deseemos. Como por ejemplo, el día de hoy vamos a configurar dos pines como salidas para encender dos leds, pero podríamos conectar sensores, motores, entre otros. En el mercado existen varios modelos de placas Arduino para distintos propósitos que puedes comprar, todas ellas las podrás programar usando… 
  • El Arduino IDE, este es un entorno de desarrollo que nos permitirá realizar programas y cargarlos a la placa Arduino que vayamos a usar. Te dejo a continuación el link de descarga de este IDE: https://www.arduino.cc/en/software 

Para este tutorial voy a asumir que ya contamos por un lado con una placa Arduino y que tenemos instalado el IDE.  

Circuito

Figura 2: Materiales que utilizaremos para la implementación del circuito.

Como les decía, vamos a construir un pequeño circuito con la placa Arduino. Para ello además de la placa necesitaremos dos resistencias de 220 ohmios, un led rojo y uno azul, algunos cables y una protoboard.

Figura 3: Pines digitales del Arduino Uno y Mega.

Procedemos a identificar los pines digitales y de ellos escogemos dos, en este caso podrían ser los pines 12 y 13 por ejemplo, en el Arduino UNO. Pero si tuvieses otro modelo de placa tendrías que ubicar sus pines digitales. Por ejemplo, para la implementación real en vez de emplear un Arduino UNO, voy a usar un Arduino Mega, ya que ese es el que tengo a la mano. Por lo tanto, en el Arduino Mega tendré que identificar los pines digitales y escoger dos de ellos, en mi caso, he escogido los pines 50 y 51. 

Una vez que hemos elegido los dos pines que usaremos en Arduino, tendremos que conectar a cada uno de ellos una resistencia, un led y la conexión a tierra. Entonces voy a implementar mi circuito.

Figura 4: Simulación e implementación del circuito.

Una vez terminado el circuito vamos a conectar el Arduino a la computadora para poder subir el programa que vamos a crear a continuación… 

Encender y apagar dos leds con Arduino dependiendo si una persona lleva o no mascarilla realizando comunicación serial con Python

Ahora necesitaremos construir dos programas para efectuar nuestro proyecto. Por un lado un programa que se cargará en Arduino y otro en Python para enviar los datos a Arduino y allí encender los leds.

Programa que se cargará en Arduino

Para una explicación más detallada del programa que veremos a continuación, por favor dirígete al videotutorial de mi canal.

int led1 = 50;
int led2 = 51;
int option;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial.available() > 0){
    option = Serial.read();
    Serial.println(option);
    if(option == 'P'){
      digitalWrite(led1, HIGH);
      digitalWrite(led2, LOW);
    }
    if(option == 'N'){
      digitalWrite(led1, LOW);
      digitalWrite(led2, HIGH);
    }
  }
}

Programa en Python para comunicarse con Arduino mediante el puerto serial

Antes de pasar con el programa, debemos instalar el package pyserial que es el que nos permitirá establecer la comunicación. Para instalarlo deberemos usar: pip install pyserial

Vamos a usar el modelo entrenado y el programa realizado en el tutorial: Detecta si una persona lleva mascarilla 😷 | OpenCV con Python. E insertaremos las líneas necesarias para establecer la comunicación serial. Recuerda que para una explicación más extendida sobre el programa, te recomiendo ver el videotutorial de mi canal.

import cv2
import os
import mediapipe as mp
import serial
import time

ser = serial.Serial('COM4', 9600, timeout=1)
time.sleep(2)

mp_face_detection = mp.solutions.face_detection

LABELS = ["Con_mascarilla", "Sin_mascarilla"]

# Leer el modelo
face_mask = cv2.face.LBPHFaceRecognizer_create()
face_mask.read("face_mask_model.xml")

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

with mp_face_detection.FaceDetection(
     min_detection_confidence=0.5) as face_detection:

     while True:
          ret, frame = cap.read()
          if ret == False: break
          frame = cv2.flip(frame, 1)

          height, width, _ = frame.shape
          frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
          results = face_detection.process(frame_rgb)

          if results.detections is not None:
               for detection in results.detections:
                    xmin = int(detection.location_data.relative_bounding_box.xmin * width)
                    ymin = int(detection.location_data.relative_bounding_box.ymin * height)
                    w = int(detection.location_data.relative_bounding_box.width * width)
                    h = int(detection.location_data.relative_bounding_box.height * height)
                    if xmin < 0 and ymin < 0:
                         continue
                    #cv2.rectangle(frame, (xmin, ymin), (xmin + w, ymin + h), (0, 255, 0), 5)

                    face_image = frame[ymin : ymin + h, xmin : xmin + w]
                    face_image = cv2.cvtColor(face_image, cv2.COLOR_BGR2GRAY)
                    face_image = cv2.resize(face_image, (72, 72), interpolation=cv2.INTER_CUBIC)
                    
                    result = face_mask.predict(face_image)
                    #cv2.putText(frame, "{}".format(result), (xmin, ymin - 5), 1, 1.3, (210, 124, 176), 1, cv2.LINE_AA)

                    if result[1] < 150:
                         color = (0, 255, 0) if LABELS[result[0]] == "Con_mascarilla" else (0, 0, 255)
                         if LABELS[result[0]] == "Con_mascarilla":
                              ser.write(b'P')
                         else:
                              ser.write(b'N')
                         cv2.putText(frame, "{}".format(LABELS[result[0]]), (xmin, ymin - 15), 2, 1, color, 1, cv2.LINE_AA)
                         cv2.rectangle(frame, (xmin, ymin), (xmin + w, ymin + h), color, 2)

          cv2.imshow("Frame", frame)
          k = cv2.waitKey(1)
          if k == 27:
               break

cap.release()
cv2.destroyAllWindows()
ser.close()

Podremos notar que hemos importado serial (package recientemente instalado) y time. Además, que hemos añadido las líneas 7 y 8. Mientras que para enviar los datos las líneas 51 a 54.

Resultados

Una vez que hemos cargado el programa en Arduino y ejecutado el programa en Python, podremos probar nuestro proyecto. Veamos que pasa si se detecta que una persona lleva mascarilla:

Figura 5: Si se detecta que la persona lleva mascarilla, entonces se encenderá el led azul.

Por otro lado, observemos que pasa si la persona no lleva mascarilla:

Figura 6: Si no se detecta que la persona lleva mascarilla, entonces se encenderá el led rojo.

LINKS:

Página oficial Arduino: 🔗 https://www.arduino.cc/
Arduino IDE: 🔗 https://www.arduino.cc/en/software
Instalación Python: 🔗 https://youtu.be/6R_VU958jPY
Documentación pyserial: 🔗 https://pythonhosted.org/pyserial/
Videotutorial Detecta si una persona lleva mascarilla 😷 | OpenCV con Python: 🔗 https://youtu.be/_SCD62HmJwA
Tutorial escrito más programación: 🔗 https://omes-va.com/deteccion-mascarilla-opencv-python/

Referencias

🔗 https://pythonforundergradengineers.com/python-arduino-LED.html
🔗 https://hetpro-store.com/TUTORIALES/arduino-serial/
🔗 https://www.luisllamas.es/arduino-puerto-serie/
🔗 http://dfists.ua.es/~jpomares/arduino/page_11.htm
🔗 https://www.bejob.com/que-es-la-programacion-con-arduino-y-para-que-sirve/
🔗 https://arduino.cl/que-es-arduino/
🔗 https://controlautomaticoeducacion.com/arduino/comunicacion-serial-con-arduino/