Main Content

Circuitos_1

Iremos apresentar várias formas de utilizar botões como entradas para um circuito.
O estado de um botão é a forma mais básica da lógica binária ou está aberto ou está fechado, no entanto quando se monta um circuito tem que se ter em atenção que devemos ter sempre um valor esperado no circuito. Por este motivo é necessário usar resistências de pull-up ou pull-down.

As resistências de pull-up são resistências usadas em circuitos lógicos que asseguram que existe um valor conhecido em qualquer momento num circuito. Um circuito lógico pode ter três estados lógicos: alto, baixo e flutuante (ou alta impedância). Este último estado ocorre quando um pino não é puxado para um nível alto ou baixo, e é deixado num estado de flutuação. Um bom exemplo disto é um pino de entrada de um micro-controlador que não se encontre ligado. Isto provoca resultados imprevisíveis e para ultrapassar esta situação são usadas resistências de pull-up. Estas resistências são idênticas às demais sendo usadas para este fim específico. Um valor típico de resistência de pull-up é 10k Ohms, mas pode variar de acordo com o circuito ou objectivo.
Por oposição às resistências de pull-up existem as de pull-down que em vez de puxarem o estado de um circuito para a tensão de referência positiva (ex: 5V) puxam para a tensão negativa (ex: GND).

O valor correto da resistência é limitado por dois fatores. A dissipação de potência e a tensão. Se o valor foi demasiado baixo, uma corrente alta passará pela resistência gastando energia e produzindo calor desnecessariamente. O segundo fator é a voltagem do pino quando o pull-up entra em ação. Se o valor for demasiado alto, combinado com uma fuga de corrente do pino de entrada, a tensão de entrada pode ser insuficiente quando o circuito está aberto.
Como regra, o valor da resistência deverá ser 10 vezes menor que o valor da impedância do pino de entrada. Em circuitos a operar com tensões de 5V um valor de pull-up costuma ser entre 1k e 10k Ohms.

O terceiro circuito apresenta uma forma de ler múltiplos botões a partir de uma entrada analógica. O principio usado é o da divisão de tensão usada pelas resistências. A cada botão estão associadas um número diferente de resistências e logo uma tensão diferente.

Esquemático

Circuitos_3_Schematics

Nota:
Os circuitos apenas apresentam a parte dos botões. A ligação com o micro-controlador está definida no sketch.
O circuito para o CSEduino pode ser consultado na página. Pode igualmente ser usado um Arduino.

Componentes (BOM)

  • 10x SPST (Switch)
  • 9x Resistências de 1K Ohms (R3-R11)
  • 2x Resistências de 10K Ohms (R1-R2)

Código

O Sketch usado foi o seguinte:

/*

  Pinos usados:
  A0 - Pino analógico
  D2 - Botão Pull-up
  D3 - Botão Pull-Down

*/

const int buttonsPin = A0;
const int puPin = 2;
const int pdPin = 3;

#define btn1      1
#define btn2      2
#define btn3      3
#define btn4      4
#define btn5      5
#define btn6      6
#define btn7      7
#define btn8      8
#define btnNONE   0

int readButtons() {               // read the buttons
  int r = btnNONE;
  int adc_key_in = analogRead(buttonsPin);
// if (adc_key_in!=0)
// Serial.println(adc_key_in);

  if (adc_key_in > 560)  r = btn8;
  if (adc_key_in > 590)  r = btn7;
  if (adc_key_in > 630)  r = btn6;
  if (adc_key_in > 675)  r = btn5;
  if (adc_key_in > 725)  r = btn4;
  if (adc_key_in > 780)  r = btn3;
  if (adc_key_in > 850)  r = btn2;
  if (adc_key_in > 925)  r = btn1;
  //...
  return r;                // when all others fail, return this.
}

void setup() {
  pinMode(puPin, INPUT);
  pinMode(pdPin, INPUT);
  pinMode(buttonsPin, INPUT);
  Serial.begin(9600);
}

void loop() {
  int button = readButtons();
  Serial.print("B1: ");
  Serial.print(digitalRead(puPin));
  Serial.print(", B2: ");
  Serial.print(digitalRead(pdPin));
  Serial.print(", BM: ");
  Serial.println(button);
}

Os botões estão codificados em intervalos. A função readButtons devolve o valor do botão lido ou btnNONE caso não esteja nenhum premido.