ساخت یک مترجم کد مورس با آردوینو

فهرست مطالب

مقدمه

برقراری ارتباط بصورت رمزی و کدنگاری شده علاوه بر جذابیت های فراوان، کاربردهای گسترده ای نیز دارد که در زمینه های مختلف استفاده می شود. یکی از رایج ترین روش های برقراری ارتباط بصورت رمزی استفاده از کد مورس می باشد. در این آموزش با چگونگی ساخت یک مترجم برای ارسال و دریافت کد مورس با استفاده از آردوینو آشنا می شوید.

آنچه در این آموزش یاد می گیرید

کد مورس چیست؟

در زمان های دور که ارتباطات به سادگی امروز نبود، یکی از رایج ترین روش ها برای ارتباط برقرار کردن استفاده از روش ساموئل مورس بنام کد مورس بود. در این روش هرحرف و عدد توسط دو مشخصه شناسایی می شود،  یک مشخصه بصورت کوتاه یا نقطه(dot) و مشخصه دیگر بصورت بلند یا خط(dash)

کد مورس نیز مانند هر زبان دیگر الفبای اختصاصی خود را دارد. در حال حاضر کد مورس به دو صورت آمریکایی (American) و بین المللی (International) موجود است که نوع بین المللی آن رایج تر می باشد.

در کد مورس هر حرف یا عدد با نقطه یا خط یا ترکیبی از این دو بیان می شود.

کد مورس را می توان به روش های مختلف مانند صوت، نور، زبان بدن، فرکانس و … ارسال کرد، اگر نقطه را یک واحد زمانی درنظر بگیریم، خط سه واحد زمانی، فاصله قسمت های یک حرف یک واحد زمانی ، فاصله بین دو حرف متوالی سه واحد زمانی و فاصله بین کلمات هفت واحد زمانی خواهد بود.

بعنوان مثال کلمه SOS که یک استاندارد بین المللی برای درخواست کمک می باشد در کد مورس بصورت … — … بیان می شود.

بعنوان تمرین سعی کنید نام خود را بصورت کد مورس بنویسید.

آیا کد مورس هنوز هم کارایی دارد؟

اگرچه امروزه به اندازه گذشته از کد مورس استفاده نمی شود اما همچنان استفاده از کد مورس کاربردهای مخصوص خود را دارد. کد مورس هنوز هم بین علاقه مندان به برقراری ارتباط در گستره رادیو آماتوری محبوب است، همچنین از کد مورس در سیستم های ناوبری هوایی استفاده می شود. بسیاری از کشتی ها از کد مورس بصورت ارسال نور برای برقراری ارتباط یا کمک خواهی استفاده می کنند، بعلاوه کسانی که به هر دلیلی تواناییصحبت کردن ندارند نیز می توانند از کد مورس برای بیان منظور خود استفاده کنند.

از همه موارد بالا که بگذریم یادگیری و استفاده از کد مورس برای برقراری ارتباط می تواند جذاب و سرگرم کننده باشد.

لوازمی که به آن احتیاج دارید

قطعات مورد نیاز

برد آردوینو UNO × 1
ماژول بازر اکتیو × 1
LED × 1
سیم جامپر نری به نری

نرم افزارهای مورد نیاز

Arduino IDE

ساخت یک ارسال کننده (انکودر) کد مورس با آردوینو

شاید بخاطر سپردن کد مورس و تبدیل نوشته ها به این کد کمی دشوار باشد پس بهتر است یک مترجم متن به کد مورس بسازید!

در اینجا با استفاده از Arduino UNO یک متن دلخواه را به کد مورس تبدیل می کنید، فقط کافیست کد زیر را روی آردوینو خود آپلود کرده و Serial monitor را باز کنید، سپس کلمه یا متن دلخواه خود را نوشته و کد مورس آنرا دریافت کنید و آنرا بصورت نور و صوت ارسال کنید.

سیم بندی

کد

/* 

Morse code - Transmitter  
modified on 14 Apr 2019 
by Saeed Hosseini @ Electropeak 
Home
*/ const int led = 13; const int buz = 8; String code = ""; int len = 0; char ch; char new_char; int unit_delay = 250; void dot() { Serial.print("."); digitalWrite(led, HIGH); digitalWrite(buz, HIGH); delay(unit_delay); digitalWrite(led, LOW); digitalWrite(buz, LOW); delay(unit_delay); } void dash() { Serial.print("-"); digitalWrite(led, HIGH); digitalWrite(buz, HIGH); delay(unit_delay * 3); digitalWrite(led, LOW); digitalWrite(buz, LOW); delay(unit_delay); } void A() { dot(); delay(unit_delay); dash(); delay(unit_delay); } void B() { dash(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); } void C() { dash(); delay(unit_delay); dot(); delay(unit_delay); dash(); delay(unit_delay); dot(); delay(unit_delay); } void D() { dash(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); } void E() { dot(); delay(unit_delay); } void f() { dot(); delay(unit_delay); dot(); delay(unit_delay); dash(); delay(unit_delay); dot(); delay(unit_delay); } void G() { dash(); delay(unit_delay); dash(); delay(unit_delay); dot(); delay(unit_delay); } void H() { dot(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); } void I() { dot(); delay(unit_delay); dot(); delay(unit_delay); } void J() { dot(); delay(unit_delay); dash(); delay(unit_delay); dash(); delay(unit_delay); dash(); delay(unit_delay); } void K() { dash(); delay(unit_delay); dot(); delay(unit_delay); dash(); delay(unit_delay); } void L() { dot(); delay(unit_delay); dash(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); } void M() { dash(); delay(unit_delay); dash(); delay(unit_delay); } void N() { dash(); delay(unit_delay); dot(); delay(unit_delay); } void O() { dash(); delay(unit_delay); dash(); delay(unit_delay); dash(); delay(unit_delay); } void P() { dot(); delay(unit_delay); dash(); delay(unit_delay); dash(); delay(unit_delay); dot(); } void Q() { dash(); delay(unit_delay); dash(); delay(unit_delay); dot(); delay(unit_delay); dash(); delay(unit_delay); } void R() { dot(); delay(unit_delay); dash(); delay(unit_delay); dot(); delay(unit_delay); } void S() { dot(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); } void T() { dash(); delay(unit_delay); } void U() { dot(); delay(unit_delay); dot(); delay(unit_delay); dash(); delay(unit_delay); } void V() { dot(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); dash(); delay(unit_delay); } void W() { dot(); delay(unit_delay); dash(); delay(unit_delay); dash(); delay(unit_delay); } void X() { dash(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); dash(); delay(unit_delay); } void Y() { dash(); delay(unit_delay); dot(); delay(unit_delay); dash(); delay(unit_delay); dash(); delay(unit_delay); } void Z() { dash(); delay(unit_delay); dash(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); } void one() { dot(); delay(unit_delay); dash(); delay(unit_delay); dash(); delay(unit_delay); dash(); delay(unit_delay); dash(); delay(unit_delay); } void two() { dot(); delay(unit_delay); dot(); delay(unit_delay); dash(); delay(unit_delay); dash(); delay(unit_delay); dash(); delay(unit_delay); } void three() { dot(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); dash(); delay(unit_delay); dash(); delay(unit_delay); } void four() { dot(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); dash(); delay(unit_delay); } void five() { dot(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); } void six() { dash(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); } void seven() { dash(); delay(unit_delay); dash(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); } void eight() { dash(); delay(unit_delay); dash(); delay(unit_delay); dash(); delay(unit_delay); dot(); delay(unit_delay); dot(); delay(unit_delay); } void nine() { dash(); delay(unit_delay); dash(); delay(unit_delay); dash(); delay(unit_delay); dash(); delay(unit_delay); dot(); delay(unit_delay); } void zero() { dash(); delay(unit_delay); dash(); delay(unit_delay); dash(); delay(unit_delay); dash(); delay(unit_delay); dash(); delay(unit_delay); } void morse() { if (ch == 'A' || ch == 'a') { A(); Serial.print(" "); } else if (ch == 'B' || ch == 'b') { B(); Serial.print(" "); } else if (ch == 'C' || ch == 'c') { C(); Serial.print(" "); } else if (ch == 'D' || ch == 'd') { D(); Serial.print(" "); } else if (ch == 'E' || ch == 'e') { E(); Serial.print(" "); } else if (ch == 'f' || ch == 'f') { f(); Serial.print(" "); } else if (ch == 'G' || ch == 'g') { G(); Serial.print(" "); } else if (ch == 'H' || ch == 'h') { H(); Serial.print(" "); } else if (ch == 'I' || ch == 'i') { I(); Serial.print(" "); } else if (ch == 'J' || ch == 'j') { J(); Serial.print(" "); } else if (ch == 'K' || ch == 'k') { K(); Serial.print(" "); } else if (ch == 'L' || ch == 'l') { L(); Serial.print(" "); } else if (ch == 'M' || ch == 'm') { M(); Serial.print(" "); } else if (ch == 'N' || ch == 'n') { N(); Serial.print(" "); } else if (ch == 'O' || ch == 'o') { O(); Serial.print(" "); } else if (ch == 'P' || ch == 'p') { P(); Serial.print(" "); } else if (ch == 'Q' || ch == 'q') { Q(); Serial.print(" "); } else if (ch == 'R' || ch == 'r') { R(); Serial.print(" "); } else if (ch == 'S' || ch == 's') { S(); Serial.print(" "); } else if (ch == 'T' || ch == 't') { T(); Serial.print(" "); } else if (ch == 'U' || ch == 'u') { U(); Serial.print(" "); } else if (ch == 'V' || ch == 'v') { V(); Serial.print(" "); } else if (ch == 'W' || ch == 'w') { W(); Serial.print(" "); } else if (ch == 'X' || ch == 'x') { X(); Serial.print(" "); } else if (ch == 'Y' || ch == 'y') { Y(); Serial.print(" "); } else if (ch == 'Z' || ch == 'z') { Z(); Serial.print(" "); } else if (ch == '0') { zero(); Serial.print(" "); } else if (ch == '1') { one(); Serial.print(" "); } else if (ch == '2') { two(); Serial.print(" "); } else if (ch == '3') { three(); Serial.print(" "); } else if (ch == '4') { four(); Serial.print(" "); } else if (ch == '5') { five(); Serial.print(" "); } else if (ch == '6') { six(); Serial.print(" "); } else if (ch == '7') { seven(); Serial.print(" "); } else if (ch == '8') { eight(); Serial.print(" "); } else if (ch == '9') { nine(); Serial.print(" "); } else if(ch == ' ') { delay(unit_delay*7); Serial.print("/ "); } else Serial.println("Unknown symbol!"); } void String2Morse() { len = code.length(); for (int i = 0; i < len; i++) { ch = code.charAt(i); morse(); } } void setup() { Serial.begin(9600); pinMode(led, OUTPUT); pinMode(buz, OUTPUT); Serial.println("I am ready..."); } void loop() { while (Serial.available()) { code = Serial.readString(); Serial.print(code); Serial.print(" = "); String2Morse(); Serial.println(""); } delay(1000); }

ساخت یک دریافت کننده (دیکدر) کد مورس با آردوینو

درحالت دیگر شما یک دریافت کننده کد مورس هستید و باید کد دریافتی را به متن تبدیل کنید.

برای شبیه سازی این موضوع کد مورس خود را با استفاده از کلید فشاری به آردینو بفرستید و نتیجه آنرا بصورت متن در Serial monitor مشاهده کنید.

سیم بندی

کد

/* 

  Morse code - Receiver
 
  modified on 14 Apr 2019 

  by Saeed Hosseini @ Electropeak 

  
Home
*/ String code = ""; int len = 0; char ch; char new_char; const int but = 2; const int led = 13; unsigned long pres_len = 0, rel_time, pres_time = 0, old_time_len = 0, old_pres = 0, space = 0; int state = 0; int unit_delay = 250; int min_delay = 10; char MakeString() { if (pres_len < (unit_delay*3) && pres_len > 50) { return '.'; //if button press less than 0.6sec, it is a dot } else if (pres_len > (unit_delay*3)) { return '-'; //if button press more than 0.6sec, it is a dash } } void Morse_decod() { static String morse[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "!" }; int i = 0; while (morse[i] != "!") { if (morse[i] == code) { Serial.print(char('A' + i)); Serial.print(" "); break; } i++; } if (morse[i] == "!") { Serial.println(""); Serial.println("This code is not exist!"); } code = ""; } void setup() { Serial.begin(9600); pinMode(but, INPUT_PULLUP); pinMode(led, OUTPUT); } void loop() { label: while (digitalRead(but) == HIGH) {} old_pres = rel_time; pres_time = millis(); digitalWrite(led, HIGH); while (digitalRead(but) == LOW) {} rel_time = millis(); digitalWrite(led, LOW); pres_len = rel_time - pres_time; space = pres_time - old_pres; if (pres_len > min_delay) { code += MakeString(); } while ((millis() - rel_time) < (unit_delay * 3)) { if (digitalRead(but) == LOW) { goto label; } } Morse_decod(); }

یک گام جلوتر

  • سعی کنید با استفاده از بلوتوث، NRF24L01 و … یک فرستنده و گیرنده کد مورس بیسیم بسازید.

از این مطلب خوشتان آمد؟

آخرین مطالت و آموزش ها را در ایمیلتان دریافت کنید:

مطالب بیشتر

Comments (2)

  • arash Reply

    سلام
    مدار را ساختم و کار کرد
    اما فقط جای نقطه ها حرف مینویسد
    برای گذاشتن خط فاصله میکروسوییچ را چگونه فشار دهیم؟؟؟
    من فکر کردم خط تیره ینی صبر کردن و دوباره میکروسوییچ را فشردن
    اما تا کلید را میفشارم برنامه اجازه صبر نمیده و به عنوان مثال با یکبار فشردن حرف e را در مانیتور سریال مینویسد
    لطفا راهنمایی کنید

    ژوئن 18, 2021 at 8:27 ب.ظ
    • مهران ملکی Reply

      سلام دوست عزیز.
      برای گذاشتن نقطه باید میکروسوییچ رو برای کمتر از 0.6 ثانیه فشار بدید و برای گذاشتن خط تیره بیشتر از 0.6 ثانیه و کمتر از 2 ثانیه لازمه که میکروسوییچ رو فشرده نگه دارید. یعنی گذاشتن خط تیره به معنی صبر کردن و دوباره فشردن میکروسوییچ نیست.

      ژوئن 19, 2021 at 9:35 ق.ظ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.