Todo o software desenvolvido por nós é Open Source está disponível na nossa página do Github.
Antes de qualquer trabalho ser feito no Raspberry Pi 2 (RasPi), houve diversos problemas em simplesmente estabelecer a ligação entre o computador de trabalho e o RasPi. Este tem 2 saídas de vídeo, HDMI e vídeo composto analógico, e o monitor do computador de trabalho apenas tem entrada VGA. Testámos várias alternativas diferentes até conseguirmos programá-lo de forma estável e eficiente.
Esta solução foi rapidamente descartada, uma vez que o adaptador não funcionava corretamente (e mesmo que funcionasse, teríamos de programar diretamente no RasPi, o que tornava o processo lento e isso não era desejado).
Esta alternativa parecia a mais correta a seguir mas quando já se preparava a ligação por SSH, percebemos duas coisas:
Depois de alguma pesquisa, chegámos a este site que nos explica como ligar diretamente o computador principal ao RasPi! E, para além de já ser uma boa solução assim só, ainda tivemos um bónus: como o computador estava ligado por wifi à rede, pudemos partilhar essa ligação e ter internet no RasPi.
Quando finalmente tivemos uma maneira eficaz de comunicar com o computador de bordo, pudemos começar a programar!
Para esta parte é sempre preciso um bocadinho de magia negra! Usámos a distribuição Jessie Lite do Raspbian e apenas instalámos os mínimos para se obter ganhos no consumo de energia. Seguidamente, tivemos de configurar tudo! Usámos o systemd para iniciar o nosso programa mal o RasPi iniciasse e configurámos o NTP (Network Time Protocol) para não tentar ir buscar as horas a lado nenhum pois não há internet na estratosfera (e se não fizéssemos isto, iríamos ter horas bem configuradas durante os testes pois tínhamos internet). Também ativámos o watchdog para fazer restart do RasPi na eventualidade de ele bloquear.
Depois de termos o sistema operativo configurado, começámos a trabalhar no nosso programa. Começámos por fazer um sistema de logging para podermos saber de tudo caso alguma coisa falhasse e depois começámos a pensar em maneiras de conseguir perceber o que se está a passar no RasPi sem termos contacto direto (no lançamento não há monitores nem ligação ethernet para ninguém!). Chegámos à conclusão que, uma vez que vamos ter transmissão de vídeo em direto, podíamos usar a faixa de áudio para comunicar! E como? Com um speech synthesizer! Sim, temos um sintetizador de voz que comunica eventuais erros que aconteçam e, para além disso, está constantemente a dizer as coordenadas provenientes do GPS! Assim, na altura do lançamento, sabemos quais são os sitemas que falharam e os que iniciaram e podemos simplesmente ouvir as coordenadas para não estarmos sempre a ler.
A ligação ao sensor de temperatura/pressão foi fácil de fazer apesar de termos um problema inicial. Utilizámos o BMP180 e como ele ainda não estava soldado, a ligação falhava às vezes, mas quando percebemos que era esse o problema, foi uma questão de adicionar o código de leitura do sensor ao script principal.
Apesar de termos uma câmara analógica para transmissão de vídeo em direto, também temos uma câmara digital ligada ao RasPi para gravarmos o vídeo da viagem. Esta parte também foi muito simples de fazer, uma vez que apenas usámos a câmara oficial do RasPi. Criámos uma thread que grava vídeos para o cartão de memória regularmente e ficou a funcionar.
Uma parte engraçada da câmara é a luzinha que ela tem quando está a gravar. Depois de olharmos para isso, pensámos "Ela tem de ir desligada para não fazer reflexo no vidro, e já agora podíamos aproveitar e fazer alguma coisa com ela..."; e foi precisamente isso que fizemos! Quando o RasPi liga, para termos mais um fator de confirmação, a luz pisca 5x e depois desliga-se. Assim sabemos quando o RasPi começa a correr o nosso software!
Esta parte foi a mais difícil porque estávamos a ter erros aleatórios sem os conseguirmos reproduzir e muito estranhos. Depois, de muitas tentativas e erros, descobrimos que o nosso GPS estava localizado no /dev/ttyACM0 e usámos essa localização para inicar o gpsd. Também descobrimos que por vezes tínhamos de reiniciar o sistema de GPS e por isso adicionámos lógica para fazer isso regularmente.
Finalmente, para sincronizar as horas com o relógio do GPS usámos várias alternativas. Começámos por usar o NTP, pois este supostamente tem em conta os delays e corrige a hora, mas acabámos por usar uma simples configuração manual das horas no código, porque o NTP estava cheio de problemas e mais de metade das vezes não funcionava.
Como uma imagem vale mais que mil palavras, então o código utilizado é muito melhor para descrever a solução utilizada, por isso dêem uma vista de olhos!
Momento engraçado: tivemos de reduzir o cabo do GPS para não ficar tanto cabo no meio da caixa... e por momentos pensámos que tínhamos estragado tudo! Dentro do cabo USB há 4 cabos mais pequenos e, ao soldar duas pontas de dois cabos diferentes, estava a ficar um desastre! A solução foi soldar à parte metálica final diretamente e não soldar as duas pontas de dois cabos.
E para finalizar, ainda tivemos de fazer este site para o projeto! O interessante é que, como queríamos fazer um projeto 100% desenvolvido por nós, foi precisamente isso que fizemos: não usámos framework nenhuma e desenvolvemos tudo de raiz! E sim!, este site também é Open Source como o resto do projeto e está disponível no branch gh-pages do nosso repositório.
Para além de ter sido feito todo por nós, foi feito num curto espaço de tempo! Como podem verificar no log do repositório, começou a ser desenvolvido a 5 de maio e tinha de estar pronto a tempo do lançamento (20 de maio)! É a cereja no topo do bolo deste projeto!