0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Arduino实现的摩尔电码收发器设计方案

科技观察员 来源:hackster.io 作者:hackster.io 2022-04-07 17:49 次阅读

我们做了一些实验,构思从石器时代开始,了解人类交流的需求以及交流过程中语言和语法的含义,还有什么是可靠的交流、信号、消息等。

在讨论这些东西时,我们达到了最终能够定义语言交流的地步,与此同时摩尔斯电码应运而生。

很明显,学习摩尔斯电码对我们每个人来说都是一项乏味的任务,因此我们需要一台机器。所以,我们决定编写可以将给定字符串编码为等效摩尔斯电码的小程序和另一个可以将字符串返回给给定摩尔斯码流的解码器。

为了找到一个字符的摩尔斯电码,我参考了下表——

pYYBAGJOs5uAaOXhAAC0ZOEZXvA349.png

要将摩尔斯电码转换为等效字符,可以将其组织成如下二叉树。每个“点”移动到左子树,“破折号”移动到右子树。

poYBAGJOs5eAMdWWAAEGUmyETuQ549.png

这样的话我就能够快速将字符串编码为相应的摩尔斯电码,反之亦然。

我用 C# 编写了一个程序作为 PoC

poYBAGJOs5SAER5UAAFv7rkkZcw275.png

输出

由于必须在两方之间进行通信,因此我想将此编码的摩尔斯电码传输到另一个设备并在那里对其进行解码。

所以我使用了两个 Arduino 板来构建发射器和接收器

在发射器板上,我连接了Keyes 的激光二极管。对于我工作的距离,3v 输入绰绰有余,如果使用 5v 的电压,至少达到 200m的距离。

pYYBAGJOs5CAZal4AALDHDKLtlE818.png

我的发射器通过串行接口(通过 USB)连接到计算机。它逐个字符地读取串行端口上的任何数据。找到字符的等效摩尔斯电码并生成“点”和“破折号”光流。

我创建了一个 50 ms的脉冲,其中每个“点”是一个 50 ms的光束,一个“破折号”是 150 ms的光束。每个“点”和“破折号”由 50 ms的静音隔开。

发射机代码

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 和蜂鸣器是多余的,只是它们提供音频视频反馈,能够使我们知会到系统正在正常工作。

poYBAGJOs4mAB0B-AASNaRvDJTE549.png

我的接收器还连接到计算机以读取生成的字符串字符。

在设备上的一个循环中,我读取了照射到连接到模拟端口 4 的 LDR 的光,我用了一根长管将其与任何环境光隔离开来。当我的激光二极管发出的光照射到这个 LDR 上时,结果值变高,接着打开扬声器并打开 LED。当它下降时,我打开扬声器并关闭LED。

我正在计算光束的长度以确定它是“点”还是“破折号”。考虑到所有延迟,我的 16MHz Atmel 处理器上的一个脉冲大约需要 400 个周期。

接收设备代码

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Arduino
    +关注

    关注

    186

    文章

    6439

    浏览量

    185440
收藏 人收藏

    评论

    相关推荐

    树莓派恶作剧:制造摩尔电码噪音

    Pi Cobbler Kit(见下图)。这个恶作剧是会发出噪音,用合适的材料和设计,让它听上去像是某种小啮齿动物(你懂的)在房间的某个角落瞎搞。这个恶作剧的功能实际上是发送摩尔电码信息。所以如果你有
    发表于 01-27 17:44

    如何利用FPGA设计摩尔电码的无线通信发射模块?

    本文从基于FPGA平台的专用芯片设计技术入手,分析和设计了一种摩尔电码的无线通信发射模块设计方案,并对设计进行了仿真验证。
    发表于 05-06 07:39

    Arduino用于uSDX收发器的lpf滤波

    描述Arduino 用于 uSDX 收发器的 lpf 滤波
    发表于 06-30 06:42

    摩尔电码

    摩尔电码 莫尔斯电码(Morse code)是美国人莫尔斯于1844年发明的,由点(.)、划(-)两种符号组成。 1、
    发表于 02-07 16:29 6983次阅读
    <b class='flag-5'>摩尔</b>斯<b class='flag-5'>电码</b>

    什么是摩尔电码收发技术原理

    什么是摩尔电码收发技术原理 摩尔电码(又译为摩斯电码)是一种时通时断的信号代码,这种信号
    发表于 03-29 11:22 8322次阅读

    Arduino的uSDX收发器

    电子发烧友网站提供《Arduino的uSDX收发器.zip》资料免费下载
    发表于 07-06 11:19 1次下载
    <b class='flag-5'>Arduino</b>的uSDX<b class='flag-5'>收发器</b>

    Arduino的uSDX收发器开源

    电子发烧友网站提供《Arduino的uSDX收发器开源.zip》资料免费下载
    发表于 08-05 10:57 4次下载
    <b class='flag-5'>Arduino</b>的uSDX<b class='flag-5'>收发器</b>开源

    使用Arduino构建一个摩尔电码转换器

    在本教程中,我们将使用 Arduino 构建一个摩尔电码转换器,它将任何字符作为串行监视器的输入,并通过蜂鸣器将其转换为等效的摩尔电码
    发表于 08-29 16:46 3295次阅读
    使用<b class='flag-5'>Arduino</b>构建一个<b class='flag-5'>摩尔</b>斯<b class='flag-5'>电码</b>转换器

    摩尔电码开源分享

    电子发烧友网站提供《摩尔电码开源分享.zip》资料免费下载
    发表于 11-01 10:08 8次下载
    <b class='flag-5'>摩尔</b>斯<b class='flag-5'>电码</b>开源分享

    使用LoRa在两个Arduino之间发送摩尔电码信息

    电子发烧友网站提供《使用LoRa在两个Arduino之间发送摩尔电码信息.zip》资料免费下载
    发表于 12-15 10:24 0次下载
    使用LoRa在两个<b class='flag-5'>Arduino</b>之间发送<b class='flag-5'>摩尔</b>斯<b class='flag-5'>电码</b>信息

    基于Arduino UNO使用摩尔电码通信

    消息,他也无法理解,除非他找到密钥。为此,我使用了摩尔电码通信,您也可以使用另一种方式来完成此任务。什么是摩尔电码?莫尔斯电码是一种传递
    发表于 12-20 15:53 0次下载

    激光寻呼机/莫尔斯电码收发器开源

    电子发烧友网站提供《激光寻呼机/莫尔斯电码收发器开源.zip》资料免费下载
    发表于 01-31 14:24 0次下载
    激光寻呼机/莫尔斯<b class='flag-5'>电码</b><b class='flag-5'>收发器</b>开源

    摩尔电码SOS闪光器开源

    电子发烧友网站提供《摩尔电码SOS闪光器开源.zip》资料免费下载
    发表于 02-01 09:22 0次下载
    <b class='flag-5'>摩尔</b>斯<b class='flag-5'>电码</b>SOS闪光器开源

    如何使用Arduino创建摩尔电码生成器

    如果您对秘密信息感兴趣,那么对您来说摩尔电码将会是一种有趣的交流方式。然而,摩尔电码的特性使其非常适合于通过Arduino来编写和生成消
    的头像 发表于 02-22 17:56 1362次阅读
    如何使用<b class='flag-5'>Arduino</b>创建<b class='flag-5'>摩尔</b>斯<b class='flag-5'>电码</b>生成器

    摩尔电码发射器设计案例

    摩尔电码发射器设计案例
    发表于 07-07 15:45 1次下载
    <b class='flag-5'>摩尔</b>斯<b class='flag-5'>电码</b>发射器设计案例