Windows系统监听键盘通过UDP协议控制树莓派小车

作者:网友投稿 时间:2018-07-31 16:02

字号

树莓派小车硬件从淘宝买到手后已经鼓捣很长时间了,其中最喜欢的应用是控制小车运动了。我的小车控制系统在开发的过程中遇到了很多小问题,都被我一一修正了,将开发经验与大家分享,希望后来人能少走些弯路。

控制小车的方法大体上有以下几种:

1.TCP/UDP控制;

2.网页控制;

3.蓝牙控制;

4.红外遥控器控制;

5.手柄控制。

本次我采用的是【1.TCP/UDP控制】方案。

需要的硬件如下:

1. win7笔记本

2. 树莓派小车

3. 无线wifi网络

控制方案简介:通过监听win7笔记本上的键盘的按键,获得控制信息。然后将控制信息通过UDP协议发送给局域网内的树莓派小车。树莓派小车获得指令后进行动作。

车控制系统分为三部分:控制协议、客户端设计服务端设计

0×01 控制协议

车控制系统的通讯协议采用面向非连接的UDP协议,相比TCP协议,UDP协议更简单有效。

控制协议格式如下:

协议版本号:包号:命令字

其中协议版本号固定为1;包号为一个数字,每发送一次进行加1处理;命令字用于向小车发送控制命令。

本文用到的命令字有如下几种。

//方向控制 #define CARRUN_REMOTE_FORWARD (0x01) #define CARRUN_REMOTE_BACK (0x02) #define CARRUN_REMOTE_LEFT (0x03) #define CARRUN_REMOTE_RIGHT (0x04) #define CARRUN_REMOTE_STOP (0x05) //IP相关命令 #define CARRUN_REMOTE_WHOISONLINE (0x06) // who is online #define CARRUN_REMOTE_ONLINE (0x07) // I am online
0×02 客户端设计

客户端界面如下所示。

windows系统监听键盘通过UDP协议控制树莓派小车

可以手动输入树莓派小车的IP地址。为了方面操作,设计了一个自动获得树莓派小车IP的功能。

按下[Find Car]按钮,客户端程序向整个网络广播CARRUN_REMOTE_WHOISONLINE(谁在线)请求。当树莓派小车收到广播通知,立即向客户端发送CARRUN_REMOTE_ONLINE(我在线)的答复。客户端收到答复,自动将树莓派小车的IP地址记录到文本框中显示。

获得树莓派小车IP地址后,按下[Start]按钮,开始监听键盘信息,并根据监听到的特定按键的按下、抬起事件,转换为树莓派小车的控制命令,通过UDP协议与树莓派小车通信。

按键与小车动作的转换表如下:

按键事件 小车动作
方向键上按下   小车前进  
方向键上抬起   小车停止  
方向键下按下   小车后退  
方向键下抬起   小车停止  
方向键左按下   小车左转  
方向键左抬起   小车停止  
方向键右按下   小车右转  
方向键右抬起   小车停止  

UDP协议使用的3737端口,发送UDP协议是很简单的事情,本文不详细介绍。

监听键盘是通过安装系统钩子实现的,具体内容不详细介绍,读者可以检索SetWindowsHookEx函数进行详细了解。

 0×03 服务器端设计

树莓派小车安装的是RaspbianOS系统,该系统采用linux内核,对熟悉linux的朋友很容易上手。

服务器端使用C++语言和python语言混合编程实现。其中python语言编写的程序用于控制小车的前进、后退、左转、右转、停止动作。C++语言编写的程序用于监听UDP命令,并处理控制命令。

用python控制小车的代码非常简单,我调试好的代码如下:

 #!/usr/bin/Python # -*- coding: UTF-8 -*- #引入gpio的模块 import RPi.GPIO as GPIO import time #设置in1到in4接口 IN1 = 12 IN2 = 16 IN3 = 18 IN4 = 22 #初始化接口 def car_init(): #设置GPIO模式 GPIO.setmode(GPIO.BOARD) GPIO.setup(IN1,GPIO.OUT) GPIO.setup(IN2,GPIO.OUT) GPIO.setup(IN3,GPIO.OUT) GPIO.setup(IN4,GPIO.OUT) #前进的代码 def car_forward(): GPIO.output(IN1,GPIO.HIGH) GPIO.output(IN2,GPIO.LOW) GPIO.output(IN3,GPIO.HIGH) GPIO.output(IN4,GPIO.LOW) time.sleep(0.15) GPIO.cleanup() #后退 def car_back(): GPIO.output(IN1,GPIO.LOW) GPIO.output(IN2,GPIO.HIGH) GPIO.output(IN3,GPIO.LOW) GPIO.output(IN4,GPIO.HIGH) time.sleep(0.15) GPIO.cleanup() #左转 def car_left(): GPIO.output(IN1,False) GPIO.output(IN2,False) GPIO.output(IN3,GPIO.HIGH) GPIO.output(IN4,GPIO.LOW) time.sleep(0.15) GPIO.cleanup() #右转 def car_right(): GPIO.output(IN1,GPIO.HIGH) GPIO.output(IN2,GPIO.LOW) GPIO.output(IN3,False) GPIO.output(IN4,False) time.sleep(0.15) GPIO.cleanup() #停止 def car_stop(): GPIO.output(IN1,GPIO.LOW) GPIO.output(IN2,GPIO.LOW) GPIO.output(IN3,GPIO.LOW) GPIO.output(IN4,GPIO.LOW) GPIO.cleanup()

C++语言编写的程序是小车控制系统的核心,可以分为4个模块:协议解析模块、UDP端口监听模块、逻辑控制模块、动作执行模块。

协议解析模块用于解析协议。

责任编辑:CQITer新闻报料:400-888-8888   本站原创,未经授权不得转载
继续阅读
热新闻
推荐
关于我们联系我们免责声明隐私政策 友情链接