查看: 568|回复: 0

[项目] 【树莓派+.NET MF打造视频监控智能车】控制篇(树莓派)

[复制链接]

主题

好友

488

积分

秀才

  • TA的每日心情
    无聊
    2019-1-9 09:43
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2018-12-3 13:36:12 |显示全部楼层
    对已经具备一定Linux基础的人来说,树莓派学习起来应该非常简单自然。在他们眼中,树莓派就是一个简易版的,卡通版的Linux而已。但是对我这样一个早已习惯微软技术生态系统的人或者初学者来说,要实现一个简单程序的编写、编译到运行,还是不太容易的。

    1.jpg


    上图是我搭建的一个相对完整的树莓派开发环境,有显示(HDMI转VGA->7寸显示屏800*480),有键盘和鼠标等,当然这些不是必须的,只是对初学者来说,显的比较直观。

    为了降低学习和开发难度,树莓派上提供多种编程语言选择,比如Python、Java、C/C++等linux可支持的开发语言。在图形界面下,可以在IDE环境相对简单的进行Python编程、调试、运行等。如果基于第三方支持库,还可以用Python操控GPIO等。

    出于对C/C++语言的热爱,我还是选择了基于GNU C进行程序开发,下图是已经安装到智能小车上的树莓派。我们需要搭建一个没有显示、鼠标和键盘下的编程、部署、运行调试环境。


    2.jpg


    至于如何烧写树莓派的系统到SD卡上,我们这里就不再熬叙了,已有很多入门文章进行了相关的讲解和说明。本篇文章主要介绍,搭建一个便于和Windows平台交互的编程平台,借助wiringPi C/C++库,操作GPIO和串口通信。

    第一步:远程登录树莓派

    我们选择安装的树莓派系统镜像为Raspbian,系统默认启动后,就是支持远程SSH连接的。我们可以下载一个免费的PuTTY工具软件进行远程连接。

    3.jpg


    打开连接,输入用户名:pi  密码:raspberry(默认) 会出现如下画面。
    4.jpg


    第二步:安装简易FTP服务
    为了便于把Windows系统中已经写好的C文件部署到树莓派中,我们安装一个简单的FTP服务。我们选择的是一个开源的比较轻量级的FTP服务器vsftpd,下面简单说一下安装步骤:

    1、  安装vsftpd服务
    sudo apt-get install vsftpd

    2、  开启vsftpd服务
    sudo service vsftpd start

    3、  修改配置文件
    sudo nano /etc/vsftpd.conf

    找到并修改
    anonymous_enable=NO   //不允许匿名访问
    local_enable=YES        //允许本地用户访问
    write_enable=YES        //允许写
    local_umask=022         //设定上传后文件权限掩码

    存盘退出。

    4、  重启vsftpd服务
    sudo service vsftpd restart

    打开windows上任意一款FTP客户端软件(我一直使用的是FlashFXP),配置相关IP、用户和密码(用户名:pi  密码:raspberry)。

    5.jpg


    连接成功后,会出现如下画面:
    6.jpg


    第三步:安装wiringPi库
    WiringPi是第三方封装的一个针对树莓派平台的GPIO控制库函数,WiringPi遵守GUN Lv3。wiringPi使用C或者C++开发并且可以被其他语言转包应用。

    有了以上三步的准备,我们就可以在Windows编写开发C语言代码,远程部署到树莓派,通过树莓派上的GCC工具进行编译,然后执行。编写代码之前,我们先了解一下树莓派的GPIO接口,如下图所示:

    7.jpg


    我们需要完成三个功能,一、GPIO控制一个LED闪烁;二、通过串口和凌霄板进行通信;三、输出PWM信号控制舵机。

    下面我们将一一介绍上面三个功能的实现。

    1、GPIO控制LED灯闪烁

    硬件接线:我们选择一个LED发光二极管,焊接一个1K左右的电阻,把一根杜邦线剪开,分别焊接到二极管两个管脚上(其中一个焊接在电阻另外一端)。LED较长的管脚为正极,我们接在树莓派第11管脚上,也就是GPIO0上。另外一端,我们接在25管脚上(可任意接在一个标有0V的管脚上)。

    我们在记事本(推荐使用EverEdit)编写相关代码,如下图所示:

    8.jpg


    把LED.C文件通过FlashFXP上传到树莓派上去。用GCC进行编译,然后执行,如下图所示:
    9.jpg



    如果硬件没有问题,那么你应该可以看到LED灯在闪烁了。

    2、树莓派和凌霄开发板串口通信

    2.1 关闭串口调试功能

    串口还不能直接使用,因为默认是绑定调试端口的,所以我们必须先关闭该功能。

    命令行中输入如下命令:
    sudo nano /boot/cmdline.txt

    将以下内容
    dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

    改为
    dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

    输入如下命令:
    sudo nano /etc/inittab

    将以下内容
    #Spawn a getty on Raspberry Pi serial line

    T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

    改为
    #Spawn a getty on Raspberry Pi serial line

    #T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

    然后重启树莓派。



    2.2 硬件接线

    8号管脚为TX,10号管脚为RX,是TTL电平的,我们和凌霄开发板的子板接口19和20管脚进行连接。
    树莓派 8  (TX) -- 凌霄开发板19(RX)
    树莓派 10 (RX) -- 凌霄开发板20(TX)
    树莓派 6  (0v) -- 凌霄开发板03(GND)

    2.3 .NET Micro Framework串口编程

    我们要求的功能相对简单,并不要求双向通信,凌霄开发板接收到控制摄像头云台的按键信息后,直接发送给树莓派(如果通过网络远程控制小车,则可以由树莓派通过wifi socket编程获取远程的按键控制信息,然后通过串口发给凌霄开发板,由后者控制小车,后续如果有时间,可以做一个这方面的功能)。

    串口定义:
    1. static SerialPort piPort = new SerialPort("COM4", 9600);
    复制代码

    在Main函数中,进行串口打开操作:
    piPort.Open();

    在按键事件中发送按键信息:
    1. static void ps2_Click(object sender, PS2.ButtonArgs e)

    2. {

    3.     if (e.key == PS2.Key.RRocker)

    4.     {

    5.         PS2 ps2 = (PS2)sender;

    6.         PS2.ButtonArgsbutton = ps2.GetButton(PS2.Key.L2);

    7.         if (button.state == 1)  //按下L2按键,我们才发送摇杆的信息

    8.         {

    9.            byte[] buffer = newbyte[] { 0xAA, (byte)e.x,(byte)e.y, 0x55 };

    10.            piPort.Write(buffer, 0, 4);

    11.            piPort.Flush();

    12.         }

    13. }

    14. }
    复制代码
    2.4 树莓派串口编程

    打开串口:
    1. if ((fd = serialOpen ("/dev/ttyAMA0", 9600)) < 0)

    2. {

    3.     fprintf (stderr,"Unable to open serial device: %s\n", strerror (errno)) ;

    4.     return 1;

    5. }
    复制代码


    接收数据:
    1. <blockquote>while(1)
    复制代码
    注:WiringPi对外封装并没有提供串口read函数,只提供了单个字符的获取,我们直接采用linux本身提供的read函数。

    2.5 通信测试

    编写相关文件,传输到树莓派,然后进行编译。运行程序后,我们操作Sony PS2按键,应该可以看到如下信息输出:

    10.jpg


    3、树莓派PWM输出控制

    树莓派仅提供一个物理硬件PWM输出IO,也就是GPIO1,第12管脚。实际测试发现,其周期为6.64us左右,WiringPi封装的接口还不能修改该周期的大小(后续有时间可以研究一下底层相关代码),这不符合舵机控制的需要,舵机一般要求20ms左右的周期。另外摄像头云台是控制两路舵机,所以一个物理硬件PWM也不够。所以我们采用软PWM,也就是用普通的GPIO,通过时钟中断,模拟PWM方波输出。

    我们用GPIO1(12管脚)和GPIO2(13管脚)来模拟PWM输出,所以硬件接线也是舵机的PWM信号输入管脚和树莓派的这两个管脚相连(舵机5V的供电专门供,不要直接从树莓派5V管脚上取)。

    PWM初始化代码:
    1. <blockquote>#define PWM1  1
    复制代码

    在串口的信息接收中,输出PWM,从而控制舵机。
    1. <blockquote>if (read (fd, buffer, 4) == 4)
    复制代码

    部署到树莓派,编译,运行,如果我们手头有示波器,我们应该可以看到GPIO1和GPIO2输出的波形。

    以上程序如果和凌霄板共同运行,应该可以看到如下效果:








    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /4 下一条

    手机版|爱板网

    GMT+8, 2019-1-19 11:15 , Processed in 0.129686 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-5   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001056号

    Powered by Discuz!

    返回顶部