如何在 Google Coral 开发板上使用无线控制器?
How to use a wireless controller on the Google Coral Dev Board?
对于 Jetson Nano,我通过蓝牙连接了一个 PS4 控制器,设备显示在 /dev/input/js0
下。但是,当我通过蓝牙将控制器连接到我的 Coral 板时,我在那个位置什么也看不到,可能是因为 Mendel 而不是 Ubuntu?连接 PS4 控制器并从 C++ 访问它的推荐方法是什么?我应该使用不同的操纵杆吗?
经过一些研究,我在 linux 上了解了 joydev 和 evdev 之间的区别。似乎我的 PS4 控制器在 Jetson 上显示为一个 joydev 设备,而在 Coral 运行 Mendel 上它显示为一个 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);
}
}
对于 Jetson Nano,我通过蓝牙连接了一个 PS4 控制器,设备显示在 /dev/input/js0
下。但是,当我通过蓝牙将控制器连接到我的 Coral 板时,我在那个位置什么也看不到,可能是因为 Mendel 而不是 Ubuntu?连接 PS4 控制器并从 C++ 访问它的推荐方法是什么?我应该使用不同的操纵杆吗?
经过一些研究,我在 linux 上了解了 joydev 和 evdev 之间的区别。似乎我的 PS4 控制器在 Jetson 上显示为一个 joydev 设备,而在 Coral 运行 Mendel 上它显示为一个 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);
}
}