From d2b79fcbb1aa748ae94b44ec2da1fcd1cbc5c920 Mon Sep 17 00:00:00 2001 From: ft-NotArt Date: Fri, 7 Mar 2025 13:04:45 +0100 Subject: [PATCH] ~ | Final version --- ShyEye/eyeMove/eyeMove.ino | 39 +++++++++++++++++++------------------- ShyEye/faceDetection.py | 32 ++++++++++++++++++++++++++----- 2 files changed, 47 insertions(+), 24 deletions(-) diff --git a/ShyEye/eyeMove/eyeMove.ino b/ShyEye/eyeMove/eyeMove.ino index fba8d67..00eda14 100644 --- a/ShyEye/eyeMove/eyeMove.ino +++ b/ShyEye/eyeMove/eyeMove.ino @@ -19,12 +19,13 @@ #define SERVO_UMOV 7 #define SERVO_DMOV 8 -#define LOOK_LEFT -45 -#define LOOK_RIGHT 45 -#define LOOK_UP 45 -#define LOOK_DOWN -45 +#define LOOK_LEFT 30 +#define LOOK_RIGHT -30 +#define LOOK_UP 30 +#define LOOK_DOWN -30 -#define START_POS 90 +#define START_POS_X 90 +#define START_POS_Y 115 Servo servoX; Servo servoY; @@ -36,8 +37,8 @@ void setup() { servoX.attach(9); // Attach servoX to pin 9 servoY.attach(10); // Attach servoY to pin 10 - servoX.write(START_POS); - servoY.write(START_POS); + servoX.write(START_POS_X); + servoY.write(START_POS_Y); delay(1000); Serial.begin(9600); @@ -68,43 +69,43 @@ void loop() { switch (eyeDir) { case SERVO_LMOV: - moveServo(servoX, START_POS + LOOK_LEFT, isServoXAttached, 9); + moveServo(servoX, START_POS_X + LOOK_LEFT, isServoXAttached, 9); stopServo(servoY, isServoYAttached); break; case SERVO_LUMOV: - moveServo(servoX, START_POS + LOOK_LEFT, isServoXAttached, 9); - moveServo(servoY, START_POS + LOOK_UP, isServoYAttached, 10); + moveServo(servoX, START_POS_X + LOOK_LEFT, isServoXAttached, 9); + moveServo(servoY, START_POS_Y + LOOK_UP, isServoYAttached, 10); break; case SERVO_LDMOV: - moveServo(servoX, START_POS + LOOK_LEFT, isServoXAttached, 9); - moveServo(servoY, START_POS + LOOK_DOWN, isServoYAttached, 10); + moveServo(servoX, START_POS_X + LOOK_LEFT, isServoXAttached, 9); + moveServo(servoY, START_POS_Y + LOOK_DOWN, isServoYAttached, 10); break; case SERVO_RMOV: - moveServo(servoX, START_POS + LOOK_RIGHT, isServoXAttached, 9); + moveServo(servoX, START_POS_X + LOOK_RIGHT, isServoXAttached, 9); stopServo(servoY, isServoYAttached); break; case SERVO_RUMOV: - moveServo(servoX, START_POS + LOOK_RIGHT, isServoXAttached, 9); - moveServo(servoY, START_POS + LOOK_UP, isServoYAttached, 10); + moveServo(servoX, START_POS_X + LOOK_RIGHT, isServoXAttached, 9); + moveServo(servoY, START_POS_Y + LOOK_UP, isServoYAttached, 10); break; case SERVO_RDMOV: - moveServo(servoX, START_POS + LOOK_RIGHT, isServoXAttached, 9); - moveServo(servoY, START_POS + LOOK_DOWN, isServoYAttached, 10); + moveServo(servoX, START_POS_X + LOOK_RIGHT, isServoXAttached, 9); + moveServo(servoY, START_POS_Y + LOOK_DOWN, isServoYAttached, 10); break; case SERVO_UMOV: stopServo(servoX, isServoXAttached); - moveServo(servoY, START_POS + LOOK_UP, isServoYAttached, 10); + moveServo(servoY, START_POS_Y + LOOK_UP, isServoYAttached, 10); break; case SERVO_DMOV: stopServo(servoX, isServoXAttached); - moveServo(servoY, START_POS + LOOK_DOWN, isServoYAttached, 10); + moveServo(servoY, START_POS_Y + LOOK_DOWN, isServoYAttached, 10); break; default: diff --git a/ShyEye/faceDetection.py b/ShyEye/faceDetection.py index e87cad0..9cc46a5 100644 --- a/ShyEye/faceDetection.py +++ b/ShyEye/faceDetection.py @@ -1,6 +1,7 @@ import cv2 import serial import time +import random # Used for debug mainly, set to True to see what the camera is recording DRAW_CAMERA = True @@ -28,7 +29,7 @@ SERVO_UMOV = 7 SERVO_DMOV = 8 -SERVO_SPD = 2 +SERVO_SPD = 10 def draw_square(frame, faces, color): for (x, y, w, h) in faces: @@ -36,6 +37,21 @@ def draw_square(frame, faces, color): cv2.rectangle(frame, (x, y), (x + w, y + h), color, 1) return frame +# Returns the opposite of a given move +# for example, the opposite of left move would be right move +def reverse_move(move) : + switch = { + SERVO_LMOV : SERVO_RMOV, + SERVO_LUMOV : SERVO_RDMOV, + SERVO_LDMOV : SERVO_RUMOV, + SERVO_RMOV : SERVO_LMOV, + SERVO_RDMOV : SERVO_LUMOV, + SERVO_RUMOV : SERVO_LDMOV, + SERVO_UMOV : SERVO_DMOV, + SERVO_DMOV : SERVO_UMOV, + } + return switch.get(move, SERVO_NOMOV) + arduino = serial.Serial(port='/dev/ttyACM0', baudrate=9600, timeout=.1) @@ -52,6 +68,7 @@ if ret: eyeX = int (frameW / 2) eyeY = int (frameH / 2) + while True: ret, frame = video_capture.read() if not ret: @@ -66,8 +83,13 @@ while True: target = [int ((frameW / 2) - 10), int ((frameH / 2) - 10), 20, 20] eyeDir = SERVO_NOMOV if len(detected_faces) >= 3 : - # anxiety code - feur = 3 + print("anxieux") + anxiety_queue = [] + for i in range(3) : + anxiety_queue.append(random.choice([SERVO_LMOV, SERVO_LUMOV, SERVO_LDMOV, SERVO_RMOV, SERVO_RUMOV, SERVO_RDMOV, SERVO_UMOV, SERVO_DMOV])) + arduino.write(bytes(f"{anxiety_queue[i]}", "utf-8")) + for i in range(3) : + arduino.write(bytes(f"{reverse_move(anxiety_queue[i])}", "utf-8")) elif len(detected_profiles) != 0 and len(detected_faces) != 0 : arduino.write(bytes(f"{SERVO_NOMOV}", "utf-8")) else : @@ -99,10 +121,10 @@ while True: if eyeY < target[1] or eyeY > (target[1] + target[3]) : if eyeY < target[1] : eyeY += SERVO_SPD - eyeDir += 2 + eyeDir += 2 # As moving down values had been set up to horizontal move + 2 else : eyeY -= SERVO_SPD - eyeDir += 1 + eyeDir += 1 # As moving up values had been set up to horizontal move + 1 arduino.write(bytes(f"{eyeDir}", "utf-8"))