AnyMath 文档
Notebook

从USB操纵杆输入信息

我们正在研究如何将USB操纵杆连接到AnyMath模型,以便能够从真实的输入设备测试模型或硬件的控制。

copter_controller_video.gif

任务说明

任何硬件都可以连接到AnyMath中的脚本和模型,在这个项目中,我们展示了通过USB将HID设备(人机接口设备)连接到本地计算机的能力。 AnyMath子系统负责与AnyMath进行通信。整合。

运行命令 engee.package.install("Engee-Device-Manager") 在命令行上,获取您的ID并下载客户端程序(链接将出现在终端中,您可以点击它)。

在[通信和安全]部分获取访问令牌(https://engee.com/account/safety )你的AnyMath个人帐户("个人访问令牌"部分)。

启动程序后 engee-device-manager.exe (配置为您的地址并使用有效的PAT令牌),在AnyMath和本地计算机之间创建安全通信通道,允许您在单个模型中使用本地软件和硬件资源。

您可以通过HID配置文件连接到本地硬件,该配置文件可以配置为输入设备,操纵杆,Arduino等业余爱好平台和许多其他硬件工具。

在Windows中,您可以通过在命令窗口中键入行来检查操纵杆 joy.cpl. 这是一个辅助工具,允许您检查连接的操纵杆,但它不会显示键盘,鼠标或Arduino。

专责小组 Get-PnpDevice -Class "HIDClass" | Select-Object FriendlyName, InstanceId 它允许您看到VID和PID标识符,我们将需要配置与设备(操纵杆)的通信信道。 这里是找到他们的地方。:

image.png

数字1781和0898需要转换为十进制,可以在后续命令中使用。 在Linux上,命令执行相同的操作 lsusb.

下一步是检查连接:

In [ ]:
hid = Main.EngeeDeviceManager.Devices.HID.Hid(6017,2200)
Out[0]:
Main.EngeeDeviceManager.Devices.HID.Hid("Hid", Base.UUID("236b86c9-cb25-4ef2-ad1f-1b984d70885c"), ["read", "write", "close", "start_stream", "list_hid_id"], "Hid_236b86c9-cb25-4ef2-ad1f-1b984d70885c_reply", Main.EngeeDeviceManager.Devices.HID.var"#read#read##0"{String, Base.UUID}("Hid", Base.UUID("236b86c9-cb25-4ef2-ad1f-1b984d70885c")), Main.EngeeDeviceManager.Devices.HID.var"#write#write##0"{String, Base.UUID}("Hid", Base.UUID("236b86c9-cb25-4ef2-ad1f-1b984d70885c")), Main.EngeeDeviceManager.Devices.HID.var"#close#close##0"{String, Base.UUID}("Hid", Base.UUID("236b86c9-cb25-4ef2-ad1f-1b984d70885c")), Main.EngeeDeviceManager.Devices.HID.var"#start_stream#start_stream##0"{String, Base.UUID}("Hid", Base.UUID("236b86c9-cb25-4ef2-ad1f-1b984d70885c")), Main.EngeeDeviceManager.Devices.HID.var"#list_hid_id#list_hid_id##0"{String, Base.UUID}("Hid", Base.UUID("236b86c9-cb25-4ef2-ad1f-1b984d70885c")))

可以通过指定数据包大小从该通道读取数据。 接收向量的大小受设备发送的信息量的限制。

In [ ]:
Main.EngeeDeviceManager.Devices.HID.read( hid, 8 )
Out[0]:
8-element Vector{UInt8}:
 0x98
 0x00
 0x87
 0x04
 0x6c
 0x04
 0xfb
 0x00

我们已经读取了一个8字节的数据包,反映了控制面板的旋钮和按钮的实际位置。 然后这个包可以被转换和重新组合以提取必要的信息。

从USB/HID设备读取数据到AnyMath模型

从真实硬件获取新数据并将其发送到AnyMath模型并不比在脚本中获取这些信息困难得多。 首先,我们使用AnyMath功能块创建一个模型。:

In [ ]:
engee.open("usb_controller_example.engee")
image.png

此组件的代码包含以下行:

package_dir = "/internal_persistent_vol/support_packages/locations/AnyMath-Device-Manager/AnyMathDeviceManager.jl"

if !isdefined(Main, :AnyMathDeviceManager)
    include("$(package_dir)/src/AnyMathDeviceManager.jl")
end

using .AnyMathDeviceManager.Devices: HID

mutable struct Block <: AbstractCausalComponent
    hid::Any
    function Block()
        hid = HID.Hid(6017,2200)
        return new(hid)
    end
end

初始化后,在计算模型的每一步都有一个代码被执行。:

function (c::Block)(t::Real)
    return HID.read(c.hid, 8)
end

因此,我们得到一个组件,该组件从控制面板读取数据并将数字发送到模型。

运行此模型的步骤

创建此模型将工作的工作环境的最小步骤如下:

-启动AnyMath计划。集成(可能会实施更新)
-点击"连接"(连接通常需要10秒)
-将硬件连接到本地计算机
-启动模型(通过在设置中启用减速,以便模型时间以与用户实时相同的速度运行)。

结论

我们轻松地将操纵杆连接到AnyMath环境,我们可以控制模型参数,物理或自动化操作。