Tutoriels

L’objectif de cette section est de montrer comment mettre en œuvre à la fois une application à plusieurs pièces et une application à plusieurs pièces/robots. Dans de nombreux cas, nous expliquerons simplement les étapes à suivre, sans entrer dans les détails de la procédure. Nous supposons que vous savez comment créer une nouvelle pièce, effectuer un étalonnage de pièce et écrire un programme pour une application à un robot/une pièce.
Pour plus de détails, consultez la section suivante.
Utilisons l’option Part Feeding

Tutoriel 1 : 1 robot, 1 distributeur, 2 types de pièces

Dans ce tutoriel, deux pièces fonctionnent simultanément sur le même distributeur. Ces pièces sont physiquement différentes. Les pièces n° 1 et n° 2 sont utilisées. Une caméra fixe orientée vers le bas est installée au-dessus du distributeur. Le robot prélèvera et positionnera deux pièces n° 1, puis prélèvera et placera une pièce n° 2. Cette opération sera exécutée en continu, en boucle.

Chaque pièce sera prélevée à l’aide d’une pince différente (c’est-à-dire, un bit de sortie). Le nombre de pièces et l’ordre de prélèvement sont des éléments importants pour cette opération d’assemblage. Le processus d’alternance entre la pièce n° 1 et la pièce n° 2 s’effectuera à l’aide de « PF_ActivePart ». Dans un premier temps, nous allons écrire le code de manière à ce que le mouvement du robot soit exécuté à l’intérieur de la fonction de rappel PF_Robot. Nous améliorerons ensuite le débit du robot en exécutant le mouvement dans une tâche multiple distincte et en traitant en parallèle les vibrations du distributeur.

  1. Créez un nouveau projet Epson RC+.

  2. Étalonnez la caméra fixe orientée vers le bas.

  3. Dans Vision Guide, créez la séquence Part Blob.
    La séquence Part Blob sert à fournir un retour d’informations pendant l’étalonnage des pièces et lors de l’exécution, afin de déterminer la meilleure façon d’alimenter les pièces. La séquence Part Blob détecte des pièces individuelles ou des groupes de pièces lors de l’exécution. La séquence Part Blob contient généralement un seul objet de vision Blob. La séquence Part Blob devra disposer d’un étalonnage de caméra attribué à la propriété Calibration (Étalonnage).
    La propriété NumberToFind de l’objet Blob doit être définie sur « All » (Tout). La propriété ThresholdAuto du Blob doit être définie sur False (valeur par défaut).
    Placez les pièces sur la plateforme, ouvrez la fenêtre Histogram (Histogramme) et réglez les valeurs Threshold High (Seuil haut) et Threshold Low (Seuil bas) jusqu’à ce que seules les pièces soient détectées. Définissez la zone minimale du Blob à environ 0,9 fois la zone de la pièce. Si la pièce comporte plusieurs faces, définissez la zone minimale de manière à ce que la pièce puisse être détectée, quelle que soit son orientation. Vous pouvez définir des séquences Blob de pièce distinctes pour chacune des deux pièces (traitées par le distributeur), mais en général, vous pouvez utiliser la même séquence Blob pour toutes les pièces.
    Assurez-vous que la séquence Part Blob puisse détecter chaque pièce qui sera traitée sur le distributeur. La fenêtre de recherche de l’objet Blob doit occuper autant d’espace que possible sur la zone de la plateforme. Cela dit, il est essentiel que l’objet Blob ne détecte que les pièces et non le distributeur lui-même. Si la séquence Part Blob détecte une partie quelconque du plateau, le système ne fonctionnera pas correctement.

  4. Dans Vision Guide, créez la séquence de pièces pour chacune des deux pièces qui seront traitées sur le distributeur.
    Assurez-vous que la propriété Calibration (Étalonnage) est définie pour chaque séquence. En règle générale, un objet Geometric sert à localiser la face avant (et un deuxième objet Geometric est généralement utilisé pour déterminer la face arrière de la pièce si un retournement est nécessaire). La propriété NumberToFind de l’objet de vision est généralement définie sur « All » (Tout).

  5. Accédez à la boîte de dialogue [Tools] (Outils) - [Part Feeding] et ajoutez une nouvelle pièce. L’« assistant de pièces » vous guidera tout au long du processus d’ajout d’une pièce.
    Pour plus d’informations sur l’assistant de pièces, veuillez vous reporter au chapitre suivant.
    Utilisons l’option Part Feeding

  6. Accédez à la page [Calibration] (Étalonnage) de la nouvelle pièce et cliquez sur le bouton [Calibrate] (Étalonner) pour lancer l’assistant d’étalonnage.
    Veuillez vous reporter à la section suivante pour plus de détails sur l’utilisation de l’assistant d’étalonnage.
    Étalonnage et test

  7. Accédez à la page [Pick] (Prélever) de la pièce n° 1 et cliquez sur le bouton [Teach] (Apprendre).
    Déplacez le robot jusqu’à la hauteur de prélèvement de la pièce et apprenez la commande « Pick Z » (Prélever Z).

  8. Cliquez sur le bouton [Add] (Ajouter) dans la boîte de dialogue [Part Feeding] pour ajouter la pièce n° 2.
    Configurez la pièce à l’aide de l’« assistant de pièces ».

  9. Accédez à la page [Calibration] (Étalonnage) et cliquez sur le bouton [Calibrate] (Étalonner) pour lancer l’assistant d’étalonnage.

  10. Accédez à la page [Pick] (Prélever) de la pièce n° 1 et cliquez sur le bouton [Teach] (Apprendre).
    Déplacez le robot jusqu’à la hauteur de prélèvement de la pièce et apprenez la commande « Pick Z » (Prélever Z).

  11. Fermez la boîte de dialogue Part Feeding.
    Le code du modèle Part Feeding (c’est-à-dire, les fonctions de rappel Part Feeding) est créé automatiquement.

  12. Apprenez au robot les points de « stationnement » et de « positionnement », puis nommez-les respectivement.

  13. Modifiez le code du modèle comme suit.

Main.prg

Function Main
    Robot 1
    Motor On
    Power High
    Speed 50
    Accel 50, 50
    Jump Park

    PF_Start 1, 2
Fend

PartFeeding.prg

Global Integer numPicked ' number of parts that have been picked

Function PF_Robot(PartID As Integer) As Integer

    Integer numRequired, gripperOutput

    Select PartID
        Case 1
            numRequired = 2 ’ number of parts required
            gripperOutput = 1
        Case 2
            numRequired = 1
            gripperOutput = 2
    Send
    Do
        If PF_QueLen(PartID) > 0 Then
            P0 = PF_QueGet(PartID)
            PF_QueRemove (PartID)
            Jump P0
            On gripperOutput
            Wait 0.1
            Jump Place
            Off gripperOutput
            Wait 0.1
            numPicked = numPicked + 1
        Else
            ’ Not enough parts were picked
            PF_ActivePart PartID ’ No change in Active Part
            PF_Robot = PF_CALLBACK_SUCCESS
            Exit Function
        EndIf
    Loop Until numPicked = numRequired

    numPicked = 0
    ’ select the next Active Part
    If PartID = 1 Then
        PF_ActivePart 2
    Else
        PF_ActivePart 1
    EndIf
    PF_Robot = PF_CALLBACK_SUCCESS
Fend

Dans l’exemple de code présenté ci-dessus, le distributeur ne vibrera (si nécessaire) qu’une fois que le robot aura terminé son mouvement de « positionnement » et que la fonction PF_Robot se sera achevée. Le code peut être réorganisé de manière à ce que les vibrations du distributeur se produisent en parallèle avec le mouvement du robot.
La fonction de rappel PF_Robot servira à signaler à une tâche de mouvement (la fonction Main dans cet exemple) que des pièces sont prêtes à être prélevées.
Les E/S de mémoire (étiquetées « PartsToPick1 » et « PartsToPick2 ») servent à signaler que des pièces sont disponibles.
Lorsque la dernière pièce disponible est en cours de positionnement (à 80 % du mouvement dans cet exemple), la tâche de mouvement indique à la fonction PF_Robot de s’arrêter et de renvoyer une valeur. Les valeurs de retour indiquent au système qu’il peut procéder à l’acquisition de nouvelles images, déclencher une vibration, acheminer des pièces depuis une trémie, etc. Nous allons maintenant modifier le code de notre tutoriel afin que l’action du distributeur puisse se dérouler en parallèle avec le mouvement du robot.

Main.prg

Function Main
    Integer numToPick1, numToPick2, numPicked

    Motor On
    Power High
    Speed 50
    Accel 50, 50
    Jump Park

    MemOff PartsToPick1
    MemOff PartsToPick2
    numToPick1 = 2
    numToPick2 = 1

    PF_Start 1, 2

    Do
        numPicked = 0

        Do
            Wait MemSw(PartsToPick1) = On
            pick = PF_QueGet(1)
            PF_QueRemove (1)
            Jump pick
            On gripper1
            Wait 0.1
            numPicked = numPicked + 1
            If numPicked < numToPick1 And PF_QueLen(1) > 0 Then
                Jump Place
            Else
                ’ Last part or no more parts available to pick
                If numPicked = numToPick1 Then
                    ’ Select the next part
                    PF_ActivePart 2
                EndIf
                Jump Place ! D80; MemOff PartsToPick1 !
            EndIf
            Off gripper1
            Wait 0.1
        Loop Until numPicked = numToPick1

        numPicked = 0
        Do
            Wait MemSw(PartsToPick2) = On
            pick = PF_QueGet(2)
            PF_QueRemove (2)
            Jump pick
            On gripper2
            Wait 0.1
            numPicked = numPicked + 1
            If numPicked < numToPick2 And PF_QueLen(2) > 0 Then
                Jump Place
            Else
                ’ Last part or no more parts available to pick
                If numPicked = numToPick2 Then
                    ’ Select the next part
                    PF_ActivePart 1
                EndIf
                Jump Place ! D80; MemOff PartsToPick2 !
            EndIf
            Off gripper2
            Wait 0.1
        Loop Until numPicked = numToPick2
    Loop
Fend

PartFeeding.prg

Function PF_Robot(PartID As Integer) As Integer
    Select PartID
        Case 1
            MemOn PartsToPick1
            Wait MemSw(PartsToPick1) = Off
        Case 2
            MemOn PartsToPick2
            Wait MemSw(PartsToPick2) = Off
    Send

    PF_Robot = PF_CALLBACK_SUCCESS
Fend

Tutoriel 2 : 2 robot, 1 distributeur, 2 types de pièces

Dans ce tutoriel, deux pièces fonctionnent simultanément sur le même distributeur. Ces pièces sont physiquement différentes. Les pièces n° 1 et n° 2 sont utilisées. Une caméra fixe orientée vers le bas est installée au-dessus du distributeur. Deux robots partageront le même distributeur. Les robots prélèveront à tour de rôle des pièces dans le distributeur. Chaque robot prélèvera et positionnera sa propre pièce. Le robot n° 1 prélèvera une pièce n° 1, puis le robot n° 2 prélèvera une pièce n° 2.
L’ordre de prélèvement est important pour cette application. L’ordre de prélèvement alterné est géré par « PF_ActivePart ». Dans un premier temps, nous allons écrire le code de manière à ce que le mouvement du robot soit exécuté à l’intérieur de la fonction de rappel PF_Robot. Dans ce cas, le mouvement du robot sera séquentiel. En d’autres termes, un seul robot se déplacera à la fois.
Nous améliorerons ensuite le débit du robot en exécutant les mouvements dans plusieurs tâches multiples distinctes. Le tutoriel mis à jour inclura également PF_AccessFeeder et PF_ReleaseFeeder. Les fonctions PF_AccessFeeder et PF_ReleaseFeeder permettent d’éviter toute collision entre les robots lors du prélèvement dans le distributeur.

  1. Créez un nouveau projet Epson RC+.
  2. Étalonnez la caméra fixe orientée vers le bas pour le robot n° 1.
  3. Étalonnez la caméra fixe orientée vers le bas pour le robot n° 2.
  4. Dans Vision Guide, créez la séquence Blob pour la pièce n° 1. La séquence Part Blob contient généralement un seul objet de vision Blob. Il faudra attribuer à la propriété Calibration (Étalonnage) de la séquence l’étalonnage de caméra effectué pour le robot n° 1. La propriété NumberToFind de l’objet Blob doit être définie sur « All » (Tout).
    La propriété ThresholdAuto du Blob doit être définie sur False (valeur par défaut). Placez les pièces sur la plateforme, ouvrez la fenêtre Histogram (Histogramme) et réglez les valeurs Threshold High (Seuil haut) et Threshold Low (Seuil bas) jusqu’à ce que seules les pièces soient détectées. Définissez la zone minimale du Blob à environ 0,9 fois la zone de la pièce.
    Si la pièce comporte plusieurs faces, définissez la zone minimale de manière à ce que la pièce puisse être détectée, quelle que soit son orientation. Assurez-vous que la séquence Part Blob puisse détecter la pièce n° 1.
    La fenêtre de recherche de l’objet Blob doit occuper autant d’espace que possible sur la zone de la plateforme. Cela dit, il est essentiel que l’objet Blob ne détecte que les pièces et non le distributeur lui-même.
  5. Dans Vision Guide, créez la séquence Blob pour la pièce n° 2. La séquence Part Blob contient généralement un seul objet de vision Blob. Il faudra attribuer à la propriété Calibration (Étalonnage) de la séquence l’étalonnage de caméra effectué pour le robot n° 2. La propriété NumberToFind de l’objet Blob doit être définie sur « All » (Tout).
    La propriété ThresholdAuto du Blob doit être définie sur False (valeur par défaut).
    Placez les pièces sur la plateforme, ouvrez la fenêtre Histogram (Histogramme) et réglez les valeurs Threshold High (Seuil haut) et Threshold Low (Seuil bas) jusqu’à ce que seules les pièces soient détectées.
    Définissez la zone minimale du Blob à environ 0,9 fois la zone de la pièce.
    Si la pièce comporte plusieurs faces, définissez la zone minimale de manière à ce que la pièce puisse être détectée, quelle que soit son orientation. Assurez-vous que la séquence Part Blob puisse détecter la pièce n° 2. La fenêtre de recherche de l’objet Blob doit occuper autant d’espace que possible sur la zone de la plateforme.
    Cela dit, il est essentiel que l’objet Blob ne détecte que les pièces et non le distributeur lui-même.
  6. Dans Vision Guide, créez la séquence de pièces qui servira à localiser la pièce n° 1.
    Veillez à définir la propriété Calibration (Étalonnage) sur l’étalonnage effectué pour le robot n° 1.
    En règle générale, un objet Geometric est utilisé pour localiser la face avant. (Un deuxième objet Geometric est utilisé pour déterminer la face arrière de la pièce si un retournement est nécessaire.) La propriété NumberToFind de l’objet de vision est généralement définie sur « All » (Tout).
  7. Dans Vision Guide, créez la séquence de pièces qui servira à localiser la pièce n° 2.
    Veillez à définir la propriété Calibration (Étalonnage) sur l’étalonnage effectué pour le robot n° 2.
    En règle générale, un objet Geometric est utilisé pour localiser la face avant. (Un deuxième objet Geometric est utilisé pour déterminer la face arrière de la pièce si un retournement est nécessaire.) La propriété NumberToFind de l’objet de vision est généralement définie sur « All » (Tout).
  8. Accédez à la boîte de dialogue [Tools] (Outils) - [Part Feeding] et ajoutez une nouvelle pièce n° 1. L’« assistant de pièces » vous guidera tout au long du processus d’ajout d’une pièce. Veillez à sélectionner le robot n° 1 sur la première page de l’assistant de pièces.
    Pour plus d’informations sur l’assistant de pièces, veuillez vous reporter au chapitre suivant.
    Utilisons l’option Part Feeding
  9. Accédez à la page [Calibration] (Étalonnage) de la nouvelle pièce n° 1 et cliquez sur le bouton [Calibrate] (Étalonner) pour lancer l’assistant d’étalonnage.
    Veuillez vous reporter à la section suivante pour plus de détails sur l’utilisation de l’assistant d’étalonnage.
    Étalonnage et test
  10. Accédez à la page [Pick] (Prélever) de la pièce n° 1 et cliquez sur le bouton [Teach] (Apprendre).
    Déplacez le robot n° 1 jusqu’à la hauteur de prélèvement de la pièce et apprenez la commande « Pick Z » (Prélever Z).
  11. Cliquez sur le bouton [Add] (Ajouter) dans la boîte de dialogue [Part Feeding] pour ajouter la pièce n° 2. Configurez la pièce à l’aide de l’« assistant de pièces ».
    Veillez à sélectionner le robot n° 2 sur la première page de l’assistant de pièces.
  12. Accédez à la page [Calibration] (Étalonnage) et cliquez sur le bouton [Calibrate] (Étalonner) pour lancer l’assistant d’étalonnage.
  13. Accédez à la page [Pick] (Prélever) de la pièce n° 1 et cliquez sur le bouton [Teach] (Apprendre). Déplacez le robot n° 2 jusqu’à la hauteur de prélèvement de la pièce et apprenez la commande « Pick Z » (Prélever Z).
  14. Fermez la boîte de dialogue Part Feeding.
    Le code du modèle Part Feeding (c’est-à-dire, les fonctions de rappel Part Feeding) est créé automatiquement.
  15. Modifiez le code du modèle comme suit.

Main.prg

Function Main
    Robot 1
    Motor On
    Power High
    Speed 50
    Accel 50, 50
    Jump Park
    Robot 2
    Motor On
    Power High
    Speed 50
    Accel 50, 50
    Jump Park

    PF_Start 1, 2
Fend

PartFeeding.prg

Function PF_Robot(PartID As Integer) As Integer
    If PF_QueLen(PartID) > 0 Then
        Select PartID
            Case 1
                Robot 1
                P0 = PF_QueGet(1)
                PF_QueRemove (1)
                Jump P0 /R
                On rbt1Gripper
                Wait 0.25
                Jump Place
                Off rbt1Gripper
                Wait 0.25
                PF_ActivePart 2
            Case 2
                Robot 2
                P0 = PF_QueGet(2)
                PF_QueRemove (2)
                Jump P0 /L
                On rbt2Gripper
                Wait 0.25
                Jump Place
                Off rbt2Gripper
                Wait 0.25
                PF_ActivePart 1
        Send

    EndIf

    PF_Robot = PF_CALLBACK_SUCCESS

Fend

Nous allons maintenant modifier le code d’exemple afin que les mouvements du robot soient exécutés dans plusieurs tâches multiples distinctes. Lorsqu’un robot quitte le distributeur, l’autre robot peut commencer à se diriger vers celui-ci. Lorsque des robots partagent un distributeur à mouvement parallèle, il est essentiel d’utiliser les commandes PF_AccessFeeder et PF_ReleaseFeeder pour éviter toute collision entre les robots.
De plus, le code révisé permettra de traiter en parallèle les vibrations du distributeur et les mouvements du robot. Dans ce tutoriel, lorsque chaque robot a parcouru 80 % du trajet menant à sa position finale, il est sorti du champ de vision de la caméra et une image peut alors être acquise.
De plus, lorsque chaque robot a parcouru 80 % du trajet menant à sa position finale, l’autre robot peut se mettre en route en toute sécurité vers le distributeur. Bien sûr, ce n’est qu’un exemple. Le pourcentage réel de mouvement dépend de la vitesse et de la position relative des robots dans votre situation spécifique. Chaque robot dispose d’un point de « stationnement » et d’un point de « positionnement ». Dans ce tutoriel, le robot n° 1 prélève les pièces du distributeur avec son bras en position Droitier tandis que le robot n° 2 les prélève avec son bras en position Gaucher.
Voici le code révisé du modèle.

Main.prg

Function Main
    Robot 1
    Motor On
    Power High
    Speed 50
    Accel 50, 50
    Jump Park
    Robot 2
    Motor On
    Power High
    Speed 50
    Accel 50, 50
    Jump Park
    MemOff PartsToPick1
    MemOff PartsToPick2

    PF_Start 1, 2
    Xqt Robot1PickPlace
    Xqt Robot2PickPlace
Fend

Function Robot1PickPlace
    Robot 1
    Do
        Wait MemSw(PartsToPick1) = On
        PF_AccessFeeder 1
        P0 = PF_QueGet(1)
        PF_QueRemove (1)
        Jump P0 /R
        On rbt1Gripper
        Wait 0.25
        Jump Place ! D80; MemOff PartsToPick1; PF_ReleaseFeeder 1 !
        Off rbt1Gripper
        Wait 0.25
    Loop
Fend

Function Robot2PickPlace
    Robot 2
    Do
        Wait MemSw(PartsToPick2) = On
        PF_AccessFeeder 1
        P0 = PF_QueGet(2)
        PF_QueRemove (2)
        Jump P0 /L
        On rbt2Gripper
        Wait 0.25
        Jump Place ! D80; MemOff PartsToPick2; PF_ReleaseFeeder 1 !
        Off rbt2Gripper
        Wait 0.25
    Loop
Fend

PartFeeding.prg

Function PF_Robot(PartID As Integer) As Integer
    Select PartID
        Case 1
            If PF_QueLen(1) > 0 Then
                MemOn PartsToPick1
                Wait MemSw(PartsToPick1) = Off
                PF_ActivePart 2
            Else
                PF_ActivePart 1
            EndIf
        Case 2
            If PF_QueLen(2) > 0 Then
                MemOn PartsToPick2
                Wait MemSw(PartsToPick2) = Off
                PF_ActivePart 1
            Else
                PF_ActivePart 2
            EndIf
    Send
    PF_Robot = PF_CALLBACK_SUCCESS
Fend