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

我们做了一些实验,构思从石器时代开始,了解人类交流的需求以及交流过程中语言和语法的含义,还有什么是可靠的交流、信号、消息等。
在讨论这些东西时,我们达到了最终能够定义语言交流的地步,与此同时摩尔斯电码应运而生。
很明显,学习摩尔斯电码对我们每个人来说都是一项乏味的任务,因此我们需要一台机器。所以,我们决定编写可以将给定字符串编码为等效摩尔斯电码的小程序和另一个可以将字符串返回给给定摩尔斯码流的解码器。
为了找到一个字符的摩尔斯电码,我参考了下表——
要将摩尔斯电码转换为等效字符,可以将其组织成如下二叉树。每个“点”移动到左子树,“破折号”移动到右子树。
这样的话我就能够快速将字符串编码为相应的摩尔斯电码,反之亦然。
我用 c# 编写了一个程序作为 poc
输出
由于必须在两方之间进行通信,因此我想将此编码的摩尔斯电码传输到另一个设备并在那里对其进行解码。
所以我使用了两个 arduino 板来构建发射器和接收器。
在发射器板上,我连接了keyes 的激光二极管。对于我工作的距离,3v 输入绰绰有余,如果使用 5v 的电压,至少达到 200m的距离。
我的发射器通过串行接口(通过 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 和蜂鸣器是多余的,只是它们提供音频和视频反馈,能够使我们知会到系统正在正常工作。
我的接收器还连接到计算机以读取生成的字符串字符。
在设备上的一个循环中,我读取了照射到连接到模拟端口 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) + 2;
    } else {
      if(ctrlow == dotlen*2){
        serial.print(morsetree[codeptr]);
        codeptr = 0;
      }
    }
    ctrhigh = 0;
    digitalwrite(13, low);
    notone(9);
  }
}

如何制作自定义控制器
汽车音频电源设计
花重金砸出来的P8,绝对不是一款简简单单的产品
激光焊接技术在焊接0.7mm紫铜的工艺
美国与巴西就出资购买5G设备方面进行接洽
基于Arduino实现的摩尔电码收发器设计方案
MOSFET需求激增,全球龙头企业产能预订一空
双向电平转换工作原理 自动双向电平转换芯片介绍
特殊应用模拟开关的优点以及应用分析
高通骁龙888处理器亮点特性全面解析
音圈马达无人机助力宣传反诈知识
机智云受邀出席第五届照明湘军交流会
国芯科技宣布与京东阿里合作,助力打造自己的中国芯片
小米2016年度最佳百元机红米4 骁龙625+4100mAh
电源变压器原理
百度与长沙合作,计划将长沙打造为自动驾驶之城
滤波器详细讲解
校准仪中精密合成电阻的设计
华为悄悄成立一家创投公司并且日入20亿
oppor11什么时候上市?oppor11最新消息:大手笔邀热巴等巨星代言,oppor11下月发布仅售2999元