|
|
2023
|
|||||||||
Autores: |
|||||||||||
|
Alexandre Gonçalves Canas (Nº1211392) |
1211392@isep.ipp.pt |
|||||||||
|
Diogo Moreira Ferreira (Nº1211002) |
1211002@isep.ipp.pt
|
|||||||||
|
|||||||||||
|
|||||||||||
O grupo escolheu como tema a construção de um circuito capaz de ler um objeto de pequenas/médias dimensões e representá-lo num grafíco de 3 dimensões. Foi escolhido este tema, porque se enquadra com tecnologia relativamente recente, por apresentar uma certa dificuldade na sua pesquisa, para aprofundar os conhecimentos a nivel do movimento de motores e sensores e para consolidar matérias aprendidas do curso em questão. Atualmente, a procura por impressoras 3D com multiplas funções tem crescido em larga escala, esta causa deve se ao facto de os consumidores cada vez mais quererem uma maior autonomina na criação de peças perfeitas e precisas para implementar em trabahos cada vez mais minuciosos. Isto leva a uma grande demanda pelo produto, o que influencia nos preços de mercado. Ou seja, devido à grande procura os preços do mercado são muito elevados. Por este motivo, o grupo em questão desenvolveu a ideia de que teria que implementar um projeto para tais preocupações e mesmo pela pouca experiência, decidiu pesquisar, entender e criar um Scanner 3D, para compreender o mundo das impressões e analises em 3 dimensões, feitas por uma máquina. Figura 1 - Nesta imagem está representado uma exemplo ilustrativo de um Scanner 3D [1] |
|||||||||||
|
|||||||||||
O Scanner 3D desenvolvido neste projeto tem como objetivos, que o sensor leia uma distância precisa, um motor passo a passo rode em torno de si em sentido anti-horário completando uma volta de 360 graus, esperando em cada volta um comando, outro motor passo a passo que rode 1 passo de cada vez sempre que recebe um comando ou que dê um número exato de passos de forma a ficar na possição original. Esta máquina tem como função ler e transmitir os dados obtidos automaticamente para um computador. Na seguinte figura é apresentado o funcionamento do sistema do projeto num diagrama de blocos. ![]() Figura 1 - Nesta imagem está representado o diagrama de blocos da arquitetura toda do projeto Nas seguintes imagens temos as primeiras representações teorizadas do projeto, através de cálculos e medições. Nestas últimas imagens é possivel visualizar todas as dimensões e cálculos utilizadas ao longo do projeto. |
|||||||||||
|
|||||||||||
Alimentação: No que diz respeito à alimentação, é usado um adaptador DC para 12 volts, o grupo decidiu escolher este tipo de alimentação pois o projeto é estático garantindo uma vantagem em termos monetários.
Figura 3 - Nesta imagem está representado um adaptador Arduino: Em termos de controlador optamos por um arduino para a totalidade do trabalho o fator mais importante por trás desta escolha é a parte de comunicação serie, o grupo já tinha conhecimento desde o início desta componente para facilitar trabalho, espaço e confusão de fios optamos pelo arduino para fazer a totalidade do trabalho.
Figura 4 - Nesta imagem está representado um arduino Ponte H: Para efeitos de controlo de motores é usado 2 pontes H l298n, decidimos usar esta ponte H porque suporta o valor de tensão requerido pelo motor, não é preciso usar breadbord para utilizar este driver. No restante o driver suporta tensões entre os 5 volts ate 35 volts.
Figura 5 - Nesta imagem está representado um driver l293n Sensor: No caso do sensor a escolha foi um TOF Luna 8m, apesar de não ser a melhor escolha para este trabalho devido a este ser um sensor mais adaptado a medias e longas distâncias, este sensor tem uma boa resolução e precisão, tornando-se bom para objeto de medio porte.
Figura 6 - Nesta imagem está representado um sensor LIDAR Motores: A escolha dos motores passou por 2 steppers Nema17 bipolar pelo facto de ser mais preciso e fácil de controlar, com um angulo de 1.8 graus permite uma grande precisão o que é muito vantajoso para scanners e impressoras 3d. A tensão de funcionamento dos motores é de 12 volts
Figura 8 - Nesta imagem está representado um motor passo a passo A principal função de um resistor ou resistência dentro de um circuito eléctrico ou electrónico é de "resistir", este regula ou define o fluxo de electrões (corrente) que o atravessam.
Figura 9 - Nesta imagem está representado uma resistência O botão Switch permite a escolha de apenas uma entre duas opções (Ativado ou Desativado).
Figura 10 - Nesta imagem está representado um botão ou switch Led é um diodo semicondutor, que quando é energizado, emite luz visível
Figura 7 - Nesta imagem está representado um led/diodo |
|||||||||||
|
|||||||||||
Neste tópico será apresentado o Software utilizado no projeto e será explicado como o mesmo foi construido, através de imagens e explicações fáceis de entender. O código está dividido em 2 partes: C++ e Python. Começando pelas bibliotecas usadas na totalidade do trabalho: stepper.h, wire.h, tfli2c.h, serial, mayavi, vtk, numpy. Iniciando pela biblioteca stepper.h: biblioteca oficial arduino que controla todos os motores steppers desde unipolares a bipolares, é uma biblioteca simples de usar, tem unicamente uma inicialização que é feita quando chamamos stepper, tem 3 funções: setspeed, step e stepper. Apesar da sua simplicidade em termos de uso, ela é bastante complexa para controlar a direção do stepper em exemplo: “stepper.step(10);” a biblioteca assume internamente um seguinte padrão 1-3-2-4 sendo isto bobina 1 e 3 ativa inicialmente e bobina 2 e 4 ativa sempre em sequência sentido horário. Para controlar a velocidade do stepper em exemplo: “stepper.setSpeed(10);”, a biblioteca trabalha internamente com as interrupções para gerar um PWM (pulse with modulation) que controla a velocidade do motor. Avançando a biblioteca Wire.h é uma ponte para comunicação sensor arduino, a função desta biblioteca neste código é configurar os pinos SDA(Serial Data) e SDC(Serial Clock) oferecendo assim comunicação I2C, esta biblioteca tem bastantes funções que este código em especifico não necessita mas passo a enunciar algumas: “wire.begin();”,“wire.end();”,“wire.write();”,“wire.read();”. Para dar um contexto, i2c é um modo de comunicação usado para que dois dispositivos comuniquem entre si através de dois fios e sistema escravo/mestre se necessário, o funcionamento dele tem a ver com um endereçamento único que permite transmissão de dados entre 2 dispositivos, há 2 maneiras de transmitir que são: pelo SDC controlo de transmissão síncrona de dados através de um sinal de clock ou seja a informação é transmitida num ritmo controlado ou pelo SDA que tem um sistema bidirecional logo pode receber ou transmitir os dados. Apos a transmissão de bits há sempre uma última transmissão de bit de ACK (acknowledge) por parte do recetor seja ele mestre ou escravo para confirmar a receção de dados. Avançando para a biblioteca que permite a comunicação sensor Arduíno, a TFLI2C não é uma biblioteca oficial Arduíno, tem como função o apoio aqueles que usam sensores TOF (time of flight) Luna ou mini-Luna. Esta biblioteca é específica para comunicação i2c ou comunicação UART, no caso deste trabalho comunicação modo i2c de certo modo esta é uma biblioteca simples de usar mas complexa inicialmente inicializa-se o sensor de seguida faz-se uma declaração “int16_t” o objetivo desta declaração é a única maneira de receber os dados porque eles são enviados em 16 bits e uma das diferenças do “int” para “int16_t” é que o int possui 32 bits equivalente a 4 bytes e int16_t são 16 bits equivalente a 2 bytes, declarando-se a distancia e o adereço por onde enviar os dados (endereço default) avançamos para o ciclo if para recolha de informação de distancia. O ciclo if é usado para verificar se o sensor esta pronto a transmitir informação. Agora com as bibliotecas Python, começando com a biblioteca serial como o nome indica é uma biblioteca que faz comunicação serie no caso deste trabalho há uma necessidade de comunicar com o Arduíno para obter valores de x,y,z, é uma biblioteca com fácil instalação basta inserir no terminal power shell Python “pip install pyserial” de seguida será necessário estabelecer comunicação iniciando a mesma no Arduíno e completando no Python com o seguinte código “serial.Serial(“port USB”,”Baud Rate”,”timeout=1”)“, em relação a esta ultima linha de código, “timeout=1” é um parâmetro bloqueante por um tempo especifico, neste caso 1 segundo, é forçada uma espera para dar tempo do envio de dados, após este 1 segundos o código prossegue mesmo que não tenha informação para ler. Continuado para a biblioteca que desenha o plot3d, esta biblioteca é mais complexa em termos de uso e internamente muito completa, para instalar a biblioteca é preciso inserir na power Shell os seguintes comandos “pip install numpy”, seguido de “pip install vtk”, seguido de ”pip install pyqt5” por fim “pip install mayavi”. Estas duas inicializações antes de instalar a biblioteca principal mayavi necessitam de ser declaradas mas não são usadas no código, a biblioteca numpy é uma biblioteca matemática do python que ajuda a processar arrays e outras operações, a biblioteca vtk é um sistema que processa imagens, imagens 3d, gráficos por entre outros é uma biblioteca dedicada a modelagem. Por fim a biblioteca pyqt5 é um conjunto de bibliotecas c++ que implementam aplicações de alto nível e tem uma vertente alta de plot3d. Para a biblioteca principal mayavi é necessário instalar todas estas bibliotecas acima, avançando o software usado tem uma interface muito boa e limpa, permite varias formas para construir gráficos tanto em 2D como 3D, esta aplicação permite construir gráficos com linhas, plot3d, mesh entre outros. Esteticamente é mais bonito criar uma figura de fundo branco iniciando com o seguinte código “mlab.figure=(bgcolor(1,1,1))” de seguida é preciso dar plot3d a figura com o seguinte código “ mlab.plot3d(x,y,z,tube_radius=0.01,figure=’figura’)” desconstruindo esta linha o programa irá fazer um plot dos itens guardados em x,y,z usando uma linha de raio indicado no 4 ponto, mais a figura com fundo branco. Inicializações: Concluída assim a explicação posso avançar para o código c++, para iniciar adicionei as bibliotecas que expliquei inicialmente na introdução do software, de seguida declaramos o sensor e motores usados. Nesta tabela será exposto todas as variáveis usadas.
Setup:
b1 A função b1 é implementada para aumentar a resolução do trabalho. É uma função simples, em que a base é um ciclo if que verifica se o botão não esta pressionado quando pressionamos o botão o objetivo é baixar o valor de vels, quando vels atingir o valor 10 ou menor que isso definimos vels como 10 sendo a menor resolução possível.b2 A função b2 é semelhante a função b1, a diferença desta função para a função b1 é a diminuição da resolução, a base é igualmente um ciclo if que verifica se o botão não esta pressionado, quando pressionado o botão o objetivo é aumentar o valor de vels, quando vels atinge valor 200 ou maior definimos vels para 200 sendo esta a maior resolução possível.loop_fim A função loop fim tem como objetivo definir uma distância chave que força o código a terminar, com isto retornamos o motor2 a sua posição inicial, dar reset ao eixo z e fechar a porta serial, finalizando com um loop infinito que só é quebrado quando o utilizador clica no botão reset Arduino.Código Python Inicialmente declaramos as bibliotecas que já expliquei na introdução, iniciamos a comunicação serial, que já expliquei na introdução, após isso declaramos os 3 vetores necessários para guardar os valores de x,y,z. Depois iniciamos um ciclo loop com objetivo de ler a porta serie dos valores separados por vírgulas, apos isso separamos os valores recebidos, guardar os mesmos e dar print aos dados recebidos. De seguida ocorre o armazenamento dos valores x,y,z para xn,yn,zn, guardando tudo em vetores. Quando a porta serial fecha, o código entra na sua parte final significa que ele irá dar plot3d aos valores de array xn,yn,zn. |
|||||||||||
|
|||||||||||
Neste tópico é apresentado o vídeo elaborado pelo grupo. No vídeo é possível visualizar que um dos drivers não se apresenta devidamente aparafusado, por causa de um problema de cabos, e para isso teve que se usar cabos mais curtos o que não permitiu ao mesmo estar devidamente colocado. Por outro lado, tudo correu como previsto. |
|||||||||||
|
|||||||||||
O principal objetivo foi compreender e aprofundar conhecimentos sobre motores, sensores e microcontroladores. Não foram cumpridos todos os objetivos. Este não cumprimento deve-se ao facto da limitação encontrada no sensor Lidar, escolhido pelo grupo. O maior desafio na realização do projeto foi a existência reduzida de informação, porque trata-se de uma tecnologia recente e complexa a nível mundial. Com este trabalho, os alunos envolvidos aprenderam a trabalhar em grupo, fortaleceram o domínio da cooperação em equipa e aumentaram o seu conhecimento ao nível dos microcontroladores e microprocessadores, tal como os vários tipos de motores e sensores. |
|||||||||||
|
|||||||||||
|
|||||||||||
[1] Instructables, Pinterest, https://www.pinterest.pt/pin/474285404508767257/ [2] LABSI, ISEP, https://moodle.isep.ipp.pt/course/view.php?id=4345 [3] Bud Ryerson, github.com, https://github.com/budryerson/TFLuna-I2C/blob/master/README.md [4] VTK developers, pypi.org, https://pypi.org/project/vtk/ [5] Prabhu Ramachandran, et al., pypi.org, https://pypi.org/project/mayavi/ [6] Riverbank Computing Limited, pypi.org, https://pypi.org/project/PyQt5/ [7] Fábio Souza, embarcados.com.br, https://embarcados.com.br/comunicacao-i2c/
|
|||||||||||
|