您需要做一个飞行控制器
- 树莓派 3 或更高版本
- 微型街机风格操纵杆
- 10 个按钮
- 4 x 螺钉端子 (4 极)
- 45 针至公跳线
- 4 英尺电线
- 面包板
- 安装控件的情况。
- 具有小钻头和阶梯式钻头的电钻
- 焊接设备,包括热缩管和剥线钳
- 万用表
树莓派飞行控制器的接线和硬件
1 在这种情况下,标记控件的放置位置。这样做是为了确保所有组件都有空间,并且使用起来舒适。
2 使用小钻头,在组件上钻一个导向孔。交换到阶梯式钻头上,并进行钻孔以匹配组件的尺寸。经常停下来检查尺寸。同时钻一个 ½ 英寸的孔,将电线引到 Pi 上。
3 测试是否适合所有组件。
4 从外壳上取下操纵杆,并确保在焊接之前将其牢牢固定。准备工作区,然后加热烙铁。
5 如果游戏杆在外壳周围有四个开关,请在每个开关上寻找 COM 。在 COM 连接器上施加少量焊料。如果操纵杆只有一个带有五个引脚的连接器,则在 COM/GND 引脚上施加少量焊料。
6 取导线的长度,从末端剥去 1/4 英寸,然后将裸线扭成螺旋状。在导线上涂少量焊料。将导线焊接到操纵杆上的 COM/GND 引脚上。如果您使用带有五针操纵杆的单个连接器,请跳至步骤 9 。
7 移至下一个 COM 引脚,并测量至 COM 引脚的导线。在测量中再增加 ½ 英寸,然后使用剥线钳露出电线。请勿切断电线!
8 在电线裸露的情况下,将少量焊料流到裸线上,然后将其小心地焊接到 COM 引脚上。对其余的 COM 引脚重复此过程。
9 将操纵杆安装到外壳中,并用螺钉固定在中。也将按钮安装到外壳中并固定在中。**
10 将电线从操纵杆的 COM/GND 引脚连接到第一个按钮的一根支脚。在电线的长度上再加上 ½ 英寸,并从电线上剥去套管。但是不要切断电线。 在裸线和按钮的一只脚上流一点焊料。 使用更多的焊料将导线连接至按钮的腿。 在每个按钮上用一只脚重复此操作。
11 修剪电线,使其有大约 6 英寸的松弛。剥去电线的末端,扭绞裸线,并在电线上流一点焊料。
12 从四根跳线中切出母头。剥去套管,将裸线拧成螺旋状。对于每根线将焊料流到裸铜线上。可选步骤是使用热缩管将电线固定到插针,并防止意外的电气短路。
13 将焊料流到操纵杆上每个开关的 NO (常开) 连接上。如果使用单个连接器的五针操纵杆,则将少量焊料流到四个连接器上。将跨接线连接到连接。
14 切开十根跳线的凹入端,剥去套管,扭绞线,并在每根裸线上流一点焊料 **。** 可使用热缩来防止电气短路。
15 使用少量焊料,将跳线连接到每个备用按钮支腿上,,然后将热缩管滑到支腿上,并加热管以将其收缩到位。
现在应该有 15 个连接。从所有按钮,操纵杆的方向来看,以及一个单独的 GND 连接,该 GND 连接到操纵杆上的每个 COM 引脚以及每个按钮的一条腿。
16 将万用表设置为连续模式,并将一根探针放在 COM/GND 连接的一端,另一根置于尖端的裸线 **。您应该会听到一声哔哔声,确认已正确连接所有设备。
17 将四个螺钉端子插入面包板,然后从操纵杆上取下跨接线,注意上,下,左和右。**** 将电线插入面包板 * * 使它们与螺钉成一直线。
18 对每个按钮的所有跳线重复此操作,最后对具有自己的螺钉端子的 GND 连接进行重复。使用中应有 15 个螺钉端子,以及一个备用端子。
19 请使用两根母对公跳线。将它们连接在一起以形成更长的跳线。在连接处滑动一段热缩并加热连接以固定它。可以使用胶带代替热缩。重复此过程,以便有 15 根延长线。
20 将电线的公端拧入螺钉端子,然后穿过外壳的孔。记下每根电线的连接方式。我们使用了标签打印机,但是胶带和笔也可以正常工作。
21 按照图示将按钮连接到树莓派上的 GPIO 。
22 连接您的 Pi 配件并将树莓派引导到桌面。
树莓派 Flight Controller 的软件设置
23 ** 打开终端并安装 pynput **,这是一个用于模拟键盘输入的 Python 模块。
sudo pip3 安装 pynput
24 从编程菜单中打开 Thonny 。
25 导入三个模块,用于键盘模拟的 Pynput ,用于与 GPIO 引脚配合使用的 gpiozero ,以及控制项目进度的时间。
从 pynput.keyboard 导入密钥,控制器
从 gpiozero 导入按钮
从进口睡眠开始
26 在 Pynput 代码和虚拟键盘之间建立连接。
键盘= Controller ()
27 每个按钮和操纵杆都物理连接到树莓派的 GPIO ,现在我们需要” 告诉 Python 在哪里可以找到每个按钮”**,并且需要为每个按钮提供一个参考,以告诉我们该按钮的用途。
向上=按钮(27)
向下=按钮(17)
左=按钮(10)
右=按钮(22)
F1 =按钮(9)
F2 =按钮(11)
F3 =按钮(5)
F4 =按钮(6)
F5 =按钮(13)
F6 =按钮(19)
F7 =按钮(26)
F8 =按钮(21)
齿轮=按钮(20)
查看=按钮(16)
28 创建一个无限循环,该循环将不断运行代码。
而 True:
在循环内部,我们开始一系列条件语句,这些测试将在循环结束时检查每个按钮 / 操纵杆方向的状态。如果按下按钮,则运行该测试的代码。第一个测试是查看操纵杆是否被按下。如果是这样,则代码将模拟每 0.1 秒按下向上箭头键。
如果 Up.is_pressed:
打印("向上")
keyboard.press (Key.up)
睡眠(0.1)
keyboard.release (Key.up)
30 下一个测试将检查是否已按下向下方向。
Elif Down.is_pressed:
打印("下")
键盘按下(Key.down)
睡眠(0.1)
keyboard.release (Key.down)
31 输入左右的代码。
Elif Left.is_pressed:
打印("左")
keyboard.press (Key.left)
睡眠(0.1)
keyboard.release (Key.left)
elif Right.is_pressed:
打印("右")
keyboard.press (Key.right)
睡眠(0.1)
keyboard.release (Key.right) 32 **将推力键**映射到 F1 至 F4 。 F1 将引擎打开至 25 %的功率,而 F4 则为全功率。这些被映射到控制器上的第一行按钮。
elif F1.is_pressed:
打印("发动机功率 25 %")
keyboard.press (Key.f1)
睡眠(0.1)
keyboard.release (Key.f1)
elif F2.is_pressed:
打印("发动机功率 50 %")
keyboard.press (Key.f2)
睡眠(0.1)
keyboard.release (Key.f2)
elif F3.is_pressed:
打印("发动机功率 75 %")
keyboard.press (Key.f3)
睡眠(0.1)
keyboard.release (Key.f3)
elif F4.is_pressed:
打印("发动机功率 100 %")
keyboard.press (Key.f4)
睡眠(0.1)
keyboard.release (Key.f4)
33 ** Map Flap 控件,用于创建拖动,到 F5 到 F8 **,这是控制器上的第二行。
elif F5.is_pressed:
打印("襟翼位置 1")
keyboard.press (Key.f5)
睡眠(0.1)
keyboard.release (Key.f5)
elif F6.is_pressed:
打印("襟翼位置 2")
keyboard.press (Key.f6)
睡眠(0.1)
keyboard.release (Key.f6)
elif F7.is_pressed:
打印("襟翼位置 3")
keyboard.press (Key.f7)
睡眠(0.1)
keyboard.release (Key.f7)
elif F8.is_pressed:
打印("襟翼位置 4")
keyboard.press (Key.f8)
睡眠(0.1)
keyboard.release (Key.f8)
34 将最后两个按钮映射到起落架,并更改视图。
elif Gear.is_pressed:
打印("齿轮切换")
keyboard.press ("g")
睡眠(0.1)
keyboard.release ("g")
Elif View.is_pressed:
打印("查看切换")
keyboard.press ("s")
睡眠(0.1)
keyboard.release ("s")
35 将代码另存为 flight.py **,然后单击开始按钮 ** 以运行。
36 打开网络浏览器,以 ** https://s-macke.github.io/FSHistory/** 并确保浏览器窗口被选中。现在抓住您的控制器,按 100 %的推力,看着周围的世界变成您控制之下的 1980 年代飞行模拟器!
完整的代码清单
从 pynput.keyboard 导入密钥,控制器
从 gpiozero 导入按钮
从进口睡眠开始
键盘= Controller ()
向上=按钮(27)
向下=按钮(17)
左=按钮(10)
右=按钮(22)
F1 =按钮(9)
F2 =按钮(11)
F3 =按钮(5)
F4 =按钮(6)
F5 =按钮(13)
F6 =按钮(19)
F7 =按钮(26)
F8 =按钮(21)
齿轮=按钮(20)
查看=按钮(16)
而 True:
如果 Up.is_pressed:
打印("向上")
keyboard.press (Key.up)
睡眠(0.1)
keyboard.release (Key.up)
Elif Down.is_pressed:
打印("下")
键盘按下(Key.down)
睡眠(0.1)
keyboard.release (Key.down)
Elif Left.is_pressed:
打印("左")
keyboard.press (Key.left)
睡眠(0.1)
keyboard.release (Key.left)
elif Right.is_pressed:
打印("右")
keyboard.press (Key.right)
睡眠(0.1)
keyboard.release (Key.right)
elif F1.is_pressed:
打印("发动机功率 25 %")
keyboard.press (Key.f1)
睡眠(0.1)
keyboard.release (Key.f1)
elif F2.is_pressed:
打印("发动机功率 50 %")
keyboard.press (Key.f2)
睡眠(0.1)
keyboard.release (Key.f2)
elif F3.is_pressed:
打印("发动机功率 75 %")
keyboard.press (Key.f3)
睡眠(0.1)
keyboard.release (Key.f3)
elif F4.is_pressed:
打印("发动机功率 100 %")
keyboard.press (Key.f4)
睡眠(0.1)
keyboard.release (Key.f4)
elif F5.is_pressed:
打印("襟翼位置 1")
keyboard.press (Key.f5)
睡眠(0.1)
keyboard.release (Key.f5)
elif F6.is_pressed:
打印("襟翼位置 2")
keyboard.press (Key.f6)
睡眠(0.1)
keyboard.release (Key.f6)
elif F7.is_pressed:
打印("襟翼位置 3")
keyboard.press (Key.f7)
睡眠(0.1)
keyboard.release (Key.f7)
elif F8.is_pressed:
打印("襟翼位置 4")
keyboard.press (Key.f8)
睡眠(0.1)
keyboard.release (Key.f8)
elif Gear.is_pressed:
打印("齿轮切换")
keyboard.press ("g")
睡眠(0.1)
keyboard.release ("g")
Elif View.is_pressed:
打印("查看切换")
keyboard.press ("s")
睡眠(0.1)
keyboard.release ("s")
睡眠(0.1)
其他:
打印("未按下任何按钮")