银河国际手机版最新:MF打造视频监控智能车,通过串口关闭Linux的服务器

一个真正的服务器一般往往不需要连接键盘、显示器或鼠标等外设。而仅仅需要一个性能稳定的操作系统如Linux和一个网卡。诸如鼠标、键盘等外部设备则往往不必要连接。在运行Linux的机器上,通过网络进行远程管理是最好和最方便的解决方法。

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

在买服务器时应该确保在开机BIOS中有设定不需要检测键盘的选项。目前市场上大多数主板厂商的BIOS版本都有这样的选项。但是仍然有一些主板认为自己的的服务器将只运行windows,因此一定会在启动时需要一个键盘,因此不推荐使用这种机器作为服务器使用。

 银河国际手机版最新 1

没有键盘和监视器的计算机非常适合于作为防火墙、web服务器、NFS服务器、邮件服务器的、ADSL网关、DNS服务器的概念等等。而且该机器不一定是功能非常强大的机器。即使一个老的Pentimu100机器,只要拥有足够的内存就可以同时服务数百个客户服务请求。

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

服务器不连接键盘、鼠标和显示器的好处是非常方便,因为服务器将只是一个简单的主机箱,可以放在任何适合的地方。但有时候你可能希望能有一个按键来实现安全的关闭服务器而无需首先远程登录服务器运行shutdown命令来实现关闭机器。也可能你现在就在服务器机房,而最近的工作站离你有100多米远;或者你希望某个没有root密码的普通用户关闭服务器。当然直接关闭电源并不是一个好的想法,因为这样可能导致丢失数据并且在下次启动时需要很长时间的文件系统检测。

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

解决方法是按照本文的方法安装一个很小的、便宜的串口设备实现安全关机。

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

设备

 银河国际手机版最新 2

我们将制作一个小小的、由两个LED和一个按键式开关组成的设备。其中绿色的LED亮表示当前按键式开关是处于激活状态,缓慢闪烁的黄色LED灯表示服务器正在启动或者仍然处于关闭状态。为了实现安全关闭服务器需要持续按下开关3秒钟。

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

如果你按了按键开关,亮着的绿色的LED将熄灭,表示正在关机,这时候命令”/sbin/shutdown
-t2 -h
now”被执行。在服务器关闭过程中黄色的LED将连续闪烁以进行指示。当黄色LED不再闪烁时,你仍然需要等待10秒钟才能关闭服务器电源。当所有的进程被杀掉,磁盘被卸载以后黄色LED将不再闪烁。若你的服务器支持自动关机则你不需要考虑10秒的等待时间,因为服务器会自动关闭电源。

第一步:远程登录树莓派

串口

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

关于串口令人感兴趣的是我们可以通过ioctl系统调用来控制其中的几个管脚。这意味着你不需要修改任何内核代码就可以控制连接到串口的LED
或这读取按键式开关的状态。串口有足够的电压来驱动两个低电压LED。我们将使用RTS和DTR针来连接LED,并且”Carrier
Detect line”被用来读取按键开关的状态。

 银河国际手机版最新 3

串口母头连接器的管脚定义:

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

9 PIN-connector 25 PIN-connector Name Dir Description

 银河国际手机版最新 4

1 8 CD input Carrier Detect

第二步:安装简易FTP服务

2 3 RXD input Receive Data

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

3 2 TXD output Transmit Data

1、  安装vsftpd服务

4 20 DTR output Data Terminal Ready

sudo apt-get install vsftpd

5 7 GND — System Ground

2、  开启vsftpd服务

6 6 DSR input Data Set Ready

sudo service vsftpd start

7 4 RTS output Request to Send

3、  修改配置文件

8 5 CTS input Clear to Send

sudo nano /etc/vsftpd.conf

9 22 RI input Ring Indicator

找到并修改

电路

anonymous_enable=NO   //不允许匿名访问

用户需要下面元器件来制作这个串口关机设备:

local_enable=YES        //允许本地用户访问

1 绿色低电压LED (一个普通LED同样可以工作,但是亮灯过低)

write_enable=YES        //允许写

1 黄色低电压LED

local_umask=022         //设定上传后文件权限掩码

2 1.5K欧姆的电阻

存盘退出。

1 6.8K欧姆的电阻

4、  重启vsftpd服务

1 小按键开关

sudo service vsftpd restart

1 串口母头连接器

 

这些元器件按照如下的电路图连接在一起。串口电压范围是+/-
10伏特。1.5K电阻适合于低电压的LED,但是普通LED同样适合。不推荐修改电阻器电压和使用外部电源,因为串口控制芯片是主板的一部分,一旦你烧了其中的芯片,你只有修改整个主板。

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

上图是实际的电路板样品图。最后的设备如文章开始图片所示。

 银河国际手机版最新 5

软件

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

软件部分是一个小的守护进程。它可以通过/etc/rc.d/rc3.d/的脚本被启动。它通过使用ioctl(fd,
TIOCMSET,…)和ioctl(fd, TIOCMGET,
…)函数来读取和写串口。你可以从这里下载程序。软件中包含一个Makefile和安装指示。

 银河国际手机版最新 6

 

第三步:安装wiringPi库

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

详情请参见这篇文章:

 

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

 银河国际手机版最新 7

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

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

1、GPIO控制LED灯闪烁

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

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

 银河国际手机版最新 8

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

 银河国际手机版最新 9

如果硬件没有问题,那么你应该可以看到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编程获取远程的按键控制信息,然后通过串口发给凌霄开发板,由后者控制小车,后续如果有时间,可以做一个这方面的功能)。

串口定义:

  static SerialPort piPort = new SerialPort(“COM4”, 9600);

在Main函数中,进行串口打开操作:

piPort.Open();

在按键事件中发送按键信息:

static void ps2_Click(object sender, PS2.ButtonArgs e)

{

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

    {

        PS2 ps2 = (PS2)sender;

        PS2.ButtonArgs button = ps2.GetButton(PS2.Key.L2);

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

        {

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

            piPort.Write(buffer, 0, 4);

            piPort.Flush();

        }

}

}

2.4 树莓派串口编程

打开串口:

if ((fd = serialOpen (“/dev/ttyAMA0”, 9600)) < 0)

{

    fprintf (stderr, “Unable to open serial device: %s\n”, strerror
(errno)) ;

    return 1;

}

接收数据:

while(1)

{

           if(serialDataAvail (fd)>=4)   //判断接收缓冲区的个数

           {

              if (read (fd, buffer, 4) == 4)

              {                   

                        if(buffer[0]==0xAA && buffer[3]==0x55)

                        {

                                printf(“x:%d
y:%d\r\n”,buffer[1],buffer[2]);               

                        }

              }

           }

           else

           {

              delay (10) ;

      }

}
   
注:WiringPi对外封装并没有提供串口read函数,只提供了单个字符的获取,我们直接采用linux本身提供的read函数。

2.5 通信测试

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

 银河国际手机版最新 10

3、树莓派PWM输出控制

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

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

PWM初始化代码:

#define PWM1  1

#define PWM2  2

softPwmCreate (PWM1, pwmV1, 200) ;  //1=100us  7~28  

softPwmCreate (PWM2, pwmV2, 200) ;  //1=100us  7~28  

 

在串口的信息接收中,输出PWM,从而控制舵机。

if (read (fd, buffer, 4) == 4)

{                     

    if(buffer[0]==0xAA && buffer[3]==0x55)

    {

          pwmV1 = 7 + (int)(buffer[1]*21.0/255.0); //x

          pwmV2 = 7 + (int)(buffer[2]*21.0/255.0); //y

          softPwmWrite(PWM1, pwmV1);        

          softPwmWrite(PWM2, pwmV2);                                

    }                

}

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

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

视频链接:

 

文章导航:

1、【树莓派+.NET
MF打造视频监控智能车】遥控篇

2、【树莓派+.NET MF打造视频监控智能车】控制篇(.NET
MF)

3、【树莓派+.NET MF打造视频监控智能车】控制篇(树莓派)

4、【树莓派+.NET MF打造视频监控智能车】视频篇

 小结:

1、 树莓派硬件设计小巧,会让一些人因为树莓派而喜欢上Linux。

2、
Linux毕竟不是一个实时系统,在做软PWM的时候,你会发现舵机会抖动,并且幅度还不小(由于凌霄系统已经提供了16路PWM,所以后续还是由凌霄系统控制所有的舵机)

3、
Linux系统的镜像大概2.8G左右,和凌霄系统的几百K相比,还是挺重量级的,并且启动时间会比较长一些。

发表评论

电子邮件地址不会被公开。 必填项已用*标注