网络LedMatrix

浙江大学嵌入式系统的终极boss。

实验目的

  • 掌握Linux设备驱动程序的开发过程;
  • 理解I2C总线协议;
  • 复习socket编程(网络原理课);
  • 实现一个网络访问的LED矩阵显示器。

实验器材

  • 硬件
    • 树莓派2代板一块;
    • 5V/1A电源一个;
    • microUSB线一根;
    • 面包板一块;
    • 8x8 LED矩阵一块(不带I2C控制器);
    • 360Ω 1/8W电阻8颗,或360Ω 排阻1颗;
    • 面包线若干。
      以下为自备(可选)器材:
    • PC(Windows/Mac OS/Linux)一台;
    • USB-TTL串口线一根(FT232RL芯片或PL2303芯片);
    • 以太网线一根(可能还需要路由器等)。
  • 软件
    • 编译软件。

实验步骤

  • 设计外部设备方案,画连线示意图;

    (Fritzing里找不到合适大小的led矩阵,就这么凑合一下了)

  • 在面包板上连线,完成外部电路;

    实物连接图

  • 编写Linux应用程序,能通过第六次实验的GPIO库控制LED矩阵显示字母数字;

    这个相对简单,这里我使用了python编写应用程序,使用RPi.GPIO库
    显示的时候需要另起一个线程,可以使用python中的thread库
    首先讲一下MT07088BK的管脚

    网上找到这么一张管脚图,不过看了之后依旧不是很清楚,测试之后发现实物上的管脚编号大致如下

  • 编写Linux设备驱动程序,能通过寄存器操纵GPIO控制LED矩阵,将这个LED矩阵做成/dev/ledmatrix,之 后能 通过cat命令输出字母数字来显示;

    首先我们需要准备一些工具,包括树莓派的交叉编译环境以及树莓派系统源代码
    交叉编译环境之前都已经做过了这里不再赘述,这里主要说一下系统源代码以及一些其他注意事项
    树莓派的系统代码我们可以从官方的github上clone下来,这里面包括了我们编译内核模块必要的一些文件

    1
    git clone https://github.com/raspberrypi/linux.git

    另外在开始之前最好保证你当前的系统与你下载的源码版本一致,不然你插入内核模块的时候会因为内核版本不一致而失败
    树莓派可以简单地通过一条命令更新内核到最新版本,这样的话只要下载最新版本的内核源代码就行了

    1
    sudo rpi-update

    当然事实上我这样做了以后发现版本还是不一致,我更新以后树莓派的内核版本是3.18.14v7+,但是编译出来的内核模块显示对应内核版本总是3.18.14v7,原因不是很明白,不过几经查阅总算找到一个解决办法。直接修改include/generated/utsrelease.h内的版本号

    1
    #define UTS_RELEASE "3.18.14-v7+"

    然后就可以愉快的开始编写我们的内核模块了
    实验要求基本上只要写一个简单的字符设备驱动,所以我们要做的其实主要就是在内核中注册好我们的字符设备,并且实现它相应的一些文件操作(read、write之类)
    需要注意的是实验要求能够cat显示字符,cat实际上是做打开读取再关闭的操作,但是读取的时候它会一直读取知道读到EOF(0),所以我们在实现read函数时不能忘记返回0
    另外关于gpio操作,可以使用linux/gpio.h中提供的一些函数接口,非常方便。
    显示的时候需要另起一个线程,这里需要编写内核线程的一些知识。
    下面是一些操作字符设备以及内核打印调试信息的截图

  • 编写Linux应用程序,能通过TCP接受一个连接,将发来的文字在LED矩阵上流动显示出来。
    最后一部分考虑流动显示的部分,我没有用前一个部分写好的驱动,因为那个驱动只能单独显示字符集中的字符,因此我又重新利用gpio库重写了显示逻辑
    我利用树莓派做主机,监听10000端口,PC及去连接这个端口,并发送一些信息,树莓派收到信息后会流动显示发来的字符串,显示完成后会给PC发送消息表示显示完成,接着接收之后的消息。
    实现代码参见tcp_ledmat_rpi.pytcp_ledmat_pc.py

实验结果视频

Lab8 Demo