
Racer
StuckAtPrototype/Racer
These are structured into their own files. I could have used submodules, but decided against it.

Festool Bluetooth protocol and interfacing
VacControl is an open-source printed circuit board by tjob, from the tjob/ft-vac-control repository on GitHub, published under the MIT licence. It is a 2-layer board of 100 × 135 mm with 33 parts on 45 nets, routed with 107 tracks and 1 via.
It is built around the BSS138. Its parts include 7 connectors, 5 capacitors, 3 resistors, 2 transistors and 1 IC. It belongs with the radio and wireless boards and the RP2040 boards of this library.
Use the Festool Bluetooth remote with vacuum extractors from other manufacturers.
The project contains the schematics and PCB layout designed using KiCad 7, and the firmware (written in C) for the Raspberry Pi Pico to interface with a Festool No. 202097 Bluetooth Remote Control add-on.

Festool sell an upgrade for their CT26/36/48 vacuum extractors to give remote control using Bluetooth, CT-F I/M-Set. It has two parts: the "CT-F I/M" installs in the extractor and the "CT-F I" is the button that attaches to the end of the vacuum hose. The button then starts and stops the extractor. Paired cordless tools with their Bluetooth-enabled batteries can also control the extractor.

But I don't have a CT26/36/48 extractor from Festool, so I wanted to create an adaptor that uses the module and controls a standard power socket to control any device attached. With a custom PCB, a Raspberry Pi Pico, some firmware, a Solid State Relay, and an enclosure I had a working solution. Along the way I had to reverse-engineer the non-standard serial protocol and try to make sense of the bytes sent.

The Festool module has three electrical connections to the host vacuum: two for power and one for data. The data line is serial, probably bidirectional, and uses a form of Manchester encoding. For more details on the serial stream and commands, see the description of the traces captured with a logic analyzer.
The serial data from the receiver feeds the Raspberry Pi Pico via a BSS138 MOSFET as a level shifter. The Pico decodes the Manchester-encoded stream. When the Start/Stop commands are seen the software switches a Solid State Relay controlling mains AC supply to the output socket.
Wanting an excuse to learn KiCad, I designed a custom PCB to host the Pi Pico and a 4-pin 3.96 mm header to plug the CT-F I/M Bluetooth module into. The board contains a 240V switch-mode regulator providing 5V DC power to both the Pico and the CT-F I/M.

[!WARNING] This project description is not a guide and does not detail how to assemble a unit safely. If you are not sure how to build one that is safe and complies with local laws and regulations, DO NOT ATTEMPT TO RECREATE.
Parts on the PCB
| Part | Reference Designator | Description |
|---|---|---|
| MCU | U1 | Raspberry Pi Pico, the cheap one |
| 5V PCB mount PSU | PS1 | Vigortronix VTX-214-005-005 5W Miniature SMPS AC-DC Converter 5V Output |
| Fuse holder | F1 | 5.2x20mm PCB Fuse Holder W/Cover 6.3A 250VAC |
| PSU protection diode | D1 | Optional, diode to stop power from USB flowing back into the PSU. If not installed, bridge JP2 instead |
| RX data port | J1 | Connects to the Festool receiver module. 4 pin, 3.96mm pitch header with plastic tab cut off - e.g. JST B4P-VH(LF)(SN) |
| SSR driver header | J2 | 2 way, 2.54mm board-to-wire header for connecting to the input of the SSR |
| Wago 3 way PCB connector | J5, J6 | Wago part number 2604-1103 |
| Wago 4 way PCB connector | J7 | Wago part number 2604-1104 |
| Signal MOSFETs | Q1, Q2 | BSS138, in SOT-23 package |
| 10k Resistors | R1, R2, R3 | SMT 1206 package |
| 4.7uH | L1 | Inductor, RLB0913-4R7K |
| 100nF | C2, C4, C6, C7 | Decoupling capacitors, through-hole, 2.5mm pitch |
| 470uF 10V | C1 | Suntan TS13DJ1A471MSB040R 470uf 10V Low Imp Electrolytic Capacitor |
| X2 Capacitor | X2-Cap1 | Vishay BFC2-336-20224 220n 275V X2 Suppression Capacitor |
| Debug UART | J4 | Optional (usefully only for firmware development) |
| Test points | TP1, TP2 | Optional, do not populate |
| Aux port | J3 | Optional and currently unused |
| Reset switch | SW1 | Optional (usefully only for firmware development) |
Other mechanical and electrical parts
| Parts | Count | Description |
|---|---|---|
| Enclosure | 1 | 190mm x 190mm x 67mm die-cast aluminum box |
| Mains plug + inlet cable | 1 | I used a molded plug on a cable cut from an IEC lead |
| Power in strain relief | 1 | Cable Gland M16 10mm - e.g. 50616PA7001SET |
| Output socket | 1 | 13A Circular Panel Mount Socket Outlet, 13A - e.g. 735WHI |
| Green indicator | 1 | Panel mount, 22.5mm, 220-240v, to show if the incoming power is on - e.g. LEDTECGREEN230VAC |
| Yellow indicator | 1 | Panel mount, 22.5mm, 220-240v, LED lamp, to show if the vacuum power is on - e.g. LEDTECYELLOW230VAC |
| PCB standoffs | 5 | M4 - length dependent on the enclosure used |
| M6 x 35mm cap screws | 2 | Black, for securing the Festool receiver module |
| Custom M6 standoffs | 2 | To receive the M6 screws from the Festool receiver module. Length depends on the enclosure used, 39.1mm was correct for me |
| PCB screws | 5 | M4 x 8mm |
| SSR | 1 | Random on Solid State Relay, must be switchable by 5V DC - e.g. i-Autoc Panel Mount Solid State Relay, 25 A Max. Load, 280V AC |
| SSR cover | 1 | i-Autoc Kudom KPC-0A Solid State Relay Accessory Protective Cover Single Phase |
| SSR thermal pad | 1 | i-Autoc Kudom KTP-0A Solid State Relay Accessory Thermal Pad KSI/KSJ |
| Mains wiring loom | Assorted | Line, Neutral, Earth (CPC), sided appropriately for your max load. I used stranded 2.5mm2 |
| Bits 'n' Bobs | Assorted | Hardware to attach standoffs to enclosure and to mount the SSR, earth bonding nuts and bolds, and crimp eyelets and spade connectors |
The software, schematic designs and PCB layout contained in this repository are released under the MIT license.
I got the pinout for the Bluetooth receiver from YouTube channel "My Project Box". His video "Festool Bluetooth Hack / Mod works with any dust extractor!" shows a very neat solution with a different approach; avoiding any software.
On Github, user gilbertf published libft capable of both sending and receiving. It's not used by this project but his encoder appears to send the same bytes my decoder expects, which gave me some confidence that the implementation here is somewhat interoperable.
I used the Pi Pico KiCAD symbol and footprint from ncarandini/KiCad-RP-Pico
This project helped Loriowar create a Festool receiver handler for Arduino.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 5 | MountingHole | MountingHole:MountingHole_4.3mm_M4 | H1, H2, H3, H4, H5 |
| 4 | 100nF | Capacitor_THT:C_Rect_L4.6mm_W3.0mm_P2.50mm_MKS02_FKP02 | C2, C4, C6, C7 |
| 3 | 10k | Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolder | R1, R2, R3 |
| 2 | 2604-1103 | wago-2604-11xx:2604-1103 | J5, J6 |
| 2 | BSS138 | Package_TO_SOT_SMD:SOT-23_Handsoldering | Q1, Q2 |
| 1 | 0.22uF 275V AC | Capacitor_THT:C_Rect_L18.0mm_W7.0mm_P15.00mm_FKS3_FKP3 | X2-Cap1 |
| 1 | 250mA slow blow | Fuse:Fuseholder_Cylinder-5x20mm_Stelvio-Kontek_PTF78_Horizontal_Open | F1 |
| 1 | 2604-1104 | wago-2604-11xx:2604-1104 | J7 |
| 1 | 4.7uH | Inductor_THT:L_Radial_D7.8mm_P5.00mm_Fastron_07HCP | L1 |
| 1 | 470uF 10v | Capacitor_THT:CP_Radial_D8.0mm_P3.50mm | C1 |
| 1 | D_Schottky | Diode_SMD:D_SMC_Handsoldering | D1 |
| 1 | Festool BT receiver | festool BT module:BT receiver | J1 |
| 1 | GND | Connector_Pin:Pin_D0.9mm_L10.0mm_W2.4mm_FlatFork | TP2 |
| 1 | Jumper_2_Open | TestPoint:TestPoint_2Pads_Pitch2.54mm_Drill0.8mm | JP1 |
| 1 | Pico | MCU_RaspberryPi_and_Boards:RPi_Pico_SMD_TH | U1 |
| 1 | SSR | Connector_Molex:Molex_KK-254_AE-6410-02A_1x02_P2.54mm_Vertical | J2 |
| 1 | SW_Push | Button_Switch_THT:SW_PUSH_6mm_H4.3mm | SW1 |
| 1 | UART | Connector_PinSocket_2.54mm:PinSocket_1x04_P2.54mm_Vertical | J4 |
| 1 | VTX-214-005-005 | VTX-214-005-0xx:Converter_ACDC_Vigortronix_VTX-214-005-0xx_THT | PS1 |
| 1 | Warning | Symbol:Symbol_HighVoltage_Type2_CopperTop_VerySmall | CAUTION: High Voltage (240VAC) |
| 1 | aux | Connector_IDC:IDC-Header_2x05_P2.54mm_Vertical | J3 |
| 1 | bt_ser | Connector_Pin:Pin_D0.9mm_L10.0mm_W2.4mm_FlatFork | TP1 |

StuckAtPrototype/Racer
These are structured into their own files. I could have used submodules, but decided against it.

willem-pennings/balancing-cube
A cube that balances itself in a corner or edge using reaction wheels

abhishek-kakkar/BeagleLogic
A Software Suite that implements a logic analyzer with the PRU on the BeagleBone / BeagleBone Black.


lachlanA/eagle-to-kicad
Eagle SCH/LIB to KiCad SCH/LIB ULP conversion script

No0ne/ps2x2pico
USB keyboard/mouse to PS/2 interface converter using a Raspberry Pi Pico

StuckAtPrototype/AirCube
Works standalone out of the box. Pairs with Home Assistant in minutes. Other platforms are supported through community-contributed extensions.

It measures 100 × 135 mm and has 2 copper layers, 1.6 mm thick.
33 parts, built around the BSS138. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the tjob/ft-vac-control repository on GitHub, at the commit this page was made from: the board is pcb/VacControl.kicad_pcb and its schematic pcb/VacControl.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).