Índice:

Raspberry Pi Laser Scanner: 9 etapas (com imagens)
Raspberry Pi Laser Scanner: 9 etapas (com imagens)

Vídeo: Raspberry Pi Laser Scanner: 9 etapas (com imagens)

Vídeo: Raspberry Pi Laser Scanner: 9 etapas (com imagens)
Vídeo: DIY Scanning Laser Microscope 2024, Julho
Anonim
Image
Image
Raspberry Pi Laser Scanner
Raspberry Pi Laser Scanner

O Scanner a Laser é um dispositivo de sistema integrado Raspberry Pi capaz de digitalizar objetos em arquivos de malha.obj para reprodução usando impressão 3D. O dispositivo faz isso utilizando um laser de linha e uma PiCam integrada para realizar a visão computacional. O laser é posicionado a 45 graus inclinado em relação ao laser e projeta uma linha vermelha brilhante em uma fatia vertical do objeto. A câmera detecta a distância da fatia do centro para dar uma fatia de malha. O objeto é girado na bandeja giratória e o processo é repetido até que todo o objeto seja digitalizado. O arquivo.obj gerado é finalmente enviado por e-mail ao usuário, tornando o sistema totalmente autônomo e integrado.

Este Instructable explicará como o dispositivo foi construído, alguns resultados e etapas futuras.

Etapa 1: Inspiração

Inspiração
Inspiração
Inspiração
Inspiração

Como um fabricante ávido, há vários anos trabalho com impressão 3D e modelagem de sólidos. Trabalhei com várias ferramentas de prototipagem, de roteadores CNC a cortadores a laser e impressoras 3D. Um dispositivo que meu Makerpace local ainda não comprou foi um scanner 3D - e posso dizer por quê.

Os mais baratos (algumas centenas de dólares) não eram confiáveis, exigiam condições perfeitas e ainda produziam resultados muito ruins. Os caros eram … bem, caros, variavam até vários milhares de dólares, fazendo com que sua função não valesse a pena em muitos casos. Além disso, na maioria das vezes, opto por fazer medições e projetar um modelo do zero do que lidar com a malha de superfície gerada a partir de uma digitalização.

Por causa disso, eu queria construir um scanner autônomo de orçamento para ver quão bem eu poderia escanear um objeto usando componentes de prateleira.

Depois de fazer algumas pesquisas, vi que muitos scanners 3D utilizavam uma plataforma rotativa e, em seguida, uma variedade de sensores diferentes para medir a distância do centro a fim de construir um modelo rotacional. Muitas delas usaram câmeras duplas semelhantes à do Kinect. Acabei encontrando o Yscanner, que é um scanner de baixa resolução que usa laser. Olhando para a simplicidade e viabilidade, esta técnica de laser, na qual um laser é brilhado deslocado em relação a uma câmera para medir a distância do centro, parecia um caminho claro para a frente.

Etapa 2: Ferramentas e peças

Partes:

  • Raspberry Pi $ 35,00
  • Câmera Raspberry Pi V2 $ 30,00
  • LEDs, resistores e fios
  • Filamento de impressão 3D
  • Folhas de madeira 12x12x0,125
  • Hardware M3
  • Motor de passo - $ 14
  • Laser de linha - $ 8
  • Drivers de motor de passo LN298 - $ 2,65
  • Botão de metal - $ 5

Ferramentas:

  • Ferro de solda
  • Cortador a laser
  • impressora 3d
  • Chave de fenda
  • Alicate

Etapa 3: Design de alto nível

Design de alto nível
Design de alto nível
Design de alto nível
Design de alto nível

O componente central neste projeto é o laser de linha que se projeta sobre uma fatia vertical dos objetos. Essa projeção pode ser capturada na picamera, ter sua perspectiva corrigida e, em seguida, filtrada antes do processamento da imagem. No processamento de imagem, a distância entre cada segmento da linha do centro do objeto pode ser coletada. Em coordenadas radiais, esta imagem produziria os componentes r e z. A terceira dimensão, Θ, é então alcançada girando o objeto para uma nova fatia. Este conceito é mostrado na primeira figura.

Para realizar as ações descritas acima, usei um Raspberry Pi como nossa unidade de computação central. Eu conectei um motor de passo e um driver de motor ao Pi, alimentado por uma fonte externa de 5 V e controlado pelos pinos GPIO do Pi. Um laser de linha foi colocado na linha de 3,3 V no Pi e uma PiCam foi conectada à entrada da câmera no Pi. Por último, um simples botão puxado para baixo foi instalado e um LED de status para indicar ao usuário em que estado o sistema está. O sistema completo é resumido em um diagrama de blocos do sistema.

Desde o início, foi planejado abrigar os componentes eletrônicos em uma caixa de corte a laser unida a ranhuras em T e hardware M3. A eletrônica ficaria oculta em um compartimento inferior e uma tampa permitiria fácil acesso para colocação de objetos na bandeja rotativa. Essa tampa é necessária para minimizar a quantidade de luz que vaza no sistema, pois essa luz externa pode produzir ruído na varredura final.

Etapa 4: Hardware

Hardware
Hardware
Hardware
Hardware
Hardware
Hardware

Como visto acima, antes de começar o corte a laser ou impressão 3D, usei o Autodesk Fusion 360 para fazer um modelo 3D detalhado de nosso projeto. Como uma visão geral, o dispositivo é uma caixa simples com uma tampa com dobradiças cortadas a laser. Existem duas camadas principais do dispositivo: a cama dos eletrônicos e a cama principal, com orifícios para os fios passarem entre as duas camadas.

A maior parte de nossa caixa foi fabricada com um cortador a laser, com designs sendo produzidos no Fusion 360 e cortados em um cortador a laser Epilog Zing 40 W. Nossos projetos são mostrados nas figuras acima. Do canto superior esquerdo movendo para a direita, as peças são a cama principal, a cama dos eletrônicos, duas peças para a tampa, a parte traseira, a parte frontal e as duas peças laterais. Na cama principal, há três recortes principais: um para montar o motor de passo, um para direcionar os fios do laser e um para direcionar o cabo largo da PiCam. A peça da base tem orifícios de montagem para prender o Pi, placa de ensaio e driver do motor e um recorte maior para acessar o motor de passo. As peças da tampa se encaixam simplesmente para formar a peça triangular vista acima e a dobradiça é uma extrusão simples que tem a largura do diâmetro do orifício das placas laterais. A parte posterior e uma das laterais possuem ranhuras nas laterais para que as portas do Pi (HDMI, USB, Ethernet, Power) possam ser acessadas facilmente. A frente é uma peça simples que acabei fazendo furos com uma furadeira manual para montar o botão e o LED. Como visto em todas as peças, nossas peças são mantidas juntas por hardware M3 usando juntas em T e ranhuras. Este é um método de segurar peças cortadas a laser de forma ortogonal e segura. As aletas das peças se alinham com as ranhuras das outras peças e o corte em forma de T nas bordas dá espaço para que uma porca M3 seja enfiada nelas sem girar. Isso nos permite usar um parafuso M3 para travar as peças juntas com muito pouco espaço de manobra, sem que a montagem seja totalmente permanente.

Optei por fazer a maioria das nossas peças com cortador a laser devido à sua rapidez e facilidade. Porém, ainda tive que imprimir em 3D algumas peças devido à geometria 3D que seria mais difícil de criar na cortadora. A primeira peça foi o porta-laser de linha. Esta peça deveria ser montada na cama principal a 45 graus da visão da câmera e ter um orifício para que o laser pudesse se encaixar perfeitamente por fricção. Eu também tive que criar um suporte de motor porque o eixo do motor era muito longo. A fricção da montagem se encaixou nas peças cortadas a laser e baixou o plano ao qual o motor estava preso de modo que a plataforma giratória ficasse nivelada com o leito principal.

Etapa 5: Eletrônica

Eletrônicos
Eletrônicos

O hardware de fiação deste projeto era muito simples, pois o scanner 3D não exigia muitos periféricos. Um motor, botão, LED, laser e câmera precisavam ser conectados ao Pi. Conforme mostrado, certifiquei-me de conectar resistores em série com cada pino que usamos para proteger os pinos. Um pino GPIO era dedicado a controlar o LED de status, que acendia quando o dispositivo estava pronto para ser usado e pulsava com PWM quando o dispositivo estava operando. Outro pino GPIO foi conectado a um botão suspenso, registrando ALTO quando o botão não foi pressionado e BAIXO quando o botão foi pressionado. Por último, dediquei quatro pinos GPIO para acionar o motor de passo.

Uma vez que nosso motor só teve que pisar um certo ponto sem exigir controle de velocidade, optamos por um driver de motor de passo mais simples (L298N) que simplesmente aumenta as linhas de controle para alimentar as entradas do motor. Para aprender como operar os motores de passo em um nível muito baixo, consultamos a folha de dados do L298N e a biblioteca do Arduino. Os motores de passo têm um núcleo magnético com dedos pertrusos de polaridade alternada. Os quatro fios são enrolados para controlar dois eletroímãs, cada um alimentando cada um dos outros dedos opostos no motor. Assim, ao mudar a polaridade dos dedos, podemos empurrar o stepper um passo. Com esse conhecimento de como os steppers funcionavam em nível de hardware, fomos capazes de controlá-los com muito mais facilidade. Optamos por alimentar nosso motor de passo com uma fonte de alimentação de 5 V no laboratório em vez do Pi por causa de seu consumo máximo de corrente de cerca de 0,8 A, que é mais do que o Pi poderia fornecer.

Etapa 6: Software

Programas
Programas
Programas
Programas
Programas
Programas
Programas
Programas

O software para este projeto pode ser dividido em quatro componentes principais que interagem entre si: Processamento de Imagem, Controle de Motor, Criação de Malha e Funções Embutidas.

Como um resumo do software, podemos olhar para a primeira figura. À medida que o sistema é inicializado, o.bashrc se conecta automaticamente ao Pi e começa a executar nosso código python. O sistema acende a luz de status para permitir que o usuário saiba que foi inicializado corretamente e aguarda o pressionamento do botão. O usuário pode então colocar o item a ser digitalizado e fechar a tampa. Depois de apertar o botão, o LED pisca para permitir que o usuário saiba que o dispositivo está funcionando. O dispositivo fará um loop entre o processamento de imagem e o controle do motor até que a rotação completa seja concluída e todos os dados do objeto sejam coletados. Finalmente, a malha é criada e o arquivo é enviado por email para um email pré-selecionado. Isso reinicia o ciclo e a máquina está pronta para realizar outra digitalização com o pressionar de um botão.

Processamento de imagem

A primeira coisa implementada foi o processamento de uma imagem capturada para extrair as informações armazenadas na imagem em uma forma que pudesse ser usada para criar uma matriz de pontos no espaço. Para fazer isso, comecei tirando uma foto do objeto na plataforma junto com todo o ruído de fundo criado pelo laser brilhando na parte de trás da caixa e se dispersando. Essa imagem tinha dois problemas principais em sua forma bruta. Primeiro, o objeto foi visto em um ângulo com uma perspectiva elevada e, segundo, havia muito ruído de fundo. A primeira coisa que eu precisei fazer foi levar em conta esse ângulo de visão porque usar a foto como está não nos permitiria determinar uma altura consistente do objeto. Como visto na segunda figura, a altura da forma de “L” de cabeça para baixo é consistente; no entanto, devido a um lado ser mais longo que o outro, eles parecem ter diferentes alturas na borda mais próxima do visualizador.

Para corrigir isso, tive que transformar o espaço de trabalho na imagem em um retângulo da forma trapezoidal que tinha anteriormente. Para fazer isso, usei o código fornecido por este link, que ao fornecer uma imagem e quatro pontos, recorta a imagem entre os quatro pontos e transforma a imagem recortada para compensar a perspectiva. Essa transformação usa os quatro pontos para criar um retângulo em vez de uma forma de tipo trapézio, como visto na terceira figura.

O próximo problema que precisava ser resolvido era o ruído de fundo na forma de luz externa e a luz sendo refletida pelo próprio laser. Para fazer isso, filtrei a luz usando a função inRange () do OpenCV. Eu defini o limite para apenas pegar a luz vermelha em um determinado nível. Para obter o valor correto, comecei com um limite tolerante e continuei aumentando o nível de limite até que a única luz captada fosse a luz do laser no objeto sendo digitalizado. Assim que tive essa imagem, encontrei o pixel mais brilhante em cada linha para obtenha uma linha de um pixel por linha que contorna o lado esquerdo da linha do laser. Cada pixel foi então convertido em um vértice no espaço 3D e armazenado em uma matriz, conforme descrito na seção de criação de malha. Os resultados dessas etapas podem ser vistos na quarta figura.

Controle motor

Depois de conseguir processar com sucesso uma única imagem para obter a fatia do objeto, eu precisava ser capaz de girar o objeto para tirar uma nova foto com um ângulo diferente. Para fazer isso, controlei o motor de passo abaixo da plataforma em que o objeto sendo verificado se senta. Eu construí uma base de nossa função de passo criando uma variável para rastrear o estado do motor e micropasso alternando cada uma das quatro entradas do motor.

Criação de malhaPara criar uma malha a partir de todas as imagens processadas, primeiro tive que converter cada pixel branco da imagem processada em um vértice no espaço 3D. Como estou coletando fatias individuais do objeto com simetria cilíndrica, fez sentido começar a coletar coordenadas cilíndricas. Isso fazia sentido, pois a altura da imagem poderia representar o eixo z, a distância do centro da mesa rotativa poderia representar o eixo R e a rotação do motor de passo poderia representar o eixo teta. No entanto, como armazenei nossos dados em coordenadas cilíndricas, tive que converter cada um desses vértices em coordenadas cartesianas.

Uma vez que esses vértices foram criados, eles foram armazenados em uma lista e essa lista foi armazenada em outra lista que continha as listas de vértices criadas para cada imagem capturada. Uma vez que todas as imagens foram processadas e convertidas em vértices, eu tive que selecionar os vértices que eu realmente queria representados na malha final. Eu queria que o vértice superior e o vértice inferior fossem incluídos e, com base na resolução, escolhi um número de vértices com espaçamento uniforme para usar em cada imagem. Como nem todas as listas de vértices tinham o mesmo comprimento, tive que nivelá-las encontrando a lista com o menor número de vértices e removendo vértices de todas as outras listas até que estivessem todas iguais. Com as listas de vértices criadas, agora fui capaz de crie uma malha. Eu escolhi formatar nossa malha pelo padrão de arquivo.obj, pois é simples e imprimível em 3D.

Função Embutida

Depois que o dispositivo estava funcional, eu o aprimorei adicionando funcionalidade integrada completa. Isso significava remover o teclado, o mouse e o monitor e fazer com que ele nos enviasse sem fio o arquivo.obj após o término do processamento. Para começar, mudei o código.bashrc para fazer login automaticamente e iniciar o programa python principal na inicialização. Isso foi feito usando sudo raspi-config e selecionando “Console Autologin” e adicionando a linha “sudo python /home/pi/finalProject/FINAL.py” a /home/pi/.bashrc. Além disso, eu também adicionado um botão e LED de status para entrada e saída do usuário. O botão permite que o usuário informe ao dispositivo quando iniciar a digitalização e o LED informa ao usuário o estado da máquina. Se o LED estiver aceso, o dispositivo está pronto para iniciar uma nova varredura. Se o LED estiver pulsando, o dispositivo está digitalizando no momento. Se o LED for de escritório, há um erro de software, solicitando a reinicialização do sistema. Por último, habilitei o dispositivo para enviar o arquivo.obj por e-mail. Isso foi feito usando as bibliotecas smtplib e de e-mail. Essa capacidade de enviar e-mails nos deu uma maneira muito conveniente e sem fio de entregar o arquivo produzido ao usuário para acesso em muitas plataformas diferentes.

Etapa 7: Integração

Integração
Integração

Depois de fabricar as várias peças do dispositivo, montei-o. A figura acima mostra a ordem:

(a) caixa montada fora

(b) caixa montada dentro com câmera e laser

(c) vista interna da cama de eletrônicos

(d) parte traseira do Pi com acesso às portas Pi e a entrada do motor de 5V

(e) botão de pressão com anel LED e luz de status na frente do dispositivo

Etapa 8: Resultados

Resultados
Resultados
Resultados
Resultados
Resultados
Resultados
Resultados
Resultados

O scanner a laser 3D foi capaz de digitalizar objetos com precisão decente. As características dos objetos são distintas e reconhecíveis e as peças eram muito fáceis de imprimir em 3D usando um software de fatiamento como o Repetier. As figuras acima mostram algumas varreduras de amostra de um pedaço de madeira e um patinho de borracha.

Uma de nossas maiores descobertas e sucessos que descobri durante os testes foi a consistência do dispositivo. Ao longo de várias tentativas do mesmo objeto, o scanner foi capaz de produzir um arquivo.obj muito semelhante a cada vez, mesmo que alterássemos ligeiramente o posicionamento do objeto. Como visto nas três varreduras separadas, todas são muito semelhantes, capturando os mesmos detalhes e a mesma quantidade de detalhes. No geral, fiquei muito impressionado com a consistência e robustez do nosso sistema.

Uma das variáveis que realmente consegui ajustar é a resolução das varreduras. Como há 400 etapas no stepper, posso escolher o tamanho de cada ΔΘ para ditar a resolução angular. Por padrão, tenho a resolução angular definida para 20 iterações, o que significa que, a cada quadro, o motor gira em 20 etapas (400/20 = 20). Isso foi escolhido principalmente por questão de tempo - leva cerca de 45 segundos para concluir uma varredura dessa maneira. No entanto, se eu quiser uma varredura de qualidade muito mais alta, posso aumentar o número de iterações até 400. Isso fornece muito mais pontos para construir o modelo, tornando a varredura muito mais detalhada. Além da resolução angular, também posso ajustar a resolução vertical ou quantos pontos diferentes escolho pesquisar ao longo do corte do laser. Para um interesse semelhante no tempo, tenho esse padrão definido para 20, mas posso aumentá-lo para obter melhores resultados. Ao brincar com esses parâmetros de resolução angular e resolução espacial, fui capaz de compilar os resultados de diferentes varreduras abaixo na última figura. Cada etiqueta é formatada de forma que seja a resolução angular x resolução espacial. Conforme visto nas configurações de digitalização padrão, os recursos do pato são reconhecíveis, mas não detalhados. No entanto, conforme eu aumento a resolução, características individuais precisas começam a aparecer, incluindo os olhos, bico, cauda e asas no pato. A imagem de maior resolução levou cerca de 5 minutos para digitalizar. Ver essa resolução alcançável foi um grande sucesso.

Limitações

Apesar dos resultados bem-sucedidos do projeto, ainda existem algumas limitações de design e implementação. Com o uso do laser, surgem muitos problemas com a forma como a luz se dispersa. Muitos objetos que tentei escanear que eram translúcidos, brilhantes ou muito escuros mostraram-se problemáticos com a forma como a luz refletia na superfície. Se o objeto fosse translúcido, a luz seria absorvida e dispersa, tornando a leitura das fatias muito barulhenta. Em objetos brilhantes e escuros, a luz seria refletida ou absorvida a ponto de ser difícil de captar. Além disso, como estou usando uma câmera para capturar as características dos objetos, sua detecção é limitada por sua linha de visão, o que significa que objetos côncavos e ângulos agudos são frequentemente bloqueados por outras partes do objeto. Isso é mostrado em nosso exemplo do pato de borracha, já que a cauda às vezes perde sua curvatura na varredura. A câmera também pode detectar apenas estruturas de superfície, o que significa que orifícios ou geometrias internas não podem ser capturados. No entanto, esse é um problema comum que muitas outras soluções de digitalização também têm.

Próximos passos

Embora eu tenha ficado feliz com os resultados do nosso projeto, havia algumas coisas que poderiam ser implementadas para torná-lo melhor. Para começar, no estado atual, a resolução da varredura só pode ser alterada alterando as variáveis de resolução embutidas em código em nosso código. Para tornar o projeto mais integrado, um potenciômetro de resolução poderia ser incluído para que o usuário pudesse alterar a resolução sem ter que conectar um monitor e teclado ao scanner. Além disso, o scanner cria imagens que às vezes podem parecer irregulares. Para corrigir isso, técnicas de suavização de malha podem ser implementadas para suavizar irregularidades e cantos ásperos. Por último, descobri que as coordenadas de pixel não se adaptam bem ao mundo real. As malhas que criei eram 6 a 7 vezes maiores do que o objeto real. No futuro, seria vantajoso implementar uma forma de dimensionar malhas para que sejam mais precisas para o tamanho real do objeto.

Etapa 9: Recursos

Incluí o código, arquivos STL para impressão e arquivos DXF para recorte de todo o projeto.

Raspberry Pi Contest 2020
Raspberry Pi Contest 2020
Raspberry Pi Contest 2020
Raspberry Pi Contest 2020

Primeiro prêmio no Raspberry Pi Contest 2020

Recomendado: