Electronic – Efficient way to selectively unpower USB ports

power supplyusb

(Edited and expanded from original question for clarity)

USB interfaces as a means of controlling external hardware from a desktop or laptop computer are ubiquitous; many thousands of hardware models are available, ranging in price from 10-1 to 106 USD. It is reasonable to require that the +5V DC voltage line be able to be switched off from the host computer, but this is by no means guaranteed across every mainstream PC/laptop running every widespread OS.

I am looking to have a true cross-platform solution to be able to selectively power USB ports down and up from software, for totally arbitrary lengths of time. This is not because I am prototyping or breadboarding, and nor is this my first foray into electronics making an LED blink on and off; I require a long-term reliable solution.

I am looking for an efficient solution which minimizes:

  • Cost
  • Implementation time
  • Other general hassles, such as volume or amount of trailing wires

Based upon comments, I have thusfar ranked my options as follows:

Option 1

Buy a dedicated USB splitter, with fully cross-platform proprietary software, such as the Yepkit YKUSH hub:

YKUSH

  • $42
  • Negligble software compilation time + some time to "box up"
  • Compact and neat

Option 2

Buy a programmable USB hub:

programmable hub

  • $300
  • Small amount of time to implement command-line software control
  • Professionally boxed

At the moment, I would be tempted to get a 4-way USB hub, splice its power lines through a separate arduino-controlled relay (as I have an arduino that need never be unpowered).

Option 3

Buy a fairly off-the shelf hub compatible with uhubctl. Then either run Linux or program a way to make it work in Windows. A VM would also be a headache, because programs in Windows will have trouble interfacing with Linux programs inside the VM.

  • ~$20
  • Long time to implement cross-platform software
  • Professional USB hub

Option 4

Buy a USB hub and a Normally Closed 5V relay, controlled by e.g. an arduino to cut power to the USB hub as required:

arduino relay

  • ~$25
  • Long time to solder and tidy connections + short time to implement switching in arduino code
  • Fairy ugly due to splicing wires

(Surprisingly not suggested in responses given that this is an Electrical Engineering site)

Best Answer

On Windows, you can simulate disconnect event using utility devcon provided by Microsoft. Use it as outlined in this answer. However, it doesn't necessarily mean that power will be turned off.

On other platforms (Linux, Mac) you can use my utility uhubctl. It will work and actually turn power off per each port selectively for any USB hub that supports per port power control (check compatibility list for tested devices). Good news is that uhubctl supports USB 3 and many USB 3 hubs properly support per port power control.