Fiz uma mão de Lego que replica movimentos da sua na vida real!
- Eduardo Brennand Paranhos
- 6 de jan.
- 3 min de leitura
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.

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!



Muito Massa, Arduino!!👏