lundi 21 juillet 2014

Junix

Bonjour à tous. Un petit article pour vous présenter le projet que j'ai mené lors de mon stage de fin d'étude et cette année au sein de la société Zig Zag Production.

J'ai développé avec l'aide d'un collègue un robot mobile Wifi pour faire de l'animation live.

Sans plus attendre, voici une photo :


Il a été réalisé entièrement au sein de l'atelier. C'est un robot mobile dédié à l'animation en temps réel. Il est télécommandé par un comédien déporté qui :
  • peut entendre et voir au travers de Junix ;
  • parler au travers de Junix avec un vocodeur ;
  • bien entendu, le déplacer grâce à ces deux chenilles motrices ;
  • bouger la tête de Junix suivant deux axes ;
  • lever / descendre la tête ;
  • et changer le style des yeux !
Voici une vidéo ou l'on voit Junix déambuler :




Maintenant je vais détailler son fonctionnement interne car je suppose que c'est ce qui vous intéresse. 

Voici un schéma bloc de l'architecture actuelle de Junix :



Petite précision : Les liaisons vidéo et audio sont indépendantes de ce système, elles sont gérées par des modules HF. 

Le Raspberry Pi gère l'interface Wifi et contrôle les actionneurs de Junix. Le système est découpé en modules I2C :
  • Un module qui sert à étendre le port d'entrée/sortie du Raspberry Pi ;
  • Un module contrôleur pour le vérin électrique de la tête ;
  • Un module qui gère les divers éléments de la tête.
Au niveau logiciel, j'ai développé un serveur UDP en C++ pour le Raspberry Pi qui écoute les ordres émis par le client. Ce serveur pilote les composants I2C du robot.

Quant au client, il a été développé en Java est se présente sous cette forme : 





C'était un rapide aperçu de la partie logiciel / électronique de Junix. Je vais vous présenter maintenant la CAO du robot. La plupart des pièces ont été imprimés avec une imprimante 3D Makerbot.

On commence par une vue éclatée :


La base mobile est constituée de 4 flasques en alu montées avec des entretoises en profilé alu également. Les chenilles sont amorties avec des silentbloc. On peut voir les 4 batteries lithium-ions qui aliment le tout.

Détails de la tête :



Il y a principalement des pièces imprimées. Les servomoteurs utilisées sont des Dynamixel Rx 28, ils offrent une fluidité de mouvement exceptionnelle. 

C'est tout pour le moment, et surtout, n’hésitez pas à poser des questions.




jeudi 23 janvier 2014

Suite fraiseuse CNC


Voici la la nouvelle 3D de ma fraiseuse, avec l'intégration des moteurs :



J'avais parlé de faire mes contrôleurs de moteur PAP mais finalement j'ai trouvé un kit sur Ebay (parmi les nombreux disponibles) avec les moteurs + les contrôleurs + les alimentations pour pas trop cher. Voici à quoi ressemble le kit :


lundi 2 septembre 2013

Contrôle d'un moteur pas à pas

Bonjour à tous,
Au début de mon projet de CNC, j'avais parlé d'acheter mes contrôleurs de moteur pas à pas sur internet. J'ai cependant changé d'avis et je vais plutôt les réaliser moi même car cela est plus intéressant et moins cher.

Pour cela j'ai utilisé le composant TB6600HG qui est un driver de moteur pas à pas et qui possède les caractéristiques suivantes :

  • Mode pas entier, demi-pas, 1/4, 1/8, 1/16
  • Tension d'alimentation maximale de 50 V
  • Courant maximal par phase 4.5 A

dimanche 5 mai 2013

Un programme plus simple pour contrôler l'axe d'imprimanrte

J'ai trouvé beaucoup plus simple que mon post précédent pour contrôler l'axe d'imprimante. J'utilise pour cela deux bibliothèques : Encoder et PID.

Le programme ci-dessous fait bouger l'axe de gauche à droite :


/*
* Contrôle d'un axe d'imprimante en utilisant les bibliothèques
* Encoder et Pid
*
*/


#include <Encoder.h>
#include <PID_v1.h>

const int pin_channelA = 2;  // codeur optique
const int pin_channelB = 3;  // codeur optique
const int pin_t1 = 10;       // moteur, pont en H
const int pin_t2 = 9;        // moteur, pont en H
double Setpoint, Input, Output;

Encoder encoder(pin_channelA, pin_channelB);
PID myPID(&Input, &Output, &Setpoint, 6.4, 0.32, 0.00064, DIRECT);

unsigned long time;
unsigned long last_time = 0;
int cons = 1;
int val = 1;

void setup() {
  myPID.SetMode(AUTOMATIC);  // demarrer Pid
  pinMode(pin_t1, OUTPUT);
  pinMode(pin_t2, OUTPUT);
  myPID.SetSampleTime(1);
  myPID.SetOutputLimits(-255, 255);
  Output = 0;
}

void loop() {
  Input = encoder.read() + cons;  // En entrée du Pid : valeur du codeur + consigne
  myPID.Compute();
  if (Output > 0) {  // sens avant
    analogWrite(pin_t1, Output);
    digitalWrite(pin_t2, LOW);
  }
  else if (Output < 0){  // sens arrière
    analogWrite(pin_t2, -Output);
    digitalWrite(pin_t1, LOW);
  }
  else {  // arrêt
    digitalWrite(pin_t1, LOW);
    digitalWrite(pin_t2, LOW);
  }

  // on incrémente ou décremente la consigne toute les 2 ms
  time = millis();
  if (time-last_time > 2) {
    cons+=val;
    if (cons>500)
      val=-1;
    if (cons==0)
      val = 1;
    last_time = time;
  }
}

vendredi 21 décembre 2012