风筝
发表于: 2019-8-15 21:25:33 | 显示全部楼层

以编码的方式进行通信,除了迷人之外,在各个领域中具有许多应用。最常见的编码通信方法之一是摩尔斯电码。在本篇文章中,您将学习如何使用Arduino开发板制作一台翻译器来发送和接收摩尔斯电码。


什么是摩尔斯电码?

在过去,通信并不像今天那么简单,最常见的通信方式之一是塞缪尔莫尔斯(Samuel Morse)方法,称为“摩尔斯电码”。在此方法中,每个字母或数字通过使用短(点)和长(破折号)元素表示。


与其他语言一样,摩尔斯电码有自己的字母表,目前有美国和国际两种类型,最常用的是国际类型。

morse-table.jpg


摩尔斯电码可以以不同的方式传输:最初是沿电报线的电脉冲,也可以是音频音、无线电信号、灯光、肢体语言、频率等。想象一下点作为时间单位,然后短划线是三个时间单位,一个字母的部分之间的距离是一个时间单位,两个连续字母之间的距离是三个单位的时间,以及单词之间的距离是七个单位的时间。


例如,SOS这个词,请求帮助的全球标准是......  - 摩尔斯电码。


莫尔斯电码仍然实用吗?

虽然莫尔斯代码不再像过去那样使用,但它仍然有自己的应用程序。摩尔斯电码仍然受到业余无线电领域爱好者的欢迎。摩尔斯电码也用于航空导航系统。许多船只使用莫尔斯电码发送灯光进行通信或帮助。此外,那些因任何原因无法说话的人也可以使用莫尔斯电码来表达其含义。


除此之外,学习和使用莫尔斯电码进行交流可以带来乐趣。


所需的材料

●    Arduino UNO R3开发板

●    有源蜂鸣器

●    LED指示灯

●    跳线

●    Arduino IDE

morse-required.jpg


使用Arduino制作摩尔斯电码编码器

记住莫尔斯代码并将文本转换为此代码可能有点困难,所以让我们让编码器将文本转换为莫尔斯代码!


在这里,我们使用Arduino UNO将文本翻译为摩尔斯电码。在Arduino开发板上上传此代码并打开串口监视器窗口。键入您想要的单词或文本,并使用莫尔斯电码的方式接收,然后您可以将其以光和声音的形式发送。


电路

morse_send_circuit.jpg


代码

  1. /*

  2. Morse code - Transmitter

  3. modified on 14 Apr 2019
  4. by Saeed Hosseini @ Electropeak
  5. https://electropeak.com/learn

  6. */

  7. const int led = 13;
  8. const int buz = 8;

  9. String code = "";
  10. int len = 0;
  11. char ch;
  12. char new_char;
  13. int unit_delay = 250;


  14. void dot()
  15. {
  16.   Serial.print(".");
  17.   digitalWrite(led, HIGH);
  18.   digitalWrite(buz, HIGH);
  19.   delay(unit_delay);
  20.   digitalWrite(led, LOW);
  21.   digitalWrite(buz, LOW);
  22.   delay(unit_delay);
  23. }

  24. void dash()
  25. {
  26.   Serial.print("-");
  27.   digitalWrite(led, HIGH);
  28.   digitalWrite(buz, HIGH);
  29.   delay(unit_delay * 3);
  30.   digitalWrite(led, LOW);
  31.   digitalWrite(buz, LOW);
  32.   delay(unit_delay);
  33. }

  34. void A()
  35. {
  36.   dot();
  37.   delay(unit_delay);
  38.   dash();
  39.   delay(unit_delay);
  40. }
  41. void B()
  42. {
  43.   dash();
  44.   delay(unit_delay);
  45.   dot();
  46.   delay(unit_delay);
  47.   dot();
  48.   delay(unit_delay);
  49.   dot();
  50.   delay(unit_delay);
  51. }
  52. void C()
  53. {
  54.   dash();
  55.   delay(unit_delay);
  56.   dot();
  57.   delay(unit_delay);
  58.   dash();
  59.   delay(unit_delay);
  60.   dot();
  61.   delay(unit_delay);
  62. }
  63. void D()
  64. {
  65.   dash();
  66.   delay(unit_delay);
  67.   dot();
  68.   delay(unit_delay);
  69.   dot();
  70.   delay(unit_delay);
  71. }
  72. void E()
  73. {
  74.   dot();
  75.   delay(unit_delay);
  76. }
  77. void f()
  78. {
  79.   dot();
  80.   delay(unit_delay);
  81.   dot();
  82.   delay(unit_delay);
  83.   dash();
  84.   delay(unit_delay);
  85.   dot();
  86.   delay(unit_delay);
  87. }
  88. void G()
  89. {
  90.   dash();
  91.   delay(unit_delay);
  92.   dash();
  93.   delay(unit_delay);
  94.   dot();
  95.   delay(unit_delay);
  96. }
  97. void H()
  98. {
  99.   dot();
  100.   delay(unit_delay);
  101.   dot();
  102.   delay(unit_delay);
  103.   dot();
  104.   delay(unit_delay);
  105.   dot();
  106.   delay(unit_delay);
  107. }
  108. void I()
  109. {
  110.   dot();
  111.   delay(unit_delay);
  112.   dot();
  113.   delay(unit_delay);
  114. }
  115. void J()
  116. {
  117.   dot();
  118.   delay(unit_delay);
  119.   dash();
  120.   delay(unit_delay);
  121.   dash();
  122.   delay(unit_delay);
  123.   dash();
  124.   delay(unit_delay);
  125. }
  126. void K()
  127. {
  128.   dash();
  129.   delay(unit_delay);
  130.   dot();
  131.   delay(unit_delay);
  132.   dash();
  133.   delay(unit_delay);
  134. }
  135. void L()
  136. {
  137.   dot();
  138.   delay(unit_delay);
  139.   dash();
  140.   delay(unit_delay);
  141.   dot();
  142.   delay(unit_delay);
  143.   dot();
  144.   delay(unit_delay);
  145. }
  146. void M()
  147. {
  148.   dash();
  149.   delay(unit_delay);
  150.   dash();
  151.   delay(unit_delay);
  152. }
  153. void N()
  154. {
  155.   dash();
  156.   delay(unit_delay);
  157.   dot();
  158.   delay(unit_delay);
  159. }
  160. void O()
  161. {
  162.   dash();
  163.   delay(unit_delay);
  164.   dash();
  165.   delay(unit_delay);
  166.   dash();
  167.   delay(unit_delay);
  168. }
  169. void P()
  170. {
  171.   dot();
  172.   delay(unit_delay);
  173.   dash();
  174.   delay(unit_delay);
  175.   dash();
  176.   delay(unit_delay);
  177.   dot();
  178. }
  179. void Q()
  180. {
  181.   dash();
  182.   delay(unit_delay);
  183.   dash();
  184.   delay(unit_delay);
  185.   dot();
  186.   delay(unit_delay);
  187.   dash();
  188.   delay(unit_delay);
  189. }
  190. void R()
  191. {
  192.   dot();
  193.   delay(unit_delay);
  194.   dash();
  195.   delay(unit_delay);
  196.   dot();
  197.   delay(unit_delay);
  198. }
  199. void S()
  200. {
  201.   dot();
  202.   delay(unit_delay);
  203.   dot();
  204.   delay(unit_delay);
  205.   dot();
  206.   delay(unit_delay);
  207. }
  208. void T()
  209. {
  210.   dash();
  211.   delay(unit_delay);
  212. }
  213. void U()
  214. {
  215.   dot();
  216.   delay(unit_delay);
  217.   dot();
  218.   delay(unit_delay);
  219.   dash();
  220.   delay(unit_delay);
  221. }
  222. void V()
  223. {
  224.   dot();
  225.   delay(unit_delay);
  226.   dot();
  227.   delay(unit_delay);
  228.   dot();
  229.   delay(unit_delay);
  230.   dash();
  231.   delay(unit_delay);
  232. }
  233. void W()
  234. {
  235.   dot();
  236.   delay(unit_delay);
  237.   dash();
  238.   delay(unit_delay);
  239.   dash();
  240.   delay(unit_delay);
  241. }
  242. void X()
  243. {
  244.   dash();
  245.   delay(unit_delay);
  246.   dot();
  247.   delay(unit_delay);
  248.   dot();
  249.   delay(unit_delay);
  250.   dash();
  251.   delay(unit_delay);
  252. }
  253. void Y()
  254. {
  255.   dash();
  256.   delay(unit_delay);
  257.   dot();
  258.   delay(unit_delay);
  259.   dash();
  260.   delay(unit_delay);
  261.   dash();
  262.   delay(unit_delay);
  263. }
  264. void Z()
  265. {
  266.   dash();
  267.   delay(unit_delay);
  268.   dash();
  269.   delay(unit_delay);
  270.   dot();
  271.   delay(unit_delay);
  272.   dot();
  273.   delay(unit_delay);
  274. }
  275. void one()
  276. {
  277.   dot();
  278.   delay(unit_delay);
  279.   dash();
  280.   delay(unit_delay);
  281.   dash();
  282.   delay(unit_delay);
  283.   dash();
  284.   delay(unit_delay);
  285.   dash();
  286.   delay(unit_delay);
  287. }
  288. void two()
  289. {
  290.   dot();
  291.   delay(unit_delay);
  292.   dot();
  293.   delay(unit_delay);
  294.   dash();
  295.   delay(unit_delay);
  296.   dash();
  297.   delay(unit_delay);
  298.   dash();
  299.   delay(unit_delay);
  300. }
  301. void three()
  302. {
  303.   dot();
  304.   delay(unit_delay);
  305.   dot();
  306.   delay(unit_delay);
  307.   dot();
  308.   delay(unit_delay);
  309.   dash();
  310.   delay(unit_delay);
  311.   dash();
  312.   delay(unit_delay);
  313. }
  314. void four()
  315. {
  316.   dot();
  317.   delay(unit_delay);
  318.   dot();
  319.   delay(unit_delay);
  320.   dot();
  321.   delay(unit_delay);
  322.   dot();
  323.   delay(unit_delay);
  324.   dash();
  325.   delay(unit_delay);
  326. }
  327. void five()
  328. {
  329.   dot();
  330.   delay(unit_delay);
  331.   dot();
  332.   delay(unit_delay);
  333.   dot();
  334.   delay(unit_delay);
  335.   dot();
  336.   delay(unit_delay);
  337.   dot();
  338.   delay(unit_delay);
  339. }
  340. void six()
  341. {
  342.   dash();
  343.   delay(unit_delay);
  344.   dot();
  345.   delay(unit_delay);
  346.   dot();
  347.   delay(unit_delay);
  348.   dot();
  349.   delay(unit_delay);
  350.   dot();
  351.   delay(unit_delay);
  352. }
  353. void seven()
  354. {
  355.   dash();
  356.   delay(unit_delay);
  357.   dash();
  358.   delay(unit_delay);
  359.   dot();
  360.   delay(unit_delay);
  361.   dot();
  362.   delay(unit_delay);
  363.   dot();
  364.   delay(unit_delay);
  365. }
  366. void eight()
  367. {
  368.   dash();
  369.   delay(unit_delay);
  370.   dash();
  371.   delay(unit_delay);
  372.   dash();
  373.   delay(unit_delay);
  374.   dot();
  375.   delay(unit_delay);
  376.   dot();
  377.   delay(unit_delay);
  378. }
  379. void nine()
  380. {
  381.   dash();
  382.   delay(unit_delay);
  383.   dash();
  384.   delay(unit_delay);
  385.   dash();
  386.   delay(unit_delay);
  387.   dash();
  388.   delay(unit_delay);
  389.   dot();
  390.   delay(unit_delay);
  391. }
  392. void zero()
  393. {
  394.   dash();
  395.   delay(unit_delay);
  396.   dash();
  397.   delay(unit_delay);
  398.   dash();
  399.   delay(unit_delay);
  400.   dash();
  401.   delay(unit_delay);
  402.   dash();
  403.   delay(unit_delay);
  404. }
  405. void morse()
  406. {
  407.   if (ch == 'A' || ch == 'a')
  408.   {
  409.     A();
  410.     Serial.print(" ");
  411.   }
  412.   else if (ch == 'B' || ch == 'b')
  413.   {
  414.     B();
  415.     Serial.print(" ");
  416.   }
  417.   else if (ch == 'C' || ch == 'c')
  418.   {
  419.     C();
  420.     Serial.print(" ");
  421.   }
  422.   else if (ch == 'D' || ch == 'd')
  423.   {
  424.     D();
  425.     Serial.print(" ");
  426.   }
  427.   else if (ch == 'E' || ch == 'e')
  428.   {
  429.     E();
  430.     Serial.print(" ");
  431.   }
  432.   else if (ch == 'f' || ch == 'f')
  433.   {
  434.     f();
  435.     Serial.print(" ");
  436.   }
  437.   else if (ch == 'G' || ch == 'g')
  438.   {
  439.     G();
  440.     Serial.print(" ");
  441.   }
  442.   else if (ch == 'H' || ch == 'h')
  443.   {
  444.     H();
  445.     Serial.print(" ");
  446.   }
  447.   else if (ch == 'I' || ch == 'i')
  448.   {
  449.     I();
  450.     Serial.print(" ");
  451.   }
  452.   else if (ch == 'J' || ch == 'j')
  453.   {
  454.     J();
  455.     Serial.print(" ");
  456.   }
  457.   else if (ch == 'K' || ch == 'k')
  458.   {
  459.     K();
  460.     Serial.print(" ");
  461.   }
  462.   else if (ch == 'L' || ch == 'l')
  463.   {
  464.     L();
  465.     Serial.print(" ");
  466.   }
  467.   else if (ch == 'M' || ch == 'm')
  468.   {
  469.     M();
  470.     Serial.print(" ");
  471.   }
  472.   else if (ch == 'N' || ch == 'n')
  473.   {
  474.     N();
  475.     Serial.print(" ");
  476.   }
  477.   else if (ch == 'O' || ch == 'o')
  478.   {
  479.     O();
  480.     Serial.print(" ");
  481.   }
  482.   else if (ch == 'P' || ch == 'p')
  483.   {
  484.     P();
  485.     Serial.print(" ");
  486.   }
  487.   else if (ch == 'Q' || ch == 'q')
  488.   {
  489.     Q();
  490.     Serial.print(" ");
  491.   }
  492.   else if (ch == 'R' || ch == 'r')
  493.   {
  494.     R();
  495.     Serial.print(" ");
  496.   }
  497.   else if (ch == 'S' || ch == 's')
  498.   {
  499.     S();
  500.     Serial.print(" ");
  501.   }
  502.   else if (ch == 'T' || ch == 't')
  503.   {
  504.     T();
  505.     Serial.print(" ");
  506.   }
  507.   else if (ch == 'U' || ch == 'u')
  508.   {
  509.     U();
  510.     Serial.print(" ");
  511.   }
  512.   else if (ch == 'V' || ch == 'v')
  513.   {
  514.     V();
  515.     Serial.print(" ");
  516.   }
  517.   else if (ch == 'W' || ch == 'w')
  518.   {
  519.     W();
  520.     Serial.print(" ");
  521.   }
  522.   else if (ch == 'X' || ch == 'x')
  523.   {
  524.     X();
  525.     Serial.print(" ");
  526.   }
  527.   else if (ch == 'Y' || ch == 'y')
  528.   {
  529.     Y();
  530.     Serial.print(" ");
  531.   }
  532.   else if (ch == 'Z' || ch == 'z')
  533.   {
  534.     Z();
  535.     Serial.print(" ");
  536.   }
  537.   else if (ch == '0')
  538.   {
  539.     zero();
  540.     Serial.print(" ");
  541.   }
  542.   else if (ch == '1')
  543.   {
  544.     one();
  545.     Serial.print(" ");
  546.   }
  547.   else if (ch == '2')
  548.   {
  549.     two();
  550.     Serial.print(" ");
  551.   }
  552.   else if (ch == '3')
  553.   {
  554.     three();
  555.     Serial.print(" ");
  556.   }
  557.   else if (ch == '4')
  558.   {
  559.     four();
  560.     Serial.print(" ");
  561.   }
  562.   else if (ch == '5')
  563.   {
  564.     five();
  565.     Serial.print(" ");
  566.   }
  567.   else if (ch == '6')
  568.   {
  569.     six();
  570.     Serial.print(" ");
  571.   }
  572.   else if (ch == '7')
  573.   {
  574.     seven();
  575.     Serial.print(" ");
  576.   }
  577.   else if (ch == '8')
  578.   {
  579.     eight();
  580.     Serial.print(" ");
  581.   }
  582.   else if (ch == '9')
  583.   {
  584.     nine();
  585.     Serial.print(" ");
  586.   }
  587.   else if(ch == ' ')
  588.   {
  589.     delay(unit_delay*7);
  590.     Serial.print("/ ");
  591.   }
  592.   else
  593.     Serial.println("Unknown symbol!");
  594. }

  595. void String2Morse()
  596. {
  597.   len = code.length();
  598.   for (int i = 0; i < len; i++)
  599.   {
  600.     ch = code.charAt(i);
  601.     morse();
  602.   }
  603. }

  604. void setup() {
  605.   Serial.begin(9600);
  606.   pinMode(led, OUTPUT);
  607.   pinMode(buz, OUTPUT);
  608.   Serial.println("I am ready...");
  609. }

  610. void loop() {
  611.   while (Serial.available())
  612.   {
  613.     code = Serial.readString();
  614.     Serial.print(code);
  615.     Serial.print(" = ");
  616.     String2Morse();
  617.     Serial.println("");
  618.   }
  619.   delay(1000);
  620. }
复制代码

morse-serial-1.png


使用Arduino制作摩尔斯电码解码器

在另一种情况下,您是莫尔斯电码的收件人,您必须将收到的代码转换为文本。

要模拟这一点,请使用密钥将摩尔斯电码发送到Arduino,并在串口监视器中将看到文本形式的结果。

电路

morse_rec_circuit.jpg


代码

  1. /*

  2.   Morse code - Receiver

  3.   modified on 14 Apr 2019
  4.   by Saeed Hosseini @ Electropeak
  5.   https://electropeak.com/learn

  6. */

  7. String code = "";
  8. int len = 0;
  9. char ch;
  10. char new_char;

  11. const int but = 2;
  12. const int led = 13;

  13. unsigned long pres_len = 0, rel_time, pres_time = 0, old_time_len = 0, old_pres = 0, space = 0;
  14. int state = 0;
  15. int unit_delay = 250;
  16. int min_delay = 10;

  17. char MakeString()
  18. {
  19.   if (pres_len < (unit_delay*3) && pres_len > 50)
  20.   {
  21.     return '.';                        //if button press less than 0.6sec, it is a dot
  22.   }
  23.   else if (pres_len > (unit_delay*3))
  24.   {
  25.     return '-';                        //if button press more than 0.6sec, it is a dash
  26.   }
  27. }

  28. void Morse_decod()
  29. {
  30.   static String morse[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
  31.                              "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-",
  32.                              ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "!"
  33.                             };
  34.   int i = 0;
  35.   while (morse[i] != "!")  
  36.   {
  37.     if (morse[i] == code)
  38.     {
  39.       Serial.print(char('A' + i));
  40.       Serial.print(" ");
  41.       break;
  42.     }
  43.     i++;
  44.   }
  45.   if (morse[i] == "!")
  46.   {
  47.     Serial.println("");
  48.     Serial.println("This code is not exist!");
  49.   }

  50.   code = "";
  51. }

  52. void setup() {
  53.   Serial.begin(9600);
  54.   pinMode(but, INPUT_PULLUP);
  55.   pinMode(led, OUTPUT);

  56. }
  57. void loop() {
  58. label:
  59.   while (digitalRead(but) == HIGH) {}
  60.   old_pres = rel_time;
  61.   pres_time = millis();
  62.   digitalWrite(led, HIGH);
  63.   while (digitalRead(but) == LOW) {}
  64.   rel_time = millis();
  65.   digitalWrite(led, LOW);
  66.   pres_len = rel_time - pres_time;
  67.   space = pres_time - old_pres;
  68.   if (pres_len > min_delay)
  69.   {
  70.     code += MakeString();
  71.   }
  72.   while ((millis() - rel_time) < (unit_delay * 3))
  73.   {
  74.     if (digitalRead(but) == LOW)
  75.     {
  76.       goto label;
  77.     }
  78.   }

  79.   Morse_decod();
  80. }
复制代码

以上就是本篇文章的全部内容。如有问题,请随时在本帖下面进行回复。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-23 08:15 , Processed in 0.040755 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表