··

低成本使用单片机模拟switch joycon手柄

Note

本教程需要你拥有一张ESP-32STM32或者CH32开发板。并且本文只基于ESP-32进行讲解。

1 前言

本文只是一个粗浅的教程,详细可以加QQ群946057081讨论。
在开始正文前,我想先列举一下我尝试过的方案。

  • NXBT:这是目前最火的项目,但是它要求使用树莓派或者linux系统的PC。
    树莓派太贵,所以我没采用。
    之后我又折腾过 WSLVMWareVirtualBox,但是都没成功。
    VMWare是我最接近成功的一次,有兴趣各位可以试试。
    而且此项目年久失修,我估计switch到16.0固件以后就没法用了。
  • NintendoSwitchController: 纯日语项目,很不友好,需要Arduino Leonardo,贵。
  • EasyCon:本文主角。支持多种单片机,价格控制在50元人民币以内,可以自制脚本,接上采集卡还能使用图像识别(采集卡要另外买,差不多200来块),功能强大。

2 准备工作

2.1 下载整合包

首先,你需要下载整合包。
这里我提供了交流群中2022年12月更新的文件:
{{< tabs >}} {{< tab “ESP-32” >}} {{< button label=“点击下载ESP32整合包” link=“https://cdn.hluvmiku.tech/download/ESP32.zip” style=“solid”>}} {{< /tab >}} {{< tab “STM32” >}} {{< button label=“点击下载STM32整合包” link=“https://cdn.hluvmiku.tech/download/STM32.zip” style=“solid”>}} {{< /tab >}} {{< tab “CH32” >}} {{< button label=“点击下载CH32整合包” link=“https://cdn.hluvmiku.tech/download/CH32.zip” style=“solid”>}} {{< /tab >}} {{< /tabs >}}

你可以根据自己的需求选择下载不同的文件。

2.2 购买对应的开发板

建议根据下载的整合包里的PDF文件购买开发板。

2.2.1 ESP-32

我使用的是ESP-32

Note

请注意不要购买ESP32-CxESP32-Sx型号。
并且最好购买带有`cp2102关键字的开发版。

薄膜键盘可以不用买,但是数据线一定要买,是比较老的那种接口,具体可以问客服。
针脚可以联系客服让厂商帮你焊好(不焊也可以用)。

这里是我的购买截图

202308281615179

2.2.2 其他

请参考整合包中PDF文件进行购买。

2.3 安装驱动

如果整合包中包含驱动,则安装驱动,
若无,直接进行下一步。

2.4 烧录固件

所有的整合包中都包含EasyCon固件以及烧录文件,你可以直接烧录。

下面我将以ESP-32为例进行讲解。

1、 启动烧录程序。点击烧录程序后,选择ESP32,然后点击OK

你应该会看到如图所示界面

202308281630772

202308281632607

2、 点击...,选择整合包中的固件,并选中。在后方的地址输入 0x0。并选择正确的串口。

202308281635066

3、 点击start

出现如图所示的界面代表烧录成功

202308281638726

3 使用EasyCon

3.1 下载EasyCon并使用

你可以在这里找到对应文件。
下载并解压他们。

打开后你会看到这样的界面。

202308281640429

点击自动连接即可与开发版连接。

3.2 EasyCon语法介绍

按键

  • 语法:键位 [持续时间(ms)|DOWN|UP]
  • 示例:A(按下A键50毫秒)、HOME 1000(按下Home键1秒)、LEFT DOWN(按住左十字键,需要手动用LEFT UP松开)
  • 全部按键:ABXYUPDOWNLEFTRIGHTMINUSPLUSLRZLZRHOMECAPTURE

摇杆

  • 语法:
    • LS|RS 方向|角度 [, 持续时间(ms)]
    • LS|RS RESET
    • LSS|RSS 方向 (1.45新增慢推语法,仅支持方向,不支持角度)

等待

  • 语法:[WAIT] 等待时间(ms)
  • 示例:WAIT 5002000

注释

  • 语法:# 注释内容
  • 注意:多写注释是个好习惯,尤其是分享脚本给别人的时候。

输出

  • 语法:PRINT 输出内容
  • 注意:联机模式专用,在控制台显示文字。

消息推送

  • 语法:ALERT 输出内容
  • 注意:联机模式专用,发送推送消息,基于推送加服务。需要先关注<pushplus推送加>小程序生成token并在设置->推送设置页面配置。

循环

  • 语法:
    • FOR [循环次数]

      NEXT

常量与变量

  • 常量语法:常量名 = 值
  • 变量基础语法:$索引
  • 变量进阶语法:$变量名$$变量名

赋值

  • 语法:目标变量 = 值目标变量 = 来源变量

含变量的基础语句

  • 输出:PRINT 用&分隔的输出内容
  • 按键:键位 变量名
  • 摇杆:LS|RS 方向|角度 变量名
  • 等待:WAIT 变量名

条件分支

  • 语法:
    • IF 条件

      ELSE … ENDIF

4 部分脚本

自动刷活动 > [!note] >

需要不在同行第一只宝可梦放刷活动用宝可梦,并且该宝可梦第一个技能应该为需要使用的技能。
使用时,需连接网络,并进入联机太晶对战界面再运行脚本。
此外,还需要将捕捉用的精灵球选择为普通球(否则太浪费)并且买999个。

FOR
X 100
WAIT 100
A 100
WAIT 100
NEXT
自动取孵
#1.语速调到最快,关闭取名,关闭学技能,自动记录最好关闭
#2.将【园模镇:西】标记为目的地,并打开原地旋转模式
#3.同行携带要生蛋的两只宝可梦
#4.将盒子打开的界面调成将要放蛋的第一个空箱子
#5.放蛋的空箱子的前一个箱子第一列空出来,第二列只放火焰之躯宝可梦【孵蛋用】
#6.菜单界面光标默认调到野餐,脚本开始时人物退出盒子,退出菜单,并骑上神兽
#7.初始站位需站在园模镇橄榄球场远离可梦中心球筐左侧,面朝宝可梦中心,球筐在右侧
#8.默认20周期的,孵其他宝可梦,孵蛋时间需自行调节,料理位置按自己的配方调整
#9.部分延时为防止卡顿,加的时间有点长,可自行修改,如果野餐不成功,请重新开始即可
#10.by 倚夏&law 宝可梦取孵一体脚本2.86【圆模镇】(往复式孵蛋)
#【※※※※运行前清修改数值※※※※】
#======初始数值调整【必看】======
_孵蛋箱数 = 1 #需自行计算箱数,一次料理54+颗蛋左右【一次料理,孵蛋两箱,约1.5小时】
_孵蛋周期 = 25 #直接填写孵蛋宝可梦的孵蛋周期,可看下方的周期表
_料理次数 = 4 #一次料理54颗蛋左右,根据料理次数换算成你要孵蛋的箱数
_料理位置 = 8 #就是17号配方【超级花生酱三文治】在第几行
_料理左右 = 0 #就是17号配方【超级花生酱三文治】在 0左 还是 1
_跳过野餐 = 1 #1开启,不进行野餐直接孵蛋,初始站位不变,并将光标放到孵蛋的第一箱第一个蛋,同行只有一只孵蛋用宝可梦
_蛋蛋力LV3 = 1 #1开启,将制作蛋蛋力LV3,需要两个甜味料和一份生菜,一次料理85颗左右
_甜味料位置 = 5 #倒数第几行
#======进阶调整数值【可选】======
_孵蛋延时 = 60 #默认60,如果存在没孵出来的蛋,打开图鉴或者服装,自行加大,每加1延迟孵蛋时间2秒
_拿取延时 = 100 #默认100,改小增大吞键可能性
_按键延迟 = 500 #默认500,按键间隔的延迟
_复位功能 = 1 #1开启 0关闭
_复位周期 = 3 #几箱复位一次
_往对侧 = 3500 #往球场对侧方向行走时间
_往中心 = 1500 #往球场中心方向行走时间
_闪光识别 = 0 #1开启,需用采集卡,并自制标签,烧录需注释【@闪光】
_自动放生闪光识别 = 0 #1开启,需用采集卡,烧录需删除放生代码
#自行按照以下周期选择适合的(周期数据查询神奇百科)
#网站:https://wiki.52poke.com/wiki/宝可梦列表(按孵化周期分类)
#孵蛋时间有盈余的,会在第一个蛋的界面空转几圈
#5周期= 5 例如鲤鱼王
#10周期=10 例如一对鼠
#15周期=15 例如斗笠菇
#20周期=20 例如小火龙
#25周期=25 例如冰砌鹅
#30周期=30 例如沙河马
#35周期=35 例如伊布
#40周期=40 例如烈咬陆鲨
#函数--------------------------
FUNC POINT #朝向目的地
600
Y 200
2700
B 200
2000
L 100
400
ENDFUNC
#函数--------------------------
# 准备阶段
FOR 5
RCLICK
200
NEXT
#开始运行
$5 = _跳过野餐
IF $5 = 0
#自动野餐----------------------------------------------------
PRINT 自动野餐开始
CALL POINT
LS 270,500
500
LS 270
B 200
WAIT 1500
LS RESET
300
LS 90,2000
200
PLUS 200
300
LS 270,700
CALL POINT
PRINT 走到野餐位置,开始野餐
FOR 3
X 50
50
NEXT
FOR 5
50
A 100
50
NEXT
WAIT 7000 #等待野餐时间
L 500
WAIT 1000
#走到篮子位置
LS UP,200
WAIT _按键延迟
LS LEFT,320
WAIT _按键延迟
LS UP,500
WAIT _按键延迟
LS RIGHT,330
WAIT _按键延迟
LS DOWN,300
WAIT 500
#做料理
$1 = 1
FOR _料理次数
500
PRINT 开始做料理
LS DOWN,200
WAIT _按键延迟
FOR 10
50
A 100
50
NEXT
WAIT 5000 #等待选配方界面
$5 = _蛋蛋力LV3
IF $5 = 0
#17号料理 根据料理位置设置次数
PRINT 制作17号料理
$4 = _料理位置
$4 -= 1
FOR $4
LS DOWN,100
100
NEXT
$4 = _料理左右
#判定料理配方在左右
IF $4 = 0
#在左
WAIT 100
ELSE
#在右
LS RIGHT,100
WAIT 200
ENDIF
WAIT _按键延迟
FOR 5
50
A 100
50
NEXT
WAIT 8000
#开始做三文治
FOR 3
LS 90,550
100
A DOWN
100
LS 270,525
A UP
100
NEXT
#放面包和签子
WAIT 3000
LS UP,550
WAIT _按键延迟
FOR 120 #等三文治转圈画面
50
A 100
50
NEXT
$5 = 7 #蛋蛋力LV2拿蛋7轮
$4 = 23
ELSE
PRINT 制作蛋蛋力LV3料理
$4 = _甜味料位置
X 200
200
A 200
200
PLUS 200
200
FOR $4
100
UP 100
100
NEXT
200
FOR 2
100
A 100
100
NEXT
200
PLUS 200
200
A 200
WAIT 8000 #等待做料理
LS UP,550
FOR 130 #等三文治转圈画面
50
A 100
50
NEXT
$5 = 10 #蛋蛋力LV3拿蛋10轮
$4 = 16
ENDIF
8000 #吃料理时间
A 200
2000
PRINT 吃料理时间
PRINT 吃了 & $1 & 次料理
$1 += 1
LS UP,45
WAIT _按键延迟
# 拿蛋阶段
PRINT 开始拿蛋
$3 = 1
FOR $5
#等待过程中每10秒吹一次口哨
FOR $4
R 200
WAIT 10000
NEXT
#连A拿蛋
FOR 52
A 100
WAIT 300
NEXT
#连B取消对话框
300
B 100
WAIT 300
B 100
WAIT 300
#循环一次时间5分
PRINT 拿蛋 & $3 & 轮
$3 += 1
NEXT
# 返回循环做料理
NEXT
PRINT 野餐拿蛋结束
# 结束野餐
2000
FOR 5
50
Y 100
50
NEXT
FOR 13
150
A 200
150
NEXT
200
PRINT 开始返回球场
LS 270,200
500
PLUS 600 #返回球场
500
LS 90,1200 #走到栏杆边
200
LS 90
B 300
1000
LS RESET
CALL POINT
LS 270,1000
#交换工具人----------------------------------------------------
PRINT 交换工具人
500 #拿出孵蛋宝可梦
FOR 3
X 50
50
NEXT
3000
UP 200
FOR 5
50
A 100
50
NEXT
2000
L 200
500
RIGHT _拿取延时
200
Y 200
300
FOR 2
100
LEFT _拿取延时
100
NEXT
300
FOR 2
100
DOWN _拿取延时
100
NEXT
200
A 100
200
UP _拿取延时
300
MINUS 300
FOR 5
UP
50
NEXT
100
A 100
200
RIGHT _拿取延时
200
A 100
200
R 200
500
PRINT 交换已完成
ENDIF
#自动孵蛋-----------------------------------------------------
$1 = 1 #列数 1为第一列,不要修改
$2 = 1 #已孵蛋箱数
$3 = _孵蛋周期
$3 *= 3
$3 /= 2
$3 += _孵蛋延时
$6 = 1
PRINT 开始孵蛋
FOR _孵蛋箱数
FOR 6 #盒子取蛋
500
MINUS 300
FOR 8
DOWN
50
NEXT
100
A 100
200
DOWN _拿取延时
100
FOR $1
100
LEFT _拿取延时
100
NEXT
FOR 3
A 100
100
NEXT
FOR 13
50
B 100
50
NEXT
1500
#往复式孵蛋----------------------------
LS 90,_往对侧
FOR $3
FOR 10
LS 90
A
50
NEXT
FOR 10
LS 270
A
50
NEXT
NEXT
LS RESET
LS 270,4500
#往复式孵蛋----------------------------
500 #复位
$5 = _复位功能
IF $5 = 1
IF $6 = _复位周期
IF $1 = 6
$6 = 0
LS 180,100
400
L 100
600
LS 90,2000
500
LS 270,_往中心
600
CALL POINT
ENDIF
ENDIF
ENDIF
500 #宝可梦放回盒子
FOR 3
X 50
50
NEXT
FOR 5
50
A 100
50
NEXT
2000
DOWN _拿取延时
300
LEFT _拿取延时
300
#自动放生代码【烧录需删除】--------------------------
$5 = _自动放生闪光识别
$4 = 0
IF $5 = 1
PRINT 开始放生
FOR 5
$5 = @LV
IF $5 < 95
BREAK
ENDIF
$5 = @闪光
IF $5 > 95
PRINT 第 & $2 & 箱第 & $1 & 列出闪了!!!
DOWN 100
300
$4 += 1
ELSE
FOR
$5 = @打开菜单
IF $5 > 95
BREAK
ELSE
A 100
500
ENDIF
NEXT
FOR
$5 = @放生
IF $5 > 95
BREAK
ELSE
UP 100
200
ENDIF
NEXT
FOR
$5 = @放生2
IF $5 > 95
BREAK
ELSE
A 100
1200
ENDIF
NEXT
FOR
$5 = @放生3
IF $5 > 95
BREAK
ELSE
UP 100
400
ENDIF
NEXT
FOR
$5 = @放生4
IF $5 > 95
A 100
1500
ELSE
BREAK
ENDIF
NEXT
ENDIF
NEXT
IF $4 > 0
FOR
$5 = @回到第二行
IF $5 < 95
UP 100
200
ELSE
BREAK
ENDIF
NEXT
ENDIF
ENDIF
#自动放生代码--------------------------
MINUS 300
#闪光识别代码-----------------------------------------------------
FOR 8
$5 = _闪光识别
IF $5 = 1
#烧录模式将下行的代码注释掉,在前面加上【#】即可,无采集卡同理
$5 = @闪光 #烧录需将此行注释,如【#$5 = 闪光】
IF $5 > 95
PRINT 第 & $2 & 箱第 & $1 & 列出闪了!!!
ENDIF
ENDIF
DOWN 100
100
NEXT
#闪光识别代码-----------------------------------------------------
300
A 100
FOR 3
UP
100
NEXT
300
FOR $1
100
RIGHT _拿取延时
100
NEXT
FOR 3
A 100
100
NEXT
FOR 3
B 100
100
NEXT
2000
FOR 3
A
50
NEXT
2000
IF $1 != 6 #换下一列
FOR $1
100
RIGHT _拿取延时
100
NEXT
ELSE
200
R 100
300
ENDIF
PRINT 第 & $2 & 箱第 & $1 & 列已孵完
$1 += 1
NEXT
$2 += 1
$6 += 1
$1 = 1
NEXT
PRINT 结束

5 进阶操作

你可以购买一个采集卡,然后自制标签,这样就可以使用图像识别了。

6 结语

使用EasyCon和相关的开发板为Nintendo Switch玩家提供了一种便捷、经济的方式来自定义并模拟控制器的操作。无论你是希望为特定游戏创建自定义的宏,还是希望进行更复杂的操作,本教程为你提供了开始的基础。