【问题标题】:How to use a wireless controller on the Google Coral Dev Board?如何在 Google Coral 开发板上使用无线控制器?
【发布时间】:2022-09-24 03:45:58
【问题描述】:

使用 Jetson Nano,我通过蓝牙连接了 PS4 控制器,该设备显示在/dev/input/js0 下。但是,当我通过蓝牙将控制器连接到我的 Coral 板时,我在那个位置看不到任何东西,可能是因为 Mendel 而不是 Ubuntu?连接 PS4 控制器并从 C++ 访问它的推荐方法是什么?我应该使用不同的操纵杆吗?

  • 也许您缺少正确的驱动程序或正确的设备树或固件。或者一些蓝牙堆栈或配置......您可以提供更多详细信息以获得更好的建议。

标签: google-coral


【解决方案1】:

在做了一些研究之后,我了解了 linux 上的 joydev 和 evdev 之间的区别。似乎我的 PS4 控制器在 Jetson 上显示为joydev 设备,而在运行 Mendel 的 Coral 上显示为 evdev 设备。我从 Croepha 找到了一些用于 evdev 设备的示例 C++ 代码 /大卫巴特勒:https://handmade.network/forums/t/3673-modern_way_to_read_gamepad_input_with_c_on_linux

我为 PS4 控制器修改了这个代码,如下所示:

void runJoystick() {
    auto gamepad = open("/dev/input/event4", O_RDONLY | O_NONBLOCK); //todo use /proc/bus/input/devices instead
    assert(gamepad != -1);
    std::cout << "Running joystick" << std::endl;

    while (m_still_running) {
        struct input_event events[8];  // 8 events per frame is pretty extreme, more like 1 or 2, sometimes as high as 4
        auto r1 = read(gamepad, events, sizeof events);
        if (r1 != -1) {
            int new_event_count = r1 / sizeof(struct input_event);
            for (int evi = 0; evi < new_event_count; evi++) {
                auto& ev = events[evi];

                switch (ev.type) {
                    case EV_ABS: {
                        switch (ev.code) {
                            case ABS_X: {  // left x
                                // std::cout << "type " << ev.code << "value:" << ev.value << std::endl;
                            } break;
                            case ABS_Y: {  // left y
                                // std::cout << "type " << ev.code << "value:" << ev.value << std::endl;
                            } break;
                            case ABS_Z: {  // right x
                                // std::cout << "type " << ev.code << "value:" << ev.value << std::endl;
                            } break;
                            case ABS_RZ: {  // right y
                                // std::cout << "type " << ev.code << "value:" << ev.value << std::endl;
                            } break;
                        }
                    } break;
                    case EV_KEY: {
                        switch (ev.code) {
                            case BTN_A: {  // square
                                std::cout << "Square ";
                            } break;
                            case BTN_B: {  // x
                                std::cout << "X ";
                            } break;
                            case BTN_C: {  // circle
                                std::cout << "Circle ";
                            } break;
                            case BTN_X: {  // triangle
                                std::cout << "Triangle ";
                            } break;
                        }

                        if (ev.value) {
                            std::cout << "Pressed " << std::endl;
                        } else {
                            std::cout << "Released " << std::endl;
                        }

                    } break;
                }
            }
        }

        assert(r1 != -1 || errno == EWOULDBLOCK || errno == EAGAIN);
        std::this_thread::sleep_for(std::chrono::milliseconds(20));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 2020-02-07
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多