我們做了一些實驗,構思從石器時代開始,了解人類交流的需求以及交流過程中語言和語法的含義,還有什么是可靠的交流、信號、消息等。
在討論這些東西時,我們達到了最終能夠定義語言交流的地步,與此同時摩爾斯電碼應運而生。
很明顯,學習摩爾斯電碼對我們每個人來說都是一項乏味的任務,因此我們需要一臺機器。所以,我們決定編寫可以將給定字符串編碼為等效摩爾斯電碼的小程序和另一個可以將字符串返回給給定摩爾斯碼流的解碼器。
為了找到一個字符的摩爾斯電碼,我參考了下表——
要將摩爾斯電碼轉換為等效字符,可以將其組織成如下二叉樹。每個“點”移動到左子樹,“破折號”移動到右子樹。
這樣的話我就能夠快速將字符串編碼為相應的摩爾斯電碼,反之亦然。
我用 C# 編寫了一個程序作為 PoC
輸出
由于必須在兩方之間進行通信,因此我想將此編碼的摩爾斯電碼傳輸到另一個設備并在那里對其進行解碼。
在發射器板上,我連接了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) + 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
+關注
關注
188文章
6472瀏覽量
187320
發布評論請先 登錄
相關推薦
評論