树莓派作品2_莫尔斯电码

来源:互联网 发布:淘宝拍卖字画是真的吗 编辑:程序博客网 时间:2024/04/29 21:26

一、创意来源

       莫尔斯电码历史悠久,我从小时候就听说过莫尔斯电码了伟大了,不过直至今日我都没有机会过过手瘾,亲手用莫尔斯电码来输出一些有意义的句子。

   不过有了树莓派,一切都不成问题,只要两个按钮,就能帮我完成这个夙愿。

       尤其是最后,我录了两段视频,一段是输出SOS的,另一段令人意想不到的输出的是……

 

二、实验内容

       用树莓派做一个莫尔斯电码翻译机,实验只需要两个按钮,一个负责输入莫尔斯电码,一个负责确认输入完毕并输出结果。程序运行的过程,每当用户输入一串莫尔斯电码,并确认输入完毕时,会在shell输出电码,并且输出该编码对应字符。程序使用C/C++语言写。实验报告要画出电路图(Frizting),说明使用的库,附连线的照片,拍实际的视频上传到优酷并在报告中给出URL,要附源码。

三、主要仪器设备

1. RPI

2. 移动电源

3. Win7 PC机一台

4. 面包板

5. 面包线、杜邦线

6. 段数码管

7. 限流电阻

8. 两个按钮

 

四、操作方法和实验步骤

1.安装wiringPi

使用git工具下载wiringPi

 

查询当前目录下的wiringPi,并进入该目录,使用build命令安装


 

验证,已安装!

 

 

 

 

 

2.电路设计

 

引脚文件


电路设计图


树莓派实物接线

 

3.实验代码

程序主要部分已注释

#include <wiringPi.h>

#include <stdio.h>

#include <stdlib.h>

 

#define BTN0 10   // 左键 主要用来输入莫尔斯码

#define BTN1 11   // 右键 主要点击初始化或输出当前莫尔斯码

 

int kh=0;

 

int main() {

    int pin;

    int m = 0,  out=-1;

    int run = 0;

    unsigned int  btime1, btime2;

 

 

    if (wiringPiSetup () == -1)   // 初始化

        exit (1) ;

 

 

    pinMode(BTN0, INPUT);

    pinMode(BTN1, INPUT);

    int len;

    int a[10];

    while (1) {

        if (digitalRead(BTN1) && run == 0) {    // 右键按一次初始化

            len = 0;

            run = 1; 

                          

        }

       else if (digitalRead(BTN0) && run == 1)   //  左键

              {

                     out = 0;

                     btime1 = millis();

                     while (digitalRead(BTN0)){      // 记录左键按的时间

                        btime2 = millis();        

                     }

                     if (btime2 - btime1 > 350)        // >350ms则算 - , 否则 .

                            out = 1;

                     else

                            out = 0;  

                     a[len] = out;

                     len++;

              }

        else if (digitalRead(BTN1) && run == 1 && len >0) { // 输出结果

           printf("%d : ",len);

          for (m=0; m<len; m++)

            if (a[m] == 0)

                     printf(".");

            else

                     printf("-");

           int number = 0;

            int ss = 1;

            int i = len-1;

           printf("    the letter is:  "); 

    

                int mychar;

     for (; i>=0; i--){                          // -为1,.为0,算二进制值

         number = number + ss*a[i];

         ss = ss*2;

     }

     if (len==1){                      // 根据长度和二进制编码值,译码

        switch (number){

               case 0:

                     mychar = 'E';

                                    break;

               case 1:

                    mychar = 'T';

                                   break;

              default:

                  mychar = '!';

              break;

        }

     }

     else

     if (len==2){

        switch (number){

               case 0:

                    mychar = 'I';

                                   break;

               case 1:

                    mychar = 'A';

                                   break;

               case 2:

                    mychar = 'N';

                                   break;

               case 3:

                    mychar = 'M';

                                   break;

              default:

                  mychar = '!';

              break;

        }    

     }

     else

     if (len==3){

        switch (number){

               case 0:

                    mychar = 'S';

                                   break;

               case 1:

                    mychar = 'U';

                                   break;

               case 2:

                    mychar = 'R';

                                   break;

               case 3:

                    mychar = 'W';

                                   break;

               case 4:

                    mychar = 'D';

                                   break;

               case 5:

                    mychar = 'K';

                                   break;

               case 6:

                    mychar = 'G';

                                   break;

               case 7:

                    mychar = 'O';

                                   break;

              default:

                  mychar = '!';

              break;

        }    

     }

     else

     if (len==4){

        switch (number){

               case 0:

                    mychar = 'H';

                                   break;

               case 1:

                    mychar = 'V';

                                   break;

               case 2:

                    mychar = 'F';

                                   break;

               case 4:

                    mychar = 'L';

                                   break;

               case 6:

                    mychar = 'P';

                                   break;

               case 7:

                    mychar = 'J';

                                   break;

               case 8:

                    mychar = 'B';

                                   break;

               case 9:

                    mychar = 'X';

                                   break;

               case 10:

                    mychar = 'C';

                                   break;

               case 11:

                    mychar = 'Y';

                                   break;

               case 12:

                    mychar = 'Z';

                                   break;

               case 13:

                    mychar = 'Q';

                                   break;

              default:

                  mychar = '!';

              break;

        }

     }

     else

     if (len==5){

        switch (number){

               case 0:

                    mychar = '5';

                                   break;

               case 1:

                    mychar = '4';

                                   break;

               case 3:

                    mychar = '3';

                                   break;

               case 7:

                    mychar = '2';

                                   break;

               case 18:

                    mychar = '/';

                                   break;

               case 31:

                    mychar = '0';

                                   break;

               case 30:

                    mychar = '9';

                                   break;

               case 28:

                    mychar = '8';

                                   break;

               case 24:

                    mychar = '7';

                                   break;

               case 16:

                    mychar = '6';

                                   break;

               case 15:

                    mychar = '1';

                                   break;

              default:

                  mychar = '!';

              break;

        }

     }

     else

     if (len==6){

         switch (number){

                 case 12:

                      mychar = '?';

                                     break;

                 case 21:

                      mychar = '.';

                                     break;

                 case 31:

                      mychar = '-';

                                     break;

                 case 45:

                      if (!kh){

                         kh = !kh;

                         mychar = '(';

                                           break;

                      }

                      else{

                         kh = !kh;

                         mychar = ')';

                                           break;

                      }

              default:

                  mychar = '!';

              break;

         }

     }

     else

           mychar = '!';

           printf("%c\n",mychar);     

            len = 0;

           run = 0;

        }

 

        delay(10);

    }

 

    return 0;

}

 

 

4. 实验结果

用scp把笔记本上的run2.c传入树莓派,ls查看如下

 

编译

 

运行

 

 

输入SOS


视频URLhttp://v.youku.com/v_show/id_XNTczODI2MTU2.html

 

随便输入点东西,其中感叹号统一表示非莫尔斯编码

 

下面是亮点:

首先先看一个视频

视频URLhttp://v.youku.com/v_show/id_XNTczODM3ODUy.html

清晰截图请看下页

/**********/

我挡

 

 

我挡

 

 

 

我挡

 

 

 

 

我挡挡

 

 

 

 

 

见下页

/**********/

熟悉莫尔斯编码的人可能一下就能读出我输入的含义,没错就是如下图所示:


I LOVE YOU 哈!

 

 

5. 实验心得

实验难度不高,但是胜在创意,用最简单的东西能做出有意义的产品才是最符合大众需求的,设计之初本想实现个莫尔斯电码玩玩,后来做出来后发现完全可以让树莓派说些内涵的话,倒是意料之外。

 

莫尔斯编码用C写的译码国产完全也是自己胡想的,就是先判断其长度然后再根据他的二进制编码值来确定最后字符,不知道是否有高人能有更高明的解码方式。