~ | Final version

This commit is contained in:
ft-NotArt 2025-03-07 13:04:45 +01:00
parent ccd8993bf5
commit d2b79fcbb1
2 changed files with 47 additions and 24 deletions

View File

@ -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:

View File

@ -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"))