신호 소스 다루기

Oct 07 2020

다음 회로는 더 복잡한 시스템의 단순화 된 버전입니다. 테스트 목적으로 555 타이머는 직렬 저항에 의해 설정된 주파수를 사용하여 테스트 신호 소스로 사용되도록 추가되었습니다. 각 임의의 신호는 푸시 버튼으로 표시되며 Arduino는 어떤 버튼을 눌렀는지 구별 할 수 있어야합니다. 불행히도 버튼은 3 개만있을 수 있으며 더 이상 추가 할 수 없습니다. 문제가 발생하는 곳입니다. 임의 파형을 방해하지 않고 어떤 누름 버튼을 눌렀는지 안정적으로 표시하려면 어떻게해야합니까?

처음에는 Arduino가 해당 샘플을 기반으로 신호를 샘플링하여 Arduino가 어떤 버튼을 눌렀는지 알 수 있다고 생각했습니다.

분홍색의 버튼 1을 누르면 Arduino는 다음 신호 샘플을 수신합니다.

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

입력 이동

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

아날로그 입력을 이동해도 어떤 버튼을 눌렀는지 쉽게 구별 할 수 없습니다. 그래서이 문제를 어떻게 해결해야하는지 커뮤니티에 물어보기로했습니다. 나는 릴레이를 사용하고 모든 경우를 단순히 하드 코딩하려고 시도했지만 그 결과 시스템이 매우 견고하지 않고 시간이 지남에 따라 쉽게 파손되기 쉽습니다.

답변

3 SiddharthKothari Oct 07 2020 at 19:22

단일 아날로그 입력을 사용하여 여러 푸시 버튼을 쉽게 읽을 수있는 방법이 있습니다.

여러분이해야 할 일은 analogRead를 사용하여 읽을 수있는 다른 전압에서 전압 분배기를 만드는 것입니다. 아래 다이어그램의 마지막 저항 R6은 푸시 버튼을 누르지 않을 때 핀이 0을 읽도록합니다 (즉, 풀다운 저항). 아래 다이어그램에서 Vcc를 Arduino의 5V에 연결하십시오.

시도해보십시오. 다양한 누름 버튼에 대해 적절한 간격의 값을 얻을 수 있습니다!

1 DavidWisniewski Oct 09 2020 at 16:19

이 문제를 해결하는 데 하루나 이틀이 지난 후, 아날로그 핀 사용을 피하고 555 타이머와 직접 인터페이스하지 않는 것이 가장 좋습니다. 이것은 더 복잡한 회로의 단순화 된 버전이며 555 타이머는 임의의 신호 소스를 나타냅니다. 예를 들어 모바일 라디오에서는 버튼을 눌러 특정 주파수를 전송합니다. 이것이 개념입니다. 주파수 만 아직 조정할 수 없습니다. 555 타이머가 여기에서 디버깅 목적으로 회로에 배치되었다는 것이 확인되었으므로이 문제에 대해 찾은 최상의 솔루션입니다. 첫째, Arduino의 아날로그 핀에서 읽을 수는 있지만 쉽지는 않습니다. 이로 인해 파형이 임의의 주파수로 임의적이라는 오류의 여지가 많이 남습니다. 따라서 Arduino에서 디지털 핀을 사용하기로 결정했습니다.

디지털 핀을 사용하여 이제 버튼이 높거나 낮은 지에 대해서만 걱정하면됩니다. 그런 다음 NPN 트랜지스터를 사용하여 버튼을 누르면 스위치 역할을합니다. 그런 다음 다이오드를 추가하여 트랜지스터베이스에 일정한 전압을 유지했습니다. 테스트 목적으로 LCD를 제거하고 LED로 교체했습니다. 코드에 관한 한 아래와 같이 특별하거나 복잡한 것은 아닙니다. 따라서이 문제를 해결하는 가장 좋은 방법이라고 생각합니다.

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);
}