Lidando com uma Fonte de Sinal

Oct 07 2020

O circuito a seguir é uma versão simplificada de um sistema mais complexo. Para fins de teste, o temporizador 555 foi adicionado para servir como uma fonte de sinal de teste com frequências definidas pelos resistores em série. Cada sinal arbitrário é indicado por um botão e o Arduino precisa ser capaz de distinguir qual botão foi pressionado. Infelizmente, pode haver apenas 3 botões e mais não podem ser adicionados. É aqui que ocorre o problema. Como você pode indicar com segurança qual botão foi pressionado sem interferir na forma de onda arbitrária?

A princípio, meu pensamento original era fazer com que o Arduino fizesse uma amostra do sinal com base nessa amostra, o Arduino seria capaz de dizer qual botão é pressionado.

Quando o botão 1 no rosa é pressionado, o Arduino recebe uma amostra do sinal a seguir.

843
848
849
849
849
849
   // Time 0 when button is pushed 
532
414
500
373
463
346
425
370
386
476
346
442
642
788

Movendo a entrada

    // At t = 0 the Serial Monitor reads zero 
    998
    998
    998
    998
    998
    0
    0
    0
    0
    0
    998
    0
    0
    0
    0
    0
    0
    0
    0
    0
    998
    0
    0
    0
    0
    998
    0
    0
    0
    998
    998
    998
    0
    998
    0
    0
    0
    998
    0
    0
    0
    0

Mover a entrada analógica não torna mais fácil distinguir qual botão foi pressionado. É por isso que decidi perguntar à comunidade como lidar com isso. Eu tentei usar um relé e simplesmente codificar todos os casos, mas o resultado é um sistema não muito robusto e vulnerável a quebrar facilmente com o tempo.

Respostas

3 SiddharthKothari Oct 07 2020 at 19:22

Existe uma maneira fácil de conseguir a leitura de vários botões usando uma única entrada analógica.

Tudo o que você precisa fazer é criar alguns divisores de voltagem em diferentes voltagens que podem ser lidos usando analogRead. O último resistor, R6, no diagrama abaixo garante que o pino leia 0 quando nenhum botão for pressionado (ou seja, resistor pull-down). No diagrama abaixo, conecte Vcc a 5V no Arduino.

Experimente, você deve ser capaz de obter valores bem espaçados para botões diferentes!

1 DavidWisniewski Oct 09 2020 at 16:19

Depois de um ou dois dias trabalhando neste problema, descobri que é melhor evitar o uso de pinos analógicos e ficar longe da interface direta com o 555 Timer. Esta é uma versão simplificada de um circuito mais complexo e o 555 Timer representa alguma fonte de sinal arbitrária. Por exemplo, no rádio móvel, você aperta um botão para enviar uma determinada frequência. Esse é o conceito aqui, apenas as frequências ainda não podem ser ajustadas. Agora que foi esclarecido que o 555 Timer foi colocado no circuito para fins de depuração, aqui está a melhor solução que encontrei para este problema. Primeiro, descobri que é possível ler a partir do pino analógico do Arduino, mas não é fácil. Isso deixa muito espaço para erro, sendo que a forma de onda é arbitrária com alguma frequência aleatória. Portanto, optei por usar os pinos digitais no Arduino.

usando os pinos digitais, agora só preciso me preocupar se o botão está alto ou baixo. Em seguida, transistores NPN foram usados ​​para atuar como interruptores uma vez que o botão é pressionado. Os diodos foram então adicionados para manter uma tensão constante na base do transistor. Para fins de teste, o LCD foi removido e substituído por um LED. No que diz respeito ao código, não é nada extraordinário ou complexo como mostrado abaixo. Portanto, acredito que essa seja a melhor maneira de resolver esse problema.

const int D_pin10 = 10;
const int D_pin9 = 9;
const int D_pin8 = 8;
int led = 13;
void setup()
{
  pinMode(D_pin10 , INPUT); // pin 10 is an input
  pinMode(D_pin9 , INPUT); // pin 10 is an input
  pinMode(D_pin8, INPUT); // pin 10 is an input
  pinMode(led, OUTPUT);
}

void loop()
{
  int High_Low10 =0;
  int High_Low9 =0;
  int High_Low8 =0;
  
  High_Low10 = digitalRead(D_pin10);
  High_Low9 = digitalRead(D_pin9);
  High_Low8 = digitalRead(D_pin8);
  
  if(High_Low10 == HIGH)
  {
    digitalWrite(led, HIGH); 
  }
  else if(High_Low9 == HIGH)
  {
    digitalWrite(led, HIGH); 
  }
  else if(High_Low8 == HIGH)
  {
    digitalWrite(led, HIGH); 
  }
  else
  {
    digitalWrite(led, LOW); 
  }
  delay(1000);
}