Switching Power on Raspberry Pi USB Ports



I want to create a stop motion movie of sourdough growing over night. Don't ask. Since I'm very comfortable with the OS, I am using Raspberry Pi as the hardware platform. And since everyone will tell you that _Lighting_ is important for any kind of filmmaking I played around with ways to toggle power on the USB ports to control USB-powered lamps. <span id="more-5451"></span> The package `libusb-dev` is only one ```bash sudo apt install libusb-dev ``` away. Luckily, Joel Dare (aka "codazoda") already wrote a handy program to access those C-bindings ((https://github.com/codazoda/hub-ctrl.c/blob/master/hub-ctrl.c)): ```bash pi@sauercam:~ $ git clone https://github.com/codazoda/hub-ctrl.c Cloning into 'hub-ctrl.c'... remote: Enumerating objects: 13, done. remote: Counting objects: 100% (13/13), done. remote: Compressing objects: 100% (12/12), done. remote: Total 62 (delta 3), reused 5 (delta 1), pack-reused 49 Unpacking objects: 100% (62/62), done. pi@sauercam:~ $ cd hub-ctrl.c/ pi@sauercam:~/hub-ctrl.c $ gcc hub-ctrl.c -l usb -o hub-ctrl pi@sauercam:~/hub-ctrl.c $ sudo mv hub-ctrl /usr/bin/ ``` This will produce an ELF binary named `hub-ctrl` and place it in your path. Now let's figure out how the Raspberry Pi Model 1 B 2.0 (CPU Revision `000e`) and 2 Model B 1.1 (CPU Revision `a01041`) are structured wrt USB: ```bash pi@sauercam-000e:~ $ lsusb -t /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc_otg/1p, 480M |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/5p, 480M |__ Port 1: Dev 3, If 0, Class=Vendor Specific Class, Driver=smsc95xx, 480M pi@sauercam-a01041:~ $ lsusb -t /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc_otg/1p, 480M |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/5p, 480M |__ Port 1: Dev 3, If 0, Class=Vendor Specific Class, Driver=smsc95xx, 480M |__ Port 2: Dev 5, If 0, Class=Hub, Driver=hub/4p, 480M ``` I know for a fact that the Ethernet card is connected via USB on the Raspberry Pi so for the B 2.0 we are probably out of luck: it only has one bus with one hub with one port. If we disable it to switch USB lamps off, we will also disable the Ethernet connection. For the 2 Model B 1.1 it looks a bit differently though: there are two ports available. Let's try the second one: ```bash sudo hub-ctrl -b 001 -d 002 -P 2 -p 0 # re-enable with: -p 1 ``` And now it's disco time: ```bash awk -v n=10 -v seed="$RANDOM" 'BEGIN { srand(seed); for (i=0; i<n; ++i) printf("%.4f\n", rand() / 3) }' | while read amount; do sleep $amount; hub-ctrl -b 001 -d 002 -P 2 -p 1; hub-ctrl -b 001 -d 002 -P 2 -p 0; done ``` <img decoding="async" src="/wp-content/uploads/2020/09/disco.gif" class="aligncenter size-full" style="position:relative;border:4px solid #ddd;width:480px;height:270px;z-index:20;display:block" /> <hr style="position: relative; top:-165px; border:2px solid #ddd;z-index:0;margin-bottom:-10px">

Leave a Reply

Your email address will not be published. Required fields are marked *