0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用Arduino創(chuàng)建摩爾斯電碼生成器

h1654155275.5753 ? 來源:DevicePlus ? 作者:DevicePlus ? 2023-02-22 17:56 ? 次閱讀
這篇文章來源于DevicePlus英語網(wǎng)站的翻譯稿。

如果您對秘密信息感興趣,那么對您來說摩爾斯電碼將會是一種有趣的交流方式。然而,摩爾斯電碼的特性使其非常適合于通過Arduino來編寫和生成消息。在本指南中,我們將向您展示如何創(chuàng)建一種可以將您輸入的文本自動轉(zhuǎn)換為可聽的摩爾斯電碼信息的設(shè)備。

摩爾斯電碼工作原理

摩爾斯電碼發(fā)明于19世紀,使用非常簡單的長短脈沖序列(通常為電和劃)來遠距離發(fā)送消息。通過將字母表中的字母編碼為電和劃的組合,信息可以只用一個單一的電子或聲音信號來表達。

為了說明這是如何工作的,我們將使用一個簡單的蜂鳴器將文本轉(zhuǎn)換為可聽的摩爾斯電碼信號。通過使用Arduino IDE中的串行監(jiān)視器,您在計算機上輸入的信息可以被轉(zhuǎn)換為摩爾斯電碼音調(diào)。值得注意的是,只需要進行少量修改,同樣的方法就可以用于通過LED傳達信息,因為這兩種設(shè)備都可以被快速打開和關(guān)閉。

pYYBAGPy0siAa5sWAABFlkabDd4922.png

所需組件

在硬件方面,您不需要太多組件來完成該項目工作。但是,如果您是編碼新手,那么您可能會希望能夠分塊進行該項目。這不是很復雜的代碼,但是您需要了解數(shù)組switch cases 語句的工作原理。請記住要點,然后進行接下來的工作。

您需要的物理組件如下所示:

Arduino Uno pYYBAGPy0keAIANsAAA5UDjpMbU093.png
一個面包板 poYBAGPy0s6AH3oPAAJn2wRt1iQ433.png
Arduino IDE pYYBAGPy0k2AN7DzAAAw7VCpJJQ071.png
一個蜂鳴器 pYYBAGPy0tOAOAouAAIPN29Dhxw221.png

您還需要一些標準電線。

大多數(shù)入門電子套件都帶有我們上面列出的所有部件,所以如果您有一個套件,請在開始這個項目前查看是否具有這些組件。

接線

這個項目的接線十分簡單。本項目中所具有的功能大部分都通過代碼來實現(xiàn),所以我們不用將接線考慮在內(nèi)。在接線部分,請將蜂鳴器的電源線連接到引腳8,然后將蜂鳴器的地線連接到GND。

這樣就完成了!這很簡單?,F(xiàn)在,讓我們繼續(xù)進行代碼部分。

代碼

這個項目的代碼可能比您以往看到的要長,主要是因為需要對摩爾斯電碼脈沖進行編碼。不過不要太擔心。一旦您把它分解開來,就會發(fā)現(xiàn)各部分都是很基礎(chǔ)的代碼。首先,以下是您可以直接上傳到Arduino的完整代碼。

int buzzer = 8; // Assign buzzer to pin 8
int note = 1000; // Set the pitch for the buzzer tone

int timeUnit = 100; // This variable will be used to measure dots, dashes, breaks, and pauses
char input; // Variable to save the input to

void setup () {
Serial.begin(9600);//for the connect with the boared
}

void loop () {
if (Serial.available()) {
input = Serial.read();//read the input
if (input == ‘a(chǎn)’ || input == ‘A’) {lA();}//if the input is a or A go to function lA
if (input == ‘b’ || input == ‘B’) {lB();}//same but with b letter
if (input == ‘c’ || input == ‘C’) {lC();}
if (input == ‘d’ || input == ‘D’) {lD();}
if (input == ‘e’ || input == ‘E’) {lE();}
if (input == ‘f’ || input == ‘F’) {lF();}
if (input == ‘g’ || input == ‘G’) {lG();}
if (input == ‘h’ || input == ‘H’) {lH();}
if (input == ‘i’ || input == ‘I’) {lI();}
if (input == ‘j’ || input == ‘J’) {lJ();}
if (input == ‘k’ || input == ‘K’) {lK();}
if (input == ‘l’ || input == ‘L’) {lL();}
if (input == ‘m’ || input == ‘M’) {lM();}
if (input == ‘n’ || input == ‘N’) {lN();}
if (input == ‘o’ || input == ‘O’) {lO();}
if (input == ‘p’ || input == ‘P’) {lP();}
if (input == ‘q’ || input == ‘Q’) {lQ();}
if (input == ‘r’ || input == ‘R’) {lR();}
if (input == ‘s’ || input == ‘S’) {lS();}
if (input == ‘t’ || input == ‘T’) {lT();}
if (input == ‘u’ || input == ‘U’) {lU();}
if (input == ‘v’ || input == ‘V’) {lV();}
if (input == ‘w’ || input == ‘W’) {lW();}
if (input == ‘x’ || input == ‘X’) {lX();}
if (input == ‘y’ || input == ‘Y’) {lY();}
if (input == ‘z’ || input == ‘Z’) {lZ();}
if (input == ‘ ‘) {wordPause();}
Serial.println (input);

}
}
//Letter functions
void lA () {dot();dash();letterPause();}//letter A in morse code!
void lB () {dash();dot();dot();dot();letterPause();}//same for B
void lC () {dash();dot();dash();dot();letterPause();}
void lD () {dash();dot();dot();letterPause();}
void lE () {dot();letterPause();}
void lF () {dot();dot();dash();dot();letterPause();}
void lG () {dash();dash();dot();letterPause();}
void lH () {dot();dot();dot();dot();letterPause();}
void lI () {dot();dot();letterPause();}
void lJ () {dot();dash();dash();dash();letterPause();}
void lK () {dash();dot();dash();letterPause();}
void lL () {dot();dash();dot();dot();letterPause();}
void lM () {dash();dash();letterPause();}
void lN () {dash();dot();letterPause();}
void lO () {dash();dash();dash();letterPause();}
void lP () {dot();dash();dash();dot();letterPause();}
void lQ () {dash();dash();dot();dash();letterPause();}
void lR () {dot();dash();dot();letterPause();}
void lS () {dot();dot();dot();letterPause();}
void lT () {dash();letterPause();}
void lU () {dot();dot();dash();letterPause();}
void lV () {dot();dot();dot();dash();letterPause();}
void lW () {dot();dash();dash();letterPause();}
void lX () {dash();dot();dot();dash();letterPause();}
void lY () {dash();dot();dash();dash();letterPause();}
void lZ () {dash();dash();dot();dot();letterPause();}

void dot() //Emit sound for 100 milliseconds
{
tone(buzzer, note, timeUnit);
delay(timeUnit * 2);
}

void dash() //Emit sound for 300 milliseconds
{
tone(buzzer, note, timeUnit * 3);
delay(timeUnit * 4);
}

void letterPause() //Delay between letters for 300 milliseconds
{
delay(timeUnit * 3);
}

void wordPause()
{
delay (timeUnit * 7);
}

現(xiàn)在,我們來了解一下這段代碼的重要部分,從一些基本設(shè)置開始。

int buzzer = 8; // Assign buzzer to pin 8
int note = 1000; // Set the pitch for the buzzer tone

int timeUnit = 100; // This variable will be used to measure dots, dashes, breaks, and pauses
char input; // Variable to save the input to

void setup () {
Serial.begin(9600);//for the connect with the boared
}

在這一部分中,我們將初始化引腳8上的蜂鳴器,并確定蜂鳴器發(fā)出的音調(diào)所對應的音符變量。接下來,我們給代表持續(xù)時間的變量timeUnit賦值100毫秒,這將用于確定所有信息的持續(xù)時間。例如,一個點是一個時間單位,而一個劃是三個時間單位。我們還將使用它來設(shè)置一個字母中符號之間的時間間隔(一個單位)、兩個字母之間的時間間隔(三個單位)和兩個單詞之間的時間間隔(七個單位)。

在setup()部分,我們還將初始化串行監(jiān)視器,這樣的話您就可以輸入要發(fā)送到Arduino的信息了。這要求您的項目需要通過USB保持與計算機之間的連接。

void loop () {
if (Serial.available()) {
input = Serial.read();//read the input
if (input == ‘a(chǎn)’ || input == ‘A’) {lA();}//if the input is a or A go to function lA
if (input == ‘b’ || input == ‘B’) {lB();}//same but with b letter
if (input == ‘c’ || input == ‘C’) {lC();}
if (input == ‘d’ || input == ‘D’) {lD();}
if (input == ‘e’ || input == ‘E’) {lE();}
if (input == ‘f’ || input == ‘F’) {lF();}
if (input == ‘g’ || input == ‘G’) {lG();}
if (input == ‘h’ || input == ‘H’) {lH();}
if (input == ‘i’ || input == ‘I’) {lI();}
if (input == ‘j’ || input == ‘J’) {lJ();}
if (input == ‘k’ || input == ‘K’) {lK();}
if (input == ‘l’ || input == ‘L’) {lL();}
if (input == ‘m’ || input == ‘M’) {lM();}
if (input == ‘n’ || input == ‘N’) {lN();}
if (input == ‘o’ || input == ‘O’) {lO();}
if (input == ‘p’ || input == ‘P’) {lP();}
if (input == ‘q’ || input == ‘Q’) {lQ();}
if (input == ‘r’ || input == ‘R’) {lR();}
if (input == ‘s’ || input == ‘S’) {lS();}
if (input == ‘t’ || input == ‘T’) {lT();}
if (input == ‘u’ || input == ‘U’) {lU();}
if (input == ‘v’ || input == ‘V’) {lV();}
if (input == ‘w’ || input == ‘W’) {lW();}
if (input == ‘x’ || input == ‘X’) {lX();}
if (input == ‘y’ || input == ‘Y’) {lY();}
if (input == ‘z’ || input == ‘Z’) {lZ();}
if (input == ‘ ‘) {wordPause();}//the space
Serial.println (input);//print the latter saved in the input var

}
}

在這部分代碼中,我們將依次讀取進入串行監(jiān)視器的字母,并立即運行下面相應的函數(shù)。每行用來確定輸入字母的大小寫版本(摩爾斯電碼中沒有大小寫區(qū)分),或者行中是否有空格。根據(jù)收到的字母信息,代碼將調(diào)用對應該字母的函數(shù)。

//Letter functions
void lA () {dot();dash();letterPause();}//letter A in morse code!
void lB () {dash();dot();dot();dot();letterPause();}//same for B
void lC () {dash();dot();dash();dot();letterPause();}
void lD () {dash();dot();dot();letterPause();}
void lE () {dot();letterPause();}
void lF () {dot();dot();dash();dot();letterPause();}
void lG () {dash();dash();dot();letterPause();}
void lH () {dot();dot();dot();dot();letterPause();}
void lI () {dot();dot();letterPause();}
void lJ () {dot();dash();dash();dash();letterPause();}
void lK () {dash();dot();dash();letterPause();}
void lL () {dot();dash();dot();dot();letterPause();}
void lM () {dash();dash();letterPause();}
void lN () {dash();dot();letterPause();}
void lO () {dash();dash();dash();letterPause();}
void lP () {dot();dash();dash();dot();letterPause();}
void lQ () {dash();dash();dot();dash();letterPause();}
void lR () {dot();dash();dot();letterPause();}
void lS () {dot();dot();dot();letterPause();}
void lT () {dash();letterPause();}
void lU () {dot();dot();dash();letterPause();}
void lV () {dot();dot();dot();dash();letterPause();}
void lW () {dot();dash();dash();letterPause();}
void lX () {dash();dot();dot();dash();letterPause();}
void lY () {dash();dot();dash();dash();letterPause();}
void lZ () {dash();dash();dot();dot();letterPause();}

在main loop()之外的部分,我們將為每個字母定義函數(shù)。在這一部分中,我們需要根據(jù)國際摩爾斯電碼標準為每個字母添加模板。為簡單起見,我們將使用dot()、dash()和letterPause()函數(shù)來創(chuàng)建模板,并在稍后定義這些函數(shù)的作用。每個命令用分號分隔開即可,但是為了使代碼更清楚,我們將每個函數(shù)單獨放到一行中。

void dot() //Emit sound for 100 milliseconds
{
tone(buzzer, note, timeUnit);
delay(timeUnit * 2);
}

void dash() //Emit sound for 300 milliseconds
{
tone(buzzer, note, timeUnit * 3);
delay(timeUnit * 4);
}

void letterPause() //Delay between letters for 300 milliseconds
{
delay(timeUnit * 3);
}

void wordPause()
{
delay (timeUnit * 7);
}

接下來,我們將定義在上一部分中使用的函數(shù)。首先,dot()用于播放我們在最上面代碼中所指定的聲音一個時間單位。雖然tone()命令可以播放一個時間單位的聲音,但是如果過早在此調(diào)用該函數(shù),可能會發(fā)生搶占,因此我們將添加一個delay()命令,以防止草圖在兩個時間單位內(nèi)移動到下一行代碼。為什么是兩個時間單位?因為如此一來,tone()可以在第一個時間單位完成命令的運行,然后將第二個時間單位作為元素之間的暫停。

例如,對于由一個點組成的字母“E”,您應該聽到100毫秒的蜂鳴聲,然后靜音100毫秒。對于由三個點組成的字母“S”,您會聽到蜂鳴,靜音,蜂鳴,靜音,蜂鳴,靜音,每個持續(xù)100毫秒。

我們在dash()命令中做了類似的工作,但這次我們將播放三個時間單位(300毫秒)的聲音,然后暫停運行四個時間單位。三個單位讓聲音完成播放,第四個時間單位用于元素之間的暫停。

我們還將定義letterPause() 和wordPause()函數(shù)。前者完全由三個時間單位延遲組成,它用于在消息的每個字母之間設(shè)置300毫秒靜音,讓您可以將不同的字母區(qū)分開來。后者是最長的延遲時間,七個時間單位,或者700毫秒。這將在監(jiān)視器讀取到一個空格時運行,表明一個新單詞的開始。

當您的草圖上傳完成并且開始運行Arduino,請在您的IDE的工具部分打開串行監(jiān)視器。輸入一些單詞并按下回車鍵,您應該會聽到蜂鳴器發(fā)出相應的摩爾斯電碼音調(diào)。如果您想自己調(diào)整草圖,可以嘗試添加描述數(shù)字的函數(shù)。

pYYBAGPbhjqAbi1JAAAGd6_rQT0867.png
DevicePlus 編輯團隊

設(shè)備升級版適用于所有熱愛電子和機電一體化的人。

審核編輯黃宇


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 摩爾斯電碼
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    10255
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4791

    瀏覽量

    68694
  • Arduino
    +關(guān)注

    關(guān)注

    188

    文章

    6471

    瀏覽量

    187231
收藏 人收藏

    評論

    相關(guān)推薦

    樹莓派惡作劇:制造摩爾電碼噪音

    Pi Cobbler Kit(見下圖)。這個惡作劇是會發(fā)出噪音,用合適的材料和設(shè)計,讓它聽上去像是某種小嚙齒動物(你懂的)在房間的某個角落瞎搞。這個惡作劇的功能實際上是發(fā)送摩爾電碼信息。所以如果你有
    發(fā)表于 01-27 17:44

    如何利用FPGA設(shè)計摩爾電碼的無線通信發(fā)射模塊?

    本文從基于FPGA平臺的專用芯片設(shè)計技術(shù)入手,分析和設(shè)計了一種摩爾電碼的無線通信發(fā)射模塊設(shè)計方案,并對設(shè)計進行了仿真驗證。
    發(fā)表于 05-06 07:39

    python生成器

    = (i for i in range(5))>>> gen2. 如何創(chuàng)建生成器?使用列表推導式在上面已經(jīng)演示過,正常我們使用列表推導式時是下面這樣子,使用 [] ,此時生成的是列表
    發(fā)表于 02-24 15:56

    摩爾電碼

    摩爾電碼 莫爾電碼(Morse code)是美國人莫爾于1844年發(fā)明的,由點(.)、劃
    發(fā)表于 02-07 16:29 ?7245次閱讀
    <b class='flag-5'>摩爾</b><b class='flag-5'>斯</b><b class='flag-5'>電碼</b>

    什么是摩爾電碼和收發(fā)技術(shù)原理

    什么是摩爾電碼和收發(fā)技術(shù)原理 摩爾電碼(又譯為摩斯電碼
    發(fā)表于 03-29 11:22 ?8568次閱讀

    如何使用Synergy項目生成器創(chuàng)建新的Synergy項目?

    Synergy ISDE 視頻教程-使用Synergy項目生成器創(chuàng)建和構(gòu)建新的Synergy項目
    的頭像 發(fā)表于 07-20 01:25 ?3159次閱讀

    python生成器是什么

    in range(5)) gen at 0x10cae50b0 2. 如何創(chuàng)建生成器? 使用列表推導式 在上面已經(jīng)演示過,正常我們使用列表推導式時是下面這樣子,使用 [] ,
    的頭像 發(fā)表于 02-24 15:53 ?3670次閱讀

    使用Arduino構(gòu)建一個摩爾電碼轉(zhuǎn)換器

    在本教程中,我們將使用 Arduino 構(gòu)建一個摩爾電碼轉(zhuǎn)換器,它將任何字符作為串行監(jiān)視器的輸入,并通過蜂鳴器將其轉(zhuǎn)換為等效的摩爾
    發(fā)表于 08-29 16:46 ?4070次閱讀
    使用<b class='flag-5'>Arduino</b>構(gòu)建一個<b class='flag-5'>摩爾</b><b class='flag-5'>斯</b><b class='flag-5'>電碼</b>轉(zhuǎn)換器

    摩爾電碼開源分享

    電子發(fā)燒友網(wǎng)站提供《摩爾電碼開源分享.zip》資料免費下載
    發(fā)表于 11-01 10:08 ?8次下載
    <b class='flag-5'>摩爾</b><b class='flag-5'>斯</b><b class='flag-5'>電碼</b>開源分享

    Arduino Lotto隨機數(shù)生成器

    電子發(fā)燒友網(wǎng)站提供《Arduino Lotto隨機數(shù)生成器.zip》資料免費下載
    發(fā)表于 11-02 10:59 ?0次下載
    <b class='flag-5'>Arduino</b> Lotto隨機數(shù)<b class='flag-5'>生成器</b>

    Arduino贊美生成器

    電子發(fā)燒友網(wǎng)站提供《Arduino贊美生成器.zip》資料免費下載
    發(fā)表于 11-09 14:22 ?1次下載
    <b class='flag-5'>Arduino</b>贊美<b class='flag-5'>生成器</b>

    創(chuàng)建摩爾電碼通信的發(fā)射器和接收器

    電子發(fā)燒友網(wǎng)站提供《創(chuàng)建摩爾電碼通信的發(fā)射器和接收器.zip》資料免費下載
    發(fā)表于 12-01 14:22 ?3次下載
    <b class='flag-5'>創(chuàng)建</b><b class='flag-5'>摩爾</b><b class='flag-5'>斯</b><b class='flag-5'>電碼</b>通信的發(fā)射器和接收器

    使用LoRa在兩個Arduino之間發(fā)送摩爾電碼信息

    電子發(fā)燒友網(wǎng)站提供《使用LoRa在兩個Arduino之間發(fā)送摩爾電碼信息.zip》資料免費下載
    發(fā)表于 12-15 10:24 ?0次下載
    使用LoRa在兩個<b class='flag-5'>Arduino</b>之間發(fā)送<b class='flag-5'>摩爾</b><b class='flag-5'>斯</b><b class='flag-5'>電碼</b>信息

    基于Arduino UNO使用摩爾電碼通信

    也無法理解,除非他找到密鑰。為此,我使用了摩爾電碼通信,您也可以使用另一種方式來完成此任務。什么是摩爾
    發(fā)表于 12-20 15:53 ?0次下載

    摩爾電碼發(fā)射器設(shè)計案例

    摩爾電碼發(fā)射器設(shè)計案例
    發(fā)表于 07-07 15:45 ?3次下載
    <b class='flag-5'>摩爾</b><b class='flag-5'>斯</b><b class='flag-5'>電碼</b>發(fā)射器設(shè)計案例