123D Circuits, GitHub e ticks no Arduino

De Garoa Hacker Clube
Ir para: navegação, pesquisa

No dia 08/01/2014, rolaram alguns assuntos interessantes no Garoa. Testamos o aplicativo 123D Circuits, sugerido na lista de discussão pelo Usuário:LucianoRamalho. Também tivemos um passo a passo de como criar um repositório controlado pelo Git, posteriormente enviando-o ao GitHub. Por fim também houve uma breve discussão sobre como medir intervalos de tempo dentro do Arduino (característica necessária ao software controlador do Relógio de Xadrez).

123D Circuits

Criamos uma conta na Autodesk para utilizar o serviço. Conforme as funcionalidades foram sendo testadas, reparamos que existem 3 tipos de circuitos que podem ser criados:

  • Circuito de breadboard (o único que possui simulação!)
  • Circuito simples (apenas a diagramação)
  • Componente (igual ao circuito simples, exceto que esse aparece nas buscas quando clicamos no botão para incrementar a paleta de componentes do nosso editor)

Como queríamos testar a simulação do Arduino, criamos um circuito de breadboard. Ele já vem com um breadboard e um Arduino. Nesse ponto identificamos um ponto negativo: não existem displays de LCD na paleta de componentes do modo circuito de breadboard, e um outro logo em seguida: não encontramos uma forma de criar um componente para os circuitos de breadboard (ou seja, não podemos contribuir um componente de display de LCD).

Pontos positivos até então: visual agradável, roda direto no browser sem depender de plugins como Java e Flash.

Fizemos um circuito básico para acender um LED a partir de um botão, primeiro sem passar pelo Arduino, e depois utilizando um pino para a entrada do botão e um para a saída que acende o LED. Nessa segunda parte tivemos uma pequena decepção com a ferramenta: perdemos um bom tempo tentando encontrar um problema inexistente no nosso circuito, devido a um bug que fez com que a resistência assumisse um valor muito maior do que o que havíamos informado, fazendo com que o LED não acendesse. Depois de revisar milhares de vezes, deletamos o resistor e inserimos exatamente o mesmo e o circuito passou a funcionar. Concluímos então que se tratava de um defeito da ferramenta e não dos nossos respectivos conhecimentos em eletrônica.

Resumindo: pela ausência (até o momento) de suporte aos displays LCD, uma certa gama de situações (incluindo o relógio de xadrez) não pode ser simulada com a ferramenta. No entanto, levando em conta que é uma ferramenta nova no mercado, ela parece ser bem promissora. Ficar de olho na evolução das funcionalidades parece ser uma boa pedida.

GitHub

Seguindo um dos princípios definidos no início do projeto do relógio, surgiu a necessidade da criação de um projeto no GitHub para hospedar os fontes para o controlador do Arduino. Dessa necessidade acabamos em contato com a organização GaroaHC cadastrada no GitHub, cujo intuito é centralizar os projetos originados no Garoa, facilitando a colaboração, presumimos.

Com as devidas permissões garantidas, fizemos um passo a passo da criação do projeto para o relógio de xadrez:

  1. Criamos o repositório local
  2. Versionamos a primeira versão, localmente
  3. Enviamos o projeto para o GitHub
  4. Resumimos o que significou cada passo do processo
  5. Discutimos sobre as formas de colaboração utilizadas no GitHub: fork/pull request e edição colaborativa com vários membros em uma organização.

Ticks no Arduino

Arduino, nativamente, não possui suporte a threads. Existem, no entanto, bibliotecas que criam pseudo-threads (como essa, bem interessante diga-se de passagem) que permitem uma ilusão a paralelismo, melhorando a estrutura do projeto em alguns casos.

Esquecendo as pseudo-threads, como seria a forma correta de decrementar um contador de segundos dentro do Arduino? Uma solução sem dúvida pode ser utilizando o método delay:

void loop() {
  delay(1000);
  tempo = tempo - 1;
}

Problema: se começarmos a adicionar mais código a essa estrutura, o tempo que a execução passa fora da execução do delay passa a ser significante, e nossos segundos por decorrência ficarão maiores. Uma solução, utilizada amplamente em desenvolvimento de jogos, é basear sua lógica nas diferenças de tempo, ou delta t, de cada passagem do loop. Para isso, podemos nos beneficiar do método millis, que retorna a quantidade de milissegundos desde o início da execução do Arduino:

void loop() {
  ultimoDeltaT = deltaT;
  deltaT = millis() - ultimoDeltaT;
  // qualquer código, complexo ou não
}

Com o algoritmo acima podemos ter um código que se comporte de forma coerente com a passagem do tempo, independente do custo dos outros módulos que estão sendo executados, tendo apenas que proporcionalizar as ações dependentes de tempo em função do valor da variável deltaT. De forma análoga a animação 3D, seria o seguinte: avance uma quantidade relativa de frames da animação em função do valor do deltaT, dessa forma, se o último loop não fez nada, o deltaT será pequeno e a animação avançará pouco, mas se o último loop foi o responsável por processar parte da AI dos personagens, por exemplo, é possível que o deltaT seja bem maior e a animação tenha que correr atrás do prejuízo para que o usuário não perceba o problema.

Observem que na documentação do método millis tem uma nota dizendo que o retorno do método millis volta a ser pequeno depois de cerca de 50 dias de execução, provavelmente decorrência do tamanho da estrutura de memória utilizada para armazenar a contagem de millis. Impacto disso no algoritmo: se o valor do millis for identificado como sendo menor que o valor do ultimoDeltaT, o cálculo correto para obter o valor de deltaT passa a ser:

deltaT = (valorMaximoPossivelParaMillis - ultimoDeltaT) + millisPequeno