精神控制无人机
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 4 | ||||
| × | 4 | ||||
| × | 12 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
| ||||
|
应用和在线服务
| ||||
|
关于这个项目
背景
我发现无人机很迷人,那些可以做任何事情的小型飞行器。当我有机会用很酷的技术做一个项目时,我决定让一个男孩的梦想成真,用你的意念控制一架无人机。
在研究中,我为这个项目所做的我没有找到任何涵盖如何轻松破解无人机控制器的教程。大多数可用的教程都是关于如何使用 Arduino 创建自己的无人机或如何破解传输协议。
本教程涵盖了破解 PCB 以对其进行数字控制的最基本概念。本教程的目的是向您学习基本概念,使您能够使用无人机进行自己的实验并创造一些有趣的东西。
通知
您可能会杀死无人机或控制器并使其无法使用。
该项目不会涵盖如何引导您的无人机仅升空和着陆。
您不一定需要 MindWave / EEG 传感器,您可以使用任何您想要的输入。但是用意念控制无人机真是太棒了!
视频教程
您需要的技能
本教程假设您有一定的焊接和拆焊经验。
零件清单
- 无人机 + 控制器
- 焊台 + 配件(编织铜线、拆焊泵、帮手、实芯线、锡)
- 万用表
- MindWave 传感器
- Arduino MKR1000
- 面包板
- 4 个 100uF 电容器
- 4 个 220Ω 电阻器
- 12x 跳线
- 6 条鳄鱼夹线(可选)
您还需要 4 个电阻值未知的电阻器。
第一阶段:无人机 PCB
您几乎可以使用任何您想要的无人机。大多数控制器使用两轴操纵杆。我们要绕过的那些操纵杆。P>
首先,打开控制器的外壳。该控制器使用两节约 3.3v 的 1.5v 电池。该值与 Arduino MKR1000 的输出相同。
可以使用您喜欢的另一个 Arduino,但请注意,如果您给它提供 PCB 可以处理的更多电压,您可能会损坏电路板。 (我是经验之谈。)
用万用表测量操纵杆通电后的中、高、低电压是多少。写下来以备后用。
从 PCB 上拆下操纵杆组件。
实际上,这些操纵杆组件只是电位计。电位器是一种模拟可变电阻器。您可以用万用表测量最大电阻。将万用表连接到 + 和 - 以读取电阻。
在操纵杆的 + 和 - 的孔上焊接(在这种情况下为 10Ω 电阻器)4 个电阻器以完成电路。
此外,将实芯线焊接到 PCB 上的 +(此板上的 B+)和 -(此板上的 B-)端口。并将实芯线焊接到操纵杆的信号端口。
现在您已经为下一步准备好了控制器。
第 2 阶段:数字到模拟
当您在 Arduino 上使用 AnalogWrite 时,输出将是 PWM(脉宽调制)信号。胜利将以确定的频率将自己的值变为高和低。
我们准备的PCB不喜欢PWM,它期望一个稳定的电压。
为了创建模拟值,我们可以使用各种数模转换器,例如 DAC 芯片或 RF 梯形滤波器。
因此,我想让这个项目尽可能简单,我将向您学习如何使用低通滤波器,这将为我们提供所需的输出。
要创建低通滤波器,您需要一个电容器和一个电阻器。
低通滤波器的特性之一是模拟电压会逐渐变化(需要一些时间)。这个电路最适合我,因为它给了我想要的结果并且使用了少量的零件。
第 3 阶段:Arduino 电路
我们电路的主要部分是我们最近创建的低通滤波器。将其中的四个连成一排,我们就有了所有四个控制器输入的模拟电压。
将正确的输出连接到控制器 PCB 上的正确输入。在上传 Arduino Sketch 之前,请确保您正确获取它。
标准的无人机布局如下:
- 油门 => 在控制器左侧向上/向下
- 偏航 => 控制器左侧的左/右
- Pitch => 在控制器右侧向上/向下
- 滚动 => 在控制器右侧向左/向右
一切都连接好后,您可以将您的草图上传到您的 Arduino MKR1000。您可以在本教程底部找到草图。
Arduino 将更换电池并可以向绕过的操纵杆发送信号(作为电压)。此时,您可以通过实验构建自己的程序来使用 PWM 控制无人机。
我现在将向您展示如何使用 Processing 和 MindWave 传感器将无人机升空。
阶段 4:精神控制
在您的计算机上安装所有驱动程序。该 MindWave 传感器随附一张 CD。
通过蓝牙将 MindWave 传感器与您的计算机配对。按住按钮 3 秒钟,蓝色 LED 会闪烁两次,现在可以发现了。
一旦连接,您就开始处理。
从 http://jorgecardoso.eu/processing/MindSetProcessing/#download
安装 Jorge C. S Cardoso 创建的 MindSet 库进行处理将库解压缩到您的库文件夹中。您可以在处理文件夹中找到库文件夹。
确保您的通讯端口在设置中正确,否则最终会出现错误。您可以在设备管理器中找到通讯端口。
您还可以在 Arduino IDE 的“Port”的“Tools”下找到 Arduino 的 com-port
您还可以在“选项”下的 ThinkGear Connector 首选项(安装驱动程序时获得此程序)中找到 MindWave 传感器的通讯端口
receiver =new Serial(this, "COM10", 115200); mindSet =new MindSet(this, "COM5");
处理通过串行与您的 Arduino 通信。您可以根据自己的喜好更改处理代码,阅读草图中的注释以了解发生了什么。
运行您的处理草图并专注于您的无人机。当您的注意力水平超过 40% 时,无人机将起飞。你越集中注意力,无人机就越具有攻击性。您可以通过让您的思绪飘散并停止集中注意力来降落无人机。
结论
我希望本教程能让您深入了解破解无人机控制器(或任何 PCB)并为其提供另一个输入是多么简单。您可以通过实验找出如何控制其他输入以及如何进行除升空和着陆之外的其他动作。
我很高兴看到你们会做出什么很酷的东西!
代码
- 处理大师
- 无人机控制
加工大师加工
通过蓝牙串行连接到 MindWave 传感器,并将注意力值作为 8 位整数发送到控制器/* * Drone mind control * * 此草图将串行值发送到接收器接收器 * * 输入是通过Neurosky MindSet 移动耳机 * * 于 2018 年 3 月 21 日创建 * 由 Wesley Hartogs * 通信和多媒体设计 * 埃文斯应用科学大学 * * */// import Serial libaryimport processing.serial.*;// 定义接收器 Serial Serial receiver;// 导入MindSet libaryimport pt.citar.diablu.processing.mindset.*;MindSet mindSet;// 设置初始值 int油门 =0;int yaw =127;int pitch =127;int roll =127;void setup() { size(150, 500); // 在 COM10 接收器处启动串行通信 =new Serial(this, "COM10", 115200); // 启动 MindSet 通信 // MindSet 使用蓝牙串行通信, // 检查设备管理器中 ThinkGear 连接器中的 COM-pot mindSet =new MindSet(this, "COM5"); // 启用抗锯齿平滑(); // 设置笔触属性strokeWeight(5);行程(255);中风帽(方形); // 设置线条颜色填充(255); } // setup()void draw(){ // 从黑色背景开始 background(0); // 从底部绘制水平线到 40% // 这条线表示需要最少(40%)的注意力 line(0, height*0.60, width, height*.60); // 从水平中心向上画一条线 // 这条线表示您的注意力 // 高度反向映射以获得从顶部开始的百分比 // 示例:通过 40% (0.4) 注意力,高度值为 ( 100 - 40) 60% (0.6) 从顶线(宽度* .5,高度,宽度* .5,高度*地图(浮点(注意力水平)/ 100, 0, 1, 1, 0 )); // 将注意力级别推到油门变量 // 40 =做某事所需的最小注意力 // 100 =最大注意力 // 30 =Arduino 的 8 位最小值 // 255 =Arduino 油门的 8 位最大值 =int( map( attentionLevel, 40, 100, 30, 255 ) ); // 将值限制为 8 位值以防止错误油门 =约束(油门, 0, 255);音高 =约束(音高,0, 255);滚动 =约束(滚动,0, 255);偏航 =约束(偏航,0, 255); // 当有可能进行通信时,将值发送到 Arduino 接收器 if (receiver .available()> 0) { println( "attentionLevel:"+attentionLevel+" Throttle:"+throttle+" yaw:"+yaw+" pitch:"+俯仰+" 滚:"+滚);接收器 .write("油门:"+油门+" 偏航:"+偏航+" 俯仰:"+俯仰+" 滚转:"+滚); } } // draw()// Killswitch,按K重置并关闭程序void keyPressed() { if (key =='k' || key ==ESC) { if ( receiver .available()> 0) {接收器 .write("油门:"+0+" 偏航:"+127+" 俯仰:"+127+" 滚转:"+127);出口(); } }}// MindSet 变量和函数int signalStrenght =0;int attentionLevel =0;public void attentionEvent( int attentionLevel_val ) { attentionLevel =attentionLevel_val;}//当与MindSet的连接不是最优时激活该函数public voidpoorSignalEvent(int signalNoise ) { // MindSet 正在调整 if (signalNoise ==200 ) { println( "Mindset 没有触及你的皮肤!" ); } // 将信号强度映射到百分比 signalStrenght =int( map( ( 200-signalNoise ), 200, 0, 100, 0 ) ); println( "信号强度:" + 信号强度 + "%" );}
无人机控制Arduino
他的草图接收串行输入值(来自处理)并将这些值发送到被黑控制器。/* * Drone control * * 此草图接收串行输入值(来自处理)并将这些值发送到被黑控制器。 * 仅将此程序与 Arduino MKR1000(或其他基于 3.3 伏输出的 Arduino)一起使用 * * 电路:* - 4 个低通滤波器,带有 100 µF 电容器和 220Ω 电阻器 * - 被黑的无人机控制器 * * 于 2018 年 3 月 21 日创建 * 作者:Wesley Hartogs * 通信和多媒体设计 * 埃文斯应用科学大学 * * 使用此草图风险自负。 * */// 设置初始值 int油门 =0;int yaw =255/2; // 3.3v / 2int 间距 =255/2; // 3.3v / 2int roll =255/2; // 3.3v / 2int油门Pin =2; // PWMint yawPin =3; // PWMint pitchPin =4; // PWMint rollPin =5; // PWMvoid setup() { // 以 115200 波特开始串行通信 Serial.begin(115200); // 设置 pinModes pinMode(throttlePin, OUTPUT); pinMode(yawPin, 输出); pinMode(pitchPin, OUTPUT); pinMode( rollPin, OUTPUT );}void loop() { // 当有可用的串行连接时,获取值 if ( Serial.available()> 0 ) { Throttle =Serial.parseInt(); // 存储串行缓冲区中的第一个整数值 yaw =Serial.parseInt(); // 存储来自串行缓冲区的第二个整数值 pitch =Serial.parseInt(); // 存储来自串行缓冲区的第三个整数值 roll =Serial.parseInt(); // 存储来自串行缓冲区的第四个整数值 } // 将值写入无人机控制器 // 使用低通滤波器或 DAC(数模转换器)将 PWM 转换为模拟电压模拟写入(油门引脚,油门);模拟写入( yawPin, yaw );模拟写入(pitchPin,pitch);模拟写入(rollPin, roll );}
示意图
将 PWM 信号转换为模拟电压 将 Arduino MK1000 连接到被黑控制器的电路制造工艺