mirror of
https://github.com/ft-NotArt/ShyEye.git
synced 2025-10-29 20:35:59 +00:00
~ | Final version
This commit is contained in:
parent
ccd8993bf5
commit
d2b79fcbb1
@ -19,12 +19,13 @@
|
|||||||
#define SERVO_UMOV 7
|
#define SERVO_UMOV 7
|
||||||
#define SERVO_DMOV 8
|
#define SERVO_DMOV 8
|
||||||
|
|
||||||
#define LOOK_LEFT -45
|
#define LOOK_LEFT 30
|
||||||
#define LOOK_RIGHT 45
|
#define LOOK_RIGHT -30
|
||||||
#define LOOK_UP 45
|
#define LOOK_UP 30
|
||||||
#define LOOK_DOWN -45
|
#define LOOK_DOWN -30
|
||||||
|
|
||||||
#define START_POS 90
|
#define START_POS_X 90
|
||||||
|
#define START_POS_Y 115
|
||||||
|
|
||||||
Servo servoX;
|
Servo servoX;
|
||||||
Servo servoY;
|
Servo servoY;
|
||||||
@ -36,8 +37,8 @@ void setup() {
|
|||||||
servoX.attach(9); // Attach servoX to pin 9
|
servoX.attach(9); // Attach servoX to pin 9
|
||||||
servoY.attach(10); // Attach servoY to pin 10
|
servoY.attach(10); // Attach servoY to pin 10
|
||||||
|
|
||||||
servoX.write(START_POS);
|
servoX.write(START_POS_X);
|
||||||
servoY.write(START_POS);
|
servoY.write(START_POS_Y);
|
||||||
delay(1000);
|
delay(1000);
|
||||||
|
|
||||||
Serial.begin(9600);
|
Serial.begin(9600);
|
||||||
@ -68,43 +69,43 @@ void loop() {
|
|||||||
|
|
||||||
switch (eyeDir) {
|
switch (eyeDir) {
|
||||||
case SERVO_LMOV:
|
case SERVO_LMOV:
|
||||||
moveServo(servoX, START_POS + LOOK_LEFT, isServoXAttached, 9);
|
moveServo(servoX, START_POS_X + LOOK_LEFT, isServoXAttached, 9);
|
||||||
stopServo(servoY, isServoYAttached);
|
stopServo(servoY, isServoYAttached);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SERVO_LUMOV:
|
case SERVO_LUMOV:
|
||||||
moveServo(servoX, START_POS + LOOK_LEFT, isServoXAttached, 9);
|
moveServo(servoX, START_POS_X + LOOK_LEFT, isServoXAttached, 9);
|
||||||
moveServo(servoY, START_POS + LOOK_UP, isServoYAttached, 10);
|
moveServo(servoY, START_POS_Y + LOOK_UP, isServoYAttached, 10);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SERVO_LDMOV:
|
case SERVO_LDMOV:
|
||||||
moveServo(servoX, START_POS + LOOK_LEFT, isServoXAttached, 9);
|
moveServo(servoX, START_POS_X + LOOK_LEFT, isServoXAttached, 9);
|
||||||
moveServo(servoY, START_POS + LOOK_DOWN, isServoYAttached, 10);
|
moveServo(servoY, START_POS_Y + LOOK_DOWN, isServoYAttached, 10);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SERVO_RMOV:
|
case SERVO_RMOV:
|
||||||
moveServo(servoX, START_POS + LOOK_RIGHT, isServoXAttached, 9);
|
moveServo(servoX, START_POS_X + LOOK_RIGHT, isServoXAttached, 9);
|
||||||
stopServo(servoY, isServoYAttached);
|
stopServo(servoY, isServoYAttached);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SERVO_RUMOV:
|
case SERVO_RUMOV:
|
||||||
moveServo(servoX, START_POS + LOOK_RIGHT, isServoXAttached, 9);
|
moveServo(servoX, START_POS_X + LOOK_RIGHT, isServoXAttached, 9);
|
||||||
moveServo(servoY, START_POS + LOOK_UP, isServoYAttached, 10);
|
moveServo(servoY, START_POS_Y + LOOK_UP, isServoYAttached, 10);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SERVO_RDMOV:
|
case SERVO_RDMOV:
|
||||||
moveServo(servoX, START_POS + LOOK_RIGHT, isServoXAttached, 9);
|
moveServo(servoX, START_POS_X + LOOK_RIGHT, isServoXAttached, 9);
|
||||||
moveServo(servoY, START_POS + LOOK_DOWN, isServoYAttached, 10);
|
moveServo(servoY, START_POS_Y + LOOK_DOWN, isServoYAttached, 10);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SERVO_UMOV:
|
case SERVO_UMOV:
|
||||||
stopServo(servoX, isServoXAttached);
|
stopServo(servoX, isServoXAttached);
|
||||||
moveServo(servoY, START_POS + LOOK_UP, isServoYAttached, 10);
|
moveServo(servoY, START_POS_Y + LOOK_UP, isServoYAttached, 10);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SERVO_DMOV:
|
case SERVO_DMOV:
|
||||||
stopServo(servoX, isServoXAttached);
|
stopServo(servoX, isServoXAttached);
|
||||||
moveServo(servoY, START_POS + LOOK_DOWN, isServoYAttached, 10);
|
moveServo(servoY, START_POS_Y + LOOK_DOWN, isServoYAttached, 10);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import cv2
|
import cv2
|
||||||
import serial
|
import serial
|
||||||
import time
|
import time
|
||||||
|
import random
|
||||||
|
|
||||||
# Used for debug mainly, set to True to see what the camera is recording
|
# Used for debug mainly, set to True to see what the camera is recording
|
||||||
DRAW_CAMERA = True
|
DRAW_CAMERA = True
|
||||||
@ -28,7 +29,7 @@ SERVO_UMOV = 7
|
|||||||
SERVO_DMOV = 8
|
SERVO_DMOV = 8
|
||||||
|
|
||||||
|
|
||||||
SERVO_SPD = 2
|
SERVO_SPD = 10
|
||||||
|
|
||||||
def draw_square(frame, faces, color):
|
def draw_square(frame, faces, color):
|
||||||
for (x, y, w, h) in faces:
|
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)
|
cv2.rectangle(frame, (x, y), (x + w, y + h), color, 1)
|
||||||
return frame
|
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)
|
arduino = serial.Serial(port='/dev/ttyACM0', baudrate=9600, timeout=.1)
|
||||||
|
|
||||||
@ -52,6 +68,7 @@ if ret:
|
|||||||
eyeX = int (frameW / 2)
|
eyeX = int (frameW / 2)
|
||||||
eyeY = int (frameH / 2)
|
eyeY = int (frameH / 2)
|
||||||
|
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
ret, frame = video_capture.read()
|
ret, frame = video_capture.read()
|
||||||
if not ret:
|
if not ret:
|
||||||
@ -66,8 +83,13 @@ while True:
|
|||||||
target = [int ((frameW / 2) - 10), int ((frameH / 2) - 10), 20, 20]
|
target = [int ((frameW / 2) - 10), int ((frameH / 2) - 10), 20, 20]
|
||||||
eyeDir = SERVO_NOMOV
|
eyeDir = SERVO_NOMOV
|
||||||
if len(detected_faces) >= 3 :
|
if len(detected_faces) >= 3 :
|
||||||
# anxiety code
|
print("anxieux")
|
||||||
feur = 3
|
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 :
|
elif len(detected_profiles) != 0 and len(detected_faces) != 0 :
|
||||||
arduino.write(bytes(f"{SERVO_NOMOV}", "utf-8"))
|
arduino.write(bytes(f"{SERVO_NOMOV}", "utf-8"))
|
||||||
else :
|
else :
|
||||||
@ -99,10 +121,10 @@ while True:
|
|||||||
if eyeY < target[1] or eyeY > (target[1] + target[3]) :
|
if eyeY < target[1] or eyeY > (target[1] + target[3]) :
|
||||||
if eyeY < target[1] :
|
if eyeY < target[1] :
|
||||||
eyeY += SERVO_SPD
|
eyeY += SERVO_SPD
|
||||||
eyeDir += 2
|
eyeDir += 2 # As moving down values had been set up to horizontal move + 2
|
||||||
else :
|
else :
|
||||||
eyeY -= SERVO_SPD
|
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"))
|
arduino.write(bytes(f"{eyeDir}", "utf-8"))
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user