StellaLight

From Ethersex_Wiki
Jump to: navigation, search
StellaLight
Status
Stable
menuconfig Applications->StellaLight: Multichannel pwm
Pinning yes
Ecmd yes
Uses Timer Timer 2
Depends on DMX Storage (optional), udpStella (optional)
Code https://github.com/ethersex/ethersex/tree/master/services/stella

StellaLight produces PWM signals on up to 16 independent pins for driving LEDs or servo motors.

Internals

Stella uses an 8-bit Timer of your choice for producing the PWM signals. Since the overflow interrupts need to be very consistent, StellaLight will not work flawlessy when other modules are active that disable the interrupts for a short amount of time.

This is a list of module where you can expect some problems with: Onewire, RFM12 (please add more if you find some).

Moreover StellaLight does not support Gamma Correction since that would require at least 10-12 bit PWM.

Configuration

In Menuconfig you can select the prescaler. The higher the frequency, the more often the StellaLight PWM functions will be executed, leading to an higher overall load of the device. So if you run into problems, try decreasing the frequency, ergo increase the prescaler.

Option Prescaler
Very slow 1024
Slow 256
Normal 128
Fast 64

You can calculate the resulting frequency by using this formula:

F_CPU: The clockspeed of your AVR (like 8Mhz, 16Mhz etc.)

F_STELLA=F_CPU/Prescaler/512

So given a setting of "Normal" on a 16Mhz device will result in 244Hz which is pretty good for most setups. So more than enough for the human eye (10 times more)

If you have enabled DMX Storage in Menuconfig, you also can set the universe and start channel of StellaLight, so you can control StellaLight via Artnet or DMX FXSlot.

Pinning

STELLA_PORT1_RANGE(PXI,PXJ) sets the range (I to J) of StellaLight controlled pins on PORTX
STELLA_PORT2_RANGE(PX2I,PX2J) sets the range (I to J) of StellaLight controlled pins on PORTX2
STELLA_USE_TIMER(I) programs TimerI for StellaLight

Two examples:

1. 3 LEDs (e.g. RGB) on PORTA, Pins: 0,1,2

ifdef(`conf_STELLA', `dnl
  STELLA_PORT1_RANGE(PA0,PA2)
  STELLA_USE_TIMER(2)
')dnl

2. 15 LEDs (e.g. 5x RGB) on PORTA, Pins: 0,1,2,3,4,5,6,7 on PORTD, Pins: 0,1,2,3,4,5,6

ifdef(`conf_STELLA', `dnl
  STELLA_PORT1_RANGE(PA0,PA7)
  STELLA_PORT2_RANGE(PD0,PD6)
  STELLA_USE_TIMER(2)
')dnl

udp control

We recommend to use the DMX Storage. But for easy set ups it is possible to use a simple udp protocol to control stella channels. Activate protocols->udpStella and configure the port. A datagram for stella has three bytes:

Byte # Semantic Valid values
1 Command Byte
 STELLA_SET_IMMEDIATELY=0,
 STELLA_SET_FADE=1,
 STELLA_SET_FLASHY=2,
 STELLA_SET_IMMEDIATELY_RELATIVE=3,
 STELLA_SET_FADESTEP=4,
 STELLA_GETALL = 255
2 Channel 0-15
3 Value 0-255

You will get back an UDP datagram if you send the STELLA_GETALL command. It consists of an identifier ["STELLA"]+[Amount of channels]+[channel#1]+..+[channel#n]

Alternative

Have a look at Starburst for an improved and more resource-conserving solution.