Kit experimental de polarização da luz com múltiplos polarizadores
Contents
Descrição do kit experimental
A montagem do kit experimental de polarização da luz com múltiplos polarizadores é composta por três componentes principais: (i) a componente mecânica composta por peças de plástico impressas em 3D, cujos desenhos técnicos estão disponíveis aqui, (ii) um raspberry Pi que executa o software de controlo através da internet e ainda realiza o streaming do vídeo, e (iii) a componente eletrónica do controlador escravo de baixo nível que está responsável pela deteção e motorização do kit experimental.
Montagem Mecânica
Nesta parte, a montagem mecânica do kit experimental é explicada em detalhe para poder ser corretamente montada.
Ordem de Montagem
1. Verificar se todas as peças necessárias à montagem estão disponíveis.
2. Retirar os suportes de impressão das polias com a ajuda de pinças ou de um X-Acto.
3. Colocar as correias nas polias.
4. Ligar as polias aos suportes dos polarizadores. Ouvir um “click” para saber que estão bem ligados. Adicionalmente, colocar os polarizadores nos suportes. (Não esquecer de retirar as películas protetoras dos polarizadores, caso seja necessário)
5. Repetir os passos 2, 3 e 4 até ter a corrente de polias e polarizadores completa. (Não esquecer de ter as correias nas polias, que não estão representadas na figura.)
6. Cortar as camadas finas de suporte que tapam os furos das placas principais da estrutura.
7. Juntar dois dos quatro pilares e colocar as porcas nos buracos específicos no topo dos pilares.
8. Ligar os dois pilares colocando os parafusos nos furos específicos.
9. Juntar as placas principais nesta posição.
10. Colocar os pilares ligados no canto da junção das placas principais.
11. Colocar os suportes da corrente no outro lado das placas principais, de modo a que fiquem em lados opostos. Verificar se o suporte da corrente está colocado em cima dos furos hexagonais.
12. Colocar as porcas nas "caixas" mais próximas da "parede" do suporte da corrente.
13. Colocar os parafusos nos pilares ligados para aparafusar os pilares às placas e ao suporte da corrente.
14. Colocar as porcas no resto das "caixas" do suporte da corrente.
15. Colocar os parafusos através das placas principais para aparafusar o suporte da corrente às placas.
16. Repetir os passos 7 e 8.
17. Ir para o lado oposto das placas principais e colocar os pilares aparafusados debaixo dos furos circulares.
18. Colocar as porcas dentro das "caixas" superiores dos pilares aparafusados.
19. Colocar o parafuso através das placas principais de modo a aparafusá-las aos pilares aparafusados.
20. Ligar a corrente aos suportes da corrente, tanto ao aparafusado como ao solto.
21. Colocar as porcas dentro das "caixas" próprias do suporte da corrente que está solto.
22. Colocar os parafusos através dos furos das placas principais para ligar o suporte da corrente solto às placas principais.
23. Escolher um dos pilares ainda não usados e colocar uma porca na "caixa" do meio.
24. Colocar o pilar debaixo das placas principais num dos cantos.
25. Colocar um parafuso através do furo nas placas principais para juntá-las ao pilar.
26. Repetir os passos 23, 24 e 25 até que os quatro cantos da estrutura estejam suportados.
27. Remover os pequenos pilares que tapam a entrada das porcas nas "caixas" da superfície inferior das placas principais.
28. Colocar as porcas dentro dessas "caixas".
29. Colocar o suporte do motor de passo por cima dos furos da placa principal onde se puseram as porcas.
30. Colocar os parafusos através dos furos do suporte do motor de passo de modo a ligá-lo à placa principal.
31. Repetir os passos 28, 29 e 30 para os outros quatro suportes do motor de passo.
32. Colocar o motor de passo no suporte do motor de passo, pondo primeiro os cabos através do furo superior e inferior do suporte. Depois, apertar/colocar o motor de passo até se ouvir um click para garantir que este está fixo na posição correta. NOTA: a ligação dos cabos depende do driver, não é confiável usar as cores dos cabos.
33. Repetir o passo 32 para os outros quatro motor de passo.
34. Colocar a correia na polia.
35. Ligar a polia (com a correia) ao motor de passo.
36. Apertar a polia do motor de passo.
37. Ajustar a posição do suporte do motor de passo de modo a garantir que a correia está à tensão.
38. Apertar os parafusos do suporte do motor de passo de modo a fixá-lo.
39. Repetir os passos 34, 35, 36, 37 e 38 para os outros quatro suportes dos motores de passo.
40. Montagem Completa.
Circuito Eletrónico
Este kit experimental tem duas componentes eletrónicas principais, (i) os drivers para os motores do motor de passo e (ii) a fonte de luz e deteção.
Montagem da Componente Eletrónica
1. Verificar se todas as peças necessárias à montagem da componente eletrónica estão disponíveis.
2. Pegar na base esquerda da componente eletrónica (verificar a imagem abaixo) e usar um ferro de solda para inserir os insertos roscados nos furos da base, através do processo de inserção térmica.
3. Pegar na caixa do Arduino Mega (verificar a imagem abaixo) e aparafusá-la à base da componente eletrónica.
4. Usar um ferro de solda para inserir os insertos roscados nos furos da caixa, através do processo de inserção térmica.
5. Pegar num dissipador de calor.
6. Retirar a película de papel.
7. Colar o dissipador de calor ao driver do motor de passo.
8. Repetir os passos 1, 2 e 3 para os cinco drivers.
9. Colocar o driver do motor de passo na placa RAMPS 1.4 (RepRap Arduino Mega Pololu Shield)
10. Certificar que o driver fica bem colocado, ou seja que a ligação ao ground está como indicado na imagem e que o parafuso (potenciómetro) se encontra do lado oposto à fonte de alimentação (no caso dos drivers verdes ou encarnados) ou do lado da fonte de alimentação (no caso dos drivers roxos).
11. Repetir os passos 5 e 6 para os cinco drivers.
12. Ligar os interruptores de curso aos cabos.
13. Colocar os interruptores de curso no segurador dos interruptores. Garantir que se houve um "click".
14. Ligar os cabos dos motores de passo e dos interruptores de curso aos drivers através da placa RAMPS 1.4. Verificar a ligação dos cabos aos pinos da placa de acordo com a informação presente na subsecção Drivers dos motores de passo.
15. Montar o circuito elétrico do fotodiodo e do detetor.
File:Photodiode circuit.jpg Esquema do circuito elétrico do fotodiodo e do detetor. |
16. Colocar o circuito elétrico no canto da caixa, posicionando-a de acordo com os furos, e aparafusá-la.
17. Pegar na parte de cima da caixa do Arduino Mega e aparafusá-la à parte de baixo (ter atenção aos cabos ao fechar a caixa).
18. Repetir o passo 2 para a base direita.
19. Colocar a fonte de alimentação na base direita e aparafusá-la.
20. Pegar na parte de baixo da caixa do Raspberry Pi e repetir o passo 4.
21. Aparafusar o Raspberry Pi à caixa.
22. Prender a parte do meio da caixa do Raspberry Pi à parte de baixo.
23. Colocar a tampa para fechar a caixa.
Drivers dos motores de passo
Os drivers dos motores de passo podem ter múltiplos designs de output de acordo com cada produtor. Os pinos dos motores de passo estão numerados de 1 a 6, da esquerda para a direita da vista frontal (eixo do montor de frente e conector virado para baixo). A posição dos drivers no arduino relaciona-se com os motores de passo de acordo com o seguinte esquema:
| 5 | 3 | N/A |
| 1 | 2 | 4 |
Usando um cabo próprio, as ligações devem seguir as indicações da tabela em baixo:
| Pinos da motherboard | Cor dos cabos | Pino do motor de passo (A4988) | Pino do motor de passo (DRV8825) |
|---|---|---|---|
| 2B | Encarnado | 6 | |
| 2A | Verde | 3 | |
| 1A | Preto | 1 | |
| 1B | Azul | 4 |
Fonte de luz e deteção
O LED encarnado é alimentado por um pino de output PMW (A4) da placa de controlo principal, o que permite uma intensidade da luz variável. O PWM padrão da placa tem uma modulação de 490Hz em passos de 1/256, permitindo uma resolução inferior a 0.5%.
Após passar pela cascata de polarizadores, o sinal é detetado por um fotodiodo. Este fotodiodo é polarizado inversamente com um resistor ligado ao ground para gerar um sinal nulo quando não há luz presente.
Esta frequência tem de ser filtrada por um filtro RC de primeira ordem passa-baixo. Como a constante do tempo é ~1s, é necessário adiar a primeira aquisição para a configuração das tensões do circuito. Assim sendo, o sinal varia suave e lentamente devido à rotação dos polarizadores, e a sobreamostragem está em vigor, é necessário um tempo de estabilização muito menor.
Caminho Óptico
O caminho óptico consiste numa fonte de luz (1) (LED encarnado) colocado no ponto focal de uma lente semiesférica (2) onde os raios de luz são colimados num feixe de luz paralelo.
Depois a luz é polarizada por um polarizador fixo (3) antes de entrar na cascata de polarizadores com inclinação variável (4). Esta cadeia escurece a luz de acordo com cada ângulo do polarizador e, em seguida, passa pela segunda lente para focalizar no detetor, um fotodiodo (6).
Antes de chegar ao fotodiodo, a luz pode passar por um filtro encarnado (5) para diminuir a largura de banda e limitar o ruído externo. Este filtro não é totalmente necessário e pode ser substituído por um papel celofane encarnado ou simplesmente retirado no caso de uma estrutura plástica totalmente opaca.
Alinhamento do Caminho Óptico
A estrutura principal do kit experimental tem a luz a propagar-se em raios paralelos através da cascata de polarizadores. Estes raios, posteriomente, são centralizados no sensor (fotodiodo). Para obter uma boa leitura da relação sinal-ruído é crucial ter esta estrutura perfeitamente alinhada. Assim sendo, a posição linear do LED emissor e do fotodiodo deve ser ajustada de acordo com o seguinte procedimento:
- Primeiramente, montar a fonte de luz (LED) e as lentes da estrutura;
- Alimentar o LED e seguir a imagem circular emergente do output, ex. projetá-la numa parede afastada um par de metros;
- Mover a posição do LED de modo a obter uma imagem de output o mais próxima do tamanho do círculo de saída possível (~30mm);
- Instalar a estrutura para a cascata de polarizadores sem colocar as lentes ou películas polarizadoras;
- Para focar a luz no fotodiodo, colocar a segunda lente de colimação;
- Usando um voltímetro para ler a intensidade da luz recebida pelos terminais do fotodiodo, mover para trás e para a frente a posição do fotodiodo a fim de maximizar o sinal;
- Colar firmemente a fonte de luz e o fotodiodo nas suas posições finais.
Calibração do Caminho Óptico
Assim que a montagem mecânica estiver completa, é necessário calibrar a posição absoluta de cada polarizador; efetivamente todos os polarizadores vão ter um pequeno offset, resultando num erro sistemático. Deste modo, é importante anotar os valores dos ângulos que maximizam a transmissividade.
O primeiro polarizador é fixo e deve ser posicionado com um pequeno offset com o intuito de evitar começar a experiência a partir de um máximo, permitindo uma fácil observação de tal máximo. Aconselha-se colocá-lo entre os 15 e os 30 graus e prendê-lo eficazmente, se necessário usando até cola. Depois, começar o procedimento de calibração inserindo o segundo polarizador e rodando-o até que os máximos serem detetados e medidos (normalmente são dois). Anotar o seu valor e deixar o segundo polarizador nessa posição. De seguida, inserir o terceiro polarizador e repetir o procedimento de deteção e anotação dos máximos. Repetir este passo para todos os restantes polarizadores. Todas as vezes que lentes ou películas polarizadoras são instaladas precisam de ser bem fixas ou coladas. No caso do uso da cola, garantir que não danifica as lentes/películas polarizadoras.
No final, uma tabela com os máximos ângulos de transmissão é obtida, indicando o valor de referência para a intensidade máxima na cascata de polarizadores.
Posteriormente, ao realizar experiências, os valores de offset devem ser tidos em conta de modo a eliminar o erro sistemático do sistema.
Software
Para utilizar corretamente a experiência, os comandos e a recolha de dados têm de estar operacionais. Isto pode ser alcançado de duas formas, atuando através da ligação série ao Arduino Mega.
O firmware existente no Arduino é capaz de (i) configurar a experiência, (ii) executar e recolher os dados gerados, e (iii) executar algumas funções especializadas de forma a testar, calibrar e manter a experiência. Para interagir com o firmware, pode-se usar um código proxy em Python (camada de software de alto nível) capaz de comunicar com o servidor FREE, ou um emulador de terminal como o Minicom, disponível para Linux, que permite enviar e receber dados através da ligação série.
Proxy FREE do Raspberry
O Raspberry Pi é responsável por transmitir o feed de vídeo da experiência e estabelecer a comunicação com o Servidor FREE utilizando uma interface proxy. O FREE aloja a interface gráfica do utilizador (GUI) para os clientes. Esta secção fornece uma visão geral concisa do procedimento utilizado para controlar todos os componentes eletrónicos através do Arduino, bem como dos protocolos de comunicação entre o Arduino e o Servidor FREE.
Modelo de comunicação entre o Servidor FREE e o Raspberry PI
A comunicação entre o servidor e a experiência segue o protocolo estruturado do e-lab que permite a interação e troca de dados em tempo real. O servidor central, Exp Server, atua como um intermediário entre os utilizadores e o aparelho experimental (RPi Server). Os utilizadores interagem com o Exp Server através de uma interface web feita com Django, uma framework web de alto nível em Python, para configurar e controlar os parâmetros da experiência, enquanto o Exp Server retransmite diretamente estes comandos para a configuração experimental.
A comunicação entre o Exp Server e o RPi Server ocorre através da internet utilizando mensagens no formato JSON, garantindo flexibilidade entre diferentes configurações experimentais. A autenticação é realizada na fase de ligação, onde o RPi Server transmite um ID e uma chave secreta para verificação. Uma vez autenticado, o Exp Server envia um ficheiro de configuração específico da experiência para o RPi Server, que depois estabelece a comunicação com o controlador local utilizando o protocolo predefinido [7]. Durante toda a experiência, o RPi Server troca continuamente atualizações de estado, resultados experimentais e mensagens de erro com o servidor XP, garantindo uma operação sincronizada e acessibilidade de dados em tempo real para os utilizadores.
Modelo de comunicação entre o Raspberry PI e o Arduino Mega
Para permitir uma comunicação perfeita entre o Arduino e o Raspberry Pi 4, foi implementado o protocolo ReC Generic Drive 11, permitindo ao utilizador externo ter controlo total sobre a experiência e o seu estado através de um conjunto de comandos. O ReC Generic Drive é um protocolo de comunicação genérico concebido para laboratórios remotos, facilitando a interação entre um controlador de software (driver) e o hardware experimental. Permite uma comunicação contínua através de portas série (RS232), utilizando mensagens estruturadas onde os comandos do driver estão em minúsculas e as respostas do hardware em maiúsculas.
O protocolo garante a sincronização através do "handshaking" de mensagens e do tratamento de tempos limite (timeouts), suportando funções como identificação, configuração, transmissão de dados, configuração da experiência e relatório de erros.
Ao ler a porta série do Arduino a uma taxa de transmissão (baud rate) de 115200 bits por segundo, o utilizador envia uma cadeia de bits (terminando com o carácter \r).
Instruções de Configuração para Administradores
Para implementar uma nova instância da experiência do multi-polarizador, o proxy do Raspberry Pi e o firmware do Arduino devem ser configurados e compilados. Siga estes passos para garantir uma inicialização correta:
- Descarregar o repositório da experiência via SSH:
git clone https://github.com/farrucho/multi-polarizer.git
- Modificar o ID da experiência em `main.cpp` para corresponder à configuração do servidor FREE:
expr.begin("ELAB_FIVEPOLARIZER"); - Ajustar as direções dos motores e a tensão de referência em `user_define.cpp`:
uint8_t resetDir = HIGH; // Direção para acionar o interruptor. Teste movendo para trás para garantir que aciona corretamente. uint8_t dirToTop = LOW; int vrefMode = 1;
- Identificar a porta série do Arduino:
ls /dev/tty*
Atualizar o ficheiro `platformio.ini` com a porta correta (ex., `monitor_port = /dev/ttyACM0`). - Compilar e carregar o firmware utilizando o PlatformIO a partir da pasta `e-lab`:
pio run -t upload -t monitor -t clean
- Configurar o script de arranque do proxy editando `/etc/rc.local`:
sudo nano /etc/rc.local
Adicionar as seguintes linhas antes de `exit 0`:
_IP=$(hostname -I) || true if [ "$_IP" ]; then printf "My IP address is %s\n" "$_IP" fi sleep 120 cd /home/elab/RPi_Proxy_fivepol su elab -c "sh start-wp.sh &"
- Ativar o serviço `rc-local` no arranque utilizando o `systemctl`:
sudo systemctl enable rc-local sudo systemctl start rc-local
---
Firmware
A programação foi feita em linguagem C++ sem recurso a bibliotecas externas. Para declarar um componente no código, basta fornecer o pino de entrada correspondente e aceder à função de ativação (enable) para o inicializar, bem como à função `isTrigger` para verificar se o valor lógico lido corresponde ao estado de acionamento do componente. Neste caso particular, o interruptor é ativado com um sinal LOW (baixo). Uma vez que todos os objetos e respetivos componentes precisam de ser inicializados e desligados, cada um possui funções correspondentes de enable/disable. Os componentes ligados a pinos de leitura simples, declarados como `pinMode` (como interruptores e fotodíodos), não requerem uma função de desativação, pois o `pinMode` não impede a leitura dos pinos, servindo antes para definir o tipo de entrada a ser processada.
De modo a rodar os motores de passo, a operação consiste em enviar um pulso cada vez que se pretende uma rotação de 1.8º (0.36º efetivos). Como diferentes valores de RPM requerem diferentes intervalos de pulso, a frequência de pulsos enviados tem de ser calculada em conformidade. Para executar uma sequência discreta de passos com base num dado ângulo em graus, foi implementada a função rotate. O motor roda para o múltiplo inteiro inferior mais próximo de 1.8º em relação ao ângulo fornecido.
O intervalo de aquisição de dados é crucial para a experiência final, uma vez que o objetivo é otimizar a utilização, minimizando os tempos de espera na recolha da intensidade da luz e dos dados do ângulo de varrimento. Para contornar isto, foi utilizada uma RPM global de 600 rotações por minuto. Com um limite de varrimento de 324º, o tempo de aquisição de dados medido experimentalmente para varrer um ou mais polarizadores em simultâneo foi de aproximadamente 40 segundos.
Para refinar ainda mais as leituras de tensão do fotodíodo, foi implementada uma média aritmética de N pontos na função de leitura de tensão do fotodíodo. Ao calcular a média aritmética sobre 13 pontos do valor medido, o desvio padrão desta média reduz o desvio padrão original em ≈ 27.14%. Esta redução foi considerada aceitável para a experiência, uma vez que o ajuste de dados efetuado foi bem-sucedido.
Depuração pelo Utilizador e Comandos Série
Para testes manuais de hardware e calibração, os administradores podem enviar comandos série diretos para o Arduino utilizando um emulador de terminal como o Minicom.
Ligue-se ao terminal utilizando a porta correta identificada anteriormente:
minicom -D /dev/ttyACM0
Ao enviar um ponto de interrogação `?` e pressionar Enter, o firmware irá devolver um menu de ajuda listando todos os comandos disponíveis. Abaixo encontra-se a explicação para cada comando suportado:
| Comando | Parâmetros | Descrição |
|---|---|---|
| `cur` | Nenhum | Retorna os parâmetros configurados atualmente. |
| `str` | Nenhum | Inicia o varrimento da experiência com base nos parâmetros configurados previamente. |
| `stp` | Nenhum | Para imediatamente a experiência e interrompe todos os movimentos dos motores. |
| `rst` | Nenhum | Repõe e move todos os motores de passo para a posição inicial (home), recuando até que os respetivos interruptores de fim de curso sejam acionados. |
| `ids` | Nenhum | Retorna a string de identificação do hardware e do firmware. |
| `cfg` | `theta1 theta2 theta3 theta4 theta5` | Configura as posições iniciais ou alvo (em passos) para cada um dos 5 polarizadores. Os limites são restringidos por `MAXIMUM_STEP`. |
| `led` | `on [0:255]` ou `off` | Controla a intensidade do LED vermelho utilizando Modulação por Largura de Pulso (PWM). O valor varia de 0 (desligado) a 255 (brilho máximo). |
| `lamp` | `on [0:255]` ou `off` | Controla a intensidade da fonte de luz auxiliar utilizando Modulação por Largura de Pulso (PWM). O valor varia de 0 (desligado) a 255 (brilho máximo). |
| `set maxstep` | `[0:1000]` | Define o limite mecânico máximo permitido para os polarizadores. Por predefinição, 900 passos correspondem ao limite físico de 900*0.36º=324.0º. |
| `set vref` | `[1:3]` | Ajusta a tensão de referência do Conversor Analógico-Digital (ADC) para evitar a saturação do fotodíodo dependendo da intensidade da luz. (1: Vref = 1.1V, 2: Vref = 2.56V, 3: Vref = 5V). |
| `move forward` | `polarizer[1:5] steps[0:MAXIMUM_STEP]` | Roda manualmente um polarizador específico para a frente pelo número de passos designado. |
| `move backward` | `polarizer[1:5] steps[0:MAXIMUM_STEP]` | Roda manualmente um polarizador específico para trás pelo número de passos designado. |
| `go to origin` | `polarizer[1:5]` | Comanda um único polarizador específico a regressar à sua posição zero/inicial até acionar o seu interruptor. |




























