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...

domingo, 21 de outubro de 2012

Automação no Parque, 20/10/2012

Hoje a Automação no Parque bombou! Com a aproximação da data da guerra de robôs na Anhanguera a turma tá com pressa de deixar tudo no jeito para a arena.
Uma dupla levou um "genérico" de controle de PlayStation 2, via rádio, que eles pretendem usar para controlar o seu robô da categoria Sumô. Eu tinha levado um braço robótico do amigo Fábio, que eu estou recuperando.

Daí... porque não ligar um no outro?

Ligamos o controle PS no Arduino e achamos uma lib para lidar com ele na net. Em seguida implementamos o acionamento de 2 dos motores do braço robô pelo controle, e...



Mais tarde um pouquinho, apareceu o ex-aluno Makson, com o seu TCC. O projeto dele é automação na veia: controle automatizado de um biodigestor. Com dois modos de atuação, automático e manual, o sistema é completamente fiel ao processo que acontece no campo. Monitora automaticamente a temperatura da chama e a pressão do gás, entrando em "modo falha" caso a pressão caia ou a temperatura se mostre abaixo do valor adequado (normalmente porque a chama se apagou). Ou seja, controle malha fechada implementado como deve ser feito.

Abaixo, o diagrama de blocos do projeto, gentilmente cedido pelo Makson:



E aqui um vídeo do equipamento funcionando. Eu começo ligando o equipamento no modo automático. Ele então abre a válvula do gás, aciona o compressor. Em seguida tenta ligar a chama, se a chama é ligada (temperatura alta), acende-se o LED verde indicando que a operação está correta.
Em seguida baixamos a temperatura até o limite em que o sistema entende que a chama apagou (<40 oC). O sistema tenta então por três vezes religar a chama. Caso não consiga, a válvula fecha, o compressor é desligado e o sistema entra em modo falha, piscando o LED vermelho e acionando um alarme sonoro. Para reiniciar é preciso que o operador coloque novamente o sistema em espera e então o coloque em modo automático ou manual. Veja abaixo:


Aqui, outras imagens da brincadeira de ontem. 


Euclides instrui as crianças.

 Receptor do controle de PS2 conectado ao Arduino.



 Receptor do controle em detalhe.
Receptor e controle PS2.

Abaixo, esquema de conexão do controle de biodigestor:



Apareceram também:

- Duas crianças que já tinham ido. Trouxeram motores de passo, que eu testei. O amigo Euclides deu a eles a atenção merecida. Vou ver se consigo reativar um notebook velho que tenho aqui para levar e deixar com quem aparecer e não tiver esse recurso.

- Apareceu o Fábio Luiz, sujeito boa gente que doou para o FreeLab um monte de equipamentos interessantes, alguma sucata mas muito equipamento legal. Fábio, obrigado mais uma vez!

Abaixo, o código fonte do controle do robô pelo controle do PlayStation 2. Para maiores informações sobre como conectar esse tipo de equipamento e a biblioteca que usei podem ser obtidos aqui.

Abaixo, outro esquema de conexão do bicho.




#include <Servo.h>
#include <PS2X_lib.h> 

PS2X ps2x; // cria a classe para controle do PS2

Servo shoulder;
Servo elbow;

int shoulderPos = 180;
int elbowPos = 30;

int error = 0;
byte type = 0;
byte vibrate = 0;

void setup()

{

 Serial.begin(57600);
 shoulder.attach(5);
 elbow.attach(6);

 error = ps2x.config_gamepad(13,11,10,12, true, true);  

 //GamePad(clock, command, attention, data, Pressures?, Rumble?)

 if(error == 0)

 {
   Serial.println("Controle encontrado e configurado");
   Serial.println("Os botões L1 e L2, R1 e L2 acionarão os motores.");
 }
  else if(error == 1)
   Serial.println("Controle não encontrado.");
  else if(error == 2)
   Serial.println("Controle encontrado, mas não aceita comandos.");
  else if(error == 3)
   Serial.println("Controle não aceita modo pressão.");

   type = ps2x.readType();

     switch(type) 
{

       case 0:
        Serial.println("Tipo desconhecido");
        break;

       case 1:
        Serial.println("Controle DualShock");
        break;

       case 2:
         Serial.println("Controle GuitarHero");
         break;
     }
}

void loop()
{
 if(error == 1)
  return;
 ps2x.read_gamepad(false, vibrate);
if (ps2x.NewButtonState())            
 {
        if(ps2x.Button(PSB_L1))
        {
           Serial.println("L1 pressionado");
           elbowPos=elbowPos+5;
           if (elbowPos > 60)
             elbowPos=60;
           elbow.write(elbowPos);
        }          if(ps2x.Button(PSB_L2))
        {
           Serial.println("L2 pressionado");
           elbowPos=elbowPos-5;
           if (elbowPos < 30)
             elbowPos=30;
           elbow.write(elbowPos);
        }  
        if(ps2x.Button(PSB_R1))
        {
           Serial.println("R1 pressionado");
           shoulderPos=shoulderPos+10;
           if (shoulderPos > 180)
             shoulderPos=180;
           shoulder.write(shoulderPos);
        }  
        if(ps2x.Button(PSB_R2))
        {
           Serial.println("R2 pressionado");
           shoulderPos=shoulderPos-10;
           if (shoulderPos < 0)
             shoulderPos=0;
           shoulder.write(shoulderPos);        }  
    }   

    delay(50);
}