Œ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