如果您對秘密信息感興趣,那么對您來說摩爾斯電碼將會是一種有趣的交流方式。然而,摩爾斯電碼的特性使其非常適合于通過Arduino來編寫和生成消息。在本指南中,我們將向您展示如何創(chuàng)建一種可以將您輸入的文本自動轉(zhuǎn)換為可聽的摩爾斯電碼信息的設(shè)備。
摩爾斯電碼工作原理
摩爾斯電碼發(fā)明于19世紀,使用非常簡單的長短脈沖序列(通常為電和劃)來遠距離發(fā)送消息。通過將字母表中的字母編碼為電和劃的組合,信息可以只用一個單一的電子或聲音信號來表達。
為了說明這是如何工作的,我們將使用一個簡單的蜂鳴器將文本轉(zhuǎn)換為可聽的摩爾斯電碼信號。通過使用Arduino IDE中的串行監(jiān)視器,您在計算機上輸入的信息可以被轉(zhuǎn)換為摩爾斯電碼音調(diào)。值得注意的是,只需要進行少量修改,同樣的方法就可以用于通過LED傳達信息,因為這兩種設(shè)備都可以被快速打開和關(guān)閉。
所需組件
在硬件方面,您不需要太多組件來完成該項目工作。但是,如果您是編碼新手,那么您可能會希望能夠分塊進行該項目。這不是很復雜的代碼,但是您需要了解數(shù)組 和 switch cases 語句的工作原理。請記住要點,然后進行接下來的工作。
您需要的物理組件如下所示:
Arduino Uno | |
一個面包板 | |
Arduino IDE | |
一個蜂鳴器 |
您還需要一些標準電線。
大多數(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ù)。
DevicePlus 編輯團隊
設(shè)備升級版適用于所有熱愛電子和機電一體化的人。
審核編輯黃宇
評論