Buat Transceiver Kode Morse dengan Arduino UNO – Proyek Komunikasi Praktis
Komponen dan Perlengkapan
Arduino UNO
×
2
LED (generik)
×
2
Photo resistor
×
1
Buzzer
×
1
Tentang Proyek Ini
Saya mengajar kelas hari ini tentang Sistem Komunikasi dan ingin siswa saya belajar dengan memvisualisasikan dan mengalami langsung. Kami melakukan beberapa eksperimen untuk memulai dari Zaman Batu dan memahami kebutuhan akan komunikasi dan apa yang dimaksud dengan Bahasa dan Tata Bahasa, apa itu komunikasi yang andal, sinyal, pesan, dll.
Saat membahas semua hal ini, kami sampai pada titik di mana kami ingin mendefinisikan bahasa kita sendiri untuk komunikasi Visual, dan di sana kami menciptakan Kode Morse!
Jelas bahwa mempelajari Kode Morse akan menjadi tugas yang melelahkan bagi masing-masing dari kita, dan oleh karena itu kami memerlukan mesin. Jadi, kami memutuskan untuk menulis program kecil yang dapat mengkode string yang diberikan ke Kode Morse yang setara dan decoder lain yang dapat memberikan string kembali untuk aliran Kode Morse yang diberikan.
Untuk menemukan Kode Morse untuk karakter, saya merujuk tabel berikut –
Untuk menerjemahkan Kode Morse ke karakter yang setara, dapat diorganisir menjadi pohon biner seperti di bawah ini. Dengan setiap 'titik' bergerak ke sub pohon kiri dan 'garis' bergerak ke sub pohon kanan.
Ini memungkinkan saya untuk dengan cepat mengkode string ke Kode Morse yang sesuai dan sebaliknya.
Namun, karena komunikasi harus terjadi antara dua pihak, saya ingin mentransmisikan Kode Morse yang dikodekan ini ke perangkat lain dan mendekodekannya di sana.
Saya menggunakan dua papan Arduino untuk membangun pengirim dan penerima.
Pada papan pengirim, saya menghubungkan Diod Laser dari Keyes. Perangkat yang mudah didapat dan murah. Untuk jarak yang saya kerjakan, input 3v lebih dari cukup, namun dengan 5v, saya dapat melihat laser mencapai setidaknya 200m.
Pengirim saya terhubung ke komputer dengan Antarmuka Serial (melalui USB). Ini membaca data apa pun pada Port Serial, karakter demi karakter. Temukan Kode Morse yang setara untuk karakter dan buat aliran cahaya 'titik' dan 'garis'.
Saya membuat pulsa 50ms, di mana setiap 'titik' adalah sinar cahaya 50ms dan 'garis' adalah sinar cahaya 150ms. Setiap 'titik' dan 'garis' dipisahkan oleh diam 50ms. Setiap karakter diikuti oleh diam 100ms lainnya.
Kode Pengirim
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, // space, !, ", #, $, %, &, ' NULL, "-.-.--", ".-..-.", NULL, NULL, NULL, NULL, ".----.", // ( ) * + , - . / "-.--.", "-.--.-", NULL, ".-.-.", "--..--", "-....-", ".-.-.-", "-..-.", // 0 1 2 3 4 5 6 7 "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", // 8 9 : ; < = > ? "---..", "----.", "---...", "-.-.-.", NULL, "-...-", NULL, "..--..", // @ A B C D E F G ".--.-.", ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", // H I J K L M N O "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", // P Q R S T U V W ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", // X Y Z [ \ ] ^ _ "-..-", "-.--", "--..", NULL, NULL, NULL, NULL, "..--.-", // ' a b c d e f g NULL, ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", // h i j k l m n o "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", // p q r s t u v w ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", // x y z { | } ~ DEL "-..-", "-.--", "--..", NULL, NULL, NULL, NULL, NULL, }; int dotLength = 50; int dashLength = dotLength*3; void setup() { // put your setup code here, to run once: pinMode(13, OUTPUT); Serial.begin(9600); } void loop() { char ch; if(Serial.available()){ ch = Serial.read(); flashDashDot(MorseTable[ch]); delay(dotLength*2); } } void flashDashDot(const char * morseCode) { int i = 0; while(morseCode[i] != 0) { if(morseCode[i] == '.'){ dot(); } else if (morseCode[i] == '-'){ dash(); } i++; } } void dot() { digitalWrite(13, HIGH); delay(dotLength); digitalWrite(13, LOW); delay(dotLength); } void dash() { digitalWrite(13, HIGH); delay(dashLength); digitalWrite(13, LOW); delay(dotLength); }
Pada papan Arduino Penerima, saya menghubungkan LDR, Buzzer Piezo dan LED. LED dan Buzzer redundan, hanya memberikan umpan balik Audio dan Video dan terasa menyenangkan melihat hal-hal bekerja 😉
Penerima saya juga terhubung ke komputer untuk membaca string karakter yang dihasilkan.
Pada perangkat, dalam loop, saya membaca cahaya apa pun yang mengenai LDR yang terhubung ke Port Analog 4. Saya melindunginya dari cahaya sekeliling dengan melipatnya dengan tabung panjang. Ketika cahaya dari Diod Laser saya mengenai LDR ini, nilai yang dihasilkan naik dan saya menyalakan speaker dan led. Ketika turun, saya mematikan speaker dan led.
Saya menghitung panjang sinar cahaya untuk menentukan apakah itu 'titik' atau 'garis'. Dengan menghitung semua penundaan, ini sekitar ~400 siklus untuk pulsa pada prosesor Atmel 16MHz saya.
Kode Penerima
//Morse Code Binary Tree // Left child at 2n+1 // Right child at 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 Variable to Store the Light Value from the LDR int ctrHigh = 0; int ctrLow = 0; int codePtr = 0; int dotLen = 400; void setup() { Serial.begin(9600);// Start a Serial Connection Serial.print(codePtr); } void loop() { val = analogRead(4); if (val >= 10) { ctrHigh++; ctrLow = 0; digitalWrite(13, HIGH); tone(9, 1000); } else { ctrLow++; if ((ctrHigh >= dotLen) && (ctrHigh < dotLen*2)) { Serial.print("."); codePtr = (2*codePtr) + 1; } else if (ctrHigh >= dotLen * 2) { Serial.print("-"); codePtr = (2*codePtr) + 2; } else { if(ctrLow == dotLen*2){ Serial.print(MorseTree[codePtr]); codePtr = 0; } } ctrHigh = 0; digitalWrite(13, LOW); noTone(9); } }
Output at Receiver ....H.E.-..L.-..L---O.--W---O.-.R.-..L-..D-.-.--!
Kode
Pengirim
Penerima
PengirimArduino
Kode Pengirim
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, // space, !, ", #, $, %, &, ' NULL, "-.-.--", ".-..-.", NULL, NULL, NULL, NULL, ".----.", // ( ) * + , - . / "-.--.", "-.--.-", NULL, ".-.-.", "--..--", "-....-", ".-.-.-", "-..-.", // 0 1 2 3 4 5 6 7 "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", // 8 9 : ; < = > ? "---..", "----.", "---...", "-.-.-.", NULL, "-...-", NULL, "..--..", // @ A B C D E F G ".--.-.", ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", // H I J K L M N O "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", // P Q R S T U V W ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", // X Y Z [ \ ] ^ _ "-..-", "-.--", "--..", NULL, NULL, NULL, NULL, "..--.-", // ' a b c d e f g NULL, ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", // h i j k l m n o "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", // p q r s t u v w ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", // x y z { | } ~ DEL "-..-", "-.--", "--..", NULL, NULL, NULL, NULL, NULL, }; int dotLength = 50; int dashLength = dotLength*3; void setup() { // put your setup code here, to run once: pinMode(13, OUTPUT); Serial.begin(9600); } void loop() { char ch; if(Serial.available()){ ch = Serial.read(); flashDashDot(MorseTable[ch]); delay(dotLength*2); } } void flashDashDot(const char * morseCode) { int i = 0; while(morseCode[i] != 0) { if(morseCode[i] == '.'){ dot(); } else if (morseCode[i] == '-'){ dash(); } i++; } } void dot() { digitalWrite(13, HIGH); delay(dotLength); digitalWrite(13, LOW); delay(dotLength); } void dash() { digitalWrite(13, HIGH); delay(dashLength); digitalWrite(13, LOW); delay(dotLength); }
PenerimaArduino
Kode Penerima
//Morse Code Binary Tree // Left child at 2n+1 // Right child at 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 Variable to Store the Light Value from the LDR int ctrHigh = 0; int ctrLow = 0; int codePtr = 0; int dotLen = 400; void setup() { Serial.begin(9600);// Start a Serial Connection Serial.print(codePtr); } void loop() { val = analogRead(4); if (val >= 10) { ctrHigh++; ctrLow = 0; digitalWrite(13, HIGH); tone(9, 1000); } else { ctrLow++; if ((ctrHigh >= dotLen) && (ctrHigh < dotLen*2)) { Serial.print("."); codePtr = (2*codePtr) + 1; } else if (ctrHigh >= dotLen * 2) { Serial.print("-"); codePtr = (2*codePtr) + 2; } else { if(ctrLow == dotLen*2){ Serial.print(MorseTree[codePtr]); codePtr = 0; } } ctrHigh = 0; digitalWrite(13, LOW); noTone(9); } }
Skematik
Sirkuit Penerima Kode Morsemorsereceiver_1JpG6jZ6yv.fzzSirkuit Pengirim Kode Morsemorsetransmitter_sOKvrIbOv3.fzz