硬件



Shell Lab K1 是USB串口控制的可编程按键开关控制器

产品特点:

● 10路外部按键/开关输入,板载3路按键
● 软件抗抖动算法,参数可调
● 支持事件消息(导通/断开/长按),消息带时间戳,队列缓冲
● 通道可独立启用/禁用
● 模式配置开关,上电时自动设定通道/抗抖动参数
● 支持外部扩展接口,扩充通道数
● USB供电,线长2米
● 串口交互式控制,开放式通讯协议,自带命令帮助
● 不限制编程语言(推荐Python)
● 提供配套上位机“测试台软件”,自带众多示例代码
● 用pip安装mcush库(支持windows/linux/mac),编写python脚本

应用场景:

● 产品、软件循环测试时人工干预
● 产品生产线项目测试项目人工干预
● 实验进度状态控制
● 无法用HID键盘前台控制,必须后台控制的场合
● 互动式游戏设计
● 教学实验设计,物理化学实验
● 户外无人值守场景
● 工控设备系统集成
● 产品原型设计
● 艺术创作

支持定制:

● 按客户壳体尺寸定制PCB,定制通道数,及电平匹配

软件

串口通讯常见问题
C语言编程常见问题

串口指令:

按键控制命令
=>k --help
usage: k [-c ] [-i ] [-v ]
options:
 -c/--cmd        state|E|(e)vent|(en|dis)able|inv|debounce_(on|off|long)|count
 -i/--idx        index param
 -v/--val        value param
=> 

示例:

查询所有通道状态
=>k
0x00000009   第0/3通道按键被按下
=> 
启用通道
=>k -c enable -i 3  启动第3通道
=>k -c enable -v 0x18  启动第3/4通道
=> 
禁用通道
=>k -c disable -i 3  禁用第3通道
=>k -c disable -v 0xFFFFFFF0  禁用除了0/1/2/3之外的所有通道
=> 
按键电平翻转
=>k -c inv  查询按键翻转设置
0x00000001     第0通道按键需要电平翻转
=>k -c inv -v 0x18    修改第3/4通道按键电平翻转
=> 
获取缓冲消息
=>k -c event  获取所有缓冲的消息
46.888 + 0x2   1号按键按下 (消息类型: +按下,-松开,*长按)
47.380 - 0x2   1号按键松开
47.860 + 0x4   2号按键按下
48.112 - 0x4   2号按键松开
48.884 + 0x5   1/2号按键同时按下
49.204 - 0x5   1/2号按键同时松开
=>k -c E       获取单个缓冲的消息 
59.888 + 0x2   1号按键按下 
=>k -c e -i 1  过滤显示1号按键消息
=>
=>k -c e -v 6  过滤显示1/2号按键消息
=>
软件抗抖动
=>k -c debounce_on   查询所有通道接通稳定时间(毫秒)
0 8    设定值8毫秒(配置开关默认值:快速模式8毫秒,慢速模式200毫秒)
1 8
2 8
3 8
4 8
5 8
6 8
7 8
8 8
9 8
10 8
11 8
12 8
=>k -c debounce_on -i 1 -v 200   修改第1通道的接通稳定设定值为200毫秒
=>k -c debounce_off -i 1 -v 200   修改第1通道的断开稳定设定值为200毫秒
=>k -c debounce_long -i 1 -v 5000   修改第1通道的长按设定值为5000毫秒
=> 
消息统计
=>k -c count   查询消息统计
0 6 6 0  第0按键按下6次,释放6次,长按0次
1 5 5 0
2 7 7 0
3 0 0 0
4 0 0 0
5 0 0 0
6 0 0 0
7 0 0 0
8 0 0 0
9 0 0 0
10 0 0 0
11 0 0 0
12 0 0 0
=> 

Python封装:

安装:pip3 install mcush
升级:pip3 install -U mcush
class ShellLabKeySwitch(mcush.Mcush.Mcush):
    def key(self, cmd=None, idx=None, val=None):
        # 底层的串口命令封装

    def getInv( self ):
        # 查询翻转设置

    def setInv( self, inv ):
        # 修改翻转设置
     
    def getState( self ):
        # 查询所有通道按键状态(位图)

    def getEvent( self, evt_index=None, evt_mask=None ):
        # 获取单个按键消息

    def getEvents( self, evt_index=None, evt_mask=None ):
        # 获取所有按键消息

    def waitForEvent( self, evt_index=None, evt_mask=None, evt_type='on', timeout=30.0 ):
        # 等待单个按键消息

    def enable( self, key_index=None, key_mask=None  ):
        # 启用按键通道

    def disable( self, key_index=None, key_mask=None  ):
        # 禁用用按键通道

    def getCount( self, key_index ):
        # 查询按键次数

    def setDebounce( self, index, on_ms=None, off_ms=None, long_ms=None ):
        # 设置通道软件抗抖动算法阈值

示例:

import mcush
from mcush.linkong.ShellLab import ShellLabKeySwitch
k = ShellLabKeySwitch('COM10')  # 填入对应的串口号
state = k.getState()  # 查询所有按键状态
while True:
    for a,b,c in k.getEvents():  # 循环获取所有按键消息并打印
        print("%.3f %s 0x%X"% (a,b,c))  # 时间戳+类型+键值位图

下载

Shell Lab 测试台软件


CH341虚拟串口驱动(Windows)


应用

自带脚本演示
# this script runs in ShellLab Testbench Application
k = ShellLabKeySwitch(PORT)

info('Press key0 to start ...')
if not k.waitForEvent(0):
    stop("Timeout, key0 not pressed")
k.beep()

p = getLogPanel(switch=True, clear=True)
info('Recording all key events ...')
logAdd( 'key state: 0x%08X'% k.getState() )
while True:
    #for a,b,c in k.getEvent():  # process event one by one, quicker
    for a,b,c in k.getEvents():  # process all events, slower
        logAdd("%.3f %s 0x%X"% (a,b,c))
        # stop when key0 is long pressed (>5s)
        if (b == '*') and (c & 0x01):
            k.beep(freq=1000, times=3)
            stop('key0 long pressed, stop')