趣味创意馆

位置:首页 > 创意diy > 电子DIY

用“飞来咒”控制你的直升机手工电子DIY教程

电子DIY1.5W

用“飞来咒”控制你的直升机

 

DIYer:puzzlebox 制作时间:一星期 制作难度:★★★★★ GEEK指数:★★★★★ 

这个制作会向你展示如何拆开一架遥控直升机,然后修改它的远程控制硬件使之能够通过开源的电脑软件来控制。更重要的是,它可以通过常见的消费级 脑电图 头戴式感应器感应到人脑的专注和放松状态,进而控制直升机的飞行!

项目中用到的软件包含两个应用程序,Puzzlebox Synapse和 Puzzlebox Brainstorms 。前者连接到市售的消费级头戴式脑电图感应器,比如 NeuroSky MindSet 或者 Emotiv EPOC 。后者连接到从遥控器拆出的发射芯片上,依据Puzzlebox Synapse给出的信号向直升机发送飞行命令。这些软件(包括源代码)可以在 Brainstorms Puzzlebox 的网站下载。


 

1   材料和工具 

 

○ 一架遥控直升机

○ 头戴式脑电图感应器,比如 NeuroSky MindSet 或者 Emotiv EPOC

○ USB转串口线,可以设置任意波特率

 

● 示波器

● 逻辑分析仪

● 烙铁和焊锡(可选)

● 连接线和万能电路板(可选)

● Puzzlebox Synapse和Puzzlebox Brainstorms软件

开始干活之前,拆解直升机。充电并安装好电池,确定所有部件都工作良好之后再开始检查或拆卸单个部件(译注:开拆前别忘了取下电池,不要带电拆卸)。你也应该事先熟悉直升机的基本控制,包括如何设置,基本控制和飞行特征。这里我们用的直升机是一架 Blade mCX2 。

 

2   检查遥控器组件首先要拆卸和检查遥控器电路板的组件。弄个显微镜记录制造商的名称和各种芯片的编号和数目可能是有用的,这对研究电路的功能和通讯协议的时候有帮助,可以在下一步用 示波器 或 逻辑分析仪 工作时节省时间。我们用的遥控器是 Blade MLP4DSM 。 

遥控器上有4个控制飞行的遥控通道:A. 油门(在空中上升/下降)

B. 升降舵(前进/后退)

C. 副翼(左右转向)

D. 方向舵(顺时针/逆时针旋转)

 

这两个操纵杆连接到 电位器 上,能够控制电位器的输出电压。电位器与电源相连,抽头连接到 Atmega88PA 单片机的端口上。 

单片机测量输入电压,然后转换成 PCM 数字信号传送到发射芯片。发射芯片通过 Spektrum DSM2 协议和直升机进行通讯。 

简要说明:这里的说明可能不是100%准确,但却是一个简要有用,易于理解的可视化说明方式。 

把电类比成水可能会简单一些,水通过管道而不是电线或者电路板上的印刷线路流动。如果你测量水压或者管道中某点的水位,就相当于测量电压。管道的直径就是电路可接受的最大电压。测量在某一点单位时间内通过的水量相当于在电路中测量电流。想象高处不断落下的大水滴,这是一个高电压,低电流的电路。而一场爆发式的洪水,是一个相对低电压但是大电流的电路。也正是由于这一原因,放大器(它们放大电流)通常被认为比高电压还要危险一些。 

这些电池充当着水源的角色,和水(电力)通过管道(电路)流动的目标。连接在遥控杆上的电位器起的作用就像管道中的阀门,能够改变之后管道中的水位(电压)。比如说,当油门摇杆处在最低的位置,相当于阀门的转子叶片完全关闭,所以管道中没有水流动(电压为0)。当摇杆在最高的位置,阀门开启,后面管道的水位(电压)则处在最高位置。 

如果水管途中经过一个水轮,水轮转动时就能驱动直升机的旋翼。这里可以看出越多的水冲击水轮(电压越高),轮子和旋翼就转的越快,使直升机飞的越高。不过这里讨论的摇杆和电路在遥控器而不是直升机上,所以需要一些额外的中继步骤。在这个假想的例子中,微处理器(单片机)测量管道中的流水水位。这个数字代表着电压和摇杆的当前位置。这个数字将被转换成数字格式并且通过发射芯片发射,数目对应于各操纵杆的这些数字发射到直升机以后,直升机上的接收器传送这些数据给微处理器,在那里数字信号最后转化成用于驱动浆叶和舵机的模拟输出。 

3   将控制电路板连接到示波器利用一个示波器,我们可以探测微处理器和发射芯片之间通讯信号的特征。把示波器的探头轮流接到发射芯片的每个引脚和地线上,直到找出哪个脚用于信号传输,那些脚是电气地线。调整示波器的灵敏度将使显示的图像更加清晰可见。最重要的是,我们将可以确定我们的遥控器发送一个数字信号,而不是相反的 模拟信号 。另外一点也很重要,就是我们可以测量数字信号的电平电压,来确保我们的USB转串口线可以产生和接收相同电平的信号。如果不是这种情况,就需要一个简单电平转换电路来变换信号电平,以适合现有的USB转串口线。 

在第一幅照片里,下边沿附近的亮点显示了数据包(又名数据帧)的发送,我们想要知道每一个数据包内含的信息,为此需要使用逻辑分析仪。 

在第二张放大的照片中可以看到,在数字信号的垂直边沿上,部分线条将随着操纵杆的操作而闪动。这表明每个数据包的内含数据都随着对摇杆的操作而变化,变化方式随通道不同而不同。更具体的讨论和示波器的使用方法超出了本教程的范围,暂且不表。 

4   连接逻辑分析仪一个逻辑分析仪能够帮助你抓到从微处理器发送到发射芯片间的每帧PCM数据包。显示并且解码它们。在这个项目里我们用了Tektronix 1241逻辑分析仪。 Saleae Logic 软件能够帮助我们精确测量每帧数据发送的频率(22ms一帧),还有数据格式,位数,每个字节数据的格式(8个数据位,无效验,1个停止位),波特率(133000波特)。每帧数据中包含14个可以用十六进制方便表示的字节。注意:波特率是相当重要的。最接近我们使用要求的,并且被大多数串口设备(比如项目中的USB转串口线)支持的标准波特率是115200。但这离我们的无线发射频率差距太远,开始的尝试失败了。所以选用一个转换芯片允许任意设置波特率的USB转串口线就显得十分重要。在之后的版本里我们选用了一个基于 FTDI 芯片的版本。(FT232 USB-Serial 'UART' IC,详见最后的说明。)同这一步骤有关的是Saleae逻辑分析软件捕获数据的记录文件示例。在第一个文件示例中油门摇杆完全出于最下方,而在第二个文件里油门摇杆始终处于最上方。更多摇杆位置的数据实例和讨论以及逻辑分析仪的使用超出了本教程的范围。 

简要说明:在我们之前的比喻里,我们说水流的水压(水位)可以类比为电流流过电路时的电压,由于操纵杆控制的阀门而升降。然而当我们使用示波器的时候可以观测到,在微处理器和发射芯片之间的信号是数字的,而不是模拟的。这实际上意味着管道要么充满水要么枯竭,没有中间状态。通过两种极端状态的变化,在管道中发送二进制数据。用另一种方式思考,想象管道两端分别有着发送者和接收者。在这种情况下,发送者是微处理器(因为它知道将要发送的数字值)而接收者是发送芯片。试图通过调节管道中的水流发送信息非常缓慢,所以他们采用了手电筒互打莫尔斯电码的方式。每隔一段时间,接收者探头进入管道观察情况。同一时刻发射者要么打开手电表示一个1,要么关上手电筒将之表示为0。每次发生这种情况,称作一个位(bit)的发送。这会连续快速发送8次,形成一个字节(Byte)。如果每个词的一个字母是一位,一个词就是一个字节。逻辑分析仪还告诉我们微处理器朝发射芯片说的每个‘句子’有14个‘词’,这个句子包含了所有的摇杆位置和每个运动方向的信号。只要遥控器开启,完整的句子每秒重复约45次(每22ms一次)。波特率非常重要是因为它代表了发射方和接收方之间预先约定的信号时间间隔。换句话说,如果发送方每五秒钟发送一次闪光,而接收方每十秒钟看一次管道,他就只会记录到一半的信号,并且将它记录下来以后,实际上每个位都是错的。当我们说波特率是133000的时候,实际上这一意味着每秒钟发生的闪烁高达133000次! 

5   拆焊发射芯片在使用示波器观察微处理器和发射芯片之间的数字信号,并使用逻辑分析仪对 串行 通讯协议进行解码之后,通过软件遥控直升机的道路就变得清晰了。我们的软件会绕过所有其他组件,直接通过USB转串口线同发射芯片进行通讯。如果这一步不顺利,我们还有一个替代方案。可以使用 Arduino 输出模拟电压来模拟电位器的输出电平。 

由于发射器芯片实际上是一块单独的电路板(见附图),而且在两个引脚之间有足够的空间让我们飞出信号,我们已经能够记录和分析所有微处理器发送给它的原始数据,但我们最终希望能够自行产生这些数据。这需要给发射板额外供电,如果遥控器的电源开关打开,然后微处理器也将发送数据,这将与我们插入的数据产生冲突;如果我们关闭了电源开关,发射器芯片也将关闭,任何数据都不会发送到直升机。我们认为我们将能够从USB转串口线为发射器芯片供电,但是我们不能肯定,电力会不会回流到微处理器使之开始工作。因此,我们决定从遥控器上拆下发射器芯片板,因为这是我们的项目唯一需要的部分。 

6   连接控制板与USB转串口线当发射芯片板被拆下来以后,我们需要重新用导线将原来的遥控器与发射芯片板飞线相连,这样就既可以像以前一样放飞直升机,又可以将它连接到USB转串口线通过软件遥控飞行,还可以通过USB转串口线直接记录遥控器发出的数据帧。我们最终使用一块万能板搭建了简易的开关电路,使我们能够控制信号流向任意需要的方向。通过这些收集到的信息我们用 Python 语言编写了“Helicopter_”模块作为Puzzlebox Brainstorms软件的一部分。 

在图片里,我们从控制台运行了这个此模块,像下面这样发出了“读”的命令:python Helicopter_ --command=read --device=/dev/ttyUSB0注意:在我们的具体配置里,我们的Linux系统在创建USB到串行端口设备时串行端口被附加了“/ dev/ttyUSB0”,这可能根据您的特定系统有所不同。比如在Windows下的COM端口可能被注为“COM1“。当以这种方式执行模块时很容易看到从微处理器发送到发射器芯片的实时数据。将这个模块纳入我们的源代码之后,我们可以任意发送特定的命令字符串给直升机。顺便提一句,我们注意到,当直升机首次启动时,需要发送一个“中间”油门位置的命令来建立匹配(不论是由连接到发射器芯片遥控器或计算机软件发出该字符串)。否则直升机将不会识别发射器芯片,并进入同步模式(由一个在驾驶舱闪烁的蓝灯表示)。 

此外,当控制台命令不再发送,直升机会显示断开连接(在驾驶舱外长亮的蓝灯),为了重新建立连接,需要再次发射了大约两秒钟的“中间”油门位置命令才能发送其它操纵命令,例如“悬停”或“向前飞。”这些设置传输会自动由Puzzlebox Brainstorms软件处理。 

7   测试飞行-从命令控制台遥控直升机在这个示例视频中,遥控直升机首先通过原来的遥控器操作,再经过万能板电路切换信号通道,由在控制台模式下运行的Puzzlebox Brainstorms软件发送“向前飞”的命令。注意在直升机起飞前有一个延迟,在此期间,发射器和直升机之间重新建立了同步。 

可用的控制台命令示例:Neutral: 使用此命令来与直升机建立初始同步

python Helicopter_ --command=neutral

Hover: 直升机在空中悬停

python Helicopter_ --command=hover

Fly Forward: 直升机向前飞行,高度降低,此时易于着陆

python Helicopter_ --command=fly_forward

Read: 读取遥控器的输出指令并直接在显示器上显示

python Helicopter_ --command=read

 

8   连接脑电图感应器到Puzzlebox SynapsePuzzlebox Synapse是一个免费,开源,跨平台的应用程序,它能直接连接到市售的消费级脑电图头戴感应器上,采集脑电波信号(包括检测状态),将数据绘图,选择性地记录数据到磁盘,并提供了TCP / IP服务器功能来为远程客户端传递信息。 

这个项目我们将使用Puzzlebox Synapse连接到一个NeuroSky MindSet感应器,然后区分 “专注”和“冥想”的思想集中程度,Puzzlebox Brainstorms则使用这些数据来遥控直升机飞行,悬停,或着陆。如果使用的是Emotiv EPOC感应器则可以使用“EmoKey”软件直接同Puzzlebox Brainstorms通讯,从而跳过这一步。 

首先需要建立一个电脑与NeuroSky MindSet的蓝牙连接。连接方法应该已经在感应器的说明中提供了,不在本教程的范围之内。如果你使用的是Windows XP,建议使用东芝(Toshiba)蓝牙驱动(感应器安装光盘中有),而不是内置的Microsoft蓝牙驱动,我们使用东芝公司的软件获得了更好的效果。对于NeuroSky MindSet默认的蓝牙Pin识别码为“0000”,一旦连接到你的Windows系统会获得新的COM端口或Linux下的/ dev/ ttyUSB。建议Mac OS X的任何用户尝试使用Python解释器从源代码开始运行,并通知我遇到的任何问题。理论上这些软件应当兼容,但是截至交稿时我还没有在OS X上实际测试过。 

一旦连接建立,只需选择你NeuroSky MindSet的蓝牙连接MAC地址,或选择显示的的适当COM端口。点选“Server Daemon”下面的“Start”按钮,图形界面将开始显示实时脑电图测量结果。脑波和“eSense”计算每秒更新一次。它也可以绘制原始脑电图输出波形图用来查看,显示随着时间的推移被测对象专注和放松的趋势,并存储用户会话的全部内容到磁盘或输出为 Calc或Microsoft Excel中使用的CSV文件。 

9   使用Puzzlebox Brainstorms遥控直升机飞行Puzzlebox Brainstorms是一个免费,开源,跨平台的软件应用程序,它允许通过脑机接口(BCI)控制车辆,设备,玩具(例如 LEGO MINDSTORMS ),遥控直升机,甚至电动轮椅。 

在这个项目里我们将使用该软件控制直升机的向前飞行,悬停和/或着陆。这些操作的控制命令来源于NeuroSky MindSet或Emotiv EPOC脑电图头戴感应器自动检测到的被测对象专注/放松的程度。 

第一步是在启动应用程序之后连接到上一步的准备好的Puzzlebox Synapse的服务器。服务器可以搭建在同一台计算机上或通过TCP/ IP协议或者因特网进行访问。在“控制面板”点击Puzzlebox Brainstorms标签,核对主机和端口设置后,点击“连接”,开始接收脑电图检测数据。下一步点击“遥控直升机”标签。该发射器芯片应该已经被改装并连接到电脑系统。如前面的步骤中所述,USB转换的串行接口将出现在Windows下的COM端口或/ dev/ ttyUSB Linux下的串行设备里。默认情况下,当大脑“专注”或“放松”的水平达到一定的阈值(约60%或更高,在“puzzlebox_brainstorms_”文件中定义) “速度”表将开始上升,遥控直升机将工作在“悬停”模式,一旦放松水平低于阈值直升机则自动下降并着陆。如果使用Emotiv EPOC感应器,你可以通过“EmoKey”程序指定以下快捷键并用它们任意指定直升机的工作状态:"Home " or "[ " -悬停

"Page Up " or "] " – 向前飞行

"End " or "" -着陆

 

简要说明(注意:这里的说明可能不是100%准确,但却是一个简要有用,易于理解的可视化说明方式。)A. 假设你站在正在进行棒球比赛的体育场外,你不能看到球场上的球员(我们不能“读你的心”),但每过一段时间,你就可以听到人群欢呼和叫喊,知道发生了令人兴奋的事件。我们知道,当发生类似这样的情况,就意味着你在保持专注。你可以设想头上的电极就像接收场内人群欢呼声信号的天线,当我们调整到合适的频率(电极处于合适的位置),听到兴奋的叫喊轰鸣(电极传出信号),我们就知道你在专注。

B. 人类的大脑是由约100亿个 神经元 组成的,它们不断通过化学过程交换信息,在这一过程产生电信号,当与特定功能相关的大脑区域高度活跃时,可以直接在该区域对应的头皮表面测量出电信号的微小变化。就像遥控控制电路,我们测量这些电信号的幅度和变化并用电压表示(尽管实际的变化小而又小)。

C. 如果你从遥控器中取出单节AA电池,你会发现在一边写着“1.5V”,表示该电池正常电压为1.5伏。我们测量脑电信号用的单位是伏特十万分之一(微伏),脑电图本质上就是一个极灵敏的电压表的测量结果。

D. 当我们使用脑电图感应器测量出大脑的电活动后,就可以用数学知识来处理这些信号。结合脑科学上的知识,我们将电极放置在大脑皮层(大脑右额叶,位于前额右下部),同时采集了中立参考点的信号(例如用户的耳朵,那里没有神经元。,据此我们可以计算出人们的大脑对事物注意的程度——是专注还是放松。

 

10   致谢 

最后,感谢以下给了这个项目很大帮助的人和机构:NoisebridgeHackerspace

Miloh Alexander, Jake Walters, Tony Roberts, Paul Tonkin, Greg Smith, Chris Hellyar