Até nesta foto se sente o poder do Intel N2840

Quando contei o que estava a fazer a um amigo, a resposta dele foi:

“tu és daquelas pessoas que nunca se vai aborrecer na reforma, não és?”

Provavelmente não. Mas o que ando eu a magicar?

No início da pandemia COVID-19, precisei de um servidor para um projecto relâmpago de um fim-de-semana. Felizmente tinha um raspberry pi 4 à mão, que determinei ser adequado para o mesmo.

Depois descobri que as imagens do Docker Hub que precisava para o projecto eram específicas para X86 e não existiam para ARM. Após perder mais algum tempo a criar imagens específicas para a arquitectura do Raspi, consegui pôr tudo a funcionar… por 2 minutos.

Foi o 2º Raspberry pi 4 que faleceu nas minhas mãos, inexplicavelmente. Mas continuava a precisar de um servidor e a Mauser, onde costumo comprar estas pequenas jóias, tinha acabado de fechar devido ao surto.

A solução foi utilizar um fóssil cá de casa, um portátil adquirido há vários anos com o simples objectivo de ter uma máquina de escrever que pudesse ser transportada.

A aventura foi bem sucedida (excluindo uma demora colossal para que o Ubuntu server se decidisse a arrancar no portátil e mais tempo na BIOS do que o desejável), e durante 3 semanas a magnífica obra esteve em exposição na nossa sala.

Eventualmente chegou a hora de ser arrumado. No entanto, recentemente tive a necessidade de colocar em funcionamento novamente um servidor X86, que pelas necessidades de RAM, sairia mais caro na cloud do que eu desejava.

Aliando essa necessidade à vontade de não ter um mono horrível à vista e ao desejo de dar algum trabalho à impressora 3d, decidi retirar a motherboard do portátil e construir uma custom enclosure para ela.

Os objectivos:

  • A caixa tem que ter um aspecto minimamente decente;
  • Os apoios da motherboard têm que ser utilizados (não pode ser uma caixa de sapatos para onde atiro tudo lá para dentro);
  • A ideia é não gastar mais do que o necessário;

CAD Design

A ferramenta escolhida para desenhar a caixa foi o OpenSCAD. Para aqueles que não conhecem, esta é uma aplicação que permite desenhar modelos 3d paramétricos baseados em código com uma sintaxe parecida com C.

As vantagens que vi no OpenSCAD foram a capacidade de definir os pontos do espaço necessários e efectuar cálculos sobre estes, em contraste com a modelação tridimensional tradicional de criar as formas no espaço. Também já tinha alguma experiência com a ferramenta, o que é algo positivo quando a tarefa em mente não é “aprender a usar X” mas sim “fazer Y”.

Desenho iterativo

Defini que o primeiro passo seria encontrar a localização no espaço dos buracos da motherboard onde esta é aparafusada. Os apoios que alojam os parafusos e ligações entre si funcionariam como um “esqueleto” onde seria adicionada a ventoinha do processador. O IO Shield, face única onde se encontram as ligações da board seria ligado também ao esqueleto (mais explicações à frente) e finalmente seria tudo colocado numa caixa desenhada em volta destes elementos.

Odisseia nº 1 - Em busca dos buracos

Tinha esperanças de encontrar na Internet um desenho técnico da motherboard que especificasse as dimensões, distâncias, etc, nem que para isso tivesse que voar uma bandeira preta com uma caveira. No final, encontrei um ficheiro “BoardView” com as ligações e componentes da placa mas, infelizmente, sem medidas. A solução que encontrei foi retirar as posições do centro dos buracos no MSPaint e medir a distância entre dois pontos com um paquímetro, para encontrar um factor de conversão entre pixel e milímetro.

Optei por usar apoios impressos em plástico para segurar os parafusos. Sendo PTGE e não sofrendo muitos ciclos de apertar-desapertar, “serve”. Dado que as circunferências impressas acabam sempre mais pequenas do que desenhadas, criei uma peça com apoios, cada um com um buraco de raio progressivamente maior, para descobrir aquele em que os parafusos apertavam com um bom rácio entre dificuldade e segurança.

Espaçamentos de 0.1 numa competição mais equilibrada que o futebol português

Algumas linhas de código e uma hora depois e tinha nas mãos o primeiro elemento, 9 apoios de parafusos e ligações de 2mm de espessura entre eles. Os apoios revelaram-se mais finos do que o necessário e as distâncias não estavam perfeitas, particularmente por ter usado um factor de conversão que os deixou mais próximos uns dos outros do que o correcto. A segunda versão do elemento corrigiu estes problemas quase na totalidade. A flexibilidade do plástico contribuiu para atenuar o ligeiro erro que se mantém nas distâncias dos parafusos.

A versão corrigida do 'esqueleto'

Odisseia nº 2 - A entrada de rede amputada

A entrada do cabo RJ45 nesta motherboard apenas apresenta a parte superior do conector (onde estão alojados os contactos), sendo que a parte inferior fazia parte do chassis do portátil. A solução seria desenhar algo parecido na minha caixa. Este pequeno passo implicou 3 iterações:

  1. Entre encontrar modelos de um conector 8P8C (o usado nos cabos RJ45) e tirar medidas ao chassis e à motherboard, desenhei e imprimi a parte inferior do conector. Esta saiu quase perfeita, necessitando de alguns ajustes que foram incorporados no passo seguinte.

A primeira e segunda iteração da base da porta de rede

  1. A inclusão do conector orientado e posicionado adequadamente nos eixos X, Y e Z. A minha primeira solução para encontrar a localização foi determinar as distâncias entre 2 parafusos e o conector e inferir matematicamente as coordenadas X e Y. Entre equações, triângulos e circunferências encontrei a solução: ignorar a matemática, e medir o melhor possível com o paquímetro, que se revelou totalmente adequado, visto que também era só saber 1 ponto. Imprimi então o conector ligado ao esqueleto anterior (simplificado para apenas 4 parafusos, para poupar tempo e plástico).

  2. Corrigir o que fiz anteriormente porque a medida que tirei da posição estava correcta excepto que coloquei o conector especificamente nesse ponto quando deveria estar desviado para alinhar correctamente.

Pouco mais de 1mm separa estas duas peças, mas uma simplesmente não serve

Odisseia nº 3 - Restantes conectores

Na perspectiva de deixar a caixa esteticamente apelativa, decidi fazer espaços individuais para cada conector relevante (excluí o cartão SD). Com a experiência da BoardView, tomei uma direcção similar: tirei uma foto do topo da board e uma de frente dos conectores, com uma régua alinhada no espaço com estes, e passei para o GIMP.

No GIMP, corrigi a rotação das fotos, adicionei guias e tirei medidas em pixels entre os conectores todos. Medi ainda a distância em pixel de 5-10 cm na régua da imagem. Com estas medidas e sabendo já a localização do conector de rede, poderia colocar no espaço os espaços adequados para cada ligação.

Nesta fase o código da caixa estava a transformar-se em esparguete, em parte devido à escassez de ferramentas do OpenSCAD mas igualmente porque começavam a entrar em jogo vários factores de conversão para diferentes imagens e porque a localização de diferentes componentes estava dependente de diferentes peças, originando uma árvore de dependência.

Contemplei fazer um helper em python que convertesse as medidas todas num ficheiro OpenSCAD mas acabei por determinar que mais valia fazer um ficheiro scad só com as coordenadas e dimensões de todos os pontos “macro”, alojando os módulos que desenham as peças noutro(s) ficheiro(s).

Aproveitei ainda para inicializar o git nesta pasta, antes de continuar a criar ficheiros.

O código tornou-se mais fácil de gerir e eventualmente terminei o faceplate. De todos os conectores, apenas o USB não ficou correctamente alinhado (provavelmente pela distorção inerente à fotografia ou erro na medição), que corrigi manualmente para a iteração seguinte.

Melhor IO Shield na história de IO Shields

O soluço e o primeiro “hack”

Nesta fase, por alguma razão que não consigo explicar, ao tentar fazer slice do modelo no PrusaSlicer, este encontrava um erro e recusava-se a dar-me um resultado decente. Tal acontecia devido à “extensão” que fiz para ligar o conector de rede (que teria que ficar exactamente na localização prévia para permitir a ligação do cabo) e a superfície da caixa, a faceplate. Quando esta extensão não estava alinhada com a superfície da caixa, não havia problema, mas quando o fazia, encontrava o erro. A solução de “pedreiro” que encontrei foi adicionar 0.01mm de offset, suficiente para o slice correcto, mas tão pequeno que não é visível. Pondero abrir uma issue no PrusaSlicer ou no OpenSCAD mas terei que investigar melhor.

Odiesseia nº 4 - Montar a ventoinha

Para determinar as posições, utilizei novamente o truque das fotografias. Desenhei o suporte desconectado do esqueleto, imprimi para testar as distâncias e estava tudo correcto. No entanto deparei-me aqui com o problema de desenhar para impressoras 3D: é preciso ter em consideração que a impressora imprime sempre de baixo para cima e não consegue colocar plástico a flutuar, sendo que devem ser evitados os suportes, sempre que possível.

A forma como estava a desenhar implicava imprimir com muitos suportes ou então imprimir duas peças em separado que eram viradas e aparafusadas, aumentado os materiais e a espessura desnecessariamente.

A solução foi subir tudo o que estava feito e criar dois níveis: No rés-do-chão estaria a base da caixa, de onde partiriam os apoios da ventoinha e da motherboard. Os apoios da board seriam estendidos até ao 1º andar, onde seria colocada a placa e onde se encontrariam os espaços para os conectores saírem.

Suporte para a ventoinha, pronto para mandar fora

Até à próxima…

Foi aqui que fiquei. Em breve será testado o primeiro protótipo de duplo andar. Ainda faltam algumas coisas:

  • Um suporte para a grade do SSD;
  • A caixa em volta do esqueleto;

Aint she a beauty?

Quando terminado, terei feito um servidor de potência questionável. Espero poder concluir em breve o projecto.

Deixo o código aberto no gitlab, advertindo no entanto que não sou nenhum expert em OpenSCAD, e tanto o Git como o código que lá se encontra ~podiam~ deviam estar bem melhor organizados.