亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

Arduino UNO 莫尔斯电码收发机:激光发射与光敏接收的通信实验

组件与物料清单

组件数量
Arduino UNO2
LED(发射端指示)2
激光二极管模块1
光敏电阻1
压电蜂鸣器1

项目缘起

在讲授通信系统课程时,希望学生通过动手体验理解语言、语法、可靠通信、信号与消息等概念。课堂上我们共同设计了一套视觉通信语言——莫尔斯电码。为避免人工编解码的繁琐,编写了自动编解码程序,并用两块 Arduino 分别构建发射端(激光)与接收端(光敏电阻+蜂鸣器+LED),实现全链路通信演示。

Arduino UNO 莫尔斯电码收发机:激光发射与光敏接收的通信实验

莫尔斯编码表与二叉树解码

编码参照标准莫尔斯电码表;解码采用二叉树结构:左子节点代表点(.),右子节点代表划(-),从根节点按序遍历即可还原字符。

Arduino UNO 莫尔斯电码收发机:激光发射与光敏接收的通信实验
Arduino UNO 莫尔斯电码收发机:激光发射与光敏接收的通信实验

发射端设计

点 = 50ms 亮 + 50ms 暗
划 = 150ms 亮 + 50ms 暗
字符间隔 = 100ms 暗
Arduino UNO 莫尔斯电码收发机:激光发射与光敏接收的通信实验

发射端代码

const char* MorseTable[] = {
  // 索引对应 ASCII 码,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, NULL, // 0-31
  NULL, "-.-.--", ".-..-.", NULL, NULL, NULL, NULL, ".----.", // 32-39 空格 ! " # $ % & '
  "-.--.", "-.--.-", NULL, ".-.-.", "--..--", "-....-", ".-.-.-", "-..-.", // 40-47 ( ) * + , - . /
  "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", // 48-55 0-7
  "---..", "----.", "---...", "-.-.-.", NULL, "-...-", NULL, "..--..", // 56-63 8 9 : ; < = > ?
  ".--.-.", ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", // 64-71 @ A B C D E F G
  "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", // 72-79 H I J K L M N O
  ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", // 80-87 P Q R S T U V W
  "-..-", "-.--", "--..", NULL, NULL, NULL, NULL, "..--.-", // 88-95 X Y Z [ \ ] ^ _
  NULL, ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", // 96-103 ` a b c d e f g
  "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", // 104-111 h i j k l m n o
  ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", // 112-119 p q r s t u v w
  "-..-", "-.--", "--..", NULL, NULL, NULL, NULL, NULL  // 120-127 x y z { | } ~ DEL
};

int dotLength = 50;
int dashLength = dotLength * 3;

void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  if (Serial.available()) {
    char ch = Serial.read();
    flashDashDot(MorseTable[ch]);
    delay(dotLength * 2); // 字符间隔
  }
}

void flashDashDot(const char* code) {
  for (int i = 0; code[i]; i++) {
    if (code[i] == '.') dot();
    else if (code[i] == '-') dash();
  }
}

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 UNO 莫尔斯电码收发机:激光发射与光敏接收的通信实验

接收端代码

// 莫尔斯二叉树,索引 0 为根,左=2n+1(点),右=2n+2(划)
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'
};

int val = 0, ctrHigh = 0, ctrLow = 0, codePtr = 0, dotLen = 400;

void setup() { Serial.begin(9600); }

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 = codePtr*2 + 1; }
    else if (ctrHigh >= dotLen*2) { Serial.print("-"); codePtr = codePtr*2 + 2; }
    else {
      if (ctrLow == dotLen*2) { Serial.print(MorseTree[codePtr]); codePtr = 0; }
    }
    ctrHigh = 0;
    digitalWrite(13, LOW); noTone(9);
  }
}

实测输出

发送 Hello World!,发射端串口输出:

.... . .-.. .-.. --- .-- --- .-. .-.. -.. -.-.--

接收端串口还原:

....H.E.-..L.-..L---O.--W---O.-.R.-..L-..D-.-.--!

原理图文件

制造工艺

  1. 条码扫描器:技术原理、设计演进与未来趋势
  2. 仅用 Arduino 构建 DTMF 解码器 – 无需额外 IC
  3. SERENA:基于 Arduino Mega 2560 与 TFT 触摸屏的多级密码报警系统
  4. 激光模块莫尔斯电码通信——双 Arduino 收发实验
  5. Arduino 驱动 NeoPixel 光剑:凯洛·伦与蕾伊双模型,含炫彩派对模式
  6. 摩斯密码与双重勒索:高级恶意软件威胁的当前图景
  7. Data Matrix码与QR码怎么选:哪个更适合您的业务
  8. CNC G代码精解:程序员必备指南
  9. Fanuc G代码完整参考手册——全指令详解
  10. Fanuc 控制系统 CNC G 代码综合指南:A/B/C 三组代码对照表
  11. 掌握ADC代码错误率:核心要点解析
  12. C++ 注释最佳实践:编写可读、可维护代码的注释艺术