Click Here – to see my latest work in this area, ‘painting a christmas tree’
Pi Zero
We made use of a Pi zero as a controller for the WS2812B LED strips. 15 metres (3 rolls) of these strips were
wrapped around a tree. We made use of a logic level converter to convert the 3.3V output from a Pi to 5V.
We made use of this excellent library https://github.com/jgarff/rpi_ws281x to actually drive
the WS2812B LEDs, specifically the provided Python API.
We wanted each light to pulse out an ID, to enable us to locate the (x,y) coordinates of each LED. To accomplish this we used
a simple digital format.
Digital Format
We make use of the following data format for the data the LEDs pulse out. We use 16 bits for the preamble, 10 bits for the ID, and 8 bits
for the checksum (which is CRC % 256). We finally encoded the data through Manchester encoding, to ensure at most there are two successive 1s or 0s.
<br> {signal: [<br> {name:'preamble', wave: '1111010011001000' },<br> {name:'data', wave: '0000000000' },<br> {name:'checksum', wave: '01000111' }<br> ]}<br>
Tree Calibration Video
In the following video you can see the pulses emitted by each of the LEDs, enabling us to determine the ID of an LED at a specific (x,y) coordinate
in the image.
OpenCV
Blob detection
We made use of OpenCV3 via Python3 to perform blob detection. We first thresholded the 720p image frame from the webcam, through the use of the following function call cv2.threshold(frame,200,255,0). We then made use of cv2.SimpleBlobDetector_create(params) to perform blob detection, to find the LEDs. In the following two images, you can see, the first is the original image from the webcam, the second shows blobs circled with a red circle.
The blob detection was performed in realtime from the webcam frames, while the frames where written to disk at 30fps, to enable later processing.
Tree Tagged
The image to the left, shows the LEDs, which where successfully tagged, with an ID via our algorithm. We made use of a very simple algorithm to detect data bits from
the 30fps video we captured previously.
For each of the blobs in a frame, we check if a blob has been found within 8 pixels, of the current blob’s (x,y) coordinates, if it has, it is likely the same LED, so we update its (x,y) location, to that of the current blob. We then add the timestamp of the current frame to a list for the LED. If the blob hasn’t been seen before within this fixed distance, we add it.
Once we have successfully processed all frames, we are then able to discern the bits of data for each LED from the timestamps an LED was ‘on’. As we made use of manchester encoding, there can only ever be two ones or zeros next to each other.
We find the differences, between the frame timestamps, for each LED. We then iterate through each of these differences, if the difference < 60, we count the number of sucessive times we’ve seen a value < 60. If a blob has been present for <= 200ms, we class the LED as being on, and output a single bit. If it has been present for more than this we output two 1’s.
Once we have have generated a bitstream for each LED, we then make use of a sliding window to find the preamble which is 32 bits in manchester coding. We then attempt to extract the 10 bit ID, and perform checksum computation on the preamble + ID bits, and compare it to the checksum found from the LEDs bitstream.
Once we have successfully found a valid LED, we log its x,y coordinates and ID
Convert video to lights
We downloaded a video of a fire, and obtained the colour from the same (x,y) coordinate as the LEDs we detected from the tree.
We then were able to display these colours on a representation of the tree, which you can see below. We also store the these colours for each frame, and store them in a python list, which we are then able to pickle and pass to the raspberry pi to play out on the actual LEDs
Video of tree
Future work
We played around a bit with histogram backprojection to extract colours similar only to a red or green LED, to avoid ever having the LEDs completely off, however more work needs to be performed to represent data through colours.
We also intend to create a full 3D model of the tree, to light all sides of the tree.
Academic Research
This was just a hobby project to play with my WS2812B lights. For excellent academic research in this
area, checkout:
Source code
See https://github.com/anfractuosity/lightfantastic for the source
Leave Comment
Error