您的位置:时时app平台注册网站 > 彩世界网址 > 通过串口关闭Linux的服务器

通过串口关闭Linux的服务器

2019-10-12 09:22

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

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

2. 按键的输入原理

在单片机应用系统中,通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。也就是说,它能提供标准的TTL 逻辑电平,以便与通用数字系统的逻辑电平相容。此外,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能。因此,键信息输入是与软件结构密切相关的过程。 对于一组键或一个键盘,通过接口电路与单片机相连。单片机可以采用查询或中断方式了解有无按键输入并检查是哪一个按键按下,若有键按下则跳至相应的键盘处理程序处去执行,若无键按下则继续执行其他程序。

1 8 CD input Carrier Detect

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

四、调试要点与实验现象

接好硬件,通过冷启动方式将程序所生成的。hex文件下载到单片机运行后,打开串口调试助手软件,设置好波特率9600,复位单片机,然后按下板上的4×4按键中的任意一个,并注意观串口调试助手上的显示。(见图3),可以观察到在接收窗口有按键的数据显示。

图片 1

图3 按键通过串口调试助手显示界面

此外,在本文所附的实验程序中,其中与串口通信中调用了发送字符函数与发送字符串函数。在没有仿真器和遇到需要显示一些提示信息的时候,可以采用串口打印的方式,这样不仅直观方便而且不增加其他成本。

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

树莓派 10 (RX) -- 凌霄开发板20(TX)

二、电路详解

电路图如图2 所示。

图片 2

图2

从图2 中可知独立式按键采用每个按键单独占用一根I/O 口线结构。当按下和释放按键时,输入到单片机I/O 端口的电平是不一样的,因此可以根据不同端口电平的变化判断是否有按键按下以及是哪一个按键按下。从图2(a) 中可以看出,按键和单片机引脚连接并加了上拉电阻,这样当没有按键按下的时候,I/O 输入的电平是高电平,当有按键按下的时候,I/O 输入的电平是低电平。
  虽然独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O 口线,因此,在按键较多时,I/O 口线浪费较大。对于比较复杂的系统或按键比较多的场合,可以用到矩阵键盘,图2(b) 中所示的为4×4的矩阵式键盘,其他矩阵式键盘的设计方法类似。
  4×4 的矩阵式键盘由4 根行线和4 根列线交叉构成,按键位于行列的交叉点上,这样就构成了16 个按键。其中交叉点的行列线是不连接的,当按键按下的时候,此交叉点处的行线和列线导通。图2(b) 行线通过上拉电阻接到VCC 上。当无键按下时,行线处于高电平状态;当有键按下时,行、列线在交点导通,此时,行线电平将由与此行线相连的列线电平决定。这是识别按键是否按下的关键。然而,矩阵键盘中的每条行线与4 条列线相交,交点的按键按下与否均影响该键所在行线和列线的电平,各按键间将相互影响,键分析时必须将行线、列线信号配合起来作适当处理,才能确定闭合键的位置。
  值得注意的是本文介绍的矩阵键盘,在传统的矩阵键盘的输出端加了一个四输入与门芯片74HC21。当四路输入有一个为低电平的时候,输出为低电平。将74HC21 的输出端接到单片机的外部中断0(P32 管脚)上,这样在实时性要求较高的情况下,设P00~P03 为全低等待按键触发,当任何一个按键按下的情况下,系统都会进入中断服务程序,提高了键盘响应时间,在系统实时性要求较高的情况下非常实用。

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

  static SerialPort piPort = new SerialPort("COM4", 9600);

三、程序设计

本文设计实例关键程序如下。
  独立按键程序

  ……
  #define keyio P0 ( 1)
  #define key1 P0_3 ( 2)
  ……
  keyio|=0X0F; ( 3)
  if(key1==0) ( 4)
  {
  delay_nms(20); ( 5)
  if(key1==0) ( 6)
  {
while(key1==0)
; ( 7)
  return 1; ( 8)
  }
  }

程序说明:

(1)定义按键管脚。
(2)定义按键连接管脚。
(3)将按键连接管脚输出高电平,从而接收输入。
(4)如果此时管脚所连接按键被按下。
(5)延时一段时间,去抖作业。
(6)如果此时按键仍然被按下,此时按键有效。
(7)等待按键抬起,死循环,如果按键一直按下则一直等待。
(8)返回键值。矩阵键盘程序

  ……
  #define KEYIO P0 ( 1)
  ……
  code ksp[4]={0x7F,0xBF,0xDF,0xEF}; ( 2)
  unsigned char keypad_scan() ( 3)
  {
  char key,i; ( 4)
  KEYIO=0xF0; ( 5)
  if (KEYIO!=0xF0) ( 6)
  {
  for(i=0;i<=3;i  ) ( 7)
  {
  delaykey(10); ( 8)
  KEYIO=ksp[i]; ( 9)
  delaykey(10); ( 10)
  if(KEYIO!=ksp[i]) //不等于ox( 11)
  {
  delaykey(10); ( 12)
  key=KEYIO; ( 13)
  while(KEYIO==key); ( 14)
  return(key); ( 15)
  }
  }
  }
  }

程序说明:

(1)定义矩阵键盘管脚。
(2)将扫描时用到的管脚四种输出电平状态定义成一个数组。//确定第几列数
(3)按键扫描程序。
(4)定义两个临时变量key,i。
(5)让键盘管脚的高四位输出高电平,低四位为低电平,为扫描按键准备。
(6)如果此时管脚状态电平发生变化。
(7)将之前定义的数组中的值赋予管脚,开始逐次扫描。
(8)延时一段时间,去抖。
(9)输出扫描按键的电平。
(10)再延时一段时间。
(11)如果此时按键管脚电平依旧不是输出的默认电平,表示有键按下。
(12)延时一段时间,让电平稳定。
(13)读取当前按键管脚电平,即键值。
(14)等待按键抬起,死循环,如果按键一直按下则一直等待。
(15)返回键值。

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

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

3. 按键的特点与去抖

机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。其抖动过程如图1(a) 所示,抖动时间的长短与开关的机械特性有关,一般为5 ~ 10 ms。从图中可以看出,在触点抖动期间检测按键的通与断状态,可能导致判断出错。即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。一般来说,在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。( 本学习板采用软件去抖方式)。软件去抖的流程图如图1(b) 所示。

图片 3

图1

从按键的去抖流程图我们可以知道,检测到有键按下时,应延时等待一段时间(可调用一个5ms~10ms的延迟子程序),然后再次判断按键是否被按下,若此时判断按键仍被按下,则认为按键有效,若此时判断按键没有被按下,说明为按键抖动或干扰,应返回重新判断。键盘真正被按下才可进行相应的处理程序,此时基本就算实现了按键输入,进一步的话可以判断按键是否释放。

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

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

1. 按键的分类

一般来说,按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键(如本学习板上所采用按键)。
  按键按照接口原理又可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别。
  全编码键盘由专门的芯片实现识键及输出相应的编码,一般还具有去抖动和多键、窜键等保护电路,这种键盘使用方便,硬件开销大,一般的小型嵌入式应用系统较少采用。非编码键盘按连接方式可分为独立式和矩阵式两种,其它工作都主要由软件完成。由于其经济实用,较多地应用于单片机系统中(本学习板也采用非编码键盘)。

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

 

一、原理简介

键盘接口电路是单片机系统设计非常重要的一环,作为人机交互界面里最常用的输入设备。我们可以通过键盘输入数据或命令来实现简单的人机通信。在设计键盘电路与程序前,我们需要了解键盘和组成键盘的按键的一些知识。

2 3 RXD input Receive Data

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

五、总结

本文介绍了单片机外接键盘的工作原理并给出了实例,通过该文,我们可以知道一个完善的键盘控制程序应具备以下功能:
  (1) 检测有无按键按下,并采取硬件或软件措施,消除键盘按键机械触点抖动的影响。
  (2) 有可靠的逻辑处理办法。每次只处理一个按键,其间对任何按键的操作对系统不产生影响,且无论一次按键时间有多长,系统仅执行一次按键功能程序。
  (3) 准确输出按键值(或键号),以满足按键功能要求。对于矩阵键盘而言,必须将行线、列线信号配合起来作适当处理,才能确定闭合键的位置。
  此外,按键的扫描方式有多种,本文中所述的是程序扫描方式,另外常见的还有定时扫描方式和中断扫描方式,这些方式均可以在本学习板上实现。

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

    {

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

            piPort.Write(buffer, 0, 4);

电路

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

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

详情请参见这篇文章:

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

视频链接:

串口

#Spawn a getty on Raspberry Pi serial line

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

              }

设备

 图片 4

6 6 DSR input Data Set Ready

              {                   

7 4 RTS output Request to Send

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

9 PIN-connector 25 PIN-connector Name Dir Description

 

1 串口母头连接器

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

9 22 RI input Ring Indicator

}

1 小按键开关

              delay (10) ;

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

{

5 7 GND -- System Ground

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

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

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

...

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

8 5 CTS input Clear to Send

输入如下命令:

2 1.5K欧姆的电阻

接收数据:

软件

然后重启树莓派。

1 黄色低电压LED

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

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

piPort.Open();

4 20 DTR output Data Terminal Ready

 

3 2 TXD output Transmit Data

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

1 6.8K欧姆的电阻

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

sudo service vsftpd start

 

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

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

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

2.1 关闭串口调试功能

 

第一步:远程登录树莓派

4、  重启vsftpd服务

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

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

 图片 5

 图片 6

                        }

    fprintf (stderr, "Unable to open serial device: %sn", strerror (errno)) ;

1、GPIO控制LED灯闪烁

改为

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

sudo apt-get install vsftpd

 小结:

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

 图片 7

            piPort.Flush();

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

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

#Spawn a getty on Raspberry Pi serial line

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

          softPwmWrite(PWM1, pwmV1);        

                                printf("x:%d y:%drn",buffer[1],buffer[2]);               

 

while(1)

          softPwmWrite(PWM2, pwmV2);                                

    return 1;

sudo nano /boot/cmdline.txt

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

第二步:安装简易FTP服务

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

2.4 树莓派串口编程

sudo nano /etc/vsftpd.conf

 图片 8

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

存盘退出。

2.5 通信测试

1、  安装vsftpd服务

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

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

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

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

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

#define PWM2  2

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

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

           {

}

3、  修改配置文件

}

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

串口定义:

将以下内容

8号管脚为TX,10号管脚为RX,是TTL电平的,我们和凌霄开发板的子板接口19和20管脚进行连接。

文章导航:

{

3、树莓派PWM输出控制

}

    }                

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

打开串口:

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

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

sudo nano /etc/inittab

           {

{                     

树莓派 8  (TX) -- 凌霄开发板19(RX)

    {

sudo service vsftpd restart

 

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

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

第三步:安装wiringPi库

      }

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

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

命令行中输入如下命令:

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

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

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

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

 图片 9

找到并修改

        PS2 ps2 = (PS2)sender;

 图片 10

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

 

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

#define PWM1  1

 

PWM初始化代码:

{

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

           else

           }

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

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

 图片 11

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

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

write_enable=YES        //允许写

改为

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

2、  开启vsftpd服务

树莓派 6  (0v) -- 凌霄开发板03(GND)

                        {

2.3 .NET Micro Framework串口编程

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

 图片 12

将以下内容

        {

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

 图片 13

2.2 硬件接线

        }

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

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

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

本文由时时app平台注册网站发布于彩世界网址,转载请注明出处:通过串口关闭Linux的服务器

关键词: