• Post category:Yeux animatroniques
  • Commentaires de la publication :0 commentaire
  • Dernière modification de la publication :mars 15, 2022
  • Temps de lecture :7 min de lecture

Œil animatronique (avec Pi caméra ) piloter par Arduino. Version oki et tester.

Description :

Fabrication œil animatronique à l’aide du microcontrôleur Arduino pour le pilotage des servos, avec intégration d’une PI caméra pour le suivi des objets par le futur.

La conception de l’œil avec la caméra embarquée a été faite de façon à ce que chaque assemblage dispose d’un écrou et d’une vis afin de rendre le montage fiable et fluide dans le temps.

Chaque piece a été faite pour qu’elle soit facilement imprimable sur une imprimante résine voir filament (test pas encore effectué).

Tous les fichiers sont disponibles ci-dessous en téléchargement.

 

Vidéo de démonstration :

 

Composants nécessaires :

  • Arduino Uno
  • 1 PCA9685
  • 1 module joystick
  • Une Breadboard
  • Des fils de connexion
  • 1 alimentation 5v
  • 2 vis M3x20
  • 3 vis M3x8
  • 7 écrous hexagonal M3
  • 1 imprimante 3d résine ( imprimante filament test pas encore effectué)
  • 4 Servos Tower pro 9g sg90 (attention à la sortie des fils voir ci-dessous)

 

Fichiers SolidWorks et STL :

 

Bibliothèque nécessaire :

  • #include « Adafruit_PWMServoDriver.h »

https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library

 

Schéma de câblage :

 

Codes pour positionner les servos avant assemblage final :

#include "Wire.h"
#include "Adafruit_PWMServoDriver.h"
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);

#define MIN_PULSE_WIDTH 600
#define MAX_PULSE_WIDTH 2600
#define FREQUENCY 50

void setup() {
Serial.begin(9600);
pwm.begin();
pwm.setPWMFreq(FREQUENCY);
}

int pulseWidth(int angle) {
int pulse_wide, analog_value;
pulse_wide = map(angle, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
analog_value = int(float(pulse_wide) / 1000000 * FREQUENCY * 4096);
return analog_value;
}

void loop() {
pwm.setPWM(0, 0, pulseWidth(90)); //Servo dans l'oeil direction horizontal
pwm.setPWM(1, 0, pulseWidth(180)); //Servo Paupiere haut
pwm.setPWM(2, 0, pulseWidth(0)); //Servo Paupiere bas
pwm.setPWM(3, 0, pulseWidth(0)); //Servo direction vertical
}

 

Codes :

//Servo dans l'oeil direction horizontal
int servo0min = 55 ;
int servo0max = 135 ;
int valeurservo0 = 510;
//Servo Paupiere haut
int servo1min = 110 ;
int servo1max = 180 ;
int valeurservo1 = 310;
//Servo Paupiere bas
int servo2min = 0 ;
int servo2max = 70 ;
int valeurservo2 = 310;
//Servo direction vertical
int servo3min = 0 ;
int servo3max = 80 ;
int valeurservo3 = 0;


#include "Wire.h"
#include "Adafruit_PWMServoDriver.h"
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);

#define MIN_PULSE_WIDTH 600
#define MAX_PULSE_WIDTH 2600
#define FREQUENCY 50

int analogPinA0 = A0; //Joystick VRX
int analogPinA1 = A1; //Joystick VRY
int bouton1 = 7; //Joystick SW
int valeur1 = 0;
int valeur2 = 0;

void setup() {
Serial.begin(9600);
pwm.begin();
pwm.setPWMFreq(FREQUENCY);
pinMode(bouton1, INPUT_PULLUP);
pwm.setPWM(0, 0, pulseWidth(90)); //Servo dans l'oeil direction horizontal
pwm.setPWM(1, 0, pulseWidth(180)); //Servo Paupiere haut
pwm.setPWM(2, 0, pulseWidth(0)); //Servo Paupiere bas
pwm.setPWM(3, 0, pulseWidth(0)); //Servo direction vertical
delay(2000);
}

int pulseWidth(int angle) {
int pulse_wide, analog_value;
pulse_wide = map(angle, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
analog_value = int(float(pulse_wide) / 1000000 * FREQUENCY * 4096);
return analog_value;
}

void loop() {
valeur1 = analogRead(analogPinA0);
valeur2 = analogRead(analogPinA1);
int servomapservo0 = map(valeur2, 1023, 0, servo0min, servo0max);
int servomapservo1 = map(valeurservo1, 0, 1023, servo1min, servo1max);
int servomapservo2 = map(valeurservo2, 1023, 0, servo2min, servo2max);
int servomapservo3 = map(valeur1, 1023, 0, servo3min, servo3max);
pwm.setPWM(0, 0, pulseWidth(servomapservo0));
pwm.setPWM(3, 0, pulseWidth(servomapservo3));
if(digitalRead(bouton1) == LOW){
pwm.setPWM(1, 0, pulseWidth(180));
pwm.setPWM(2, 0, pulseWidth(0));
}
else{
pwm.setPWM(1, 0, pulseWidth(servomapservo1));
pwm.setPWM(2, 0, pulseWidth(servomapservo2));
}
Serial.println(valeur1);
Serial.println(valeur2);

}

 

Photos :

 

 

 


 

Laisser un commentaire