raspberry pi 小车系列-微信和语言控制

2019-02-16  本文已影响0人  LH大牛

刘辉

2019-2-10--2019-2-13(做微信忘记保存图了)

先来说一下,树莓派是如何来控制小车的,先来说下我给小车加装的功能,移动(前进,后退,左拐,右拐),LED通断,黑线循迹,移动所需要的硬件为:L298N,4个电机,LED灯的通断需要发光二极管,黑线循迹需要(D80NK漫反射模块),树莓派控制小车主要是通过GPIO(General Purpose Input And Output),英文翻译为通用输入输出端口,可以通过他们输出高低电平或通过他们读入引脚状态我们就是通过他们来控制树莓派小车的,这里树莓派的引脚是不够的我们需要为他加装拓展版。这里我们可以看下树莓派官方给的引脚的定义。

L298N:

这里我们不讲如何接线,直讲一下我们是如何控制它移动的,L298N有四个引脚,作为逻辑输入端,同时L298N又有两个逻辑输出端即为 OutPutA,OutPutB,这里我们把同侧的两个电机并联分别接入OutPutA,OutPutB.

下图为逻辑输入端与电机运动方向的关系:

逻辑输入与电机转向

前文已经写过让小车跑起来,再次在重申一遍:

控制前进

此函数为控制小车前进的代码,小车使用BCM编码,按照上图的输入端与电机与电机运动方向的关系图,只需对IN1输入高电压,IN2输入低电压,IN3输入高电压,IN4输入低电压即可,这样就做到了,左侧电机前进右侧电机前进,小车前进,后退道理同理。

重点来了:----微信控制

如何接入树莓派小车以做到远程控制,这里接入的方式有很多,比如通过ZigBee协议(主要是不会),另一种是通过自己搭建一个服务器通过开发一个手机app来接入,但是这些都不够简单也不具有普适性,试想一下如果可以用微信控制,比如小车在陕西我在广东,小车已经联网,我只需要在微信上发送一个“开大灯”,就可以控制LED的通断,发送一个“前进”就可以使小车前进,人人都有微信,操作简单,有真正做到了远程控制,有这样一个东西是不是就太酷了?

这里的酷是itchat为我们提供了一种思路,如果物联网强调是万物互联,那么微信这种简单人人都有的东西能否成为万物互联的接口呢?

下面来介绍下itchat库,itchat这个库是Python关于微信的一个库,通过这个库具有很多的功能,比如说对公共账号,好友,群聊的整体获取,如果做到这个就可以实现好友云词分析,好友分析等来实现微信分析,这里推荐大家一篇教程:https://blog.csdn.net/lee20093905/article/details/79052795/一篇很好的通过itchat来做微信分析的教程。

还可以实现对于微信消息的接收,发送,分析,微信的小车就是利用了这一点来实现了远程的控制登陆:itchat提供了一个登录的方法,itchat.auto_login(enableCmdQR=2,hotReload=True)介于我是在MAC终端远程连接的树莓派,所以需要在终端形成二维码,enableCmdQR=2即位在终端形成二维码,如果不想每次登陆都扫描二维码可使用参数hotReload=True该方法会生成一个静态文件itchat.pkl,用于存储登陆的状态。

消息处理:

首先我们要想一下我们要发给谁消息,然后让树莓派小车做出响应,这里我们可以发送给文件助手,具体代码如下这里使用的是搜索好友的方法:

接下来要判断的就是我们收到的消息是语音还是文本消息,如果收到的是语音的话,我们将其下载下来并使用百度的STT将其转换为文本,如果收到的文本的话,我们可以通过python的find方法来做一下判断,这里我们以前进和开大灯为例,如果我给微信文件助手发送的字符串是开大灯,即为find方法不返回-1,此时为关键字,触发小车做出反馈:

这个时候只需要将电压置于高电压状态,小灯即被点亮。

在举例前进:

微信文件助手收到“前进”,这个时候需要给小车即调用前进函数,此函数被调用两秒即为小车前进两秒,两秒后执行停止命令,电机停止运转,小车停止。

但是只是有文字还是不够智能,我们希望一种更为智能的方式说白了就是懒以及更人性化的东西来远程控制,下篇文章就会对这两种方式作出介绍即为STT(Speak To Text),TTS(Text To Speak),语音识别,语音反馈。

实现这两种东西的意义就是我对文件助手发送语音例如“打开大灯”,他会在执行打开大灯命令的同时,通过3.5mm的音频输出设备给我们一个反馈例如会说“好的,以打开大灯”。

以及语音聊天,语音聊天的实现方式即为使用了图灵机器人,然后再使用百度的TTS将图灵机器人回复的文本播放出来,这样就做到了语音聊天,这些都会在下篇做出更新。

最后,现在百度的DuerOS以他方便的硬件和系统,已经有人做到了使用DueroS来控制家居设备,比如坐在沙发上,大喊“小度,小度,打开空调”,无需通过微信而是通过拾音器来做到这一点,这对于未来连接万物以及未来智能设备提供了一种新的思路。

语音控制:

今年注册的账号可能百度,改变了下发的数据格式,不再是文本格式,是以链接的形式。具体的我还没有研究。大家可以看返回的数据,payload里面是text还是url,是text 的可以用我这个方法,url的暂时还不行,等我有时间看一看如何提取,会再更新的

本文是基于百度的DuerOS Python SDK进行的,具体安装以及实现过程,可以看我的这篇教程:要实现的功能有:

语音聊天:可以跟智能小车进行对话,询问现在的天气,播放想听的歌曲等等基本对话;

语音控制:可以通过语音的操作方式控制智能小车的前进后退、避障转弯等功能,进一步可以扩展到家里的台灯、空调、窗帘等等家具;

语音反馈:在你发出命令后,小车还会给出回应,与你互动,实现一个良好的反馈

1. 命令读取

content里即为我们要读取的命令数据,是一种类JSON格式,所以有两种办法将数据读取出来。

1.采用JSON的字典格式

2.直接将数据保存为.txt格式

2. 命令判断

读取到命令之后要对其进行检测,如果命令中包含一些特定的关键词,则做出相应的动作。

代码未完

用完GPIO接口记得清理GPIO口:GPIO.cleanup()

4.为避免命令文件堆积,每次识别命令结束后,进行命令文件的清理,代码很简单:

f = open("ord.txt",'w')

f.truncate()

f.close()

5. 命令反馈

这部分集成到了第二部分命令判断中,判断完立即进行反馈。

要注意的是,在第二部分每一条命令都有一条这样的代码

GPIO.output(LED_CTR, GPIO.HIGH)

这一步正是屏蔽掉DuerOS原有的语音反馈的关键

(1)首先录制好自己想要的话语,然后仿照我的代码放到对应的位置

shutil.copy("/home/pi/Rascar-DuerOS-Python-Client/app/resources/turn_right.mp3","/home/pi/Rascar-DuerOS-Python-Client/temp.mp3")

(2)接下来是最关键的一步

sdk/interface里面有一个speech_synthesizer.py文件,这个文件就是控制TTS语音输出的,在这对代码进行一定修改,就可以实现播放我们自定义的音频。

import RPi.GPIO as GPIO

LED_CTR = 5 #与上面端口一致,用于检测是否有控制指令发送

然后在speak函数加入一条检测指令:

就可以啦

后续会将我的代码传到github,

上一篇 下一篇

猜你喜欢

热点阅读