Postagem em destaque

Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte I

Este post é o primeiro de uma série de seis que escrevi tratando de controle de potência e PID (controle proporcional, integral e derivativo...

quinta-feira, 13 de fevereiro de 2014

Space Camp III - Carrinho de Controle Remoto

Pousados foguetes e ovonautas, estes últimos coletaram amostras de materiais existentes nos astros em que pousaram e que deveriam ser trazidas de volta à Terra. Essas amostras eram específicas do astro, por exemplo, Titã tinha água, Marte tinha ferro e por aí afora.

Para transportar as amostras coletadas até a base de lançamento do foguete de retorno, os bravos participantes do SpaceCamp deveriam construir um veículo terrestre capaz de, controlado remotamente, coletar a amostra e trazê-la ao ponto de lançamento. O pobre do ovonauta foi abandonado como um degredado português intergalático no corpo celeste em que pousou.

Os pilotos do veículo podiam usar as mãos para coletar a amostra, mas se o fizessem sem usar as mãos ganhariam um ponto extra.

Dessa oficina, que também foi sensacional, eu não tenho imagens. Isso porque trabalhei tanto na instrução teórica quanto no apoio à construção dos carrinhos, além de ter sido o "alvo" destes na parte prática. Se alguma alma caridosa que esteve por lá tiver fotos dessa parte do evento, por favor me mande e eu publico, com o devido crédito.

Alguns dos nossos spacecampers me escreveram pedindo para disponibilizar o código fonte da versão final do programa do carrinho. Ele segue abaixo, devidamente comentado. Para quem levou a montagem do carrinho prá casa, é só copiar e mandar prá dentro. O código foi fornecido pelo Léo e eu dei uma enxugada. Uma dica: para copiar o fonte abaixo, selecione com o mouse a parte do texto, sem incluir os números de linha.

No meu blog, aqui, tem um outro post que fala mais sobre esse controle remoto e sua conexão ao Arduino, a quem interessar possa.

Em caso de dúvidas, é só postar aqui no blog.

// biblioteca que contém as rotinas de comunicação com o controle remoto tipo PS/2.
#include "PS2X_lib.h"

PS2X ps2x; // Classe do controle remoto

int erro = 0; 

void setup()
{
  Serial.begin(57600);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
 
  // inicia o controle. 
  // Os parâmetros correspondem aos fios que saem do controle, e aparecem na seguinte ordem:
  // clock, command, attention, data.
  // No exemplo abaixo, 9-clock etc.
  // No outro post do blog (http://automatobr.blogspot.com.br/2012/10/automacao-no-parque-20102012.html)
  // tem mais informação a respeito. 
  erro = ps2x.config_gamepad(9,11,10,12, true, true);
  if(erro > 0)
  {
   Serial.print("Erro de acesso ao controle PS/2: ");
   Serial.println(erro);
  }
  // No post do blog acima, nos fontes, tem o significado dos diferentes erros, 
  // de acordo com o número. 
}

void loop()
{
   if(erro > 0) // Se tem erro, para por aqui
     return; 
   // Se o botão tipo stick (PSS) da direita (R) foi inclinado para a frente (eixo Y), 
   // o carrinho acelera à frente.
   if((ps2x.Analog(PSS_RY) < 64) )
   {
      Serial.println("FORWARD");
      digitalWrite(4, HIGH);
   }
   // Se o botão tipo stick (PSS) da direita (R) não está acionado, o motor para.
   else
   {
      digitalWrite(4, LOW);
   }
   // Se o botão tipo stick (PSS) da direita (R) foi inclinado para a trás (eixo Y), 
   // o carrinho acelera prá trás.
   if((ps2x.Analog(PSS_RY) > 192))
   {
     Serial.println("BACKWARD");
     digitalWrite(5, HIGH); 
   }
   // Se o botão tipo stick (PSS) da direita (R) não está acionado, o motor para.
   else
   {
     digitalWrite(5, LOW);
   }
   // Se o botão tipo stick (PSS) da esquerda (L) está acionado para a esquerda
   // (valo menor que 64) o motor de direção aciona para o lado que vira o 
   // carrinho à esquerda.
   if((ps2x.Analog(PSS_LX) < 64))
   {
      Serial.println("LEFT");
      digitalWrite(6, HIGH); 
   }
   // Se o botão tipo stick (PSS) da esquerda (L) não está acionado, o motor para.
   else
   {
      digitalWrite(6, LOW);
   }
   // Se o botão tipo stick (PSS) da esquerda (L) está acionado para a direita
   // (valo maior que 192) o motor de direção aciona para o lado que vira o 
   // carrinho à direita.
   if((ps2x.Analog(PSS_LX) > 192))
   {
      Serial.println("RIGHT");
      digitalWrite(7, HIGH);
   }
   // Se o botão tipo stick (PSS) da esquerda (L) não está acionado, o motor para.
   else
   {
      digitalWrite(7, LOW); 
   }
   //  dá um "refresco" ao sistema, permitindo que o carrinho obedeça ao
   // comando.
   delay(50);
}