Arduino UNO 莫尔斯电码收发机:激光发射与光敏接收的通信实验
组件与物料清单
| 组件 | 数量 |
|---|---|
| Arduino UNO | 2 |
| LED(发射端指示) | 2 |
| 激光二极管模块 | 1 |
| 光敏电阻 | 1 |
| 压电蜂鸣器 | 1 |
项目缘起
在讲授通信系统课程时,希望学生通过动手体验理解语言、语法、可靠通信、信号与消息等概念。课堂上我们共同设计了一套视觉通信语言——莫尔斯电码。为避免人工编解码的繁琐,编写了自动编解码程序,并用两块 Arduino 分别构建发射端(激光)与接收端(光敏电阻+蜂鸣器+LED),实现全链路通信演示。

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


发射端设计
- 激光二极管模块(Keyes)接在 D13,3.3V 即可驱动,5V 可达 200m 以上。
- 通过 USB 串口接收字符,查表获取莫尔斯编码,按时序闪烁激光:
点 = 50ms 亮 + 50ms 暗
划 = 150ms 亮 + 50ms 暗
字符间隔 = 100ms 暗

发射端代码
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);
}
接收端设计
- 光敏电阻接 A4,用长管遮光防干扰。
- 读取模拟值,高于阈值判定为光信号,统计高电平持续循环次数区分点/划(约 400 循环/点)。
- 同步构建二叉树索引
codePtr,间隔 2 个点时长无光信号则输出对应字符并重置指针。 - 同步驱动 D13 LED 与 D9 蜂鸣器指示接收状态。

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