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

모스 부호 송수신기

구성품 및 소모품

Arduino UNO
× 2
LED(일반)
× 2
포토 저항기
× 1
부저
× 1

이 프로젝트 정보

저는 오늘 커뮤니케이션 시스템에 대한 수업을 하고 있었고 학생들이 시각화하고 경험함으로써 배우기를 원했습니다. 우리는 석기 시대부터 시작하여 의사 소통의 필요성과 언어 및 문법이 의미하는 바, 신뢰할 수있는 의사 소통, 신호, 메시지 등을 이해하기 위해 몇 가지 실험을했습니다.

이 모든 것을 논의하는 동안 우리는 비주얼 커뮤니케이션을 위한 우리 고유의 언어를 정의하고자 하는 지점에 도달했고 거기에서 우리는 모스 부호를 고안했습니다!

모스 부호를 배우는 것은 우리 각자에게 지루한 작업임이 분명했기 때문에 기계가 필요했습니다. 그래서 우리는 주어진 문자열을 동등한 모스 부호로 인코딩할 수 있는 작은 프로그램과 주어진 모스 부호 스트림에 대한 문자열을 되돌려 줄 수 있는 또 다른 디코더를 작성하기로 결정했습니다.

문자의 모스 부호를 찾기 위해 다음 표를 참조했습니다 –

모스 부호를 동등한 문자로 번역하기 위해 아래와 같이 이진 트리로 구성할 수 있습니다. 각 '점'은 왼쪽 하위 트리로 이동하고 '대시'는 오른쪽 하위 트리로 이동합니다.

이를 통해 문자열을 각각의 모스 부호로 또는 그 반대로 빠르게 인코딩할 수 있었습니다.

PoC로 C#으로 프로그램을 작성했습니다.

출력

안녕하세요.... . .-.. .-.. --- .-- --- .-. .-.. -.. 

하지만 두 사람 사이에서 통신이 이루어져야 하기 때문에 이 인코딩된 모스 부호를 다른 장치로 전송하여 그곳에서 디코딩하고 싶었습니다.

두 개의 Arduino 보드를 사용하여 송신기와 수신기를 만들었습니다.

송신기 보드에 레이저 다이오드를 연결했습니다. 키이스에서. 쉽게 구할 수 있고 저렴한 장치. 제가 작업하는 거리에서는 3v 입력으로 충분했지만 5v에서는 레이저가 최소 200m에 도달하는 것을 볼 수 있습니다.

내 송신기는 직렬 인터페이스(USB를 통해)가 있는 컴퓨터에 연결되어 있습니다. 직렬 포트의 모든 데이터를 문자별로 읽습니다. 캐릭터에 해당하는 모스 부호를 찾아 '점' 및 '대시' 빛 스트림을 생성합니다.

각 '점'은 50ms 광선이고 '대시'는 150ms 광선인 50ms 펄스를 만들었습니다. 각 '점'과 '대시'는 50ms 묵음으로 구분됩니다. 각 캐릭터 다음에 또 다른 100ms의 침묵이 옵니다.

송신기 코드

const char* MorseTable[] ={ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, // 공백, !, ", #, $, %, &, ' NULL, "-. -.--", ".-..-.", NULL, NULL, NULL, NULL, ".----.", // ( ) * + , - . / "-.--.", "-.--.-", 없는, ".-.-.", "--..--", "-....-", ".-.-.-", "-.. -.", // 0 1 2 3 4 5 6 7 "-----", ".----", "..---", "...--", "... .-", ".....", "-....", "--...", // 8 9 :; <=> ? "---..", "--- -.", "---...", "-.-.-.", NULL, "-...-", NULL, "..--..", // @ ABCDEFG ".- -.-.", ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", // HIJKLMNO "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", / / PQRSTUVW ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--" , // XYZ [ \ ] ^ _ "-..-", "-.--", "-- ..", NULL, NULL, NULL, NULL, "..--.-", // ' abcdefg NULL, ".-", "-...", "-.-.", "-.. ", ".", "..-.", "--.", // hijklmno "....", "..", ".---", "-.-", ".- ..", "--", "-.", "---", // pqrstuvw ".--.", "--.-", ".-.", "...", " -", "..-", "...-", ".--", // xyz { | } ~ DEL "-..-", "-.--", "--..", NULL, NULL, NULL, NULL, NULL, };int dotLength =50;int dashLength =dotLength*3, 무효 설정 () { // 여기에 설정 코드를 입력하여 한 번 실행:pinMode(13, OUTPUT); Serial.begin(9600);}무효 루프() { char ch; if(Serial.available()){ ch =Serial.read(); flashDashDot(모스테이블[ch]); 지연(도트길이*2); }} 무효 flashDashDot(const char * morseCode){ int i =0; while(morseCode[i] !=0) { if(morseCode[i] =='.'){ 점(); } else if (morseCode[i] =='-'){ dash(); } i++; }}void dot(){ digitalWrite(13, HIGH); 지연(도트길이); 디지털 쓰기(13, 낮음); 지연(dotLength);}대시() 무효{ digitalWrite(13, HIGH); 지연(대시길이); 디지털 쓰기(13, 낮음); 지연(점 길이);}  

수신기 Arduino 보드에서 LDR을 연결했습니다. , 피에조 부저LED . LED와 부저는 중복되어 오디오 및 비디오 피드백을 제공하고 작동하는 모습을 보니 기분이 좋습니다 😉

내 수신기는 또한 결과 문자열 문자를 읽기 위해 컴퓨터에 연결됩니다.

장치의 루프에서 아날로그 포트 4에 연결된 LDR에 닿는 빛을 읽었습니다. 긴 튜브로 캡슐화하여 주변 빛으로부터 보호했습니다. 내 레이저 다이오드의 빛이 이 LDR에 닿으면 결과 값이 높아지고 스피커를 켜고 LED를 켭니다. 내리면 스피커를 끄고 LED를 끕니다.

나는 그것이 '점'인지 '대시'인지 판단하기 위해 광선의 길이를 계산하고 있습니다. 모든 지연을 고려하면 16MHz Atmel 프로세서의 펄스에 대해 ~400 사이클이 되었습니다.

수신기 코드

//모스 부호 이진 트리// 2n+1에서 왼쪽 자식// 2n+2에서 오른쪽 자식// <.|->// .E -T// .I -A .N - M//const char MorseTree[] ={'\0','E', 'T', 'I', 'A', 'N', 'M', 'S', 'U', 'R' , 'W', 'D', 'K', 'G', 'O', 'H', 'V', 'F', 'U', 'L', 'A', 'P', ' J', 'B', 'X', 'C', 'Y', 'Z', 'Q', '\0','\0','5', '4', ' '3', '\0','\0','\0','2', '\0', '\0','+', '\0','\0','\0 ','\0','1', '6', '=', '/', '\0','\0','\0','(', '\0','7' 또는 0','\0','\0','\0','\0','\0', '\0','\0','\0','?', '_' , '\0','\0','\0', '\0','"', '\0','\0','.', '\0','\0',' \0', '\0','@', '\0','\0','\0','\0','\0','\0', ' ' ','\0','\0','\0','\0','\0','\0', '\0',';', '!', '\0',')', '\0','\0','\0', '\0','\0',',' , '\0','\0','\0','\0',':', '\0','\0','\0','\0','\0', '\0','\0' }; 정수 값 =0; // LDRint의 조명 값을 저장할 변수 ctrHigh =0;int ctrLow =0;int codePtr =0;int dotLen =400;void setup(){ Serial.begin(9600);// 직렬 연결 시작 Serial .print(codePtr);}무효 루프(){ val =analogRead(4); if (val>=10) { ctrHigh++; 낮은 =0; 디지털 쓰기(13, 높음); 톤(9, 1000); } else { ctrLow++; if ((ctrHigh>=dotLen) &&(ctrHigh =dotLen * 2) { Serial.print("-"); codePtr =(2*codePtr) + 2; } else { if(ctrLow ==dotLen*2){ Serial.print(MorseTree[codePtr]); codePtr =0; } } ctrHigh =0; 디지털 쓰기(13, 낮음); 노톤(9); }} 
수신기 출력 ....HE-..L.-..L---O.--W---O.-.R.-..L-..D-. -.--! 
<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • 송신기
  • 수신자
  • 송신기Arduino
    송신기 코드
    const char* MorseTable[] ={ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL , NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, // 공백, !, ", #, $, %, &, ' NULL, "-.- .--", ".-..-.", NULL, NULL, NULL, NULL, ".----.", // ( ) * + , - . / "-.--.", " -.--.-", 없는, ".-.-.", "--..--", "-....-", ".-.-.-", "-..- .", // 0 1 2 3 4 5 6 7 "-----", ".----", "..---", "...--", ".... -", ".....", "-....", "--...", // 8 9 :; <=> ? "---..", "---- .", "---...", "-.-.-.", NULL, "-...-", NULL, "..--..", // @ ABCDEFG ".-- .-.", ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", // HIJKLMNO "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", // PQRSTUVW ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", // XYZ [ \ ] ^ _ "-..-", "-.--", "--..", NULL, NULL, NULL, NULL, "..--.-", // ' abcdefg NULL, ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", // hijklmn o "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", / / pqrstuvw ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--" , // xyz { | } ~ DEL "-..-", "-.--", "--..", NULL, NULL, NULL, NULL, NULL, };int dotLength =50,int dashLength =dotLength*3, 무효 설정 () { // 여기에 설정 코드를 입력하여 한 번만 실행합니다. pinMode(13, OUTPUT); Serial.begin(9600);} 무효 루프() { 문자 채널; if(Serial.available()){ 채널 =Serial.read(); flashDashDot(모스테이블[ch]); 지연(도트길이*2); }} 무효 flashDashDot(const char * morseCode){ int i =0; while(morseCode[i] !=0) { if(morseCode[i] =='.'){ 점(); } else if (morseCode[i] =='-'){ 대시(); } 나는 ++; }} 무효 점(){ digitalWrite(13, HIGH); 지연(도트길이); 디지털 쓰기(13, 낮음); 지연(dotLength);} 무효 대시(){ digitalWrite(13, HIGH); 지연(대시길이); 디지털 쓰기(13, 낮음); 지연(dotLength);}
    수신기Arduino
    수신기 코드
    //모스 부호 이진 트리// 왼쪽 자식 2n+1// 오른쪽 자식 2n+2// <.|->// .E -T// .I -A .N -M //const char MorseTree[] ={'\0','E', 'T', 'I', 'A', 'N', 'M', 'S', 'U', 'R', 'W', 'D', 'K', 'G', 'O', 'H', 'V', 'F', 'U', 'L', 'A', 'P', 'J ', 'B', 'X', 'C', 'Y', 'Z', 'Q', '\0','\0','5', '4', '\0',' 3', '\0','\0','\0','2', '\0', '\0','+', '\0','\0','\0' ,'\0','1', '6', '=', '/', '\0','\0','\0','(', '\0','7', '\0','\0','\0','8', '\0','9', '0', '\0', '\0','\0','\0 ','\0','\0','\0','\0','\0', '\0','\0','\0','?', '_', '\0','\0','\0', '\0','"', '\0','\0','.', '\0','\0','\ 0', '\0','@', '\0','\0','\0','\0','\0','\0', '-', '\0' ,'\0','\0','\0','\0','\0','\0', '\0',';', '!', '\0',' )', '\0','\0','\0', '\0','\0',',', '\0','\0','\0','\0 ',':', '\0','\0','\0','\0','\0','\0','\0' };int val =0; // A LDRint ctrHigh =0;int ctrLow =0;int codePtr =0;int dotLen =400;void setup(){ Serial.begin(9600);// 직렬 연결 시작 Serial.print( 코드Ptr); } 무효 루프(){ val =analogRead(4); if (val>=10) { ctrHigh++; 낮은 =0; 디지털 쓰기(13, 높음); 톤(9, 1000); } else { CtrlLow++; if ((ctrHigh>=dotLen) &&(ctrHigh =dotLen * 2) { Serial.print("-"); codePtr =(2*codePtr) + 2; } else { if(ctrLow ==dotLen*2){ Serial.print(MorseTree[codePtr]); 코드 Ptr =0; } } 높은 =0; 디지털 쓰기(13, 낮음); 노톤(9); }}

    회로도

    모스 부호 수신기 회로 morsereceiver_1JpG6jZ6yv.fzz모스 부호 송신기 회로 morsetransmitter_sOKvrIbOv3.fzz

    제조공정

    1. 바코드 스캐너
    2. C++ 주석
    3. ADC 코드 오류율 이해
    4. 모스 부호와 이중 갈취:오늘날의 맬웨어 현황
    5. Arduino만 사용하는 DTMF 디코더
    6. Arduino 알람 시스템:SERENA
    7. 데이터 매트릭스 코드와 QR 코드
    8. CNC G 코드 소개
    9. Fanuc G 코드 목록
    10. 전체 G 코드 목록