TG - Trabalho de Graduação
Autor: Jorge Florencio | Publicado: 2016-04-29T08:42:00-03:00







Atendendo a pedidos estou publicando nosso trabalho de conclusão de curso TG.







Devido a maneira de transferência a formatação do texto foi deslocada.












Universidade
Paulista



Instituto
de Ciências Exatas e Tecnologia



Graduação
em Engenharia de Controle e Automação.



















Esdras
Carlos Guimarães Netto



Ivan
dos Santos



Jorge
de Oliveira Florêncio



Marcelo
Gianetti



Paulo
Rogério Faria Machado



































Manipulação de braço mecânico pelo sensor kinect















































São
José dos Campos - SP



2012










Esdras
Carlos Guimarães Netto



Ivan
dos Santos



Jorge
de Oliveira Florêncio



Marcelo
Gianetti



Paulo
Rogério Faria Machado


&nbsp;


































Manipulação de braço mecânico pelo sensor kinect


&nbsp;


















Trabalho de
curso apresentado ao Instituto de Ciências Exatas e Tecnologia da Universidade
Paulista – UNIP, campus de São José dos Campos, como parte dos requisitos
necessários para a obtenção do título de Bacharel em Engenharia de Automação e
Controle, sob orientação do Prof.º Dr.
Ricardo Kazuo Itikava.































São
José dos Campos - SP



2012










Esdras
Carlos Guimarães Netto



Ivan
dos Santos



Jorge
de Oliveira Florêncio



Marcelo
Gianetti



Paulo
Rogério Faria Machado



















manipulação de braço mecânico pelo sensor kinect 















Trabalho de curso
apresentado ao Instituto de Ciências Exatas e Tecnologia da Universidade
Paulista – UNIP, campus de São José dos Campos, como parte dos requisitos
necessários para a obtenção do título de Bacharel em Engenharia de Automação e
Controle, sob orientação do Prof.º Dr. Ricardo
Kazuo Itikava.



















_______________________________________________________



Prof. Dr. Ricardo
Kazuo Itikava – Universidade Paulista







_______________________________________________________



Prof. Dr. Joares L.
dos Reis Junior – Universidade Paulista



















31 / 01 / 2013



Data da aprovação


















































































































Dedicamos
este trabalho aos professores que nos ajudaram de maneira eficaz na elaboração
deste projeto como os professores MSc. Luís Fernando F. Furtado e Dr. Ricardo
Kazuo Itikava, como também aos nossos familiares que nos apoiaram e fizeram o
máximo para nos auxiliar neste trabalho, embora ficássemos ausentes em
determinados momentos.









AGRADECIMENTOS






&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Não
poderíamos deixar de agradecer a Deus, pois sua fidelidade dura para sempre e
esteve nos abençoando, capacitando-nos de maneira que este projeto pudesse ser
realizado. Agradecemos também às pessoas que de maneira direta ou indiretamente
nos ajudaram para a elaboração e conclusão do desenvolvimento deste projeto. Em
especial ao nosso querido amigo Eloisio Campos que de maneira fundamental nos
auxiliou neste processo. As famílias dos componentes do grupo que nos apoiaram
em toda jornada ao longo do curso. Ao professor MSc. Luis Fernando F. Furtado
que nos ajudou e incentivou na elaboração da idéia principal do trabalho e ao
nosso professor orientador Dr. Ricardo Kazuo Itikava. Aos monitores da
universidade Jorge e Gustavo que a todo o momento estiveram dispostos a
facilitar nosso acesso às ferramentas e instrumentos da faculdade que foram
necessários para os ensaios e testes do projeto. A todos os que nos ajudaram
neste projeto, mencionados aqui ou não, recebam os nossos mais sinceros
agradecimentos. Deus os abençoe.










RESUMO







Este projeto tem como foco a
manipulação de um robô articulado da ABB com o auxílio do sensor Kinect da
Microsoft®, o qual irá fazer a identificação do movimento do braço humano e
transmitirá ao robô para que se faça o mesmo. Sendo realizado com linguagem de
programação C# paralelo ao estudo do kit de desenvolvimento do software do
Kinect (SDK), disponibilizado pela Microsoft®. Foram feitos estudos sobre
sensores, contendo assuntos relacionados aos tipos de sensores e suas
aplicações, estudos sobre as diversas classes de robôs, e as muitas linguagens
de programação. Este projeto também contempla testes e discussões sobre o
funcionamento e parâmetros. São abordadas as possibilidades de aplicações do
projeto como também os seus benefícios.







Palavras-chave:
Linguagem C#, Kinect, porta paralela, robô.









ABSTRACT










&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This
project focuses on the manipulation of an articulated robot of ABB through the
use of Kinect sensor from Microsoft®, which will identify the movement of a
human arm and will transmit the action to the robot do the same. Also this
project was made with program language C# including the study of the software
development kit (SDK) of Kinect, available by Microsoft®. Studies about sensors
were conducted with subjects like the many types of sensors and their
applications. This project also contains studies about the classification of
the robots and the various languages of programming that exists. It includes
tests and discussions on the operation and parameters that was used. The
possibilities and applications are mentioned in this project as also the
benefits.







Key words: Program language C#, Kinect, parallel port,
robot.

















Lista de
ilustrações






Figura 2.1 – Robô Cartesiano e
seu volume.............................................................................. 26




Figura 2.2 – Robô Cilíndrico e
seu volume............................................................................... 26




Figura 2.3 – Robô Esférico e seu
volume................................................................................. 27




Figura 2.4 – Robô SCARA e seu
volume................................................................................. 27




Figura 2.5 – Robô Articulado e
seu volume............................................................................. 28




Figura 3.1 – Diagrama em blocos
do sistema............................................................................ 29




Figura 3.2 – Configuração padrão
da porta paralela................................................................. 30




Figura 3.3 – Circuito de proteção
da porta paralela.................................................................. 32




Figura 3.4 – Fotoacoplador 4N25............................................................................................. 33




Figura 3.5 – Circuito final......................................................................................................... 34




Figura 3.6 – Configuração do
conector de entrada e saída digital do robô.............................. 35



Figura 3.7 – Lado da solda da
placa de fenolite....................................................................... 36




Figura 3.8 – Componentes da
interface de comunicação......................................................... 37




Figura 3.9 – Caixa plástica de
proteção do circuito.................................................................. 37




Figura 3.10 – Robô ABB IRC5 M2004................................................................................... 38




Figura 3.11 – Fluxograma de
algoritmo. Programação robô..................................................... 39




Figura 3.12 – Fluxograma geral do
algoritmo do robô............................................................. 43




Figura 3.13 – Tela
do software e seus respectivos campos de parâmetros............................... 45




Figura 3.14 – Tela
do software em seu pleno funcionamento.................................................. 46




Figura 4.1 – Ilustração
dos eixos no corpo humano.................................................................. 47




Figura 4.2 – Tela
de monitoramento de entradas e saídas digitais do robô ABB.................... 48




Figura 4.3 – Associação dos eixos............................................................................................ 51













Lista de tabelas







Tabela 3.1 – Tabela de pinagem da
porta paralela e função no sistema.................................... 31




Tabela 3.2 – Descrição dos pinos
do fotoacoplador 4N25....................................................... 33




Tabela 3.3 – Configuração da
porta DB25............................................................................... 35



Tabela 3.4 – Tabela verdade de
lógica de movimento do robô................................................ 40




Tabela 3.5 – Tabela verdade de
lógica reduzida....................................................................... 42












Lista de abreviaturas e siglas






LED&nbsp;&nbsp;&nbsp; Light
Emitting Diode



LPT1&nbsp;&nbsp; Line Print
Terminal 1



SDK&nbsp;&nbsp;&nbsp; Software
Development Kit













Lista de
símbolos






V: Volts



Vcc: Voltagem Corrente Contínua



A: Ampère



m: Metros



mm: Milímetros



mm/s: Milímetros por secundo



cm: Centímetros



Ω: Ohm

















sumário






1 &nbsp;introdução.................................................................................................................. 14



1.1
&nbsp;Objetivo do trabalho................................................................................................. 14



1.2
&nbsp;Justificativa do trabalho........................................................................................... 14



2
&nbsp;REVISÃO
BIBLIOGRÁFICA......................................................................................... 17



2.1
&nbsp;Linguagem de programação.................................................................................. 17



2.1.1&nbsp; Tipos de linguagem de programação mais
utilizados................................... 18



2.1.2&nbsp; Linguagem de programação utilizada no projeto......................................... 18



2.1.3&nbsp; Vantagens e desvantagens do C#................................................................ 18



2.1.4&nbsp; Estrutura do C#............................................................................................ 19



2.2
&nbsp;Sensores................................................................................................................... 19



2.2.1&nbsp; Sensores de presença.................................................................................... 21



2.2.2&nbsp; Sensores de posição..................................................................................... 21



2.2.3&nbsp; Sensores de velocidade................................................................................ 22



2.2.4&nbsp; Sensores de aceleração................................................................................. 22



2.2.5&nbsp; Sensores de temperatura.............................................................................. 22



2.2.6&nbsp; Sensores de pressão...................................................................................... 23



2.2.7&nbsp; Sensores de nível.......................................................................................... 23



2.2.8&nbsp; Sensores de vazão........................................................................................ 23



2.2.9&nbsp; Sensores de tensão, corrente e potência....................................................... 24



2.2.10&nbsp; Sensores de umidade, gases e pH.............................................................. 24



2.3
&nbsp;Robótica................................................................................................................... 25



2.3.1&nbsp; Classificação................................................................................................ 25



3&nbsp; desenvolvimento.................................................................................................... 29



3.1&nbsp; Descrição
do projeto................................................................................................. 29



3.2&nbsp; Desenvolvimento
da interface eletrônica................................................................. 29



3.3&nbsp; Programação
do Robô IRC5 M2004........................................................................ 38



3.4&nbsp; Software
de parametrização..................................................................................... 44











4&nbsp; TESTES E DISCUSSÕES................................................................................................. 47



4.1&nbsp; Testes dos sinais digitais recebidos pelo robô IRC5 M2004 da ABB................. 47



4.1.1&nbsp; Teste dos sinais digitais referentes ao eixo X.............................................. 47



4.1.2&nbsp; Teste dos sinais digitais referentes ao eixo Y.............................................. 49



4.1.3&nbsp; Teste dos sinais digitais referentes ao eixo Z............................................... 49



4.2&nbsp; Testes dos movimentos integrados (operador e robô).......................................... 49



4.2.1&nbsp; Teste do sensor de movimento para operação com robô
(Kinect)............... 49



4.2.2&nbsp; Teste de deslocamento do braço robótico (Robô)....................................... 50



4.2.2.1
Teste de inversão do eixo (Robô).......................................................... 50



4.2.2.2&nbsp; Teste de substituição de coordenadas.................................................. 50



4.2.3&nbsp; Teste de funcionamento da interface de comunicação................................ 51







5&nbsp; conclusão.................................................................................................................... 52



5.1&nbsp; Sugestões de melhorias........................................................................................... 53



REFERÊNCIAS..................................................................................................................... 54



ANEXO
A – Datasheet do CI 4N25...................................................................................... 56



APÊNDICE
A – Programação da manipulação do robô em C#........................................ 61



APÊNDICE
B – Programação do robô em RAPID............................................................ 67

























1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INTRODUÇÃO

&nbsp;


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A humanidade, desde os
primórdios, utilizou-se de métodos que melhorassem os serviços, fosse através
de animais ou de ferramentas. A partir do século XVIII, iniciou-se a
mecanização industrial, desviando a acumulação de capitais, até então da
atividade comercial, para o setor de produção, implantando definitivamente o
modo de produção capitalista. Este processo de transformação ficou conhecido
como Revolução Industrial (VICENTINO, 2002, p. 288). Desde então, com o
decorrer do tempo, através de estudos, idéias foram sendo desenvolvidas,
gerando cada vez mais o aperfeiçoamento de ferramentas, máquinas e serviços que
trouxessem maior produção e qualidade na realização de tarefas e obtenção de
produtos.



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Conforme ROSÁRIO, 2005, a idéia de
construir robôs começou a tomar força no inicio do século XX com a necessidade
de aumentar ainda mais a produtividade industrial e melhorar a qualidade dos
produtos. Porém, com o objetivo de substituir o homem em tarefas que ele não
podia realizar, as quais envolviam condições desagradáveis, tipicamente com
altos níveis de calor, ruídos, gases tóxicos, esforço físico extremo, trabalhos
tediosos e monótonos, só no inicio dos anos 60, os primeiros robôs começaram a
ser usados.

&nbsp;


1.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OBJETIVO

&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Este trabalho tem como principal objetivo, fazer a manipulação de um braço mecânico através do sensor Kinect, oferecendo mais uma opção de controle para movimentação. Sendo que esta manipulação se dará de forma intuitiva, não necessitando de um treinamento prévio e nenhuma bagagem de conhecimento específico para manipulação.
&nbsp;


1.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JUSTIFICATIVA

&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O desenvolvimento e estudo deste projeto, manipulação robótica através do sensor Kinect, fora escolhido por tratar de assuntos atuais, pertinentes às condições de trabalho e constante progressão de tecnologias e pesquisas. Vale ressaltar que este projeto também aborda os princípios básicos da engenharia mecatrônica: mecânica, eletrônica, programação e controle.
Na sociedade atual, é crescente a necessidade de realizar tarefas com eficiência e precisão. Existem também tarefas a serem levadas a cabo em lugares em que a ação humana é difícil, arriscada e até mesmo impossível, como no fundo do mar ou em meio à imensidão do espaço. Para executá-las faz-se necessária a presença de dispositivos mecatrônicos (robôs), que realizam sem risco de vida. (ROSÁRIO, 2005, p. 142).
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Desde seu surgimento, o Kinect da Microsoft tem atraído muitos hackers e desenvolvedores para criar diferentes adaptações para o acessório. Idéias das mais diversas têm aparecido, como a aplicação do aparelho em estoques de lojas onde se torne possível mapear a movimentação dos produtos mais consumidos, resultando numa organização mais inteligente e eficiente (IGLESIAS, 2012). Inclusive a NASA se utilizou do sensor para suas pesquisas:
Doze olhos, seis pernas e uma enorme lista de funcionalidades. O novo robô da&nbsp;NASA&nbsp;é um verdadeiro “atleta”. O All-Terrain Hex-Limbed Extra-Terrestrial Explorer foi desenvolvido para explorar os locais de mais difícil acesso, como a Lua, Marte e até mesmo asteroides. Ele pode andar, escalar, pular… E o mais curioso: ser controlado por um humano à distância pelo sistema de reconhecimento de movimentos utilizado pela Microsoft no Xbox 360, o&nbsp;Kinect. (JESUS, 2012).
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Outra empresa que soube fazer outra aplicação do Kinect foi a Meka Robotics, que lançou em fevereiro de 2011, o Meka M1 Mobile Manipulator, “robô humanoide equipado com dois braços articulados e a cabeça que contém um sensor Kinect”, que reconhece os movimentos do corpo (NETO, 2011).
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Visto que é possível a implantação do sensor Kinect a um robô, teve início uma série de pesquisas que abordassem áreas de possíveis aplicações do projeto. Concluiu-se então, que as áreas de maior aplicação seriam aquelas em que fosse necessária certa destreza na realização de tarefas em locais que apresentassem perigo à vida do homem, ou fossem de difícil acesso.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Uma dessas áreas onde seria possível a utilização do projeto são as usinas nucleares. Como a radiação não é sentida nem vista pelas pessoas, elas perdem o medo e aí é que começam os problemas de contaminação e irradiação. Os efeitos de contaminação pela radiação podem causar indução ao câncer em vários órgãos do corpo, como também a formação de catarata, sem falar dos efeitos hereditários. (OKUNO, 2007).
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Neste ambiente de trabalho, muitas precauções são tomadas a fim de diminuir os riscos e seqüelas causadas por exposição externa e contaminação interna.
Todos devem tomar muita precaução ao lidar com radiação, principalmente os trabalhadores, para limitar os riscos e prevenir acidentes.
Para evitar a contaminação interna, as seguintes precauções devem ser tomadas pelos trabalhadores com radiação:
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Usar máscaras para não inalar gases radioativos;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Não pipetar com a boca, não colocar dedos na boca, e não fumar nos locais de trabalho;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Lavar as mãos sempre que necessário, com água abundante e sabonete;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Utilizar luvas e roupas especiais, pois alguns produtos podem ser absorvidos pelo organismo através da pele.
Para diminuir exposições externas, três fatores devem ser levados em consideração:
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Permanecer o tempo mínimo possível próximo à fonte de radiação;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Trabalhar à máxima distância possível da fonte;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Usar blindagens adequadas, para atenuar a radiação ao máximo. (OKUNO, 2007, p.34).
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Outros ambientes que exigem uma manipulação adequada, que impõe grande risco para o executante da tarefa ou são de difíceis acessos são: o desarmamento de bombas, exploração do espaço como Lua e Marte, exploração e coleta de dados do fundo do mar para pesquisas.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logo, com a criação deste projeto, tornar-se-á mais e seguro a realização das tarefas até aqui mencionadas, pois poderão ser realizadas a longas distâncias, não necessitando de estudos aprofundados na utilização do robô, mas sim da tarefa a ser feita.











2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REVISÃO BIBLIOGRÁFICA

&nbsp;


2.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Linguagem de Programação

&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Desde o inicio da existência do homem ele tem procurado criar maquinas que o auxiliem em seus trabalhos, diminuindo esforços e economizando tempo. Dentre essas máquinas, o computador tem se mostrado uma das mais versáteis, rápidas e seguras.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A finalidade de um computador é receber, manipular armazenar e imprimir dados. Composto de apenas dois universos que trabalham em conjunto hardware e software. Onde hardware consiste em todas as partes físicas da maquina, e software consiste em todo universo de programação.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Quando queremos escrever um software para realizar um determinado tipo de processamento de dados, devemos escrever um programa ou vários programas interligados. Para o computador compreender e executar esse programa, o método utilizado deve ser uma linguagem que o computador entenda (ASCENCIO, 2002). Essa linguagem é chamada de linguagem de programação.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Principais etapas para o desenvolvimento de um programa:
<!--[if !supportLists]-->ü&nbsp; <!--[endif]-->Análise – estuda e define os dados de entrada, o processamento e os dados de saída.
<!--[if !supportLists]-->ü&nbsp; <!--[endif]-->Algoritmo – ferramentas do tipo, descrição narrativa, fluxograma ou português estruturado, para descrever o problema com soluções.
<!--[if !supportLists]-->ü&nbsp; <!--[endif]-->Codificação – algoritmo transformado em código da linguagem de programação escolhida para trabalhar.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Portanto, um programa é a codificação de um algoritmo em uma determinada linguagem de programação (ASCENCIO, 1999).
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; “Algoritmo é a seqüência de passos que visa atingir um objetivo bem definido” (FORBELLONE, 1999).
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; “Algoritmo é a descrição de uma seqüência de passos que deve ser seguida para a realização de uma tarefa” (ASCENCIO, 1999).
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Analisando as definições anteriores podemos observar que executamos no dia-a-dia vários algoritmos, como se pode observar no exemplo abaixo:
SOMATÓRIA DE TRÊS NUMEROS
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Passo 1 – Receber os três números.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Passo 2 – Somar os três números.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Passo 3 – Mostrar o resultado obtido.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As primeiras linguagens de programação foram as linguagens de máquinas e as linguagens ASSEMBLY dos primeiros computadores, começando na década de 1940. Centenas de linguagens de programação e dialetos foram desenvolvidos desde então. A maioria teve tempo de vida e utilidades limitadas, enquanto algumas tiveram amplo sucesso e um ou mais domínios de aplicação. Muitas desenvolveram um papel importante na influencia sobre o projeto de futuras linguagens.
&nbsp;


2.1.1&nbsp;&nbsp;&nbsp; Tipos de Linguagem de Programação mais
utilizados

&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O índice TIOBE (programming community índex), analisou as linguagens de programação mais utilizadas e listou as vinte principais, são elas:
&nbsp;







<!--[if !supportLists]-->Ø&nbsp; <!--[endif]-->C
<!--[if !supportLists]-->Ø&nbsp; <!--[endif]-->Java
<!--[if !supportLists]-->Ø&nbsp; <!--[endif]-->Objective-C
<!--[if !supportLists]-->Ø&nbsp; <!--[endif]-->C++
<!--[if !supportLists]-->Ø&nbsp; <!--[endif]-->C#
<!--[if !supportLists]-->Ø&nbsp; <!--[endif]-->Visual Basic
<!--[if !supportLists]-->Ø&nbsp; <!--[endif]-->PHP
<!--[if !supportLists]-->Ø&nbsp; <!--[endif]-->Python
<!--[if !supportLists]-->Ø&nbsp; <!--[endif]-->Perl
<!--[if !supportLists]-->Ø&nbsp; <!--[endif]-->Ruby
<!--[if !supportLists]-->Ø&nbsp; <!--[endif]-->JavaScript
<!--[if !supportLists]-->Ø&nbsp; <!--[endif]-->Delphi/Object Pascal
<!--[if !supportLists]-->Ø&nbsp; <!--[endif]-->Lisp
<!--[if !supportLists]-->Ø&nbsp; <!--[endif]-->Transact-SQL
<!--[if !supportLists]-->Ø&nbsp; <!--[endif]-->Visual Basic.NET
<!--[if !supportLists]-->Ø&nbsp; <!--[endif]-->Pascal
<!--[if !supportLists]-->Ø&nbsp; <!--[endif]-->Ada
<!--[if !supportLists]-->Ø&nbsp; <!--[endif]-->Lua
<!--[if !supportLists]-->Ø&nbsp; <!--[endif]-->PL/SQL
<!--[if !supportLists]-->Ø&nbsp; <!--[endif]-->MatLab







&nbsp;


2.1.2&nbsp;&nbsp;&nbsp; Linguagem de Programação Utilizada no
Projeto

&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Este projeto está sendo desenvolvido principalmente com a Linguagem C#, pois essa linguagem de programação foi utilizada para desenvolver os aplicativos do Sensor Kinect que foi disponibilizado pela Microsoft®.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 


2.1.3&nbsp;&nbsp;&nbsp; Vantagens e desvantagens do C#

&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Vantagens do C#:
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Maior interatividade com os internautas.
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Recursos do ambiente Windows.
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Programação orientada a objeto.
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Não é preciso registrar componentes.
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Uso de eventos nos controles.
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Validação de dados.
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Manipular banco de dados desconectados.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
Desvantagem do C#:
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Os programas e componentes antigos devem ser reescritos.
&nbsp;


2.1.4&nbsp;&nbsp;&nbsp; Estrutura do C#

&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Um código criado em C# deve ser compilado e com isso será gerado um arquivo com extensão DLL ou EXE. Para rodá-lo, é invocado o runtime do NET e quando é feita uma solicitação a esse arquivo, é carregado para memória um código IL (Intermediate Language) que é compilado em tempo de execução para o computador que o solicitou. (RENATO HADDAD, 2001).
&nbsp;


2.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sensores

&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sensores são dispositivos sensíveis a alguma forma de energia podendo ser de origem variada como: luminosa, térmica, cinética; onde se relaciona com uma grandeza física que precisa ser medida como: pressão, temperatura, velocidade, posição etc. Sendo utilizados como medidores, indicadores, registradores, controladores ou alarmes. (THOMAZINI &amp; ALBUQUERQUE, 2011).
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Existem duas origens para os sensores: analógicas ou digitais. Sensores analógicos podem assumir qualquer valor no seu sinal de saída ao longo do tempo, sendo mensuradas através de elementos sensíveis com circuitos não digitais. Já os sensores digitais, assumem apenas dois valores no seu sinal de saída ao longo do tempo, interpretados como zero ou um, sendo mostrados ao sistema de controle após serem convertidos pelo circuito eletrônico do transdutor.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transdutores são os encarregados de transformar uma grandeza física em um sinal de tensão ou corrente que pode ser facilmente interpretado por um sistema de controle. No caso, o transdutor é o instrumento completo que engloba sensor e todos os circuitos de interface. (THOMAZINI &amp; ALBUQUERQUE, 2011).
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Atualmente há vários tipos de sensores, sendo divididos em alguns grupos como:
&nbsp;







<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Sensores de presença;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Sensores de posição;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Sensores de velocidade;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Sensores de aceleração;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Sensores de temperatura;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Sensores de pressão;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Sensores de nível;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Sensores de vazão;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Sensores de Tensão, Corrente e Potência;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Sensores de Umidade, Gases e pH.








2.2.1&nbsp;&nbsp;&nbsp; Sensores de Presença

&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; São componentes eletrônicos de sinalização que detectam qualquer material sem que haja contato mecânico entre eles.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Os tipos existentes e mais conhecidos são os sensores ópticos, ópticos por retrorreflexão, ópticos por transmissão, ópticos por reflexão difusa, cabos de fibra óptica, sensores infravermelhos ativos e passivos, janelas de luz, barreiras ultrassônicas e laser. (THOMAZINI &amp; ALBUQUERQUE, 2011).
&nbsp;


2.2.2&nbsp;&nbsp;&nbsp; Sensores de Posição

&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; São utilizados em várias aplicações onde a precisão e a sensibilidade do instrumento devem ser ajustadas conforme o tipo de operação. São de muita importância na fabricação de máquinas de ferramentas, na produção de peças de precisão como, por exemplo, de um micrômetro, onde é necessário definir a posição da ferramenta de corte. (THOMAZINI &amp; ALBUQUERQUE, 2011).
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Alguns tipos de sensores de posição são:
&nbsp;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Sensores de proximidade indutivos;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Sensores de proximidade capacitivos;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Sensores de proximidade magnéticos;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Transformador linear diferencial variável (LVDT);
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->LVDT com enrolamento aberto;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->LVDT com enrolamento proporcional;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Transformador diferencial rotacional variável (RVDT);
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Sensores potenciométricos;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Encoders;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Sensor incremental linear magnético;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Ultrassônicos.
&nbsp;
&nbsp;
&nbsp;


2.2.3&nbsp;&nbsp;&nbsp; Sensores de Velocidade

&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Estes são mais usados em leitores de CD-ROM, DVD players, bombas centrífugas, medidores de fluxo de líquidos, robótica, máquinas automáticas de soldagem etc. E são importantes para segurança do trabalho e controle do processo produtivo.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dínamo taqueométrico (tacogerador), tacômetro de indução, bobina pick-up, acoplador óptico e fotoacoplador são alguns dos sensores de velocidade utilizados atualmente. (THOMAZINI &amp; ALBUQUERQUE, 2011).
&nbsp;


2.2.4&nbsp;&nbsp;&nbsp; Sensores de Aceleração

&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Os sensores de aceleração (acelerômetro e giroscópios) são utilizados para monitorar as mudanças na velocidade devido à choques, vibrações ou impactos. Podem ser também utilizados para medir o ângulo da lança de guindastes, o ângulo de inclinação em maquinário de construção de estradas e em estudos de desvio de furos e de sondagem, como também em sistema de guia de navios, aviões, satélites etc. A aceleração vem convertida através de uma relação de uma massa vinculada a um meio viscoso em conjunto com um sensor de posição.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Alguns sensores de aceleração são os acelerômetros de deslocamento, deformação e acelerômetros a balanço de força. (THOMAZINI &amp; ALBUQUERQUE, 2011).
&nbsp;


2.2.5&nbsp;&nbsp;&nbsp; Sensores de Temperatura

&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; São sensores sensíveis a qualquer mudança de temperatura e são os sensores mais utilizados atualmente, desde indústrias, eletrodomésticos até em instalações prediais.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Os sensores deste tipo que são mais conhecidos são:
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Termistores;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Termopares;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Termorresistência;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Par bimetálico;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Pirômetros;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Termopilhas.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; No entanto, diferente dos outros sensores de temperatura, os pirômetros usam radiação de um corpo para medir a temperatura sem haver contato entre o sensor e o corpo. (THOMAZINI &amp; ALBUQUERQUE, 2011).
&nbsp;


2.2.6&nbsp;&nbsp;&nbsp; Sensores de Pressão

&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Estruturas metálicas planejadas para suportarem o recebimento de esforços e se deformar. Apesar de a deformação ser pequena, isso já seria o suficiente para gerar um sinal de saída compatível à carga aplicada.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Células de carga, transdutor de pressão piezoelétrico, tubos de Bourdon, são alguns dos sensores de pressão existentes. (THOMAZINI &amp; ALBUQUERQUE, 2011).
&nbsp;


2.2.7&nbsp;&nbsp;&nbsp; Sensores de Nível

&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Estes sensores são utilizados para o controle de líquidos ou grãos sólidos, que são depositados em reservatórios, tanques pressurizados, abertos ou em silos, detectando um nível fixo ou na medição contínua.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Os tipos de sensores de nível mais usados são: flutuadores, chave de nível boia, chave de nível diafragma, eletrodos metálicos, pressão hidrostática, detecção de nível vibratório (piezoelétrico), medição de nível laser, radar, radioativos, strain-gages, ultrassônico, alfassônico, pás rotativas, medidor por borbulhamento. (THOMAZINI &amp; ALBUQUERQUE, 2011).
&nbsp;


2.2.8&nbsp;&nbsp;&nbsp; Sensores de Vazão

&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; São sensores que medem a quantidade de líquidos, gases ou vapores que passam por um determinado ponto, durante um determinado período.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O medidor de vazão mais utilizado, devido a sua simplicidade, custo e fácil manutenção é o de pressão diferencial.&nbsp; 
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Outros tipos de medidores existentes são:
&nbsp;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Placa de orifício;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Tubo de Venturi;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Bocal;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Tubo de Pilot;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Rotâmetros;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Turbina;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Acoplamento magnético;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Ultrassônico;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Efeito de Coriolis;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Medidor de vazão Vortex;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Engrenagens ovais.
&nbsp;


2.2.9&nbsp;&nbsp;&nbsp; Sensores de Tensão, Corrente e Potência

&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; São sensores utilizados para medir grandezas elétricas com aplicações em indústrias e prédios.
&nbsp;


2.2.10&nbsp; Sensores de Umidade, Gases e pH

&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Os sensores de umidade são utilizados para a medição da quantidade da umidade no ambiente, e são de suma importância em algumas áreas, pois o excesso de umidade pode influenciar química, física ou biologicamente nos processos. Os setores de utilização destes instrumentos são muito abrangentes, podendo ser utilizados em indústrias de fumo, setores alimentícios, indústrias cerâmicas, produtos farmacêuticos, controle de poluição, conforto pessoal etc.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Alguns dos métodos para medição de umidade são:
&nbsp;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Bulbo úmido/bulbo seco (psicrométricas);
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Ponto de orvalho do tipo de sal saturado;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Sensores elétricos de umidade relativa;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Sensor de óxido de alumínio;
<!--[if !supportLists]-->·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Higrômetro eletrolítico.
&nbsp;
&nbsp;
&nbsp;


2.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Robótica

&nbsp;


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A partir da máquina a vapor
desenvolvida por James Watt em 1769, houve um acentuado progresso em termos de
automação de processos produtivos. A produção industrial em larga escala e os
meios de transporte revolucionaram social e economicamente as relações humanas.
Até meados do século XX, o processo de produção foi baseado no emprego de
máquinas projetadas especificamente para a fabricação em série de produtos de
uma mesma característica, visando uma elevada produtividade, volume e
qualidade. Este modelo é denominado automação rígida e foi bastante difundido
pelo empresário Henry Ford no início do século.



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O avanço tecnológico das últimas
décadas teve reflexo direto na organização das indústrias, as quais buscam
minimizar seus custos industriais através da adoção de diversos modelos de
produção. Neste contexto, destacam-se a automação programável, relativa à
fabricação em série de pequenos e médios lotes de produtos, e a automação
flexível, referida à fabricação de lotes variáveis de produtos diversos.



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Os robôs industriais têm sido muito
utilizados nos processos de automação programável e flexível, pois são
essencialmente máquinas capazes de realizar os mais diversos movimentos
programados, adaptando-se às necessidades operacionais de determinadas tarefas
e empregando garras e/ou ferramentas oportunamente selecionadas.

&nbsp;


2.3.1&nbsp;&nbsp;&nbsp; Classificação

&nbsp;


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Diversas combinações de elementos
(juntas e elos) podem ser realizadas para se obter uma configuração desejada.
De acordo com a Federação Internacional de Robótica (International Federation
of Robotics - IFR), as principais configurações básicas quanto à estrutura
mecânica com base nos três primeiros graus de liberdade (a contar da base) -
onde R significa junta rotativa e P significa junta prismática - são as seguintes
(SCHIAVICCO, SICILIANO, 1995).





















&nbsp;
<!--[if !supportLists]-->&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; I.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Cartesiano (PPP)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Este tipo de robô possui três juntas prismáticas, resultando num movimento composto de três translações, cujos eixos de movimento são coincidentes com um sistema de coordenadas de referência cartesiano. O volume de trabalho gerado é retangular conforme é representado na figura 2.1.




 

 

  

  

  

  

  

  

  

  

  

  

  

  

 

 

 



 

Figura 2.1 – Robô Cartesiano e seu volume de trabalho.
<!--[if !supportLists]-->&nbsp;&nbsp;&nbsp; II.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Cilíndrico (RPP)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Nesta configuração, os eixos de movimento podem ser descritos no sistema de coordenadas de referência cilíndrica. É formado por duas juntas prismáticas e uma de rotação, compondo movimentos de duas translações e uma rotação. Neste caso, o volume de trabalho gerado é cilíndrico conforme figura 2.2.




 

Figura 2.2 – Robô Cilíndrico e seu volume de trabalho.
<!--[if !supportLists]--> III.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Esférico (RRP)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Neste tipo de robô os eixos de movimento formam um sistema de coordenadas de referência polar, através de uma junta prismática e duas rotações. Para esta configuração, o volume de trabalho gerado é aproximadamente uma esfera, vide figura 2.3 abaixo.




 

Figura 2.3 – Robô Esférico e seu volume de trabalho.
<!--[if !supportLists]--> IV.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->SCARA (RRP)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; É um robô que apresenta duas juntas de rotação dispostas em paralelo para se ter movimento num plano e uma junta prismática perpendicular a este plano, apresentando, portanto uma translação e duas rotações. O SCARA é muito empregado em tarefas de montagem de componentes de pequenas dimensões, como placas de circuitos eletrônicos. O volume de trabalho gerado por este tipo de robô é de aproximadamente cilíndrico como mostra a figura 2.4.




 

Figura 2.4 – Robô SCARA e seu volume de trabalho.
<!--[if !supportLists]-->&nbsp;&nbsp;&nbsp; V.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->Articulado (RRR)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Nesta configuração, existem ao menos três juntas de rotação. O eixo de movimento de junta de rotação da base é ortogonal às outras duas juntas de rotação que são simétricas entre si. Este tipo de configuração é o que permite maior mobilidade aos robôs. Seu volume de trabalho apresenta uma geometria mais complexa em relação às outras configurações, demonstrado na figura 2.5 a seguir.




 

Figura 2.5 – Robô Articulado e seu volume de trabalho.











3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DESENVOLVIMENTO







3.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Descrição do Projeto



Foi
integrado um sistema de comunicação entre o sensor de movimento Kinect e o
sistema de controle do robô IRC5 M2004 da ABB. Esta comunicação contempla um
software dedicado para um microcomputador, uma placa eletrônica de interface e
um software dedicado para o robô.



Basicamente
a integração é constituída por quatro partes: o sensor de movimento que detecta
as entradas de comando pelo operador, o software de compreensão dos dados enviados
pelo sensor, uma interface eletrônica que transmite em forma de sinal elétrico
os resultados dos comandos e por fim o robô que por sua vez, recebe as
informações e as compila transformando estes comandos em movimentos físicos. O
diagrama a seguir ilustra esta integração figura 3.1.



 



Figura 3.<!--[if supportFields]><span
style='font-size:12.0pt;font-family:"Times New Roman","serif";color:windowtext;
font-weight:normal;mso-bidi-font-weight:bold'>
SEQ Figura \* ARABIC <![endif]-->1<!--[if supportFields]><span
style='font-size:12.0pt;font-family:"Times New Roman","serif";color:windowtext;
font-weight:normal;mso-bidi-font-weight:bold'><![endif]--> - Diagrama em blocos do sistema.







3.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Desenvolvimento da Interface Eletrônica.



Para
que os dados processados pelo microcomputador fossem enviados para um ambiente
externo, foi utilizada a porta paralela LPT1 do computador. Os pinos da porta
paralela são acionados individualmente bit a bit através do software dedicado
de manipulação de dados do sensor de movimento.



A porta
paralela do computador tem uma configuração padrão que determinam quais dos
pinos podem ser utilizados como entradas ou saídas, convencionando cada projeto
e viabilizando o desenvolvimento de circuitos direcionados a cada necessidade.



A
figura 3.2 a seguir, demontra as configurações de entradas e saídas da porta
paralela do computador.



 



Figura 3.<!--[if supportFields]><span
style='font-size:12.0pt;font-family:"Times New Roman","serif";color:windowtext;
font-weight:normal;mso-bidi-font-weight:bold'>
SEQ Figura \* ARABIC <![endif]-->2<!--[if supportFields]><span
style='font-size:12.0pt;font-family:"Times New Roman","serif";color:windowtext;
font-weight:normal;mso-bidi-font-weight:bold'><![endif]--> – Configuração padrão da porta
paralela.



Nesta
aplicação só foram utilizados os pinos de saída para transmitir os sinais
elétricos para as entradas do robô. Os pinos de saída da porta paralela,
enquanto não são ativados, encontram-se em nível lógico 0 (zero) ou “falso”, e
isto implica em um sinal elétrico de 0 Vcc. Quando o pino é ativado via
software, o mesmo é alterado para nível lógico 1 (um) ou “verdadeiro”, que
aplica uma baixa tensão de corrente continua de 5 Vcc neste mesmo pino.



Foi
definida uma coordenação de movimento cartesiano nos eixos X, Y e Z para cada
pino de saída da porta paralela. Estas saídas serão responsáveis por indicar ao
robô qual movimento fazer. A tabela 3.1 ilustra cada pino e sua respectiva
função.











Tabela 3.<!--[if supportFields]><span
style='font-size:12.0pt;font-family:"Times New Roman","serif";color:windowtext;
font-weight:normal;mso-bidi-font-weight:bold'>
SEQ Tabela \* ARABIC <![endif]-->1<!--[if supportFields]><span
style='font-size:12.0pt;font-family:"Times New Roman","serif";color:windowtext;
font-weight:normal;mso-bidi-font-weight:bold'><![endif]--> - Tabela de pinagem da porta
paralela e função no sistema.


 

  
NÚMERO
  PINO PORTA PARALELA

  
FUNÇÃO
  PARA MOVIMENTO DO ROBÔ

  


 

  
PINO 2

  
INCREMENTA MOVIMENTO EM “X” (X+)

 

  
PINO 3

  
DECREMENTA MOVIMENTO EM “X” (X-)

 

  
PINO 4

  
INCREMENTA MOVIMENTO EM “Y” (Y+)

 

  
PINO 5

  
DECREMENTA MOVIMENTO EM “Y” (Y-)

 

  
PINO 6

  
INCREMENTA MOVIMENTO EM “Z” (Z+)

 

  
PINO 7

  
DECREMENTA MOVIMENTO EM “Z” (Z-)

 

  
PINO 8

  
ACIONA GARRA

 




A porta
paralela fornece o sinal de 5 Vcc à cada pino que for ativado de acordo com o
software do microcomputador. Apesar de fornecer uma tensão de saída na porta
paralela, esta tensão não tem potência suficiente para acionar diretamente
outros dispositivos. 



Inicialmente
havia sido feito um circuito de drive que protegia a porta de eventuais curtos
e correntes reversas. A figura 3.3 demonstra um circuito de teste feito para
transformar o sinal de tensão da porta paralela em um sinal isolado de 5 Vcc
com potência suficiente para acionar dispositivos externos e proteger a porta
do computador.



 



Figura <!--[if supportFields]><span
style='font-size:12.0pt;font-family:"Times New Roman","serif";color:windowtext;
font-weight:normal;mso-bidi-font-weight:bold'><span
style='mso-spacerun:yes'> SEQ Figura \* ARABIC <span style='mso-element:
field-separator'><![endif]-->3<!--[if supportFields]><span
style='font-size:12.0pt;font-family:"Times New Roman","serif";color:windowtext;
font-weight:normal;mso-bidi-font-weight:bold'><![endif]-->.3 - Circuito de proteção da
porta paralela.



Utilizando-se
de um circuito integrado CI74LS541 e uma fonte externa de 5Vcc-2A para proteger
a porta paralela de altas correntes. As entradas do robô, as quais seriam enviadas
os sinais de movimento, entenderiam apenas como nível lógico 1 (um), níveis de
tensões elétricas de 24Vcc. Porém, tomando por base que neste processo o robô
não envia corrente reserva por estar em serie com um CI4N25, não se fez
necessário manter este circuito de proteção da porta paralela. Além disso,
neste circuito de proteção foi observado que estava invertendo o nível lógico
da saída, portanto foi eliminado totalmente do projeto da interface de
comunicação.



Por
esse motivo, foi adicionado um circuito com fotoacopladores (fabricados pela
empresa LITEON) do tipo 4N25 responsáveis por chavear o sinal de 24Vcc
fornecido pelo próprio robô e enviá-los para as entradas com a tensão correta,
utilizando-se também de LEDs em série para simples indicação visual de passagem
de corrente.



O
circuito de proteção envia o sinal de 5Vcc de acordo com o pino ativado para o
pino 1 do fotoacoplador, este pino energiza um LED interno de um fototransistor
que por sua vez,&nbsp; funciona como uma chave
enviando o sinal pelos pinos 4 e 5 do 4N25. A figura 3.4 ilustra o
fotoacoplador eletrônico.







 



Figura 3.<!--[if supportFields]><span
style='font-size:12.0pt;font-family:"Times New Roman","serif";color:windowtext;
font-weight:normal;mso-bidi-font-weight:bold'>
SEQ Figura \* ARABIC <![endif]-->4<!--[if supportFields]><span
style='font-size:12.0pt;font-family:"Times New Roman","serif";color:windowtext;
font-weight:normal;mso-bidi-font-weight:bold'><![endif]--> - Fotoacoplador 4N25.



A
seguir, a tabela 3.2 descreve os pinos do fotoacoplador e suas referências.



Tabela 3.2 - Descrição dos pinos
do fotoacoplador 4N25. 



 

  
PINO

  
NÚMERO CORRESPONDENTE

  
FUNÇÃO UTILIZADA

 

  
A

  
1

  
Entrada de 5V

 

  
B

  
6

  
Não utilizado

 

  
C

  
2 e 5

  
(2)
  Aterramento

(5)
  Entrada de 24V

 

  
NC

  
3

  
Não utilizado

 

  
E

  
4

  
Saída de 24V

 




Assim,
foi possível confeccionar uma placa de interface para acionar as entradas do
robô. 



Foi
utilizado um resistor de 330Ω em série com um LED entrando diretamente no pino
1 do fotoacoplador. Uma fonte de 24V fornecida pelo próprio robô, na entrada do
pino 5 e a saída (pino 4) para o pino de entrada do robô. Como se fez
necessário 8 comandos diferente, foram utilizados 8 fotoacopladores diferentes,
um para cada comando ou movimento desejado.



A
placa de interface eletrônica fica responsável por transformar os sinais da
porta paralela em sinais compreensíveis às entradas digitais do robô. O
circuito do projeto final da placa segue ilustrado na figura 3.5.



 



Figura 3.<!--[if supportFields]><span
style='font-size:12.0pt;font-family:"Times New Roman","serif";color:windowtext;
font-weight:normal;mso-bidi-font-weight:bold'>
SEQ Figura \* ARABIC <![endif]-->5<!--[if supportFields]><span
style='font-size:12.0pt;font-family:"Times New Roman","serif";color:windowtext;
font-weight:normal;mso-bidi-font-weight:bold'><![endif]--> - Circuito final.



A
conexão eletrônica com o robô ABB foi feita através de conector DB25, o qual
segue na figura 3.6 a configuração de entradas do robô. O próprio circuito
eletrônico de saída do robô fornece a tensão de 24Vcc pelo pino 1 e 14,
possibilitando o acionamento das portas do fotoacoplador sem que seja
necessário utilizar uma fonte externa, otimizando o equipamento e espaços
extras de trabalho.







 



Figura 3.<!--[if supportFields]><span
style='font-size:12.0pt;font-family:"Times New Roman","serif";color:windowtext;
font-weight:normal;mso-bidi-font-weight:bold'>
SEQ Figura \* ARABIC <![endif]-->6<!--[if supportFields]><span
style='font-size:12.0pt;font-family:"Times New Roman","serif";color:windowtext;
font-weight:normal;mso-bidi-font-weight:bold'><![endif]--> – Configuração do conector de
entrada e saída digital do robô.



A figura
3.6 demonstra a configuração da porta DB25 instalada no robô. Do pino 2 ao 8,
os pinos serão utilizados para receberem os sinais de controle, como demonstra
a tabela 3.2 a seguir.


Tabela 3.3 – Configuração da porta DB25.


 

  
NUMERO PINO PORTA PARALELA COMPUTADOR

  
FUNÇÃO PARA MOVIMENTO DO ROBÔ

  
PINO DB25 DO ROBÔ

 

  
PINO 2

  
INCREMENTA MOVIMENTO EM “X” (X+)

  
PINO 2

(DI00)

 

  
PINO 3

  
DECREMENTA MOVIMENTO EM “X” (X-)

  
PINO 3

(DI01)

 

  
PINO 4

  
INCREMENTA MOVIMENTO EM “Y” (Y+)

  
PINO 4

(DI02)

 

  
PINO 5

  
DECREMENTA MOVIMENTO EM “Y” (Y-)

  
PINO 5

(DI03)

 

  
PINO 6

  
INCREMENTA MOVIMENTO EM “Z” (Z+)

  
PINO 6

(DI04)

 

  
PINO 7

  
DECREMENTA MOVIMENTO EM “Z” (Z-)

  
PINO 7

(DI05)

 

  
PINO 8

  
ACIONA GARRA

  
PINO 8

(DI06)

 




O
circuito foi desenvolvido em uma placa de fenolite de 10cm por 10cm, desenhado
manualmente com uma caneta marca-texto e corroído em cloreto de ferro. Por
prevenção de possível troca de componentes que poderiam apresentar defeito, foi
adicionado soquete de base nos fotoacopladores. 



Para
interligação foi utilizado cabos comuns, utilizados em rede física de
computadores conhecidos como categoria 5, por terem a quantidade de vias e
identificação próprias, facilitando o trabalho de soldas.



Esta
placa com os componentes foi colocada dentro de uma caixa plástica de 10cm de
largura por 25cm de comprimento, com a finalidade de proteção do sistema.
Também foi colocado LEDs com seus mostradores luminosos expostos externamente
para melhor visualização do funcionamento do circuito. A seguir, nas figuras
3.7, 3.8 e 3.9 é possível visualizar o processo final da interface de
comunicação.



 



Figura 3.7 – Lado da solda da
placa de fenolite.



 



Figura 3.8 – Componentes da
interface de comunicação.



 



Figura 3.9 – Caixa plástica de
proteção do circuito.















3.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Programação do robô IRC5 M2004.



Para
que o robô (figura 3.10) transformasse o sinal elétrico em movimento físico,
foi criado um programa de interpretação de dados na linguagem RAPID - linguagem
de programação do robô ABB.



Este
algoritmo tem como função básica receber os sinais de coordenação cartesiana
através das entradas digitais do robô - como o avanço e recuo dos eixos X, Y e
Z - processá-las e transmitir comandos de movimentos de acordo com os comandos
dados pelo operador com seus movimentos corporais.



 



Figura 3.10 - Robô ABB IRC5 M2004.



Quando
algum sinal digital referente a um movimento cartesiano for acionado, o robô
incrementa um posicionamento no respectivo eixo.



Por
exemplo, se o operador faz um movimento com o braço que indica ao sensor Kinect
que existe um deslocamento avançando pelo eixo X, o computador envia em forma
de sinal digital ao robô que deve se movimentar pelo eixo X de forma positiva
(X+).



Se o
operador fizer o mesmo movimento no sentido contrário, o robô através de outra
entrada digital reconhece que deve decrementar o posicionamento em X,
retornando o movimento (X-).



Baseado
em testes empíricos, foi determinado que para que haja uma interação de
movimentos de forma fácil e intuitiva entre operador e robô, o valor de
deslocamento a ser incrementado a cada atualização de movimento é de 50 mm e
velocidade de 100 mm∕s.



A figura
3.11 a seguir, demonstra um fluxograma básico que indica a forma lógica que o
programa irá operar segundo o exemplo de operação no eixo X.



 
<!--[if gte mso 9]>
 <o:OLEObject Type="Embed" ProgID="Visio.Drawing.11" ShapeID="_x0000_i1025"
  DrawAspect="Content" ObjectID="_1523423631">
 
<![endif]-->


Figura 3.<!--[if supportFields]><span
style='font-family:"Times New Roman","serif"'>
SEQ Figura \* ARABIC <![endif]-->7<!--[if supportFields]><span
style='font-family:"Times New Roman","serif"'><![endif]-->1 - Fluxograma de algoritmo.
Programação robô.



Esta
lógica é aplicada a cada eixo de movimentação do robô, sendo que se existir
mais de uma orientação em eixos diferentes, o robô interpolará estes
movimentos.



Por
exemplo, se a entrada referente ao movimento X+ for acionada juntamente com a
entrada Y+, o robô terá o comando para se movimentar positivamente 50 mm tanto
no eixo X quanto no eixo Y ao mesmo tempo. Por este motivo a programação do
robô teve de contar com várias possibilidades de deslocamento, levando a um
algoritmo mais extenso. 



A tabela
3.4 representa a tabela verdade constando as possíveis combinações de entradas
na movimentação do robô.



Tabela 3.4 - Tabela verdade da lógica de movimento
do robô.



 

  
X+

  
Y+

  
Z+

  
X-

  
Y-

  
Z-

 

  
0

  
0

  
0

  
0

  
0

  
0

 

  
0

  
0

  
0

  
0

  
0

  
1

 

  
0

  
0

  
0

  
0

  
1

  
0

 

  
0

  
0

  
0

  
0

  
1

  
1

 

  
0

  
0

  
0

  
1

  
0

  
0

 

  
0

  
0

  
0

  
1

  
0

  
1

 

  
0

  
0

  
0

  
1

  
1

  
0

 

  
0

  
0

  
0

  
1

  
1

  
1

 

  
0

  
0

  
1

  
0

  
0

  
0

 

  
0

  
0

  
1

  
0

  
0

  
1

 

  
0

  
0

  
1

  
0

  
1

  
0

 

  
0

  
0

  
1

  
0

  
1

  
1

 

  
0

  
0

  
1

  
1

  
0

  
0

 

  
0

  
0

  
1

  
1

  
0

  
1

 

  
0

  
0

  
1

  
1

  
1

  
0

 

  
0

  
0

  
1

  
1

  
1

  
1

 

  
0

  
1

  
0

  
0

  
0

  
0

 

  
0

  
1

  
0

  
0

  
0

  
1

 

  
0

  
1

  
0

  
0

  
1

  
0

 

  
0

  
1

  
0

  
0

  
1

  
1

 

  
0

  
1

  
0

  
1

  
0

  
0

 

  
0

  
1

  
0

  
1

  
0

  
1

 

  
0

  
1

  
0

  
1

  
1

  
0

 

  
0

  
1

  
0

  
1

  
1

  
1

 

  
0

  
1

  
1

  
0

  
0

  
0

 

  
0

  
1

  
1

  
0

  
0

  
1

 

  
0

  
1

  
1

  
0

  
1

  
0

 

  
0

  
1

  
1

  
0

  
1

  
1

 

  
0

  
1

  
1

  
1

  
0

  
0

 

  
0

  
1

  
1

  
1

  
0

  
1

 

  
0

  
1

  
1

  
1

  
1

  
0

 

  
0

  
1

  
1

  
1

  
1

  
1

 

  
1

  
0

  
0

  
0

  
0

  
0

 

  
1

  
0

  
0

  
0

  
0

  
1

 
















Continuação tabela 3.4 - Tabela
verdade da lógica de movimento do robô.



 

  
X+

  
Y+

  
Z+

  
X-

  
Y-

  
Z-

 

  
1

  
0

  
0

  
0

  
1

  
0

 

  
1

  
0

  
0

  
0

  
1

  
1

 

  
1

  
0

  
0

  
1

  
0

  
0

 

  
1

  
0

  
0

  
1

  
0

  
1

 

  
1

  
0

  
0

  
1

  
1

  
0

 

  
1

  
0

  
0

  
1

  
1

  
1

 

  
1

  
0

  
1

  
0

  
0

  
0

 

  
1

  
0

  
1

  
0

  
0

  
1

 

  
1

  
0

  
1

  
0

  
1

  
0

 

  
1

  
0

  
1

  
0

  
1

  
1

 

  
1

  
0

  
1

  
1

  
0

  
0

 

  
1

  
0

  
1

  
1

  
0

  
1

 

  
1

  
0

  
1

  
1

  
1

  
0

 

  
1

  
0

  
1

  
1

  
1

  
1

 

  
1

  
1

  
0

  
0

  
0

  
0

 

  
1

  
1

  
0

  
0

  
0

  
1

 

  
1

  
1

  
0

  
0

  
1

  
0

 

  
1

  
1

  
0

  
0

  
1

  
1

 

  
1

  
1

  
0

  
1

  
0

  
0

 

  
1

  
1

  
0

  
1

  
0

  
1

 

  
1

  
1

  
0

  
1

  
1

  
0

 

  
1

  
1

  
0

  
1

  
1

  
1

 

  
1

  
1

  
1

  
0

  
0

  
0

 

  
1

  
1

  
1

  
0

  
0

  
1

 

  
1

  
1

  
1

  
0

  
1

  
0

 

  
1

  
1

  
1

  
0

  
1

  
1

 

  
1

  
1

  
1

  
1

  
0

  
0

 

  
1

  
1

  
1

  
1

  
0

  
1

 

  
1

  
1

  
1

  
1

  
1

  
0

 

  
1

  
1

  
1

  
1

  
1

  
1

 




Visualizando
a tabela de combinações de entradas, notamos que existem 64 combinações
diferentes, mas pode-se perceber que entre as combinações, existem algumas que
são impossíveis de acontecer; aquelas onde para um mesmo eixo, há um comando
verdadeiro, por exemplo: X+ = 1 e X- = 1.



Esta
situação não pode ocorrer, pois o operador não tem a condição de deslocar o seu
braço para a direita e esquerda ao mesmo tempo. Assim também vale para os
outros eixos de movimentação. Sendo assim, podemos eliminar do algoritmo as
combinações como estas, tendo por final a tabela 3.5 demonstrada a seguir:


Tabela 3.5 - Tabela verdade de lógica reduzida.


 

  
X+

  
Y+

  
Z+

  
X-

  
Y-

  
Z-

 

  
0

  
0

  
0

  
0

  
0

  
0

 

  
0

  
0

  
0

  
0

  
0

  
1

 

  
0

  
0

  
0

  
0

  
1

  
0

 

  
0

  
0

  
0

  
0

  
1

  
1

 

  
0

  
0

  
0

  
1

  
0

  
0

 

  
0

  
0

  
0

  
1

  
0

  
1

 

  
0

  
0

  
0

  
1

  
1

  
0

 

  
0

  
0

  
0

  
1

  
1

  
1

 

  
0

  
0

  
1

  
0

  
0

  
0

 

  
0

  
0

  
1

  
0

  
1

  
0

 

  
0

  
0

  
1

  
1

  
0

  
0

 

  
0

  
0

  
1

  
1

  
1

  
0

 

  
0

  
1

  
0

  
0

  
0

  
0

 

  
0

  
1

  
0

  
0

  
0

  
1

 

  
0

  
1

  
0

  
0

  
1

  
0

 

  
0

  
1

  
0

  
1

  
0

  
0

 

  
0

  
1

  
0

  
1

  
0

  
1

 

  
0

  
1

  
0

  
1

  
1

  
0

 

  
0

  
1

  
1

  
0

  
0

  
0

 

  
0

  
1

  
1

  
1

  
0

  
0

 

  
1

  
0

  
0

  
0

  
0

  
0

 

  
1

  
0

  
0

  
0

  
0

  
1

 

  
1

  
0

  
0

  
0

  
1

  
0

 

  
1

  
0

  
0

  
0

  
1

  
1

 

  
1

  
0

  
1

  
0

  
0

  
0

 

  
1

  
0

  
1

  
0

  
1

  
0

 

  
1

  
1

  
0

  
0

  
0

  
0

 

  
1

  
1

  
0

  
0

  
0

  
1

 

  
1

  
1

  
0

  
0

  
1

  
0

 

  
1

  
1

  
1

  
0

  
0

  
0

 




Ao
excluir as linhas que não são possíveis, temos 34 combinações para serem
programadas no robô.



A figura
3.12 ilustra o fluxograma de uma das combinações, e este padrão será repetido
34 vezes, sendo alteradas somente as combinações de entradas e suas respectivas
ações. 




 
<!--[if gte mso 9]>
 <o:OLEObject Type="Embed" ProgID="Visio.Drawing.11" ShapeID="_x0000_i1026"
  DrawAspect="Content" ObjectID="_1523423632">
 
<![endif]-->Figura 3.12 - Fluxograma geral do algoritmo do robô.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Como representado no fluxograma, o programa editado na linguagem RAPID do robô ABB funcionará basicamente da seguinte forma:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Se alguma das entradas digitais referentes a qualquer movimento for identificada, o programa analisa quais são os sinais de movimento e incrementa um valor constante, definido empiricamente, respectivo a cada eixo em um ponto definido como ponto de trabalho (Pjob00, por exemplo). 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Quando o sinal de movimento respectivo ao avanço sobre o eixo Y é identificado, o programa incrementa um valor de deslocamento constante sobre o ponto de trabalho, que deve ser o ponto atual de posicionamento do robô.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Com o valor incrementado, o ponto atual de posicionamento do robô se torna igual a este mesmo ponto, adicionado a uma constante em milímetros avançando pelo eixo Y.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pode-se representar algebricamente que Pjob = Pjobn + C(y), onde Pjob é o ponto atual de localização tridimensional da extremidade do robô e C(y) é uma constante em milímetros limitada ao eixo Y.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Como o ponto atual agora já não equivale a localização real da extremidade do robô, é enviado um comando de movimento para o novo ponto atual, fazendo com que o robô se desloque para a direção onde foi detectado o movimento do operador.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A programação feita no robô ABB em linguagem RAPID segue no apêndice B.






3.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Software de
parametrização



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Foi
desenvolvida uma interface utilizando o software Visual Studio da Microsoft,
programado em linguagem C#, onde é possível observar em quais eixos ocorre o
movimento, sendo positivo ou negativo, e configurar medidas como “Lib” e “Mov”,
ambos referenciados em metros para a obtenção desejável do modo de controle na
manipulação.



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A linguagem de programação e o
código fonte desta linguagem encontram-se disponível no Apêndice A ao final do
projeto.



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 



























&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A figura 3.13 a seguir apresenta a
interface visual do software, e a figura 3.14 mostra o software em
funcionamento. 



 



Figura 3.13 – Interface visual do software.



No parâmetro “ParaMetro Lib”, é possível configurar
a distância necessária de abertura do braço do operador para liberação do
sistema, onde a partir daí seria possível o início da manipulação.



Se o valor 0,1 for tomado como exemplo neste campo
de parâmetro, o operador deverá erguer o braço 0,1m acima do plano horizontal
de referência, sendo este plano, a posição ortogonal do braço em relação ao
tronco.



O parâmetro “ParaMetro Mov” está relacionado ao
valor captado pelo sensor e transmitido ao robô para que este inicie seu
movimento. Por exemplo, se for inserido um valor 0,1 no campo “ParaMetro Mov”
do software, o robô iniciará seu movimento após o braço do operador se deslocar
0,1 metros (10cm) ao longo do eixo desejado. Quanto menor for o valor inserido,
mais rápida será a resposta do robô. 











&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Na
interface visual da figura 3.14 podemos observar a imagem do operador, a
leitura dos movimentos captados pelo sensor Kinect e os parâmetros definidos
para os movimentos.











 



Figura
3.14 – Tela do software em seu pleno funcionamento.







&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 




4 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TESTES
E DISCUSSÕES







4.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Testes dos sinais
digitais recebidos pelo robô IRC5 M2004 da ABB

&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Os sinais digitais de 5 Vcc fornecidos pela porta paralela do computador foram processados pela interface eletrônica e amplificados para 24Vcc, tornando possível a interpretação do sinal pelo sistema do Robô ABB. A partir destes sinais digitais recebidos foram iniciados os testes de interpretação dos sinais pelo sistema ABB.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Para o inicio do teste foi definido como seria nomeado cada movimento executado pelo operador posicionado a frente do sensor de movimento. A mão do braço direito do operador é a referencia do ponto tridimensional para o sensor de movimento, sendo assim, foram convencionados os sentidos dos movimentos como ilustrado na figura 4.1 a seguir:


 



Figura
4.1 - Ilustração dos eixos no corpo humano







4.1.1&nbsp;&nbsp;&nbsp; Teste dos sinais digitais referentes ao eixo
X.

&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Após a inicialização do sistema do sensor de movimento e da conexão da interface eletrônica com o robô, foram efetuados movimentos pelo operador em frente ao sensor, os quais representam deslocamentos restritos ao avanço no eixo X.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Foi verificado a tensão elétrica de saída da interface eletrônica no pino respectivo ao deslocamento em X+, utilizando um multímetro ajustado em escala de range de 200Vdc. Neste pino pôde ser detectado a tensão de 24Vdc, tornando evidente o funcionamento do sensor de movimento e da interface eletrônica.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; No sistema operacional do robô ABB foi acessada a tela de monitoração de entradas e saídas como demonstra a figura 4.2, onde foi detectado o acionamento da entrada DI_00.
Foi executado o mesmo procedimento realizado anteriormente, alterando-se apenas o sentido do movimento feito pelo operador, onde avançou-se no eixo X, agora é feito o recuo pelo mesmo eixo tridimensional imaginário, ou seja, deslocando em X-.


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Com
o movimento do operador restritamente em X-, foi identificado o acionamento da
entrada DI_01 no robô, confirmando o funcionamento correto do sistema no eixo
X.



 



Figura
4.2 - Tela de monitoramento de entradas e saídas digitais do robô ABB.

&nbsp;
&nbsp;














4.1.2&nbsp;&nbsp;&nbsp; Teste dos sinais digitais referentes ao eixo
Y.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Foram executados os mesmos procedimentos feitos no teste do eixo X,&nbsp; exceto o movimento feito pelo operador que agora desloca-se pelo eixo Y. Primeiramente avançando restritamente pelo eixo Y+, detectou-se o acionamento da entrada DI_02 do robô, regredindo o movimento pelo eixo Y-, pôde ser verificado o acionamento da entrada DI_03 no sistema do robô, confirmando o funcionamento correto do sistema relacionado ao eixo Y.
&nbsp;&nbsp; 


4.1.3&nbsp;&nbsp;&nbsp; Teste dos sinais digitais referentes ao eixo
Z.





&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Foram executados os mesmos procedimentos realizados nos eixos X e Y, exceto o movimento efetuado pelo operador que agora é feito ao longo do eixo Z. Inicia-se avançando restritamente pelo eixo Z+, onde se detectou o acionamento da entrada DI_04 do robô. Regredindo o movimento pelo eixo Z-, pôde ser verificado o acionamento da entrada DI_05 no sistema do robô, confirmando o funcionamento correto do sistema relacionado ao eixo Z.


4.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Testes dos movimentos
integrados (operador e robô).





&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Para o teste de movimentos integrados entre robô e operador foi preciso definir quais movimentos feitos pelo braço robótico seriam relativos aos respectivos movimentos executados pelo operador.


4.2.1&nbsp;&nbsp;&nbsp; Teste do sensor de movimento para operação
com robô (Kinect).





&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O sensor de movimento foi colocado a uma altura de 0,8m em relação ao solo, e a 1,86m do operador. Foi detectado que o sensor de movimento nesta posição, poderia causar a perda de parte do campo de ação devido ao mesmo estar em posição de altura muito elevada. Portanto a altura do sensor foi alterada de 0,8m para 0,5m, definindo assim o melhor posicionamento para o sensor de movimento: 0,5m de altura em relação ao solo e 1,86m em relação ao operador.
&nbsp;
&nbsp;
&nbsp;


4.2.2&nbsp;&nbsp;&nbsp; Teste de deslocamento do braço robótico
(Robô).







&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Depois de inserido o programa do
robô, os testes dos movimentos foram feitos com cada eixo isoladamente para a
verificação de convenção de cada movimento do operador e a resposta de
movimento do braço robótico.







4.2.2.1 Teste de inversão de eixo (Robô).







&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Primeiramente o operador desloca seu
braço em direção ao eixo definido como X+ e a resposta do robô é
respectivamente ao eixo Z+, logo após o operador deslocar seu braço unicamente
em direção a X-, o movimento correspondente é em Z-. Em seguida o operador desloca
seu braço em direção a Y+ e o movimento correspondente é o de X+. Quando o
movimento do operador é feito em Y-, a resposta do robô é feita em X-. Por
último, o operador desloca seu braço em direção a Z+ e a resposta do movimento
é feita em Y+, e conseqüentemente o movimento em Z-, foi correspondido em Y-.



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Neste teste foi detectado que os eixos
de movimentos convencionados e as coordenadas de eixos reais do robô apresentam
posições opostas, necessitando fazer a devida correção.



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Para que os movimentos funcionassem
de forma intuitiva e de fácil compreensão, foram mantidas como padrão as
coordenadas de eixos convencionadas para operação, sendo necessária uma
alteração do programa do robô para que os movimentos executados por ele
estivessem de acordo com os eixos padronizados.







4.2.2.2 Teste de substituição de coordenadas.







&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A substituição das coordenadas dos
eixos de movimentos do robô foi substituída da seguinte forma: o eixo X do robô
responde aos sinais de movimentos feitos ao longo do eixo Z do operador, o eixo
Y do robô ao eixo X do operador, e o eixo Z do robô ao eixo Y do operador. 



































As
orientações de eixos convencionadas e do robô são representadas pela figura
4.3.



 



Figura 4.3 –
Associação dos eixos.











&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Finalizando
as alterações no programa e os testes de movimentos, foi definido que a
constante “C” de incremento e decremento em milímetros de resposta a cada
comando para movimentação do robô seria de 30 mm, pois este parâmetro orienta o
Robô dentro de um determinado campo de ação que é determinado pela distancia
que o mesmo pode suportar e interagir com a programação, sem causar falha de
comando.







4.2.3&nbsp;&nbsp;&nbsp; Teste de funcionamento da interface de
comunicação.







&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Os primeiros testes com relação
ao funcionamento da interface de comunicação, foi favorável à medida que era
incrementado cada movimento no robô. Foi notado que um movimento apenas não era
possível ser realizado. Então, iniciou-se a busca da solução primeiramente na
programação, uma vez que 7 dos 8 pinos estavam funcionando corretamente.
Portanto após diversas tentativas, foi diagnosticada uma falha na comunicação
na porta de entrada do robô causada por baixa tensão de entrada. O correto
seria ter 24V na entrada do robô, mas estava chegando somente 8V. A solução foi
eliminar o LED em série com o circuito de entrada do fotoacoplador.



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Foi percebido então que o um dos LED
apresentou um pequeno problema de ordem de fabricação, não permitindo a
passagem da tensão desejada, que é na ordem de 0,7V, então decidimos fazer a
substituição deste LED, e foi possível continuar os testes.












5&nbsp; CONCLUSÕES







&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Este projeto tem apresentado
diferentes desafios por ser inovador no sentido de utilizar o que há de mais
recente em tecnologia de sensores disponíveis. Aparentemente a construção
mecânica dos componentes e desenvolvimento dos processos foram simples,
possibilitando a adaptação em qualquer dispositivo robótico por utilizar um
sistema de comando simplificado baseado em pulsos elétricos e entradas
digitais, dispensando o uso de qualquer protocolo de comunicação mais complexo.



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Houve dificuldade na área de
linguagem de programação em C#, que foi responsável pela detecção dos
movimentos do operador e geração dos sinais digitais para o robô. Por isso,
tornou-se necessária a procura de um programador que tivesse afinidade em
linguagem C#, possibilitando a elaboração do software.



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ao final do projeto, foi possível
alcançar os objetivos propostos. Independente do operador e do conhecimento
agregado, a manipulação do robô de forma intuitiva foi realizada com sucesso,
somando mais uma opção nas diversas formas de manipulação.



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Através deste projeto, são possíveis
algumas aplicações em áreas de risco ou áreas de difícil acesso, como por
exemplo: áreas onde há elevados índices de radiação, setores químicos, temperatura
elevada, riscos de explosão, explorações marítimas e espaciais.



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ao analisar o projeto, foram tomadas algumas sugestões para melhoria do
projeto, visto que o tempo e alguns artifícios limitados não foram suficientes
para realização de todas as idéias em mente.

&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp;


<!--[if !supportLists]-->5.1&nbsp; <!--[endif]-->Sugestão
de melhorias







&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; No projeto atual, o movimento do
operador é detectado em relação ao punho do mesmo, ou seja, apenas um eixo é
reproduzido pelo braço robótico.



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Futuramente para um controle mais
fiel dos movimentos do operador, poderia ser feita a relação dos movimentos
específicos do operador com os seis eixos do robô.



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Para acionamentos adicionais aos
movimentos do braço robótico, como por exemplo, a abertura ou fechamento de uma
garra mecânica ou qualquer outro tipo de dispositivo auxiliar, poderia ser
utilizado futuramente o recurso de reconhecimento de comandos de voz, recurso
que já é suportado pelo sensor Kinect.



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Outra melhoria no modo de
manipulação do robô pode ser desenvolvida através de comandos remotos
utilizando meios de comunicação disponíveis como protocolo de internet ou rede
sem fio (wireless).

&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp;


































REFERÊNCIAS







ASCENCIO, A. F. G. Fundamentos
da programação de computadores. Atual ed. São Paulo: Pearson Prentice
Hall, 2002. 







FORBELLONE, A. L. V.;
EBERSPACHER, H. F. Lógica de Programação. Atual ed. São Paulo: Pearson Education/
Makron Books, 1999.







HADDAD, RENATO. I. C#
Aplicações e Soluções. 2ª ed. São Paulo: Érica, 2001.







IGLESIAS, A. Hacking do Kinect permite lojistas
avaliarem estoque e movimento. Disponível em: &lt;http://www.techtudo.com.br/curiosidades/noticia/2012/02/hacking-do-kinect-permite-lojistas-avaliarem-estoque-e-movimento-em-suas-lojas.html&gt;. Acesso em: 15 mar. 2012.







JESUS, A. Robô ‘atleta’ da NASA tem 12 olhos e é
controlado pelo Kinect. Disponível em: &lt;http://www.techtudo.com.br/curiosidades/noticia/2012/02/robo-atleta-da-nasa-tem-12-olhos-e-e-controlado-pelo-xbox.html&gt;. Acesso em: 15 mar. 2012.







NETO, D. Meka Robotics apresenta robô que usa os
sensores do Kinect. Disponível em: &lt;http://www.techtudo.com.br/noticias/noticia/2011/02/meka-robotics-apresenta-robo-que-usa-os-sensores-do-kinect.html&gt;. Acesso em: 15 mar. 2012.







OKUNO, E. Radiação: efeitos, riscos e
benefícios. 5. ed. São Paulo: Harbra, 2007.







ROSÁRIO, J. M. Princípios
da mecatrônica. 4. ed. São Paulo: Prentice Hall, 2005.







SCHIAVICCO, L.;
SICILIANO, B. Robotica Industriale: modellistica e controllo di manipolatori.
Atual ed. Milano: McGraw-Hill Inc, 1995.







TUCKER, A. B. Linguagem
de Programação: princípios e paradigmas. 2ª ed. São Paulo: McGraw-Hill,
2008.







THOMAZINI, D.;
ALBUQUERQUE, P. U. B. Sensores Industriais: fundamentos e
aplicações. 7ª ed. São Paulo: Érica, 2011.







VICENTINO, C. História
Geral. Atual ed. São Paulo: Scipione, 2002.















&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
























Anexo A – Datasheet do
CI 4N25.



 




 
&nbsp;
 
&nbsp;
 
&nbsp;
 




















































APÊNDICE A –
Programação da manipulação do robô em C#







using System;



using
System.Collections.Generic;



using System.Linq;



using System.Text;



using
System.Threading;



using
System.Windows;



using System.Windows.Controls;



using
System.Windows.Data;



using
System.Windows.Documents;



using
System.Windows.Input;



using
System.Windows.Media;



using
System.Windows.Media.Imaging;



using
System.Windows.Navigation;



using
System.Windows.Shapes;



using Microsoft.Research.Kinect.Nui;



using Robot;







namespace
SkeletalViewer



{



&nbsp;&nbsp;&nbsp; public partial class MainWindow : Window



&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public double UltimoX = 0;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public double Ultimoy = 0;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public double Ultimoz = 0;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string End = "378h";



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int Valor = 0;







&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public MainWindow()



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitializeComponent();



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.ParLib.Text = "0,2";



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Par.Text = "0,2";



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Runtime nui;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int totalFrames = 0;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int lastFrames = 0;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DateTime lastTime = DateTime.MaxValue;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const int RED_IDX = 2;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const int GREEN_IDX = 1;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const int BLUE_IDX = 0;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] depthFrame32 = new byte[320 *
240 * 4];



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dictionary&lt;JointID,Brush&gt;
jointColors = new Dictionary&lt;JointID,Brush&gt;() { 



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {JointID.HipCenter, new
SolidColorBrush(Color.FromRgb(169, 176, 155))},



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {JointID.Spine, new
SolidColorBrush(Color.FromRgb(169, 176, 155))},



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {JointID.ShoulderCenter, new
SolidColorBrush(Color.FromRgb(168, 230, 29))},



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {JointID.Head, new
SolidColorBrush(Color.FromRgb(200, 0,&nbsp;&nbsp;
0))},



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {JointID.ShoulderLeft, new
SolidColorBrush(Color.FromRgb(79,&nbsp;
84,&nbsp; 33))},



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {JointID.ElbowLeft, new
SolidColorBrush(Color.FromRgb(84,&nbsp;
33,&nbsp; 42))},



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {JointID.WristLeft, new
SolidColorBrush(Color.FromRgb(255, 126, 0))},



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {JointID.HandLeft, new
SolidColorBrush(Color.FromRgb(215,&nbsp; 86,
0))},



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {JointID.ShoulderRight, new
SolidColorBrush(Color.FromRgb(33,&nbsp;
79,&nbsp; 84))},



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {JointID.ElbowRight, new
SolidColorBrush(Color.FromRgb(33,&nbsp;
33,&nbsp; 84))},



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {JointID.WristRight, new
SolidColorBrush(Color.FromRgb(77,&nbsp; 109,
243))},



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {JointID.HandRight, new
SolidColorBrush(Color.FromRgb(255, 126, 0))},



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {JointID.HipLeft, new
SolidColorBrush(Color.FromRgb(77,&nbsp; 109,
243))},



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {JointID.KneeLeft, new
SolidColorBrush(Color.FromRgb(69,&nbsp;
33,&nbsp; 84))},



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {JointID.AnkleLeft, new
SolidColorBrush(Color.FromRgb(229, 170, 122))},



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {JointID.FootLeft, new
SolidColorBrush(Color.FromRgb(255, 126, 0))},



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {JointID.HipRight, new
SolidColorBrush(Color.FromRgb(181, 165, 213))},



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {JointID.KneeRight, new
SolidColorBrush(Color.FromRgb(71, 222,&nbsp;
76))},



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {JointID.AnkleRight, new
SolidColorBrush(Color.FromRgb(245, 228, 156))},



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {JointID.FootRight, new
SolidColorBrush(Color.FromRgb(77,&nbsp; 109,
243))}



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void Window_Loaded(object
sender, EventArgs e)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
nui = new Runtime();



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
nui.Initialize(RuntimeOptions.UseDepthAndPlayerIndex |
RuntimeOptions.UseSkeletalTracking | RuntimeOptions.UseColor);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (InvalidOperationException)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
System.Windows.MessageBox.Show("Runtime initialization failed.
Please make sure Kinect device is plugged in.");



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nui.VideoStream.Open(ImageStreamType.Video,
2, ImageResolution.Resolution640x480, ImageType.Color);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
nui.DepthStream.Open(ImageStreamType.Depth, 2,
ImageResolution.Resolution320x240, ImageType.DepthAndPlayerIndex);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (InvalidOperationException)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
System.Windows.MessageBox.Show("Failed to open stream. Please make
sure to specify a supported image type and resolution.");



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lastTime = DateTime.Now;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nui.DepthFrameReady += new
EventHandler&lt;ImageFrameReadyEventArgs&gt;(nui_DepthFrameReady);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nui.SkeletonFrameReady += new
EventHandler&lt;SkeletonFrameReadyEventArgs&gt;(nui_SkeletonFrameReady);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nui.VideoFrameReady += new
EventHandler&lt;ImageFrameReadyEventArgs&gt;(nui_ColorFrameReady);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] convertDepthFrame(byte[]
depthFrame16)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i16 = 0, i32 = 0; i16 &lt;
depthFrame16.Length &amp;&amp; i32 &lt; depthFrame32.Length; i16 += 2, i32 +=
4)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;int player = depthFrame16[i16] &amp; 0x07;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int realDepth =
(depthFrame16[i16+1] &lt;&lt; 5) | (depthFrame16[i16] &gt;&gt; 3);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte intensity = (byte)(255 -
(255 * realDepth / 0x0fff));



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthFrame32[i32 + RED_IDX] =
0;



&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;depthFrame32[i32 + GREEN_IDX] = 0;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthFrame32[i32 + BLUE_IDX] =
0;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (player)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0:



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthFrame32[i32 +
RED_IDX] = (byte)(intensity / 2);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthFrame32[i32 +
GREEN_IDX] = (byte)(intensity / 2);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthFrame32[i32 +
BLUE_IDX] = (byte)(intensity / 2);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 1:



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthFrame32[i32 +
RED_IDX] = intensity;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 2:



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthFrame32[i32 +
GREEN_IDX] = intensity;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 3:



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthFrame32[i32 + RED_IDX]
= (byte)(intensity / 4);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthFrame32[i32 +
GREEN_IDX] = (byte)(intensity);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthFrame32[i32 +
BLUE_IDX] = (byte)(intensity);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 4:



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;depthFrame32[i32 + RED_IDX] =
(byte)(intensity);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthFrame32[i32 +
GREEN_IDX] = (byte)(intensity);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthFrame32[i32 +
BLUE_IDX] = (byte)(intensity / 4);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;case 5:



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthFrame32[i32 +
RED_IDX] = (byte)(intensity);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthFrame32[i32 +
GREEN_IDX] = (byte)(intensity / 4);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthFrame32[i32 +
BLUE_IDX] = (byte)(intensity);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 6:



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthFrame32[i32 +
RED_IDX] = (byte)(intensity / 2);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthFrame32[i32 +
GREEN_IDX] = (byte)(intensity / 2);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthFrame32[i32 +
BLUE_IDX] = (byte)(intensity);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 7:



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthFrame32[i32 +
RED_IDX] = (byte)(255 - intensity);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthFrame32[i32 +
GREEN_IDX] = (byte)(255 - intensity);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;depthFrame32[i32 + BLUE_IDX] = (byte)(255
- intensity);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return depthFrame32;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void nui_DepthFrameReady(object sender,
ImageFrameReadyEventArgs e)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PlanarImage Image =
e.ImageFrame.Image;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] convertedDepthFrame =
convertDepthFrame(Image.Bits);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ++totalFrames;







&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DateTime cur = DateTime.Now;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cur.Subtract(lastTime) &gt;
TimeSpan.FromSeconds(1))



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int frameDiff = totalFrames -
lastFrames;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lastFrames = totalFrames;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lastTime = cur;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //frameRate.Text =
frameDiff.ToString() + " fps";



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void XYZ(Joint jtmd, Joint jtme)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.TXD.Text =
jtmd.Position.X.ToString();



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.TYD.Text =
jtmd.Position.Y.ToString();



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.TZD.Text =
jtmd.Position.Z.ToString();



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.TYE.Text = jtme.Position.Y.ToString();



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var ParLib =
Convert.ToDouble(this.ParLib.Text );



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (jtme.Position.Y &lt;= ParLib)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.TextStatus.Content =
"ABERTO";



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.TextStatus.Foreground =
Brushes.Red;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Valor = 0;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Paralela.Escrever(Convert.ToInt32("0378", 16),
Convert.ToByte(Valor));



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Valor = 64; 



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.TextStatus.Content =
"FECHADO";



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.TextStatus.Foreground =
Brushes.Green;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Paralela.Escrever(Convert.ToInt32("0378",
16), Convert.ToByte(Valor));



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var x = jtmd.Position.X;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var y = jtmd.Position.Y;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var z = jtmd.Position.Z;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(string.IsNullOrEmpty(Par.Text))Par.Text
= "0,2";



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var Par_ =
Convert.ToDouble(this.Par.Text);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((x - UltimoX) &gt; Par_)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.XMais.Visibility =
Visibility.Visible;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UltimoX = x;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Valor += 1;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((x - UltimoX) &lt; -Par_)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.XMenos.Visibility =
Visibility.Visible;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UltimoX = x;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Valor += 2;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.XMais.Visibility =
Visibility.Hidden;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.XMenos.Visibility =
Visibility.Hidden;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((y - Ultimoy) &gt; Par_)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.YMais.Visibility =
Visibility.Visible;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ultimoy = y;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Valor += 4;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((y - Ultimoy) &lt; -Par_)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.YMenos.Visibility =
Visibility.Visible;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ultimoy = y;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Valor += 8;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {







&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.YMais.Visibility =
Visibility.Hidden;



&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.YMenos.Visibility =
Visibility.Hidden;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((z - Ultimoz) &gt; Par_)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.ZMais.Visibility =
Visibility.Visible;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ultimoz = z;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Valor += 16;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((z - Ultimoz) &lt; -Par_)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.ZMenos.Visibility =
Visibility.Visible;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ultimoz = z;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Valor += 32;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;}



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.ZMais.Visibility =
Visibility.Hidden;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.ZMenos.Visibility =
Visibility.Hidden;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Paralela.Escrever(Convert.ToInt32("0378",
16), Convert.ToByte(Valor));



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.Sleep(200);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Point getDisplayPosition(Joint
joint)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float depthX, depthY;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
nui.SkeletonEngine.SkeletonToDepthImage(joint.Position, out depthX, out
depthY);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthX = depthX * 320; //convert to
320, 240 space



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depthY = depthY * 240; //convert to
320, 240 space



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int colorX, colorY;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImageViewArea iv = new
ImageViewArea();



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // only
ImageResolution.Resolution640x480 is supported at this point



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
nui.NuiCamera.GetColorPixelCoordinatesFromDepthPixel(ImageResolution.Resolution640x480,
iv, (int)depthX, (int)depthY, (short)0, out colorX, out colorY);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // map back to skeleton.Width &amp;
skeleton.Height)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new
Point((int)(skeleton.Width * colorX / 640.0), (int)(skeleton.Height * colorY /
480));



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Polyline
getBodySegment(Microsoft.Research.Kinect.Nui.JointsCollection joints, Brush
brush, params JointID[] ids)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PointCollection points = new
PointCollection(ids.Length);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //for (int i = 0; i &lt;
ids.Length; ++i )



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //{



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var jtme =
joints[JointID.HandRight];



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; points.Add(getDisplayPosition(jtme));







&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jtme = joints[JointID.ElbowRight];



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
points.Add(getDisplayPosition(jtme));







&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jtme =
joints[JointID.ShoulderRight];



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
points.Add(getDisplayPosition(jtme));







&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jtme = joints[JointID.HipRight];



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
points.Add(getDisplayPosition(jtme));



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //}







&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Polyline polyline = new Polyline();



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; polyline.Points = points;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; polyline.Stroke = brush;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; polyline.StrokeThickness = 5;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return polyline;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void nui_SkeletonFrameReady(object
sender, SkeletonFrameReadyEventArgs e)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SkeletonFrame skeletonFrame =
e.SkeletonFrame;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iSkeleton = 0;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Brush[] brushes = new Brush[6];



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; brushes[0] = new
SolidColorBrush(Color.FromRgb(255, 0, 0));



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; brushes[1] = new
SolidColorBrush(Color.FromRgb(0, 255, 0));



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; brushes[2] = new
SolidColorBrush(Color.FromRgb(64, 255, 255));



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; brushes[3] = new
SolidColorBrush(Color.FromRgb(255, 255, 64));



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; brushes[4] = new
SolidColorBrush(Color.FromRgb(255, 64, 255));



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; brushes[5] = new
SolidColorBrush(Color.FromRgb(128, 128, 255));



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skeleton.Children.Clear();



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (SkeletonData data in
skeletonFrame.Skeletons)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if
(SkeletonTrackingState.Tracked == data.TrackingState)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Brush brush =
brushes[iSkeleton % brushes.Length];



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skeleton.Children.Add(getBodySegment(data.Joints,
brush, JointID.HipCenter, JointID.Spine, JointID.ShoulderCenter,
JointID.Head));



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
skeleton.Children.Add(getBodySegment(data.Joints, brush,
JointID.ShoulderCenter, JointID.ShoulderLeft, JointID.ElbowLeft, JointID.WristLeft,
JointID.HandLeft));



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
skeleton.Children.Add(getBodySegment(data.Joints, brush,
JointID.ShoulderCenter, JointID.ShoulderRight, JointID.ElbowRight,
JointID.WristRight, JointID.HandRight));



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skeleton.Children.Add(getBodySegment(data.Joints,
brush, JointID.HipCenter, JointID.HipLeft, JointID.KneeLeft, JointID.AnkleLeft,
JointID.FootLeft));



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
skeleton.Children.Add(getBodySegment(data.Joints, brush,
JointID.HipCenter, JointID.HipRight, JointID.KneeRight, JointID.AnkleRight,
JointID.FootRight));



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (Joint joint in
data.Joints)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((joint.ID ==
JointID.HandRight) ||



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (joint.ID ==
JointID.ElbowRight) ||



&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(joint.ID ==
JointID.HipRight) ||



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (joint.ID ==
JointID.ShoulderRight))



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Point jointPos =
getDisplayPosition(joint);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Line jointLine = new
Line();



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jointLine.X1 =
jointPos.X - 5;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jointLine.X2 =
jointLine.X1 + 6;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jointLine.Y1 =
jointLine.Y2 = jointPos.Y;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jointLine.Stroke =
jointColors[joint.ID];



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
jointLine.StrokeThickness = 9;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
skeleton.Children.Add(jointLine);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var jtmd =
data.Joints[JointID.HandRight];



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var jtme =
data.Joints[JointID.HandLeft];



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XYZ(jtmd, jtme); 



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iSkeleton++;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void nui_ColorFrameReady(object sender,
ImageFrameReadyEventArgs e)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PlanarImage Image =
e.ImageFrame.Image;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; video.Source = BitmapSource.Create(



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Image.Width, Image.Height, 96,
96, PixelFormats.Bgr32, null, Image.Bits, Image.Width * Image.BytesPerPixel);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void Window_Closed(object
sender, EventArgs e)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nui.Uninitialize();



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Environment.Exit(0);



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void image1_ImageFailed(object
sender, ExceptionRoutedEventArgs e)



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {







&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }







&nbsp;&nbsp;&nbsp; }



}












APÊNDICE B – Programação
do robô em RAPID











CONST robtarget
PT_00:=[[1207.77,-2275.18,885.74],[0.333647,0.642084,-0.329619,0.606432],[-1,-1,2,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];



PERS robtarget Pjob:=[[1207.77,-2275.18,885.74],[0.333647,0.642084,-0.329619,0.606432],[-1,-1,2,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];







PROC KINECT()



&nbsp;&nbsp;&nbsp; MoveJ PT_00,v1000,z20,TGarra;



&nbsp;&nbsp;&nbsp; While DI_06 = Hight;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF DI_00 = Hight;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pjob.trans.y := Pjob.trans.Y + 30;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END IF;&nbsp; &nbsp;&nbsp;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF DI_01 = Hight;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pjob.trans.y := Pjob.trans.Y - 30;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END IF;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF DI_02 = Hight;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pjob.trans.z := Pjob.trans.z + 30;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END IF;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF DI_03 = Hight;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pjob.trans.z := Pjob.trans.z - 30;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF DI_04 = Hight;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pjob.trans.x := Pjob.trans.x + 30;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END IF;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF DI_05 = Hight;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pjob.trans.y := Pjob.trans.Y - 30;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END IF;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MoveJ Pjob,v1000,z20,TGarra;



&nbsp;&nbsp;&nbsp; END
WHILE;