• Nenhum resultado encontrado

7. Vamos usar a opção Part Feeding

8.3 Tutoriais

8.3.1 Tutorial 1: 1 Robô, 1 Alimentador, 2 Peças

Neste tutorial, há duas peças sendo trabalhadas no mesmo alimentador ao mesmo tempo. As peças são fisicamente diferentes. Peça 1 e peça 2 estão sendo usadas. Há uma câmera fixa voltada para baixo acima do alimentador. O robô apanhará e colocará duas unidades da peça 1 e então apanhará e colocará uma unidade da peça 2. Esta operação será executada continuamente em um loop. Cada peça será apanhada com um apanhador

Então vamos melhorar o rendimento do robô executando o movimento em uma multitarefa separada e processando em paralelo a vibração do alimentador.

(1) Crie um novo projeto no EPSON RC+. (2) Calibre a câmera fixa voltada para baixo.

(3) Pelo Vision Guide, crie a sequência Blob da peça. A “sequência Blob da peça” é usada para retroalimentação durante a calibração da peça e no tempo de execução para tomar a decisão sobre como melhor alimentar as peças. A sequência Blob da peça detecta peças individuais ou grumos de peças no tempo de execução. A sequência Blob da peça geralmente contém um objeto de visão Blob único. A sequência Blob da peça precisará ter a calibração da câmera determinada para a propriedade da calibração. A propriedade NumberToFind do objeto Blob deverá ser configurada para “All”. A propriedade ThresholdAuto do Blob deverá ser

configurada para False (valor padrão). Coloque as peças na plataforma, abra a janela Histogram e ajuste Threshold High e Low até que somente as peças sejam detectadas. Configure MinArea do Blob para aproximadamente 0,9 vezes a área da peça. Se a peça tiver múltiplos lados, então configure MinArea de modo que a peça possa ser encontrada em qualquer orientação. Você pode ter sequências Blob da peça separadas para cada uma das duas peças (sendo trabalhadas no alimentador), mas em geral pode usar a mesma sequência Blob da peça para todas as peças. Certifique-se de que a sequência Blob da peça pode detectar cada peça que será trabalhada no alimentador. A janela de procura do objeto Blob deverá cobrir tanto da área da plataforma quanto possível. Dito isto, é crítico que o objeto Blob encontre somente as peças e não a própria bandeja do alimentador. Se a sequência Blob da peça encontrar qualquer parte da bandeja então o sistema não funcionará corretamente.

(4) Pelo Vision Guide, crie a sequência de peça para cada uma das duas peças que serão trabalhadas no alimentador. Assegure-se de que foi configurada a propriedade Calibration para cada sequência. Normalmente um objeto, geométrico é usado para localizar a frente (e um segundo objeto geométrico é usado para localizar a traseira da peça, se for necessário o Flip). A propriedade NumberToFind do objeto de visão normalmente é configurada para “All”.

(5) Vá para a caixa de diálogo [Tools]-[Part Feeding] e adicione uma nova peça. O “Assistente de peça” o guiará através do processo de adicionar uma peça. Para mais detalhes sobre o assistente de peças, consulte o seguinte capítulo.

Introdução 7 “Vamos usar a opção Part Feeding”

(6) Vá para a página [Calibration] para a nova peça e clique no botão <Calibrate> para iniciar o assistente de calibração. Consulte a seção seguinte para detalhes de como usar o assistente de calibração.

(9) Vá para a página [Calibration] e clique no botão <Calibrate> para iniciar o assistente de calibração.

(10) Vá para a página [Pick] para a peça 2 e clique no botão <Teach>. Desloque o robô para a altura de coleta da peça e ensine “Pick Z”.

(11) Feche a caixa de diálogo de alimentação de peças. O código do modelo para alimentação de peças (isto é, a função callback da alimentação de peças) é criado automaticamente.

(12) Ensine ao robô os pontos para “estacionamento” e “colocação” e os etiquete respectivamente.

(13) Modifique o código do modelo como segue –

Main.prg Function Main Robot 1 Motor On Power High Speed 50 Accel 50, 50 Jump park PF_Start 2 Fend PartFeeding.prg

Global Integer numPicked ' número das peças que serão apanhadas Function PF_Robot(PartID As Integer) As Integer

Integer numRequired, gripperOutput Select PartID

Case 1

numRequired = 2 ' número das peças necessárias 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 .1 Jump place Off gripperOutput

Exit Function EndIf

Loop Until numPicked = numRequired numPicked = 0

' seleciona a próxima peça ativa If PartID = 1 then PF_ActivePart = 2 Else PF_ActivePart = 1 EndIf PF_Robot = PF_CALLBACK_SUCCESS Fend

Para o código da amostra mostrada acima, o alimentador vibrará (se necessário) somente após o robô ter completado o movimento para “colocação” e a função PF_Robot tiver sido concluída.

O código pode ser reestruturado de modo que a vibração do alimentador ocorra em paralelo com o movimento do robô. O callback da instrução PF_Robot será usado para notificar uma tarefa de movimento (a função Main neste exemplo) que estas peças estão disponíveis para serem apanhadas.

Memory IO (rotulada como “PartsToPick1” e “PartsToPick2”) são usadas para sinalizar quando a peça está disponível.

Quando a última peça disponível está sendo colocada (80% do percurso através do movimento para este exemplo), a tarefa de movimento sinaliza a função PF_Robot para concluir e retorna um valor. O valor retornado permite que o sistema saiba que ele está pronto para adquirir imagens novas, vibrar, suprir peças do depósito alimentador, etc… Iremos agora modificar nosso código tutorial de modo que a ação do alimentador possa ocorrer em paralelo com o movimento do robô.

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

Jump pick On gripper1 Wait .1

numPicked = numPicked + 1

If numPicked < numToPick1 And PF_QueLen(1) > 0 Then Jump place

Else

' Última peça ou nenhuma peça mais disponível para coleta If numPicked = numToPick1 Then

' Seleciona a próxima peça PF_ActivePart 2 EndIf

Jump place ! D80; MemOff PartsToPick1 ! EndIf

Off gripper1 Wait .1

Loop Until numPicked = numToPick1 numPicked = 0 Do Wait MemSw(PartsToPick2) = On pick = PF_QueGet(2) PF_QueRemove (2) Jump pick On gripper2 Wait .1 numPicked = numPicked + 1

If numPicked < numToPick2 And PF_QueLen(2) > 0 Then Jump place

Else

' Última peça ou nenhuma peça mais disponível para coleta If numPicked = numToPick2 Then

' Seleciona a próxima peça PF_ActivePart 1 EndIf

Jump place ! D80; MemOff PartsToPick2 ! EndIf

Off gripper2 Wait .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

Documentos relacionados