diff --git a/Production/Firmware/chu_pico.uf2 b/Production/Firmware/chu_pico.uf2 index 2e6fb16..b0df583 100644 Binary files a/Production/Firmware/chu_pico.uf2 and b/Production/Firmware/chu_pico.uf2 differ diff --git a/README.md b/README.md index a968698..aed2271 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ Features: * It's small, made for 15-17 inch screen. * Air towers are replaced with built-in ToF sensors. +* Traditional IR Air mechanism is also provided for DIYers. * HID lights, of course! * 32 keys (upper and lower rows). * Follows CrazyRedMachine's RedBoard I/O protocol. @@ -169,6 +170,20 @@ You need **4x M3*12mm screws and 4x M3 hex nuts** to fix all things. 7x silicone anti-slip pads can be applied to the bottom side of the base to provide stability when playing. +### IR Air Tower +This is not necessary for Chu Pico. But some people may prefer the traditional IR air tower, especially when they're using Chu Pico design for a full-sized controller. +So hereby I provide the IR air tower design, with a pair of air tower PCBs and the firmware support. +1. First, you need to order the PCBs, the gerber file is `Production\PCB\chu_air_v*.zip`. It's for both sides of the air tower. +2. Order the components, they're marked in the schematic. Then solder them to the PCB following the silkscreen. +3. For left side tower, use J1 to connect to the Raspberry Pi Pico, and for the right side tower, use J2. GPIO 3 -> A, GPIO 4 -> B, GPIO 5 -> C, ADC 0 (GPIO 26) -> Right S, ADC 1 (GPIO 27) -> Left S. + +4. Steps for deployment. + I. Enable IR air tower in the firmware (command `ir enable`), this will disable ToF. + II. Enable diagnostics for IR (command `ir diagnostic`). + III. Place the air towers and watch the output of the diagnostics, higher value means beam is received. + IV. Set the baseline after the towers are properly placed (command `ir baseline`). + V. Optionally, set the sensitivity, it's a percentage of expected change (command `ir trigger <1..100>`). + ### Firmware * UF2 file is in `Production\Firmware` folder. * For the new build, hold the BOOTSEL button while connect the USB to a PC, there will be a disk named "RPI-RP2" showed up. Drag the UF2 firmware binary file into it. That's it. There's a small hole at the bottom side of the Chu Pico, it is facing right to the BOOTSEL button. diff --git a/README_CN.md b/README_CN.md index 2d0ce3a..1ffafc1 100644 --- a/README_CN.md +++ b/README_CN.md @@ -6,6 +6,7 @@ **特性:** * 它很小巧,适合15-17寸屏幕。 * 空键被 ToF 距离传感器替代。 +* 也提供了传统 IR Air 的机制供 DIY 玩家使用。 * HID 灯光,必须的! * 32个按键(上下两排)。 * 遵循 CrazyRedMachine 的 RedBoard I/O 协议。 @@ -177,6 +178,20 @@ https://github.com/whowechina/ 7x 个硅胶防滑垫可以贴在基座的底部,以提供游玩时候的稳定性。 +### 红外空键 +Chu Pico 本身不需要红外空键。但是有些人可能用 Chu Pico 来做一个全尺寸的控制器,它们更喜欢传统的 IR 空键。 +所以我提供了 IR 空键的设计,包括一对空键 PCB 和对应的固件支持。 +1. 首先,你需要下单 PCB,Gerber 文件在 `Production\PCB\chu_air_v*.zip`。空键的两侧都需要这个 PCB。 +2. 根据原理图里的有标记,购买对应的元器件,然后按照丝印焊接到 PCB 上。 +3. 左侧空键 PCB 使用 J1 连接到 Pi Pico 主控,右侧空键 PCB 使用 J2 连接。GPIO 3 -> A, GPIO 4 -> B, GPIO 5 -> C, ADC 0 (GPIO 26) -> Right S, ADC 1 (GPIO 27) -> Left S。 + +4. 调试上线的过程如下: + I. 在固件中启用 IR 空键(命令 `ir enable`),它会自动禁用 ToF。 + II. 启用 IR 的诊断功能(命令 `ir diagnostic`)。 + III. 摆放两侧的空键塔,观察诊断输出,数值高代表着对应的红外光线已经对准接收器。 + IV. 在正确摆放好空键塔后,设置基线(命令 `ir baseline`)。 + V. 可选,设置触发灵敏度,是一个变化率的百分比值(命令 `ir trigger <1..100>`)。 + ### 固件 * UF2 文件在 `Production\Firmware` 文件夹下。 * 全新烧录的话,按住 Pico Pi 的 BOOTSEL 按钮,然后连接 USB 到 PC,会出现一个名为 "RPI-RP2" 的磁盘。将 UF2 固件二进制文件拖入即可。Chu Pico 的底部有一个小孔,它正对着 BOOTSEL 按钮。 diff --git a/doc/air_tower_wiring.png b/doc/air_tower_wiring.png new file mode 100644 index 0000000..4ab7a89 Binary files /dev/null and b/doc/air_tower_wiring.png differ diff --git a/firmware/src/commands.c b/firmware/src/commands.c index 1bda8e6..87dc93b 100644 --- a/firmware/src/commands.c +++ b/firmware/src/commands.c @@ -260,7 +260,6 @@ static void air_baseline() chu_cfg->ir.base[i] = air_ir_raw(i); printf(" %4d", chu_cfg->ir.base[i]); } - config_changed(); printf("\n"); } @@ -289,19 +288,26 @@ static void air_trigger(char *argv[]) static void handle_ir(int argc, char *argv[]) { - const char *usage = "Usage: ir \n" + const char *usage = "Usage: ir \n" " ir trigger \n" " percent: [1..100]\n"; if (argc == 1) { - const char *commands[] = { "diagnostic", "baseline" }; + const char *commands[] = { "enable", "disable", "diagnostic", "baseline" }; int cmd = cli_match_prefix(commands, count_of(commands), argv[0]); if (cmd == 0) { - air_diagnostic(); + chu_cfg->ir.enabled = true; + air_init(); } else if (cmd == 1) { + chu_cfg->ir.enabled = false; + } else if (cmd == 2) { + air_diagnostic(); + } else if (cmd == 3) { air_baseline(); } else { printf(usage); + return; } + config_changed(); } else if (argc == 2) { air_trigger(argv); } else {