top of page
Buscar

Fiz uma mão de Lego que replica movimentos da sua na vida real!

Neste post, mostraremos o passo a passo de como foi feita uma mão construída inteiramente com lego mindstorms ev3! Ela foi feita com o auxílio das bibliotecas opencv e cvzone para o tratamento das imagens, assim como a ev3_dc, para a conexão com o lego mindstorms.


ree

Primeiro, temos que realizar as instalações necessárias para o funcionamento deste projeto. Para fazer isso, mande os seguintes comandos para o seu terminal no vscode(além disso, tenha certeza de ter configurado um ambiente virtual em seu terminal, por causa das recentes atualizações no python):


pip3 install ev3_dc

pip3 install opencv-python

pip3 install cvzone


Feito isso, basta rodar o programa a seguir, fazendo as alterações nas variáveis "host" no início do programa para o id do seus bricks ev3, além de seguir as conexões sugeridas no código:


import ev3_dc as ev3
import cv2
from cvzone.HandTrackingModule import HandDetector

cap = cv2.VideoCapture(1) #caso apareça um erro no programa, mude este valor para 0
detector = HandDetector(detectionCon=0.8, maxHands=2)

ant1 = 0
ant2 = 0
ant3 = 0
ant4 = 0
ant5 = 0
my_ev3 = ev3.EV3(protocol=ev3.USB, host='00:16:53:41:42:D1') #troque a variável host para o id do seu primeiro ev3
my_ev32 = ev3.EV3(protocol=ev3.USB, host='00:16:53:5E:E3:D3') #troque a variável host para o id do seu segundo ev3


while True:
    success, img = cap.read()
    hands, img = detector.findHands(img)  # With Draw
    # hands = detector.findHands(img, draw=False)  # No Draw

    if hands:
        # Hand 1
        hand1 = hands[0]
        lmList1 = hand1["lmList"]  # List of 21 Landmarks points
        bbox1 = hand1["bbox"]  # Bounding Box info x,y,w,h
        centerPoint1 = hand1["center"]  # center of the hand cx,cy
        handType1 = hand1["type"]  # Hand Type Left or Right

        # print(len(lmList1),lmList1)
        # print(bbox1)
        # print(centerPoint1)
        fingers1 = detector.fingersUp(hand1)
        dedo1 = fingers1[1]
        dedo2 = fingers1[2]
        dedo3 = fingers1[3]
        dedo4 = fingers1[4]
        dedo5 = fingers1[0]
        print(fingers1)

        if dedo1 == 1 and ant1 == 0:
            with ev3.Motor(ev3.PORT_D, ev3_obj=my_ev3) as md: #dedo indicador conectado a porta d do ev3 da direita
                md.position = 0
                movement1 = (md.move_to(-90, speed=20, ramp_up=90, ramp_down=90, brake=True) + md.stop_as_task(brake=False))
                movement1.start(thread=False)

        
            ant1 = dedo1

        if dedo1 == 0 and ant1 == 1:
            with ev3.Motor(ev3.PORT_D, ev3_obj=my_ev3) as md:
                md.position = 0
                movement1 = (md.move_to(90, speed=20, ramp_up=90, ramp_down=90, brake=True) + md.stop_as_task(brake=False))
                movement1.start(thread=False)

            ant1 = dedo1


        if dedo2 == 1 and ant2 == 0:
            with ev3.Motor(ev3.PORT_C, ev3_obj=my_ev3) as mc: #dedo do meio conectado a porta c do ev3 da direita
                mc.position = 0
                movement2 = (mc.move_to(-90, speed=20, ramp_up=90, ramp_down=90, brake=True) + mc.stop_as_task(brake=False))
                movement2.start(thread=False)

        
            ant2 = dedo2

        if dedo2 == 0 and ant2 == 1:
            with ev3.Motor(ev3.PORT_C, ev3_obj=my_ev3) as mc:
                mc.position = 0
                movement2 = (mc.move_to(90, speed=20, ramp_up=90, ramp_down=90, brake=True) + mc.stop_as_task(brake=False))
                movement2.start(thread=False)

            ant2 = dedo2


        if dedo3 == 1 and ant3 == 0:
            with ev3.Motor(ev3.PORT_B,  ev3_obj=my_ev3) as mb: #dedo anelar conectado a porta b do ev3 da direita
                mb.position = 0
                movement3 = (mb.move_to(-90, speed=20, ramp_up=90, ramp_down=90, brake=True) + mb.stop_as_task(brake=False))
                movement3.start(thread=False)

        
            ant3 = dedo3

        if dedo3 == 0 and ant3 == 1:
            with ev3.Motor(ev3.PORT_B, ev3_obj=my_ev3) as mb:
                mb.position = 0
                movement3 = (mb.move_to(90, speed=20, ramp_up=90, ramp_down=90, brake=True) + mb.stop_as_task(brake=False))
                movement3.start(thread=False)

            ant3 = dedo3


        if dedo4 == 1 and ant4 == 0:
            with ev3.Motor(ev3.PORT_A, ev3_obj=my_ev3) as ma: #dedo mindinho conectado a porta a do ev3 da direita
                ma.position = 0
                movement4 = (ma.move_to(-90, speed=20, ramp_up=90, ramp_down=90, brake=True) + ma.stop_as_task(brake=False))
                movement4.start(thread=False)

        
            ant4 = dedo4

        if dedo4 == 0 and ant4 == 1:
            with ev3.Motor(ev3.PORT_A, ev3_obj=my_ev3) as ma: 
                ma.position = 0
                movement4 = (ma.move_to(90, speed=20, ramp_up=90, ramp_down=90, brake=True) + ma.stop_as_task(brake=False))
                movement4.start(thread=False)

            ant4 = dedo4


        if dedo5 == 1 and ant5 == 0:
            with ev3.Motor(ev3.PORT_A, ev3_obj=my_ev32) as me: #dedão conectado a porta a do ev3 da esquerda
                me.position = 0
                movement5 = (me.move_to(90, speed=20, ramp_up=90, ramp_down=90, brake=True) + me.stop_as_task(brake=False))
                movement5.start(thread=False)

        
            ant5 = dedo5

        if dedo5 == 0 and ant5 == 1:
            with ev3.Motor(ev3.PORT_A, ev3_obj=my_ev32) as me:
                me.position = 0
                movement5 = (me.move_to(-90, speed=20, ramp_up=90, ramp_down=90, brake=True) + me.stop_as_task(brake=False))
                movement5.start(thread=False)

            ant5 = dedo5


        if len(hands) == 2:
            hand2 = hands[1]
            lmList2 = hand2["lmList"]  # List of 21 Landmarks points
            bbox2 = hand2["bbox"]  # Bounding Box info x,y,w,h
            centerPoint2 = hand2["center"]  # center of the hand cx,cy
            handType2 = hand2["type"]  # Hand Type Left or Right

            fingers2 = detector.fingersUp(hand2)
            
            length, info, img = detector.findDistance(centerPoint1, centerPoint2, img)  

    cv2.imshow("Image", img)
    cv2.waitKey(1)

Feito isso, sua mão de lego está pronta!




 
 
 

1 comentário


Edilson Lucas
Edilson Lucas
09 de jan.

Muito Massa, Arduino!!👏

Curtir
Seja o primeiro a saber das novidades

2024 Mundo do Arduino

bottom of page