sábado, 8 de setembro de 2012

Arduino sensor de toque humano




Tenho garimpado alguns sensores no ebay e outros sites do gênero. O problema e que muitos sensores colocados à venda têm pouca ou nenhuma documentação disponível na internet. É preciso usar de engenharia reversa pra entender seu funcionamento e usá-los bem. Esta postagem mostra um desses sensores o sensor de toque humano.



Este sensor usa o comparador LM393 e tem como elemento sensor um transistor darligton MPSA13. O segredo é que a base do transistor não está ligada a nada, fica enrolada no 
corpo do transistor onde pode ser tocada. Ao tocar a base o transistor conduz o que através do LM393 coloca a saída digital do sensor (SD) em nível alto. Nos meus testes a saída ficou oscilando entre nivela alto e baixo quando o sensor era tocado. Foi preciso considerar isso na hora de programar.

O sensor também possui uma saída analógica (SA), direto do elemento sensor sem passar pelo comparador. Se ligada a uma entrada analógica do arduino, por exemplo, teremos um valor entre 1023 e 0. Na pratica, ao tocar no sensor o valor salta rapidamente de próximo do 1023 a próximo do 0. Um dos testes que fiz foi usar um pequeno pedaço de fio, como antena, conectado à base do transistor para aumentar sensibilidade. Nestes testes aproximar a mão de antena fazia aumentar o valor lido da saída analógica do sensor.


No experimento mostrado no vídeo a saída digital foi ligada no pino digital 3 do arduino. O comportamento seria idêntico ao de um botão se não fosse pelo fato da saída varia entre o nível alto e baixo, varias vezes por segundo, quando há o toque no elemento sensor. Para minimizar o esse efeito foi usado um laço. Enquanto a saída está em nível baixo o programa permanece nesse laço. Uma pequena mudança da saída para o nível alto faz o programa sair do laço e alterar o estado do pino 13 que, por sua vez controla o acendimento da lâmpada.


Programa


const int sensorPin = 3;
const int ledPin =  13;     

int sensorState = 0;        
int sensorState_aux = 0;    

void setup() {
  pinMode(ledPin, OUTPUT);      
  pinMode(sensorPin, INPUT);     
}

void loop(){

  sensorState_aux = digitalRead(sensorPin);
  delay(30);
  
  // sem ser tocado a sai­da do sensor permanece em nivel baixo
  // quand tocado a saída alterna entre nível baixo e alto
  // para eviatar ocilacões aguarda a saída ir ao nivel alto
  while( sensorState_aux != HIGH) 
  {
  sensorState_aux = digitalRead(sensorPin);
  delay(30);
  }
  //inverte o estado aterior do pino 13 do arduino
  // se HIGH passa para LOW e vice-versa
  sensorState = !sensorState;
  
  if (sensorState == HIGH) {     

    digitalWrite(ledPin, HIGH);  
  } 
  else {

    digitalWrite(ledPin, LOW); 
  }
   delay(500);
}