산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Arduino만 사용하는 DTMF 디코더

구성품 및 소모품

Arduino UNO
× 1
LED(일반)
× 10
브레드보드(일반)
× 1
점퍼 와이어(일반)
× 20

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

선택할 수 있는 선택 항목이 있는 학기 프로젝트 목록을 살펴보고 있을 때 CM 8870 IC를 DTMF 디코더로 사용하고 인코딩된 바이너리 데이터가 Arduino에 제공되어 왼쪽 오른쪽 및 앞으로 뒤로 작업을 수행하는 DTMF 제어 자동차를 보았습니다. 주요 부분인 DTMF 디코더 기능은 외부 IC를 사용했는데 통합하기가 어려웠고 회로의 IC를 일부 추가 코드로 대체할 수 있는 코드나 라이브러리를 찾다가 만족스러운 솔루션을 찾지 못했습니다. . 그러나 단위 시간당 펄스 수와 주어진 톤 신호의 진폭 기여도를 계산하여 톤에 특정 주파수가 있는지 여부를 알 수 있는 Goertzel 알고리즘(Goertzel.h)을 기반으로 한 라이브러리입니다.

기본 예제 코드를 기반으로 사용하고 톤에서 현재 지배적인 DTMF 주파수를 감지할 수 있는 코드를 작성하고 이를 디코딩하여 전화 통화 중에 반대편에서 눌려진 번호를 제공할 수 있습니다.

<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • Arduino 코드 DTMF 디코더
  • Arduino 코드 DTMF 디코더Arduino
    Arduino IDE에서 코드를 컴파일하고 업로드하고 라이브러리를 먼저 추가하는 것을 잊지 마십시오.
    라이브러리 링크는 다음과 같습니다.
    https://github.com/jacobrosenthal/Goertzel
    /* 이 코드는 아날로그 핀 A0에서 16자 DTMF 코드를 감지하기 위한 DTMF 디코더의 기본 구현이며 모든 상위 및 DTMF 매트릭스의 낮은 톤을 제거하고 숫자 0-9에 해당하는 디지털 비트를 켜고 나머지 문자를 직렬로 인쇄하여 해당 숫자를 제공합니다. 이 작업은 전적으로 http://www.embedded.com/design/embedded/4024443/The-Goertzel-Algorithm에 있는 Kevin Banks 코드를 기반으로 하므로 그의 일반적인 구현 및 분석에 대해 전적으로 감사드립니다. Goertzel 알고리즘은 오랫동안 사용되어 왔으므로 전체 설명은 http://en.wikipedia.org/wiki/Goertzel_algorithm을 참조하십시오. 모든 주파수의 발생을 표시하지 않고 단일 주파수만 검색하기 때문에 낮은 오버히드로 빠르기 때문에 고속 푸리에 변환의 대안으로 DTMF 톤 감지에서 자주 사용됩니다. * 이 코드는 "Mian Mohammad Shoaib"에 의해 작성/수정되었으며 공개 도메인으로 공개되었습니다. * 코드와 관련된 쿼리는 언제든지 [email protected]으로 문의하십시오. */#include int sensorPin =A0; 상수 정수 N =100; // 코드가 걸릴 샘플 수입니다. y0u는 감도를 변경할 수 있으며 크면 arduinoconst를 느리게 할 수 있습니다. float threshold =2000; //고려할 최소 톤 진폭은 더 민감하게 변경할 수 있습니다.const float sampling_freq =8900; //최대 감지 가능한 주파수는 샘플링 속도/2이며 16Mhz의 arduino uno는 최대 8900Hz의 샘플링을 지원할 수 있습니다.float x_frequencies[4]; // 감지할 x 및 y축 주파수를 유지하기 위해 두 개의 배열을 만듭니다.float y_frequency[4];void setup(){ pinMode(13, OUTPUT); // 톤이 감지되면 표시하기 위해 깜박임을 초기화합니다. pinMode(2, OUTPUT); // 2에서 12까지의 dtmf 출력을 표시하기 위해 10개의 핀을 출력으로 초기화합니다. 나머지는 모니터에 역직렬 방식으로 인쇄됩니다. pinMode(3, OUTPUT); 핀모드(4, 출력); 핀모드(5, 출력); 핀모드(6, 출력); 핀모드(7, 출력); 핀모드(8, 출력); 핀모드(9, 출력); 핀모드(10, 출력); 핀모드(11, 출력); 핀모드(12, 출력); Serial.begin(9600); x_frequencies[0]=1209; //행 및 콜론 번호와 함께 x 및 y 축 톤 주파수로 배열을 초기화합니다.x_frequencies[1]=1336;x_frequencies[2]=1477;x_frequencies[3]=1633;y_frequencies[0]=697;y_frequencies[ 1]=770;y_freqencies[2]=852;y_frequencies[3]=941;}bool detect_tone(float freq){Goertzel goertzel =Goertzel(freq, N, sampling_freq); // 주어진 샘플링 주파수 샘플 및 대상 주파수로 라이브러리 함수 초기화 goertzel.sample(sensorPin); // n개의 샘플을 취합니다. float 크기 =goertzel.detect(); // target_freq를 확인합니다. if(magnitude>threshold){ //적중이 잘못되었거나 적중이 없으면 임계값을 조정합니다. digitalWrite(13,HIGH); //펄스가 감지되면 13으로 깜박임 delay(250); 디지털 쓰기(13,LOW); Serial.print(주파수); Serial.print("\n"); true를 반환합니다. } else return false;}void print_number(int row,int column){int number=0;if(row==0){ //찾은 행과 열에 해당하는 숫자 찾기 if(column==0) number=1; else if(열==1) 숫자=2; else if(열==2) 숫자=3; else if(열==3) 숫자=10; }else if(행==1){ if(열==0) 숫자=4; else if(열==1) 숫자=5; else if(열==2) 숫자=6; else if(열==3) 숫자=11; }else if(행==2){ if(열==0) 숫자=7; else if(열==1) 숫자=8; else if(열==2) 숫자=9; else if(열==3) 숫자=12; }else if(행==3){ if(열==0) 숫자=14; else if(열==1) 숫자=0; else if(열==2) 숫자=15; else if(열==3) 숫자=13; }if(숫자 <10){digitalWrite((숫자+2),HIGH);Serial.print(숫자);}else if(숫자 ==10)Serial.print('A');else if(숫자 ==11)Serial.print('B');else if(숫자 ==12)Serial.print('C');else if(숫자 ==13)Serial.print('D');else if(숫자 ==14)Serial.print('*');else if(숫자 ==15)Serial.print('#');Serial.print("\n");delay(800);for(int i=2;i<=12;i++){ digitalWrite(i,LOW);}}void 루프(){int column=0,row=0;int i=0;while(1){ if(detect_tone(x_frequencies[i]) ) ==참){ 열 =나; 부서지다; } i++;if(i==4)i=0;}i=0;while(1){if(detect_tone(y_frequencies[i]) ==true){ 행 =i; 부서지다; } i++;if(i==4)i=0;}print_number(행, 열);}

    회로도

    이 회로는 디지털 핀 2에서 12까지 연결된 10개의 LED를 사용합니다. 이 LED는 0-9 사이의 숫자에 대한 톤을 각각 누를 때 켜지고 펄스 감지 LED는 핀 13에 연결되어 펄스가 발생할 때 짧은 깜박임을 제공합니다. 또는 신호가 감지되면 IDE에서 직렬 인쇄를 통해 9(특수 문자)보다 큰 숫자가 표시됩니다.
    오디오 잭 또는 AUX 케이블의 입력 핀은 저주파 및 DC 오프셋을 필터링하는 직렬 1uF 커패시터와 함께 아날로그 핀 A0에 연결됩니다.

    제조공정

    1. Arduino를 사용하여 모니터 Ambilight 만들기
    2. ARDUINO를 사용하는 초음파 부상 기계
    3. Arduino 알람 시스템:SERENA
    4. Arduino와 스마트폰을 사용한 DIY 전압계
    5. IoT를 사용한 심박수 모니터
    6. 레이저 모듈을 사용한 모스 부호 통신(둘 다)
    7. Arduino Uno WiFi를 사용하는 WebServerBlink
    8. Arduino + Processing + PHP를 사용한 자동차 카운터
    9. arduino를 사용한 자동화된 Dino 게임
    10. Python3 및 Arduino 통신