Project

Nitendon Switch Tetris Bot

Switch Bot开发日记系列


除了switch的usb键盘hub,基本材料都已经到了,下面是硬件的清单:

  1. Switch主机
  2. 采集卡:HD60 Pro
  3. 主控上位机:Arduino Mega 2560
  4. 键盘下位机:ks0248 (Leonardo的ATmega32u4有usb支持)
  5. DELTA Essentials Keyboard and Mouse Adapter(还没到,之后测试)
  6. 2*16 lcd(用来debug)
  7. 16*16 led matrix(还不知道用来显示什么)

然后软件和依赖库方面:

  1. Maven搭建的服务端,详细查阅pom.xml
  2. LiquidCrystal 用来驱动lcd
  3. Arduino LinkedList

    硬件的连接,没什么特别多的内容,

    • 2560和Leonardo用rxtx serial通信
    • 2560顺便驱动一个lcd显示debug信息
    • 2560 usb连接主控pc
    • Leonard usb连接switch usb hub

电路图


这两天敲了挺多代码的,主要有串口通信和cv识别部分,下面记录一下难点

串口通信部分

通过Serial通信,两台机子通过rx tx串口连接传输,但当一台机子忙碌时,可能会无法接收另一台的消息, arduino无法多线程处理消息,所以必须要有三次握手协议才能保证数据成功双向传输

  • 首先是给不同种类的消息不同的prefix,比如和控制台传输是通过usb串口传输的,这个能够保证消息的单方传输(单片机到pc), 所以只用判断Serial1(通过rx0和tx1端口)传输时的prefix就可以区分。 一个值得注意的问题,通过Spring的RestController请求传递uri参数时要确保prefix是支持的字符
  • 其次是队列的实现,当上位机从pc获取发送给下位机的指令时,如果下位机此时处于忙碌状态, 上位机需将此指令保存至队列,而在上位机每一个loop都会将队列中最早的一条指令发送给下位机。 另一方面,下位机执行完毕指令后也需将状态返回给上位机,从而使上位机将该指令在队列中移除

cv识别部分

获取游戏画面后首先通过OpenCV进行 灰度、平滑化和canny处理,然后对边缘化的图片进行坐标分析。 坐标分析是cv部分的难点,现在只完成了 一小部分

边缘化样本