【无需切换固件】用电脑控制Switch教程
wwwwwwzx
编辑于 2020年01月31日 02:02
收录于文集
共2篇

本文将介绍如何运用单片机作为中介,从PC/Mac/Linux端控制switch的按键操作。

更新

  1. 增加孵蛋脚本(hatch_egg.py)可以自行切换来孵化任意圈数的宝可梦。该脚本使用旷野地带的孵蛋屋,使用前清空默认盒子,只保留一只同行(例如火躯),并打开菜单后,连续按A能默认飞到旷野地带的蛋屋。开始代码时退出到大地图即可。

  2. 增加自动放生脚本(release.py)可以自行修改需要放生盒子内的宝可梦数,盒子内需从左到右紧密排布

  3. 增加自动刷日期脚本(change_date.py)可以自行修改运行次数。为了刷乱数帧,需先触发VS对战bug

  4. 增加自动四大天王脚本(league.py)

默认已知

1. 刷固件进单片机 参见这里​

2. 如何运行python代码

3. 基本编程基础。实际上十分简单,照葫芦画瓢即可,我也提供了一些样例,例如 advance_frame.py 是宝可梦剑盾团体战乱数​连续刷帧(3帧)的按键流程写法

硬件需求

1. 单片机 (Arduino UNO R3)

2. USB 转 TTL 模块 (FT232RL)

3. USB 线若干 (例如USB Type B 转 Type A, mini USB 转 Type A这些) 导线若干

加起来几十块就能搞定

软件需求

可以从我的fork里下载:https://github.com/wwwwwwzx/Switch-Fightstick

注:我改的版本可以同时按下多个按键 这样可以在旷野地带绕圈(参考circle_in_wild_area.py)

1. Joystick.hex (我已经编译好了atmega16u2的版本,直接刷进Arduino UNO R3即可)

2. NSController.py(python类文件,基本写好了接口,其他代码需要调用到它)

3. Python样例,连同上一个文件见 example 文件夹

4. 安装pyserial,命令行 pip install pyserial 即可

连线

控制方向如下:

电脑端(PC/Mac/Linux)  -> USB到TTL模块 -> 单片机 -> [Switch底座 (充电或视频采集用,非必须) ->] -> Switch

连线图

其中USB转TTL模块与单片机的连线见图示 (注意电源线VCC和地线GND不要连错,有些模块可能需要3.3V 需要看清说明)

使用方法

1)将我提供的Joystick.hex刷入单片机中 (只需一次即可,以后就不用再刷了)

      注:此时单片机直接连电脑

2)按上图连线,并断开其他手柄的连接

3)运行示例 simple_example.py ,保证NSController.py在同一文件夹内

      这段代码作用是连按A键十下

      如果检测到多个硬件(“Found multiple devices”),且不是第一个,把对应USB模块的地址带上引号作为字符串输入到Controller 的括号里即可(通过插拔模块可以分辨)

       例如看到

Found multiple devices: /dev/cu.usbserial-A50285BI /dev/cu.usbserial-AO0099VT

       而第二个是你连switch的,那么把第三行修改成 ctr = Controller('/dev/cu.usbserial-AO0099VT&#​39;) 再次运行即可

       如果没有响应,可以尝试对调一下TX RX的接线。指令发出的时候模块上TX RX两个灯都会亮

4)如果成功了,那可以试试参考我的样本编写复杂的自动化流程了。

键位对应表

  • X Y A B L R ZL ZR 直接原名调用即可, 如ctr.A() 就是按下A键

  • 主页键(h),截图键(c),加号键(p),减号键(m)

  • 按下左摇杆(LS),按下右摇杆(RS)

  • 十字键上(u)下(d)左(l)右(r)

  • 左摇杆上(ls_u)下(ls_d)左(ls_l)右(ls_r)

  • 右摇杆上(rs_u)下(rs_d)左(rs_l)右(rs_r)

然后函数内的数字可以控制按键的时间长短,以秒为单位,非正则保持不松开,如:

  • ctr.A() :按下A键后马上松开(默认按下0.1秒)

  • ctr.B(22) :按下B键22秒后松开

  • ctr.ls_r(-1) 或 ctr.ls_r(0) :将左摇杆向右推并保持,不松开

其他操作

  • ctr = Controller() 创建一个名为ctr的实例,并自动连接

  • ctr.release() 松开所有按键和摇杆

  • ctr.close() 断开控制

  • ctr.pause(33) 等待33秒

还有一些简单示范如

  • ctr.quit_app() 退出当前游戏

  • ctr.AccessBackupSave() 同时按下上+X+B来调用剑盾备用存档 等

总结

(1)这样就不用为了实现不同的功能而反复刷固件,只需在电脑上运行不同python代码段即可。孵蛋圈数不同也可以自己调。有些地方可以自行减少等待时间提高效率,有些地方增加时间提高稳定性。自由度增加许多。

(2)为了编写自己的固件也不用反复调试操作时机的时间轴(在原本程序构架上实现也不是很直觉)【我是为了之后可能的其他机械(乱数)操作,又懒得反复调时间就这么搞了】

(3)将来可能可以写个app 用键盘实时控制switch

(4)结合采集卡读出画面,甚至还可以反复读档在LGPE里刷闪超梦三鸟等