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

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

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

基于Arduino實(shí)現(xiàn)的摩爾電碼收發(fā)器設(shè)計(jì)方案

科技觀察員 ? 來源:hackster.io ? 作者:hackster.io ? 2022-04-07 17:49 ? 次閱讀

我們做了一些實(shí)驗(yàn),構(gòu)思從石器時(shí)代開始,了解人類交流的需求以及交流過程中語言和語法的含義,還有什么是可靠的交流、信號(hào)、消息等。

在討論這些東西時(shí),我們達(dá)到了最終能夠定義語言交流的地步,與此同時(shí)摩爾斯電碼應(yīng)運(yùn)而生。

很明顯,學(xué)習(xí)摩爾斯電碼對(duì)我們每個(gè)人來說都是一項(xiàng)乏味的任務(wù),因此我們需要一臺(tái)機(jī)器。所以,我們決定編寫可以將給定字符串編碼為等效摩爾斯電碼的小程序和另一個(gè)可以將字符串返回給給定摩爾斯碼流的解碼器。

為了找到一個(gè)字符的摩爾斯電碼,我參考了下表——

pYYBAGJOs5uAaOXhAAC0ZOEZXvA349.png

要將摩爾斯電碼轉(zhuǎn)換為等效字符,可以將其組織成如下二叉樹。每個(gè)“點(diǎn)”移動(dòng)到左子樹,“破折號(hào)”移動(dòng)到右子樹。

poYBAGJOs5eAMdWWAAEGUmyETuQ549.png

這樣的話我就能夠快速將字符串編碼為相應(yīng)的摩爾斯電碼,反之亦然。

我用 C# 編寫了一個(gè)程序作為 PoC

poYBAGJOs5SAER5UAAFv7rkkZcw275.png

輸出

由于必須在兩方之間進(jìn)行通信,因此我想將此編碼的摩爾斯電碼傳輸?shù)搅硪粋€(gè)設(shè)備并在那里對(duì)其進(jìn)行解碼。

所以我使用了兩個(gè) Arduino 板來構(gòu)建發(fā)射器和接收器。

在發(fā)射器板上,我連接了Keyes 的激光二極管。對(duì)于我工作的距離,3v 輸入綽綽有余,如果使用 5v 的電壓,至少達(dá)到 200m的距離。

pYYBAGJOs5CAZal4AALDHDKLtlE818.png

我的發(fā)射器通過串行接口(通過 USB)連接到計(jì)算機(jī)。它逐個(gè)字符地讀取串行端口上的任何數(shù)據(jù)。找到字符的等效摩爾斯電碼并生成“點(diǎn)”和“破折號(hào)”光流。

我創(chuàng)建了一個(gè) 50 ms的脈沖,其中每個(gè)“點(diǎn)”是一個(gè) 50 ms的光束,一個(gè)“破折號(hào)”是 150 ms的光束。每個(gè)“點(diǎn)”和“破折號(hào)”由 50 ms的靜音隔開。

發(fā)射機(jī)代碼

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);
}

在接收器 Arduino 板上,我連接了LDR 、壓電蜂鳴器和LED 。LED 和蜂鳴器是多余的,只是它們提供音頻視頻反饋,能夠使我們知會(huì)到系統(tǒng)正在正常工作。

poYBAGJOs4mAB0B-AASNaRvDJTE549.png

我的接收器還連接到計(jì)算機(jī)以讀取生成的字符串字符。

在設(shè)備上的一個(gè)循環(huán)中,我讀取了照射到連接到模擬端口 4 的 LDR 的光,我用了一根長管將其與任何環(huán)境光隔離開來。當(dāng)我的激光二極管發(fā)出的光照射到這個(gè) LDR 上時(shí),結(jié)果值變高,接著打開揚(yáng)聲器并打開 LED。當(dāng)它下降時(shí),我打開揚(yáng)聲器并關(guān)閉LED。

我正在計(jì)算光束的長度以確定它是“點(diǎn)”還是“破折號(hào)”??紤]到所有延遲,我的 16MHz Atmel 處理器上的一個(gè)脈沖大約需要 400 個(gè)周期。

接收設(shè)備代碼

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);
}
}

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

    關(guān)注

    187

    文章

    6453

    瀏覽量

    185927
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    樹莓派惡作?。褐圃?b class='flag-5'>摩爾斯電碼噪音

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

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

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

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

    什么是摩爾電碼收發(fā)技術(shù)原理 摩爾電碼(又譯為摩斯電碼)是一種時(shí)通時(shí)斷的信號(hào)代碼,這種信號(hào)
    發(fā)表于 03-29 11:22 ?8426次閱讀

    Arduino用于uSDX收發(fā)器的lpf濾波

    電子發(fā)燒友網(wǎng)站提供《Arduino用于uSDX收發(fā)器的lpf濾波.zip》資料免費(fèi)下載
    發(fā)表于 07-06 11:20 ?0次下載
    <b class='flag-5'>Arduino</b>用于uSDX<b class='flag-5'>收發(fā)器</b>的lpf濾波<b class='flag-5'>器</b>

    Arduino的uSDX收發(fā)器

    電子發(fā)燒友網(wǎng)站提供《Arduino的uSDX收發(fā)器.zip》資料免費(fèi)下載
    發(fā)表于 07-06 11:19 ?1次下載
    <b class='flag-5'>Arduino</b>的uSDX<b class='flag-5'>收發(fā)器</b>

    Arduino的uSDX收發(fā)器開源

    電子發(fā)燒友網(wǎng)站提供《Arduino的uSDX收發(fā)器開源.zip》資料免費(fèi)下載
    發(fā)表于 08-05 10:57 ?4次下載
    <b class='flag-5'>Arduino</b>的uSDX<b class='flag-5'>收發(fā)器</b>開源

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

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

    摩爾電碼開源分享

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

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

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

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

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

    激光尋呼機(jī)/莫爾斯電碼收發(fā)器開源

    電子發(fā)燒友網(wǎng)站提供《激光尋呼機(jī)/莫爾斯電碼收發(fā)器開源.zip》資料免費(fèi)下載
    發(fā)表于 01-31 14:24 ?0次下載
    激光尋呼機(jī)/莫爾斯<b class='flag-5'>電碼</b><b class='flag-5'>收發(fā)器</b>開源

    摩爾電碼SOS閃光開源

    電子發(fā)燒友網(wǎng)站提供《摩爾電碼SOS閃光開源.zip》資料免費(fèi)下載
    發(fā)表于 02-01 09:22 ?0次下載
    <b class='flag-5'>摩爾</b>斯<b class='flag-5'>電碼</b>SOS閃光<b class='flag-5'>器</b>開源

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

    如果您對(duì)秘密信息感興趣,那么對(duì)您來說摩爾電碼將會(huì)是一種有趣的交流方式。然而,摩爾電碼的特性使其非常適合于通過Arduino來編寫和生成消
    的頭像 發(fā)表于 02-22 17:56 ?1482次閱讀
    如何使用<b class='flag-5'>Arduino</b>創(chuàng)建<b class='flag-5'>摩爾</b>斯<b class='flag-5'>電碼</b>生成器

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

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

    基于單片射頻收發(fā)器芯片的礦用無線數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì)方案

    電子發(fā)燒友網(wǎng)站提供《基于單片射頻收發(fā)器芯片的礦用無線數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì)方案.pdf》資料免費(fèi)下載
    發(fā)表于 10-25 10:48 ?0次下載
    基于單片射頻<b class='flag-5'>收發(fā)器</b>芯片的礦用無線數(shù)據(jù)傳輸系統(tǒng)<b class='flag-5'>設(shè)計(jì)方案</b>