LEDCtl (WS2812b LED Controller)

From Stm32World Wiki
Revision as of 01:52, 27 December 2020 by Lth (talk | contribs)
Jump to navigation Jump to search

At the moment this document is a work in progress. I'll add to it as I go along designing the device, jotting down design decisions as I go along.

LED strips and panels based on some form of the WS2812 RGB LEDs have gained an enormous popularity the past couple of years with the price of the individual LEDs dropping well below 10 cent each. These LEDS contain 3 individual LEDs: one red, one green and one blue and the intensity of each of these can be set at 256 different levels.

Overall Design Parameters

The "device" should be able to drive 2-4 strings of up to 1000 leds on each string and the length and type of each string should be configurable.

The "device" will offer multiple ways of controlling LEDS:

  • USB/CDC (emulated Serial over USB)
  • Serial rx/tx lines
  • I2C
  • SPI

Hardware Design and Implementation

Picking the CPU

It might be possible to find a better CPU in ST's enormous line of processors, but since we've used the STM32F103 on our own Green Pill board, that processor will be the initial choice.

The "limiting" factor of this choice is the available memory. The STM32F103 has got 20 kB of RAM. Our "device" will need a "buffer" holding the RGB values of each LED. So with 1 string of 1000 LEDS we will need around 3k of RAM for this purpose alone. With 2 strings that value doubles to 6k (which might still be doable) but if we want to support 1000 LEDs on 4 strings each that will require more than half the RAM, most likely leaving too little for the software to run.

Schematics

The design of the schematics is largely based on the Green Pill with a few changes.

Ledctl rev a.svg

Hayes Like Serial Interface

To control the attached LEDs a simple serial interface is used.

AT Commands

Command Parameters Example Response Description
&F AT&F OK Factory reset
ATLsnnn=rrrgggbbb s=string
nnn=led
rrr=3 digit value
ATL0000=010010010 Set a specific led on a specific string to a specific value
Sx=y y = value ATS0=64 OK Set register to a certain value. Example will set register 0 to a value of 64
Z ATZ OK Reset device

S Registers

Register Valid values Description
0 0-999 LEDs on string 0
1 0-999 LEDs on string 1
2 0-99 "Width" of a zero (percentage)
3 0-99 "Width of a one (percentage)