VaCANt

An overengineered PCB to control a vacuum pump and to check if it caught something.

Demonstration Video

Background

Every year, the theme of Eurobot changes, but the required components remain roughly the same: suction cups with vacuum pumps, servo motors, and stepper motors.

Rather than design a large PCB with all the components needed for the current year’s challenge, which will become obsolete for the next competition, we are developing reusable modules that we can combine into any configuration we need. For example, for Eurobot 2026, our robot will have 4 suction cups with four vacuum pumps. All we need to do is combine 4 of our vacuum pump modules and connect them to the robot’s CAN bus.

Introducing VaCANt

Indeed, the first module we developed was a vacuum pump controller. We admit that this module is overengineered. The simplest goal of turning on and off a vacuum can be achieved with a simple digital signal from our main computer. However, our CAN-powered board offers many more features. Using an addressable bus means we don’t need a separate signal wire for each pump. With its onboard current sensor, our module is able to measure the current drawn by the pump. Since the current goes up when an object attaches itself to the suction cup, we know whether we successfully picked up the game element. Finally, this board was a proving grounds allowing us to try many new things. Most notably, it was our first board with an RP2040, proving our hardware design with this chip and proving the can2040 library, a fantastic CAN controller implemented in the RP2040’s programmable I/O. Yes, it’s overkill, but after all, we compete in Eurobot to learn and have fun, not to solve every task in the most efficient way possible.

The vacuum module is called VaCANt. This name shares its first three letters with “vacuum”, includes “CAN” like the used communication bus, and is a word meaning empty, since this board can detect if no game element was grabbed.

Hardware design

As already mentioned, the star of the show is an RP2040. It’s a fairly typical implementation; we didn’t deviate from Raspberry Pi’s hardware design guidelines, using their recommended FLASH, oscillator, decoupling capacitors, and strapping. The small vacuum pump is soldered directly to the PCB, simplifying wiring and keeping everything compact. It’s turned on and off through a solid state relay, and a shunt resistor and INA180A2 current-sense amplifier measure its current draw and make this available to an analog input of the microcontroller. The board is powered through a Micro-Fit connector. An e-fuse (TPS25940) protects against reverse polarity, overvoltage, and undervoltage and provides current limiting and soft start. The SN65HVD230 is used as the CAN transceiver. We selected this one because it operates on 3.3V and because we had good success with it in the past. Two CLIK-Mate connectors carry the CAN signals, and are duplicated to allow daisy-chaining. An APA102 SPI RGB LED shows the status of the board, indicating states like “ready”, “connection error”, “sucking a game element”, or “sucking air”. A four-position switch is included to connect and disconnect the CAN termination resistor (disconnected for daisy-chaining, connected if it’s the last node in the chain). We planned to use the other 3 positions to set the CAN address, but in the end we did this completely in software.

CAN bus

The primary reason we chose the CAN bus is that it’s the protocol our main computer already uses to communicate with our ODrive motor controllers responsible for propelling the robot.

Even without this motivation, CAN would still have been an appealing choice. It’s extremely robust and allows for a large number of nodes to communicate at high speed over a single differential pair. The software and hardware support makes CAN very approachable.

We opted to send our messages using raw CAN messages rather than using an abstraction like CANopen or cansimple, although our protocol works similarly. CAN messages include an 11-bit address. However, the address doesn’t necessarily have to uniquely identify a node. We use the top 6 bits of the address for the node ID and the bottom 5 bits as the command, where the command could be something like turning the pump on or requesting the current reading.

3D Viewer

Project Files

The project files for the PCB can be found at https://gitlab.com/die-dosen-stapler/evergreen/pcbs/vacant. An interactive preview is below.

Interactive Bill of Materials