
8-Bit CPU 32k
slu4coder/Minimal-64x4-Home-Computer
My DIY TTL home computer with VGA and PS/2 and 4x the processing power of a Commodore C64 or Apple II.

Controle físico (painel + joystick + telemetria) para o Kerbal Space Program 1, feito do zero com hardware e software próprios.
Modulo medio is an open-source printed circuit board by Schackschuck, from the Schackschuck/KSP repository on GitHub. It is a 2-layer board of 100 × 100 mm with 60 parts on 91 nets, routed with 1,139 tracks and 29 vias.
It is built around the 74HC165D and 74HC595. Its parts include 24 resistors, 13 switches, 7 capacitors, 6 ICs and 3 connectors.
Controle físico (painel + joystick + telemetria) para o Kerbal Space Program 1, feito do zero com hardware e software próprios.
O objetivo principal é aprender firmware/embarcados e eletrônica, e de quebra ter um cockpit de verdade — com direito a um botão que dispara um script de pouso autônomo estilo SpaceX.
PC com Windows: KSP 1 + servidor kRPC
▲
│ cabo de rede direto, com IP fixo (kRPC, TCP/protobuf)
│ (pela Wi-Fi de casa durante o desenvolvimento)
▼
Raspberry Pi 4 = computador de bordo ............... bridge/
• ponte kRPC ⇄ placas, aberta sozinha quando o Pi liga
• tela multifunção no navegador do tablet ........ bridge/celular/
• dispara os scripts de voo ....................... scripts/
▲ ▲
│ USB/serial │ Wi-Fi de casa
│ (protocolo próprio) │ (página da tela, por HTTP)
▼ ▼
Arduino Mega = I/O do painel tablet = tela multifunção
firmware/painel/ (Galaxy Tab S 8.4, no Chrome)
▲
│ SPI + linhas analógicas
▼
Backplane: 12 slots ................................ hardware/backplane/
▲
│ um cabo flat de 16 vias por módulo
▼
Módulos do painel, um por seção .......... hardware/modulo_pequeno/, _medio/ e _grande/
pequeno: 8 entradas + 8 LEDs (1 × 74HC165 + 1 × 74HC595)Cada parte tem um papel bem definido:
| Parte | Responsabilidade | Não faz |
|---|---|---|
| KSP + kRPC (PC) | Expõe o estado da nave e aceita comandos. | — |
| Computador de bordo (Raspberry Pi 4, Python) | Conecta no kRPC pela rede, abre streams de telemetria, traduz eventos do painel em comandos do jogo e telemetria em mensagens para o painel. Desenha a tela de telemetria. Dispara os scripts de voo de scripts/ (ex.: pouso autônomo). | Não lê pino nenhum. |
| Sidestick (joystick JH-D400X-R4 no painel, lido pelo Mega) | Manda os 3 eixos e o botão como qualquer controle do painel; a ponte os traduz em comandos do kRPC. | O KSP não enxerga o joystick: tudo passa pela ponte. |
| Painel (Arduino Mega, C++) | Lê entradas (com debounce), envia eventos; recebe valores e atualiza LEDs, displays e ponteiros. | Não sabe que o KSP existe. É um painel de I/O genérico. |
| Celular (opcional, página no navegador) | Mostra a tela multifunção pelo Wi-Fi, com o mesmo protocolo e o mesmo layout, sem precisar da mikromedia. | Não fala com o kRPC nem guarda estado: só desenha o que a ponte manda. |
| Tela multifunção (um tablet Galaxy Tab S 8.4, na USB do Pi) | Abre no Chrome a mesma página do celular e desenha as páginas (navball, órbita, recursos, pouso, piloto) com o que a ponte manda; troca de página pelo toque ou sozinha, pelo painel mexido. | Não fala com o kRPC; só mostra o que o computador de bordo manda. |
Durante o desenvolvimento, o mesmo código Python roda no PC — só muda o endereço do servidor kRPC e a porta serial.
Pi → placa: ALT 12345 SAS 1 FUEL 73
placa → Pi: BTN STAGE 1 SW SAS 0 AX PITCH -312| Decisão | Por quê |
|---|---|
| kRPC em vez de mods de serial (Kerbal Simpit etc.) | Acesso a praticamente tudo do jogo (órbita, estágios, delta-v, autopilot) e permite scripts de voo. A ferramenta não deve ser o limite. |
| Ponte fora do microcontrolador em vez do cliente kRPC C-nano | kRPC completo com streams; o firmware fica simples e ganha um protocolo próprio — que é onde está o aprendizado de embarcados. |
| Python na ponte | Já usado com kRPC antes; o mesmo código roda no PC e no Pi. |
| Raspberry Pi 4 como computador de bordo | Deixa o cockpit independente do PC (só um cabo de rede): a ponte, os scripts e a voz dos avisos rodam dentro da caixa. |
| Arduino Mega para o I/O | O Pi não tem entradas analógicas e o Linux não é tempo real; o Mega tem muitos pinos, trabalha em 5V e é compatível com praticamente todo módulo. |
| Painel em módulos com 74HC165 e 74HC595, ligados ao Mega por um backplane | Cada seção do painel é uma placa, montada e testada uma de cada vez. Há três tamanhos (8 entradas e 8 LEDs, 16 e 24, ou 24 e 16), para não montar CI à toa. Cada módulo tem uma etiqueta (chave DIP lida por um 74HC165 a mais), e o Mega reconhece sozinho qual módulo está em cada slot. Os CIs custam poucos reais por módulo, o firmware continua um só e o protocolo com a ponte não muda. Um micro em cada módulo fica para a fase 8. |
| Pinos do Raspberry Pi não substituem o Mega | O Pi não tem entradas analógicas, o Linux não é tempo real para encoders e ponteiros, e os pinos de 3,3 V vão direto ao processador: um fio errado nos 5 V queima o Pi. |
| mikromedia for ARM (LPC2148) como tela multifunção | Já está na bancada. ARM programado sem framework, com tela touch, microSD e áudio. Começa no protocolo em texto, como o simulador, e passa para o v1 junto com o Mega. |
| Simulador da tela multifunção no PC antes do firmware | A ponte, o protocolo e o desenho (navball, números, botões) ficam prontos e testados com o jogo antes da placa; o firmware só precisa copiar o simulador. A placa desenha a partir dos ângulos, porque a imagem pronta não cabe na serial (150 KB por quadro). |
Firmware da mikromedia compilado com o LLVM (clang), e não com o arm-none-eabi-gcc | Um compilador só, que já gera código para o ARM7, e um compilar.py em Python que roda igual no Windows e no Linux, sem make. O mfd.hex vai compilado no repositório: para gravar, basta o Flash Magic. |
| Tela da mikromedia desenhada em faixas de 16 linhas | Não cabe a tela inteira na RAM (150 KB contra 32 KB), e desenhar direto na tela piscaria. Cada faixa de 10 KB fica pronta na RAM e vai inteira para a tela, então cada ponto é escrito uma vez só. |
| Orientação e touch da mikromedia ajustados na própria tela e guardados na flash | O manual não diz a orientação do módulo nem a do touch. Ajustando na tela, o que vier trocado se corrige sem compilar de novo. |
| Celular como tela, por uma página web | Funciona já, sem firmware e sem o cabo, em qualquer celular e sem instalar nada. A ponte serve a página e fala com ela por HTTP (Server-Sent Events e POST), só com a biblioteca padrão do Python. O protocolo é o mesmo da placa, então a ponte não muda. |
| pygame-ce no lugar do pygame | O pygame original não tem pacote para o Python 3.14; o pygame-ce, mantido pela comunidade, tem e é usado do mesmo jeito (import pygame). |
| Pouso por previsão: simula a freada até o chão e acha o acelerador por bisseção | Com arrasto, a freada não tem conta fechada. Simular funciona igual em qualquer planeta, com ou sem atmosfera, e refazer a conta 20 vezes por segundo corrige os erros da previsão. O arrasto é medido em voo, e a previsão só usa parte dele, porque ele cai quando a nave fica mais lenta que o som. A guiagem não conhece o kRPC, então é testada numa nave simulada. |
| Pé da nave medido pelas pernas do trem, não pela caixa da nave inteira | Nas versões lançadas do kRPC (até a 0.6.0), a caixa de uma peça junta tudo o que está pendurado nela, como a chama do motor ligado. A caixa da nave inteira descia metros abaixo do pé, e a freada terminava alta. |
| SAS do KSP aponta a nave no pouso, não o piloto automático do kRPC | O piloto automático do kRPC vem ajustado para levar 3 s até o ângulo pedido e não conta a força do ar. No segundo teste, a nave caindo de ré balançou até 31° na freada. O SAS o jogo ajusta para cada nave. Retrógrado enquanto a nave desce rápido; devagar, perto do chão, o retrógrado pula de um lado para o outro, então no fim o SAS só segura a atitude. |
Scripts de voo numa pasta própria (scripts/), fora da ponte | Cada script roda sozinho pela linha de comando, no PC ou no Pi, com ou sem o cockpit. A ponte só dispara o script quando o botão do painel é apertado; o script não depende dela nem do painel. |
| Script liga segurando o korry 5 s, e aborta segurando de novo 5 s, sem chave ARM | Um toque sem querer não entrega a nave ao script, e o mesmo gesto aborta, sem procurar outro botão. Economiza a chave ARM com capa e um botão por script. Quem conta o tempo é a ponte, como no encoder do piloto automático, e o korry pisca âmbar enquanto conta. |
| A ponte abre o script num processo próprio e aborta com o Ctrl+C | O script continua sendo o mesmo da linha de comando, e o Ctrl+C já corta o motor e devolve a nave. O estado volta pelo UDP, como no fly by wire, e o código de saída diz se a nave pousou. |
| Um joystick só, no painel (JH-D400X-R4, um sidestick à direita), com o botão do manche trocando o modo | O cockpit fica como um avião: acelerador na mão esquerda, sidestick na direita. Os 3 eixos cabem nas 3 linhas analógicas de um slot do backplane, e o botão passa pelos modos VOO, CÂMERA e TRANSLAÇÃO, com três luzes. Passando pela ponte, dá para ter zona morta e saber quando o piloto mexe no manche para tirar o controle de um script. O Extreme 3D Pro fica para desenvolver no PC. |
| Uma tela no meio para todos os módulos, a tela multifunção, no lugar de um LCD por módulo | Os olhos vão sempre ao mesmo lugar, os painéis ficam menores e só com botões, e sai um LCD por módulo da lista de compras. A página troca sozinha para o módulo em uso e volta depois, então não é preciso escolher a página na mão. Quem decide a troca é a ponte, que já recebe todos os eventos do painel: a tela continua só desenhando. |
| Korry switches (botões iluminados com legenda, de avião) onde a luz mostra um estado do jogo | O botão não tem posição, então nunca discorda do jogo: cada toque pede a troca, e a legenda acesa é o estado do jogo. Feitos em casa: a legenda impressa em duas cores encaixa num corpo igual para todos, e a chave e os LEDs vão num suporte impresso atrás, sem placa perfurada (hardware/korry/). O que não tem estado para mostrar é um botão de 16 mm sem luz. |
| Cockpit em U, de 766 × 391 mm, com painéis de 125 mm (versão B) | Um bloco no meio e duas asas, como num avião, sem painel vazio. Os controles foram juntados em 11 painéis para a caixa não passar de 80 cm; o que não cabe em 125 mm ocupa dois quadrados. O que cada botão faz foi conferido no código-fonte do kRPC antes de desenhar. |
| A mikromedia de volta, no lugar da tela de 7" no HDMI do Pi | Sai mais barato: a placa já está na bancada, e o firmware dela já roda na placa, com o jogo. A tela de 2,8" é pequena para o meio do cockpit, que era o motivo da troca pela de 7"; as páginas têm que ser feitas para caber nela. A placa desenha sozinha a partir dos números que a ponte manda, pela USB do Pi. |
| Um tablet velho como tela, o Galaxy Tab S 8.4 (SM-T705M, Android 6.0.1), no lugar da mikromedia | Já está na bancada e não serve mais para outra coisa. A tela de 8,4" com toque cabe no painel duplo, e o Chrome do Android 6 roda a mesma página do celular, sem firmware novo. A página chega pela Wi-Fi de casa, vinda do Pi, em HTTP: o tablet só precisa entrar na rede, sem internet. Ele fica no próprio carregador, porque numa USB do Pi a Samsung puxa só uns 0,5 A, que não seguram a tela ligada. A tela de 2,8" da mikromedia ficava pequena no meio do cockpit; ela sai de novo, e o firmware dela continua no repositório. |
| O mapa da órbita no tablet, e não no monitor do PC | O monitor fica sempre na vista do foguete. O botão MAPA abre a página MAPA no tablet: a órbita em 3D, as luas, o alvo e o nó de manobra, girada e aproximada pelo toque (docs/mfd.md). O mapa do jogo continua lá, mas o cockpit não precisa dele. |
| Pi ligado no PC por um cabo de rede direto, com IP fixo dos dois lados, no lugar da Wi-Fi | A ida e volta pelo cabo fica abaixo de 0,5 ms e quase não varia; pela Wi-Fi são de 2 a 10 ms, com picos de 20 a 100 ms, e a variação atrapalha o fly by wire. Não depende do roteador, os endereços não mudam, e o PC e o Pi continuam na internet pela Wi-Fi. No PC só roda o KSP com o kRPC: a ponte abre sozinha no Pi e espera o jogo. Os 1 a 2 quadros de atraso do próprio kRPC continuam (docs/setup-pi.md). |
| Recursos na tela multifunção, sem as barras de LED | Saem o MAX7219, as 5 barras de 10 LEDs e a fiação delas, e a tela já recebe tudo da ponte. O combustível, o oxidante, o monopropelente e a eletricidade vão para uma página da tela. |
| Caixa em MDF cortado a laser, com peças impressas em 3D | A laser do colégio faz as peças planas e grandes (paredes, painéis com legendas); a impressora de casa, as pequenas e complicadas (korry, knobs, suportes). Cada seção é um painel removível com o seu módulo atrás. |
| Fly by wire com a lei de um caça: o manche pede carga (g) e velocidade de rolagem, e não mexe nas superfícies | A primeira versão movia um ponto na navball, e o avião ia até ele: estável, mas lenta e "interventora" no jogo (o voo gravado mostrou o avião respondendo quase 1 s depois e seguindo o ponto depois de o manche ser solto). Pedindo carga e rolagem, o avião responde na hora, e soltar o manche segura o caminho e a inclinação. O piloto automático pede um caminho, e o FBW calcula a carga e a inclinação para chegar nele. |
| Ganhos do FBW divididos pela autoridade do avião (torque disponível ÷ inércia, informados pelo kRPC) | A força das superfícies cresce com o quadrado da velocidade: um ganho fixo, bom na decolagem, faz o avião balançar rápido, e cada avião precisaria do seu. Nos testes, o FBW segura o avião com a autoridade informada errada pela metade ou pelo dobro. |
| Scripts mandam marcadores à ponte da tela por UDP, com a própria linha do protocolo da tela | O script continua rodando sozinho: sem a ponte aberta, a linha se perde e nada acontece. A ponte só confere e repassa. |
| Avisos de voo (GPWS) na ponte da tela, falados no Pi | A ponte já lê o jogo o tempo todo, então avisa em qualquer avião, com ou sem o fly by wire. A voz sai por um alto-falante USB no Pi, pelo espeak-ng ou por gravações; o áudio da mikromedia (VS1053) fica para os alarmes da própria tela. |
O fbw.py lê o joystick sozinho, por enquanto | A ponte ainda não lê o joystick. Quando ler, a leitura passa para ela, e o script recebe o manche da ponte. |
| ESP32 fica para depois | Candidato a painel sem fio ou módulo extra (fase 8). |
bridge/ computador de bordo em Python: ponte kRPC ⇄ serial, tela de telemetria;
tela multifunção: ponte (mfd.py), simulador, navball e a página do celular (celular/);
painel de sistemas de controle (sistemas.py), com a página de botões (celular/painel.html);
painel de scripts (painel_scripts.py): o korry POUSO abre o scripts/pouso.py, e o
LANCAR, o scripts/subida.py, com o menu da subida;
avisos de voo por voz, como o GPWS (avisos.py);
editor de nós de manobra com botões na página (manobras.py); testes em bridge/tests/;
o serviço do systemd que abre a ponte da tela quando o Pi liga (servico/)
scripts/ scripts de voo (pouso, subida até a órbita, rendezvous, fly by wire...), que rodam com ou sem o cockpit; testes em scripts/tests/
firmware/painel/ Arduino Mega (Arduino IDE ou PlatformIO)
firmware/encoder/ Arduino Uno com o encoder AJUSTE da tela (docs/encoder.md)
firmware/passos/ sketches de aprendizado, um por passo da fase 1
firmware/mfd/ mikromedia for ARM / LPC2148 (C, compilado com o LLVM pelo compilar.py): a tela multifunção
hardware/ esquemáticos e PCBs (KiCad), desenhos da caixa; ver hardware/README.md
e hardware/construcao.md (o cockpit da versão B, a caixa e os painéis);
cada peça própria numa pasta, com ficha e desenhos (hardware/korry/:
modelo no OpenSCAD, STL das legendas, das grades e das peças, gerar.py e o desenho da ligação);
identidade visual (hardware/identidade_visual.md) e desenhos dos painéis
gerados por código (hardware/desenho/, SVG em hardware/img/)
docs/ protocolo serial, pinagem, anotaçõesCada fase termina com algo funcionando de ponta a ponta. Não pule o critério de "pronto".
Status: concluída. Passo a passo detalhado e problemas encontrados em docs/setup-pi.md. No cockpit, o Pi liga no PC por um cabo de rede direto, testado com o fase0_altitude.py, e a ponte da tela abre sozinha quando ele liga, espera o jogo e reconecta quando ele fecha e abre de novo.
No PC:
localhost para Any (aceitar conexões da rede), e liberar no firewall do Windows as portas do kRPC (padrão: 50000 e 50001).pip install krpc pyserial e a Arduino IDE 2 (ou PlatformIO no VS Code).No Raspberry Pi 4:
pip install krpc pyserial pygame (de preferência dentro de um venv).import time
import krpc
# No PC: krpc.connect(name="KSP Cockpit")
# No Pi: informar o IP do PC onde o KSP está rodando
conn = krpc.connect(name="KSP Cockpit", address="192.168.0.10")
vessel = conn.space_center.active_vessel
altitude = conn.add_stream(getattr, vessel.flight(), "mean_altitude")
while True:
print(f"{altitude():,.0f} m")
time.sleep(0.1)Versão completa, que recebe o IP como argumento, espera a cena de voo e explica os erros de conexão: bridge/fase0_altitude.py.
Pronto quando: o script roda no Pi e imprime a altitude ao vivo enquanto o foguete sobe no PC.
Status: concluída, no PC e no Pi. Roteiro passo a passo, montagem e testes: docs/fase1.md. Protocolo: docs/protocolo.md.
delay().Pronto quando: apertar o botão faz stage, o LED acompanha o SAS do jogo e o LCD mostra a altitude.
Status: em andamento. Chaves, botões e LEDs estão prontos para montar: pinagem, código e testes em docs/fase2.md. O cockpit inteiro está desenhado: a versão B, em U, com 11 painéis de 125 mm, o sidestick e o acelerador no painel.
gerar.py e a ligação estão em hardware/korry/; o primeiro passo é o teste de folga e um korry ligado direto no Mega.A fazer na ponte, para a versão B (o que cada controle faz e o comando do kRPC estão em hardware/construcao.md):
ENC AJUSTE e BTN AJUSTE (docs/encoder.md).--encoder) e manda o giro e o aperto para a página aberta: a SUBIDA ou o piloto automático (docs/encoder.md).Pronto quando: dá para lançar e colocar um foguete em órbita usando só o painel.
Pronto quando: dá para circularizar uma órbita olhando só para a tela.
Status: editor de manobras escrito, com botões numa página no lugar das chaves; falta testar no jogo. bridge/manobras.py cria e edita os nós pelo kRPC e mostra os números do nó e da órbita (antes e depois) no navegador do PC ou do celular: docs/manobras.md. A página manda linhas do protocolo pela rede; o painel vai mandar as suas pela serial, com o encoder no lugar dos pares +/- do Δv. Por enquanto a página também gira a câmera do mapa, o que tem que sair dela: no cockpit, a câmera do mapa vai ser mexida pelo joystick, no modo CÂMERA.
A fazer no editor, para ficar igual ao painel desenhado (desenho, mensagens):
Ponte (bridge/manobras.py): guardar o eixo escolhido (PRO, NRM ou RAD), começando pelo PRO em cada nó novo, e trocar de eixo com BTN PRO, BTN NRM e BTN RAD.
Ponte: aceitar ENC DV <cliques> (horário positivo) e aplicar os cliques × passo no eixo escolhido.
Ponte: aceitar SW PASSO <0 a 3>, o passo pela posição da chave rotativa, no lugar do BTN PASSO.
Ponte: mandar ao painel qual eixo está escolhido, para acender o korry certo.
Página do celular (bridge/celular/manobras.html): trocar os pares PRO -/PRO +, NRM -/NRM + e RAD -/RAD + por três botões de eixo e um par -/+ que faz o papel do encoder, com o eixo escolhido destacado.
Testes (bridge/tests/test_manobras.py) para o eixo escolhido, o ENC DV e o SW PASSO.
Atualizar docs/manobras.md e tirar o "planejado" da seção No painel do protocolo.
Displays de 7 segmentos com MAX7219 para os números mais importantes.
Encoder rotativo para escolher o que cada display mostra. Lido pela mesma cadeia de 74HC165 dos módulos: o Mega lê a cadeia inteira mil vezes por segundo numa interrupção de timer, e assim o redesenho do LCD (~20 ms) não faz perder cliques. O painel acumula os cliques e manda ENC <nome> <cliques>.
Editor de nós de manobra (pelo kRPC: control.add_node, node.prograde etc.):
ENC DV <cliques>, e quem sabe o eixo escolhido é ela.INC TEMPO <passos>. Embaixo dela, ANT e PROX trocam de nó.O que resta de combustível, oxidante, monopropelente e eletricidade vai para a página RECURSOS da tela multifunção, no lugar das barras de LED que estavam no painel da EVA.
Ponteiro analógico com motor de passo X27.168.
Fonte 5V externa (a USB não aguenta muitos LEDs).
Pronto quando: um voo inteiro (lançamento → órbita → reentrada) é feito sem olhar para o monitor do PC, inclusive planejar a circularização pelo editor de manobras.
Status: script de pouso escrito, em teste no jogo; o korry POUSO já dispara o script pela página de botões. No primeiro teste, em Kerbin, a freada terminou alta e a nave tocou o chão inclinada e tombou. Corrigido: o pé agora é medido pelas pernas do trem. No segundo teste o pé ficou certo (0,4 m de erro no toque), mas a nave balançou até 31° na freada: o piloto automático do kRPC não segurava a nave. Agora quem aponta a nave é o SAS do KSP (falta testar de novo). scripts/pouso.py faz a queima de suicídio numa descida vertical, em qualquer planeta, contando o arrasto do ar; roda pela linha de comando ou pelo korry POUSO do painel de scripts, e a tela multifunção mostra o pouso numa página própria (docs/mfd.md). scripts/tests/test_pouso.py testa a mesma guiagem numa nave simulada, sem o KSP, em planetas com e sem atmosfera.
A fazer no painel de scripts:
bridge/painel_scripts.py): segurar BTN POUSO 5 s abre o scripts/pouso.py num processo; segurar de novo aborta; a linha SCR POUSO acende o korry.scripts/pouso.py: estado por UDP (linhas POU), código de saída e --demo com uma nave simulada.bridge/celular/painel.html).BTN POUSO 1 e 0, e o LED de duas cores pela linha SCR POUSO.Pronto quando: um booster pousa sozinho a partir de um botão no painel, e um nó de manobra é executado pelo botão EXEC.
Fora do cockpit de novo: a tela do cockpit passou a ser um tablet Galaxy Tab S 8.4, com a mesma página do celular (decisões), porque a tela de 2,8" ficava pequena no meio do painel. O firmware continua aqui e roda na placa, com o jogo.
Placa da MikroElektronika com NXP LPC2148 (ARM7TDMI-S, 60 MHz, 512 KB de flash, 32 KB de RAM), tela 320x240 com touch resistivo, microSD, saída de áudio e carregador de Li-Po. Aqui o firmware é escrito sem framework: C, registradores, script de linker e código de inicialização próprios.
Status: rodando na placa, com o jogo. O firmware em firmware/mfd/ faz na placa o que o simulador faz no PC: navball, números, botões de toque e as páginas SAS, AP e POUSO, no protocolo em texto. A página SUBIDA (subida até a órbita) existe na placa e no navegador; o simulador mostra a navball no lugar dela. Ligada no Pi pela PROG, com a ponte da tela aberta pelo serviço, a placa mostra a navball ao vivo, lisa, e o toque funciona no jogo. O controlador da tela é o 0047, o HX8347-D. Falta o áudio. Gravar e ligar: docs/mikromedia.md. A tela também roda no simulador do PC e no navegador do celular: docs/mfd.md.
firmware/mfd/compilar.py; o mfd.hex já vem compilado. Gravação pelo bootloader serial de fábrica do LPC2148, pela PROG, com o Flash Magic.0047 (HX8347-D), o toque responde e a navball anda lisa (conferido na placa).Pronto quando: a mikromedia mostra telemetria ao vivo recebida do Pi e toca um alarme de combustível baixo.
Scripts que pilotam a nave, ou ajudam o piloto a pilotar, disparados pelo painel e acompanhados na tela. O primeiro é o pouso autônomo da fase 5 (scripts/pouso.py); o segundo, o fly by wire de avião (scripts/fbw.py); o terceiro, a subida até a órbita (scripts/subida.py); o quarto, o rendezvous (scripts/rendezvous.py). Os outros desta seção são ideias ainda sem código e sem ordem: cada um entra no roteiro quando o hardware de que precisa existir.
Os scripts ficam em scripts/, fora da ponte: cada um roda sozinho pela linha de comando, no PC ou no Pi, mesmo sem o painel. No cockpit, a ponte só dispara o script pelo botão e mostra o estado dele no painel e na tela. Os testes, com naves simuladas e sem o KSP, ficam em scripts/tests/.
pouso.py: recebe uma leitura da nave e devolve comandos. Assim ela é testada numa nave simulada, sem o KSP, antes de ir para o jogo.Status: script escrito e testado num avião simulado; falta testar no jogo. Roteiro de testes, ajuste dos ganhos e problemas comuns em docs/fbw.md.
Como nos caças, o manche não mexe nas superfícies: ele pede o que o avião deve fazer, e o FBW decide as superfícies. scripts/fbw.py lê o joystick (o Extreme 3D Pro, ou um controle de Xbox) e pilota o avião pelo kRPC.
--sem-joystick): decola pelo teclado do jogo, na lei direta, e no ar o piloto automático voa pelo painel.Pronto quando: um avião decola na lei direta e, com o FBW, responde ao manche na hora, sem balançar: puxar dá carga, rolar dá rolagem, e soltar segura o que estava.
Anotado depois dos primeiros voos no jogo (a fazer):
Status: código escrito e testado sem o jogo; falta ouvir no Pi e voar. Roteiro, limites e como ligar o alto-falante em docs/avisos.md.
Como o GPWS dos aviões de linha, a ponte da tela fala os avisos em inglês, num alto-falante USB ligado no Pi, em qualquer nave voando na atmosfera:
Vermelhos: PULL UP (descendo rápido demais para a altura) e TERRAIN (o chão chegando rápido; vira PULL UP se continuar).
Âmbar: SINK RATE, DON'T SINK (perdendo altura depois da decolagem), TOO LOW, GEAR e TOO LOW, TERRAIN (baixo com o trem recolhido), BANK ANGLE e OVERSPEED.
Chamadas de altura no pouso: 100, 50, 40, 30, 20 e 10 pés.
Luz GPWS (âmbar) / PULL UP (vermelha) no painel de sistemas; por enquanto, na página de botões.
bridge/avisos.py: os avisos, a prioridade e a voz (espeak-ng ou gravações em bridge/sons/); --voz, --sem-voz e --testar-voz no mfd.py; testes.
Luz GPWS / PULL UP na página de botões.
Ouvir no Pi com o alto-falante USB e ajustar os limites no jogo.
Luz GPWS no desenho do painel de sistemas.
Olhar o terreno à frente (EGPWS), pela altura do terreno do kRPC.
Status: código escrito e testado com o avião simulado e a demonstração; falta testar no jogo. O fbw.py voa HDG, ALT e V/S pedindo um caminho ao FBW (docs/fbw.md), e o painel de sistemas é, por enquanto, uma página de botões aberta pela ponte da tela (docs/mfd.md), com a roda do SAS e a página do piloto na tela.
bridge/mfd.py e bridge/sistemas.py): modos do SAS, SAS e RCS no jogo; azul ou verde pelo erro até o marcador; o menu do piloto; as páginas do SAS e do piloto, com a volta à navball.scripts/fbw.py: HDG, ALT e V/S pedindo um caminho; FBW e TRAVA pelo painel; estado e comandos por UDP com a ponte da tela; testes no avião simulado.Inspirado no painel de piloto automático dos aviões de linha (o MCP do Boeing, o FCU do Airbus).
fbw.py;Pronto quando: um avião decola na mão, e o piloto automático leva ele até a altitude e o rumo escolhidos no painel e segura lá.
control.wheel_throttle e control.wheel_steering).Status: voou no jogo em 20/10/2026 e chegou em órbita sozinho, com um foguete de 552 t, a 80 e a 100 km; o giro está em ajuste. scripts/subida.py leva a nave da plataforma até uma órbita circular, em qualquer planeta, com ar ou sem. Como funciona, as contas e o roteiro de teste no jogo estão em docs/subida.md.
O piloto escolhe a altitude, a inclinação e, se quiser, o plano do alvo escolhido no jogo, na página SUBIDA da tela multifunção, por um encoder. Segura o korry LANCAR 5 s, e o script voa.
O rumo desconta a rotação do planeta e é refeito a cada passo, pela velocidade que ainda falta. A inclinação final sai a menos de 0,1° da pedida.
O giro da curva de gravidade é escolhido por simulação: antes de inclinar, o script simula a subida inteira com 16 giros e fica com o de menor Δv, somando a subida e a circularização. Depois, a cada 5 s, ele simula de novo o resto da subida e corrige o nariz em até 4°, em malha fechada.
Com o plano de um alvo, o script espera a janela de lançamento, com time warp, e no fim iguala o plano numa queima na linha dos nós.
Os estágios saem sozinhos; o corte é no apoastro pedido, e a circularização, em malha fechada, centrada no apoastro. O próprio script queima: o EXEC ainda não existe.
Junto com o pouso, fecha o ciclo: do chão até a órbita e de volta.
scripts/subida.py: a guiagem, a simulação do giro, a janela, o kRPC, o --demo e as linhas SUB; testes em scripts/tests/test_subida.py, numa nave simulada em Kerbin e na Mun.
Ponte da tela: o korry LANCAR, o menu da subida (ENC SUB, BTN SUB) e a página SUBIDA; na página de botões, o LANCAR e um encoder para a configuração.
A página SUBIDA na mikromedia e no navegador (o celular e o tablet): a configuração e o voo. O simulador mostra a navball no lugar dela.
O desenho do voo na página SUBIDA: o KSC na decolagem, a parábola na subida e a órbita na circularização, com dois zooms. No navegador, testado com o --demo; na placa, falta gravar. Falta ver num lançamento. Depois, a visão oblíqua do planeta na órbita.
Testar no jogo (roteiro): primeiro 80 km e 0°, depois a inclinação, o plano de um alvo e a Mun.
A configuração pelo encoder AJUSTE, no Uno, com a página SUBIDA aberta (docs/encoder.md).
Depois: a guiagem do vácuo (PEG), mais eficiente que seguir o pró-grado.
Depois: lançar na hora certa para o rendezvous. Além de esperar o plano do alvo, o script esperaria a fase: decolar quando o alvo estiver no ângulo certo à frente, para a subida terminar logo atrás dele, e o rendezvous virar só a aproximação final. Na Estação um (quase equatorial, ~37 min de volta), o alvo passa por cima do KSC a cada ~41 min, então a espera é curta. No primeiro voo completo (21/10/2026), a subida sem essa espera terminou a 576 km da estação, e o rendezvous previu 89,6 m/s e 5 h até o encontro.
O pouso da SpaceX completo. O pouso.py desce na vertical onde a nave estiver; aqui o booster volta para um lugar escolhido, como a plataforma do KSC.
pouso.py, com a mira puxando para o alvo em vez de só anular a deriva.pouso.py já faz na vertical.Status: voou no jogo em 21/10/2026, de 100 km até 111 m da Estação um, com 98,3 m/s gastos (89,6 previstos); a aproximação com RCS de translação também foi testada no jogo. scripts/rendezvous.py leva a nave até 100 m de outra em órbita do mesmo planeta, parada em relação a ela. Como funciona, as contas e o roteiro de teste no jogo estão em docs/rendezvous.md.
O script queima sozinho, porque o EXEC da fase 5 ainda não existe. O nó que ele cria no jogo é só para mostrar: no mapa, o KSP desenha a aproximação, e o piloto confere o plano. Com --so-planejar, o script só cria o nó, imprime o plano e sai.
warp_to). O modo diretor de voo, em que ele só propõe cada nó e o piloto queima, fica para depois.--so-planejar, 21/10/2026): 99,5 m/s previstos de 100 km até a Estação um.--so-planejar confere a menor distância da previsão própria contra a do kRPC.Itens marcados já estão na bancada. Compre por fase — não precisa tudo de uma vez. AliExpress costuma ser mais barato (e lento); Mercado Livre e lojas nacionais chegam mais rápido.
Atenção à tensão: o Mega trabalha em 5V; o Pi, em 3,3V. Nunca ligue um pino do Pi direto em 5V — a comunicação entre os dois é pela USB.
LiquidCrystal_I2C, LedControl (MAX7219), FastLED ou Adafruit_NeoPixel (WS2812), SwitecX25 (X27.168)| Qty | Value | Footprint | References |
|---|---|---|---|
| 24 | 220 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R1, R2, R10, R11, R12, R13, R14, R15, R16, R17, R18, R19, R20, R21, R22, R23 +8 |
| 6 | 100nF | Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P5.00mm | C1, C2, C3, C4, C5, C7 |
| 4 | MountingHole_3.2mm_M3 | MountingHole:MountingHole_3.2mm_M3 | H1, H2, H3, H4 |
| 3 | 10k | Resistor_THT:R_Array_SIP9 | RN1, RN2, RN3 |
| 3 | 74HC165 | Package_DIP:DIP-16_W7.62mm_Socket | U1, U2, U3 |
| 3 | 74HC595 | Package_DIP:DIP-16_W7.62mm_Socket | U4, U5, U6 |
| 1 | 470uF | Capacitor_THT:CP_Radial_D10.0mm_P5.00mm | C6 |
| 1 | Analógico (joystick, acelerador) | Connector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_Vertical | J6 |
| 1 | Backplane (IDC 2x8) | Connector_IDC:IDC-Header_2x08_P2.54mm_Vertical | J1 |
| 1 | Entradas 12-15 | Connector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_Vertical | J2 |
| 1 | Etiqueta (DIP 8 vias) | Button_Switch_THT:SW_DIP_SPSTx08_Slide_9.78x22.5mm_W7.62mm_P2.54mm | SW1 |
| 1 | Korry 1 | Connector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_Vertical | K1 |
| 1 | Korry 10 | Connector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_Vertical | K10 |
| 1 | Korry 11 | Connector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_Vertical | K11 |
| 1 | Korry 12 | Connector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_Vertical | K12 |
| 1 | Korry 2 | Connector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_Vertical | K2 |
| 1 | Korry 3 | Connector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_Vertical | K3 |
| 1 | Korry 4 | Connector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_Vertical | K4 |
| 1 | Korry 5 | Connector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_Vertical | K5 |
| 1 | Korry 6 | Connector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_Vertical | K6 |
| 1 | Korry 7 | Connector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_Vertical | K7 |
| 1 | Korry 8 | Connector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_Vertical | K8 |
| 1 | Korry 9 | Connector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_Vertical | K9 |
It measures 100 × 100 mm and has 2 copper layers, 1.6 mm thick.
60 parts, built around the 74HC165D and 74HC595. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the Schackschuck/KSP repository on GitHub, at the commit this page was made from: the board is hardware/modulo_medio/modulo_medio.kicad_pcb and its schematic hardware/backplane/backplane.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask Schackschuck before reusing the design.

slu4coder/Minimal-64x4-Home-Computer
My DIY TTL home computer with VGA and PS/2 and 4x the processing power of a Commodore C64 or Apple II.

westlicht/performer-hardware
PER|FORMER Eurorack Sequencer - Hardware Design Files

slu4coder/Minimal-64-Home-Computer
Legacy: Full TTL-only home computer with VGA and PS/2 and twice the processing power of a Commodore 64

slu4coder/Minimal-UART-Computer-3
Version 3 of my educational DIY TTL computer built around a UART serial interface - now with blinkenlights!

robsonsmartins/usbflashprog
A memory device programmer (Flash/EPROM/E2PROM) board and software, connected to PC by USB port.


Windfisch/midikraken
A open source, open hardware up-to-16x USB-MIDI-interface for around 15 bucks in its smallest configuration.
