NeoPixels (WS2812) and a Raspberry Pi Zero W

So I wanted a cool LED controllable light up thingy… Because

  1. It lights up.
  2. I needed a status for my camera for the Teams stuff when I’m at home, so my Wife does not accidentally walk though the camera
  3. It’s a big bright light.

So I first looked at the unicorn hat, but this is discontinued, so then I went to my favorite electronics store, Adafruit.com, and they did not have what I wanted in stock, so I found a cheap knockoff on amazon (azin #B081BCBQ6B if you are interested) and wired it up.

I’m working off of port 18, and pulling power from the usb port for the PI, and it seems to work well, and it’s a simple 3 wire hookup, +5v, Gnd, and Data (GPIO18).

First thing is to wire up the circuit. This is the pinout for the header on a Rasbery Pi Zero W, Directly from https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/rpi_SCH_ZeroW_1p1_reduced.pdf The even pins are on the outside of the board.

Now for software, I’m going to use Python, because, well, it’s easy. Make sure you are running Python v3, and then add the Adafruit libraries in.


    sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixel
    sudo python3 -m pip install --force-reinstall adafruit-blinka

Now we need a tester, so let’s also use Adafruit’s tester as well. I’ve modified it for 64 pixels, but nothing else yet. The code is mirrored here if you want to try it.

# Simple test for NeoPixels on Raspberry Pi
import time
import board
import neopixel


# Choose an open pin connected to the Data In of the NeoPixel strip, i.e. board.D18
# NeoPixels must be connected to D10, D12, D18 or D21 to work.
pixel_pin = board.D18

# The number of NeoPixels
num_pixels = 64

# The order of the pixel colors - RGB or GRB. Some NeoPixels have red and green reversed!
# For RGBW NeoPixels, simply change the ORDER to RGBW or GRBW.
ORDER = neopixel.GRB

pixels = neopixel.NeoPixel(
    pixel_pin, num_pixels, brightness=0.2, auto_write=False, pixel_order=ORDER
)


def wheel(pos):
    # Input a value 0 to 255 to get a color value.
    # The colours are a transition r - g - b - back to r.
    if pos < 0 or pos > 255:
        r = g = b = 0
    elif pos < 85:
        r = int(pos * 3)
        g = int(255 - pos * 3)
        b = 0
    elif pos < 170:
        pos -= 85
        r = int(255 - pos * 3)
        g = 0
        b = int(pos * 3)
    else:
        pos -= 170
        r = 0
        g = int(pos * 3)
        b = int(255 - pos * 3)
    return (r, g, b) if ORDER in (neopixel.RGB, neopixel.GRB) else (r, g, b, 0)


def rainbow_cycle(wait):
    for j in range(255):
        for i in range(num_pixels):
            pixel_index = (i * 256 // num_pixels) + j
            pixels[i] = wheel(pixel_index & 255)
        pixels.show()
        time.sleep(wait)


while True:
    # Comment this line out if you have RGBW/GRBW NeoPixels
    pixels.fill((255, 0, 0))
    # Uncomment this line if you have RGBW/GRBW NeoPixels
    # pixels.fill((255, 0, 0, 0))
    pixels.show()
    time.sleep(1)

    # Comment this line out if you have RGBW/GRBW NeoPixels
    pixels.fill((0, 255, 0))
    # Uncomment this line if you have RGBW/GRBW NeoPixels
    # pixels.fill((0, 255, 0, 0))
    pixels.show()
    time.sleep(1)

    # Comment this line out if you have RGBW/GRBW NeoPixels
    pixels.fill((0, 0, 255))
    # Uncomment this line if you have RGBW/GRBW NeoPixels
    # pixels.fill((0, 0, 255, 0))
    pixels.show()
    time.sleep(1)

    rainbow_cycle(0.001)  # rainbow cycle with 1ms delay per step

The result is awesome.

Raspberry Pi Zero W – Backup USB Terminal

I often get lazy and don’t want to look up the IP of some PI that I just installed the OS on, nor do I want to go find the monitor.. This is where the USB SSH terminal comes in super handy.

This is a Linux thing, so if you have windows, I’m sorry. Google it more.

So step one is to install the ISO of your choice. I used the Raspberry Pi OS Lite version from the official source at: https://www.raspberrypi.org/software/operating-systems/, even though I don’t like Debian. The configuration files are all in the wrong place… anyways.. it’s stable and runs well.

Install is fairly straight forward. Unzip the download, and run dd. Replace the img with your image, and sdX is your SD card.

dd bs=1M if=2021-01-11-raspios-buster-armhf.img of=/dev/sdX conv=fsync

This will create two drives on your device, The first being boot, and the 2nd being root. Let’s start in boot. Touch the SSH file, and edit the config.txt to add the dtoverlay line.

touch /Volumes/boot/ssh
echo 'dtoverlay=dwc2' >> /Volumes/boot/config.txt

Now open cmdline.txt using your favorite text editor, which of course is Vim.

vi /Volumes/boot/cmdline.txt

add

modules-load=dwc2,g_ether

after “rootwait”, and before anything else. make sure there is only one space between all of them otherwise it will get borked. Now I’m going to be lazy and hook up both Wifi and USB Networking, so I’m going to configure the USB on a static IP address

vi /etc/dhcpcd.conf

Skip down to the bottom and add a USB configuration. In this example, I’m not specifiying the DNS entry for the USB, because I want it to pull data though the wifi when possible.

interface usb0
static ip_address=192.168.7.2
static routers=192.168.7.1
#static domain_name_servers=192.168.7.1

I don’t have a 192.168.7.xxx network anywhere, so I’m using that. Now I just go and configure my USB network on my PC to be a Static of 192.168.7.1, and I’m done. Plug the USB cable into the center USB connection, and wait for the light to turn on. Now I can SSH into the board without issue.

  ssh pi@192.168.7.2