Featured image of post Nintendo Switch Joycon Simulator

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

使用ESP-32、STM32或CH32开发板设置模拟jycon手柄的详细教程。

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月更新的文件:

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

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 [循环次数]
      &mldr;
      NEXT

常量与变量

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

赋值

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

含变量的基础语句

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

条件分支

  • 语法:
    • IF 条件
      &mldr;
      ELSE &mldr; ENDIF

4 部分脚本

自动刷活动

Note

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

1
2
3
4
5
6
FOR
    X 100
    WAIT 100
    A 100
    WAIT 100
NEXT
自动取孵
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
#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玩家提供了一种便捷、经济的方式来自定义并模拟控制器的操作。无论你是希望为特定游戏创建自定义的宏,还是希望进行更复杂的操作,本教程为你提供了开始的基础。

comments powered by Disqus