DISTRIBUTEUR DE PIÈCES POUR BANC ROBOTIQUE INDUSTRIEL :

Sommaire :

•Ancien projet et objectifs
•Cahier des charges
•Fonctionnalités/Réalisation
-Distributeur de pièces
-Bras robotisé
•Matériel
•Programme des différents systèmes
-Arduino
-NodeRed
-Staubli
-Cognex
•Problèmes rencontrés
•Conclusion / Objectifs accomplis

1) Présentation de l’ancien projet :

Notre projet est basé sur l’amélioration d’un projet d’étudiants en DUT GEII de l’année précédente (Figure 1). Il consiste à créer une chaine automatisée afin de faire une démonstration lors des journées portes ouvertes de l’IUT. Le principe est simple, un automate dépose une pièce cylindrique d’une couleur quelconque sur un tapis roulant de manière aléatoire, une caméra envoie l’information de la couleur et de la position de la pièce au bras robotisé qui se chargera de déplacer la pièce pour la remettre dans le distributeur. Nous avons choisis d’améliorer ce projets, car le précédent distributeur automatisé utilisait des moteurs pas à pas, pilotés à l’aides de modules spécifique et d’une Arduino Mega (ce qui est très couteux).

Figure 1: Ancien projet

2) Cahier des Charges

Une fois que les besoins étaient définis nous avons pu établir un cahier des charges (Figure 2). Les deux fonctions principale sont:
-distribuer les pièces de manière aléatoire.
-stocker et trier ces pièces dans des compartiments.

Figure 2: Cahier des charges

3) Définition des fonctionnalités

A l’aide du cahier des charges nous avons pu définir des diagrammes FAST, afin de décrire toutes les fonctionnalités de notre projet (Figure 3.1 et 3.2).
Notre projet contient deux systèmes:

Partie distributeur de pièces (Figure 3.1):

Partie robot et caméra industrielle: (Figure 3.2):

4) Matériel

De ces différentes fonctionnalités, nous avons fait une liste de matériel, pour la création du distributeur de pièces (Figure 4):
Nous avons choisi d’utiliser un Arduino Yun car la programmation de petit systèmes embarqué comme celui-ci est très simple, de plus le Yun possède une interface Linux ce qui nous permettrait éventuellement de le relier à un serveur Node Red. Nous utilisons ces Servomoteurs, car ils ont un couple largement suffisant pour déplacer les pièces. Ils sont aussi très facilement pilotables avec la carte Arduino, car ils ne nécessitent pas de module spécifique. En revanche les capteurs de présence pièce initialement prévu n’ont pas été gardé car jugé trop encombrant pour ce qu’ils apportaient au projet.

Figure 4: Liste de matériel

5) Partie programmation

A) Programme Arduino

Le programme Arduino permet de distribuer une pièce de manière aléatoire à chaque fois que le délai d’attente a été passé. Nous utilisons la fonction rand() pour cela. Le programme a été conçue de manière modulaire, pour rajouter simplement des capteurs ou une nouvelle couleur de pièce c’est pour cela que tout est conçu sur des définitions de tableaux. Le pilotage des Servomoteurs se fait à l’aide d’une fonction ce qui permet de ne pas changer tout le programme en cas de changement du système de pilotage des actionneurs (Figure 5.1 et 5.2). On a aussi programmé un bouton poussoir, pour mettre en marche ce système. Pour éviter les problèmes de rebonds avec ce bouton, nous l’avons mis en parallèle avec une capacité (Figure 5.3).

Synoptique Arduino (Figure 5.1):

Programme Arduino (Figure 5.2):

#include <Servo.h>
#define pin_onoff 2

int temp_rotation = 420;
int pin_capteur[] = {7, 8, 7};
int valeur_pwm[][3] = {{700, 1480, 2300}, {700, 1485, 2300}, {700, 1475, 2300}};
int pin_moteur[] = {9, 10}; //11 et pin pwm obligatoire
int nbmoteur = (sizeof(pin_moteur)) / 2;
int temp_distribution = 1000;
unsigned long temp;
int distro;
bool onoff = 1;
Servo monservo;

void setup()
{
  Serial.begin(9600);
  for (int i = 0; i < nbmoteur ; i++ )
  {
    pinMode(pin_capteur[i], INPUT);
    pinMode(pin_moteur[i], OUTPUT);
  }

  //définition boutons IHM
  pinMode(pin_onoff, INPUT_PULLUP);
  pinMode(13,OUTPUT);
  attachInterrupt(digitalPinToInterrupt(pin_onoff), etat, FALLING);
  temp = millis(); //enregistre le temps écouler
  Serial.print("Durer de l'initialisation :");
  Serial.println(temp);
  Serial.print("NBMOTEUR :");
  Serial.println(nbmoteur);
}

void loop()
{
  
  if (onoff == 1) {
    if ((temp + temp_distribution) <= millis())
    {
      distro = random(0, nbmoteur);
      /*while (digitalRead(pin_capteur[distro]) == 0)
        {
        distro = random(0, nbmoteur);
        }*/
      lancement_piece(distro);
      temp = millis();
    }
  }
}



//fonction gérant le sens de rotation du servo moteur
void lancement_piece(int numero_moteur)
{
  moteur(numero_moteur, valeur_pwm[numero_moteur][0]);
  unsigned long temp = millis();
  while ((temp + temp_rotation) >= millis()) {}
  /*moteur(numero_moteur, valeur_pwm[numero_moteur][2]);
  temp = millis();
  while ((temp + temp_rotation) >= millis()) {}*/
  monservo.detach();
  //moteur(numero_moteur, valeur_pwm[numero_moteur][1]);
}

//fonction gérant le sens de rotation du servo moteur
void moteur(int numero_moteur, int valPWM)
{
  Serial.print("N° moteur:");
  Serial.print(numero_moteur);
  Serial.print("    Valeur PWM:");
  Serial.print(valPWM);
  Serial.print("    N° Pin Moteur");
  Serial.println(pin_moteur[numero_moteur]);
  monservo.attach(pin_moteur[numero_moteur]);
  monservo.writeMicroseconds(valPWM);

}
void etat() {
  temp = millis();
  if (100 + temp >= millis()) {
    onoff = !onoff;
    digitalWrite(13,onoff);
    //Serial.print("Etat On/Off : ");
    //Serial.println(onoff);
  }
}

Schéma électrique de l’Arduino:

Figure 5.3: schéma électrique de l’Arduino

Le programme est téléchargeable ici

B) Nodered

Synopsis global du transfert des données entre les différents systèmes (Figure 5.4):

Le serveur Node Red formate les données selon le destinataire et ajoute une interface web permettant ainsi des contrôles manuels.
Nous avons aussi défini aux travers de ce serveur 4 ports: Staubli receive « 1060 »; Staubli sent « 1061 »; cognex receive « 1062 »; cognex sent « 1063 » , ils permettent de faire la liaison entre la caméra et le robot (Figure 5.5).

Figure 5.5: Serveur + interface Node Red

Le fichier à importer pour recréer le serveur NodeRed est disponible ici.

C)Le Robot Staubli

Le robot (Figure 5.6), envoie des demandes de photo à la caméra jusqu’à la présence de pièces. Il attend les coordonnées ainsi que la couleur de la pièce, que la caméra va lui rendre. Une fois les données retournées, le robot ira saisir la pièce aux coordonnées indiquées et la posera au bon endroit (selon la couleur de cette pièce) (Figure 5.7 et 5.8).

Figure 5.6: Photo du robot

Synoptique du programme (Figure 5.7):

cls()
  prisetemp=prise
  deposetemp=depose
  deposetemp2=depose2

  // port receive 1060
  //port send 1061
  //S="1;300;500"


  while true
    S="0;0000;0000"  
    mult=0
    mult2=0
    couleur=0
    xpos=0
    ypos=0
    putln("Debut ")
    //  cameraSend=toString("snap",i)
    //  S=cameraReceive


    do
      clearBuffer(cameraReceive)
      clearBuffer(cameraSend)
      movej(j2,pince,rapide)
      cameraSend=toString("send",i) 
      S=cameraReceive 
      couleur=asc(S,0)-48

      put(couleur)
      putln("fin")
      delay(0.5)
    until(couleur>0)





    //teste le signe des coordonnées

    if asc(S,2)==45
      mult=-1
    endIf

    if asc(S,2)==48
      mult=1
    endIf

    if asc(S,7)==45
      mult2=-1
    endIf

    if asc(S,7)==48
      mult2=1
    endIf

    couleur=asc(S,0)-48

    xpos=mult*(asc(S,3)-48)*100+(asc(S,4)-48)*10+(asc(S,5)-48)
    put(xpos)
    put(" ")

    ypos=mult2*(asc(S,8)-48)*100+(asc(S,9)-48)*10+(asc(S,10)-48)
    put(ypos)

//gère le point de prise en fonction des coordonnées données par la cognex

    prisetemp.trsf.x=prise.trsf.x+xpos
    prisetemp.trsf.y=prise.trsf.y+ypos

    priseapp=appro(prisetemp,{0,0,-30,0,0,0})
    deposeapp=appro(deposetemp,{0,0,-30,0,0,0})
    deposeapp2=appro(deposetemp2,{0,0,-30,0,0,0})

    movej(j2,pince,lent)
    movej(priseapp,pince,rapide)
    movel(prisetemp,pince,lent)
    close(pince)
    movel(priseapp,pince,lent)

    //gère le point de dépose en fonction de la couleur
    if couleur==1

      movej(deposeapp,pince,rapide)
      movel(deposetemp,pince,lent)
      open(pince)
      movel(deposeapp,pince,lent)

    endIf

    if couleur==2

      movej(deposeapp2,pince,rapide)
      movel(deposetemp2,pince,lent)
      open(pince)
      movel(deposeapp2,pince,lent)
    endIf

    movej(j2,pince,rapide)
    putln(" fin")

  endWhile
  waitEndMove()

//Figure 5.8: Programme du robot

Le fichier du projet Staubli est disponible ici.

D) La caméra COGNEX

La caméra attend la demande d’une photo du Robot, s’il n’y a pas de pièces, alors la caméra reprend une photo jusqu’à la présence d’une pièce. Nous avons utilisé une syntaxe spécifique qui est commune au robot et à la caméra, pour la transmission de message (Figure 5.8).

Syntaxe 0;0000;0000
Explication Couleur de la pièces
(0 si absent;
1 si blanc; 2 si vert)
Coordonnées x (Premier caractère = ‘-‘ si Coordonnées négative ou ‘0’ si coordonnée positive)Coordonnées y (Premier caractère = ‘-‘ si Coordonnées négative ou ‘0’ si coordonnée positive))
Figure 5.8: Syntaxe des messages

Programme de la caméra cognex (Figure 5.9) :

La détection des pièces se fait à l’aide de la fonction « TrainPatMaxPattern »
Pour différentier deux couleurs (le vert et le blanc dans notre cas), on joue sur la luminosité.
Cela nous permet de différentier parfaitement la couleur verte de la blanche. Cependant, il arrive souvent qu’une pièce blanche soit détectée à la fois comme verte et blanche. C’est pour cela que quand une pièce est détectée comme verte et blanche, on priorise le blanc.
On a aussi créé un point de référence à l’aide de la fonction « Point », qui est le même pour le TX 60.
Enfin, toutes les coordonnées sont converties en millimètre pour pouvoir être exploitées par le robot.

Figure 5.9: Programme de la cognex

Le fichier du projet NodeRed est disponible ici.

6)Problèmes rencontrés

Les problèmes majeurs que nous avons rencontré sont :

– Chaque servomoteur a une valeur PWM différentes pour les mêmes mouvement (On as dû affiner ces valeurs par expérimentation).

– Les servomoteurs ont un courant de consommation crête bien plus élevé que ce que la datasheet donnait (1,1 A contre 1,6 A dans la réalité) ce qui créait des chutes de tension et redémarrait l’Arduino, on a donc dû surdimensionner l’alimentation.

– Les axes x et y de la caméra ne sont pas aligné avec les axes du bras robotisé ce qui empêche la bonne prise de pièces. Ce problème vient du robot Staubli, qui a son axe Y non perpendiculaire à la table.
Pour résoudre ce problème, il faut modifier le programme du Robot et mettre ceci dans les coordonnées du point de prise :

X’=X.cos(T) – Y sin(T)
Y’=X sin(T) + Y cos(T)

Ici X et Y sont les coordonnées envoyées par la caméra et T est l’angle d’écart qu’il y a entre le repère de la caméra et le repère du robot.

– La caméra positionnée au-dessus du robot est une caméra noire et blanc ce qui empêche la différenciation de plus de deux couleurs.

7) Conclusion

Ce projet fut très intéressant, il nous a permis d’appliquer les connaissances de In-sight et Staubli vu en cours directement sur un projet concret. En revanche la partie NodeRed fut une complète découverte !!

Cependant certain point reste à améliorer :
– Le système Arduino devrait être pilotable à travers l’interface web du serveur NodeRed.
– Intégrer la partie Arduino dans la maquette des DUT GMP, vu que cette maquette ne fut terminée qu’après nos séances de projets (Figure 7).
– Utiliser un condensateur pour éviter les chutes de tension plutôt que de surdimensionner l’alimentation.
– Utiliser une caméra couleur pour différencier plus de deux Couleurs.
– Calibrer les axes de la caméra et du robot TX 60.

Figure 7: Maquette des DUT GMP

Projet réalisé par :
– Erwan LAROPPE
-Louis MATHIS

Pour les curieux l’archive complète de notre projet est disponible ICI :
https://drive.google.com/drive/folders/1frOojPXsxAnuPceLYTKd4kq09x3KXn2p?usp=sharing