Fading LEDs via USB-Port.
Go to file
2006-10-01 16:28:01 +00:00
circuit Changed the circuit: zener-diodes instead of the LM317, so the uC runs at 5V 2006-09-29 21:51:07 +00:00
commandline Erste CVS-Version 2006-09-26 18:18:27 +00:00
common Corrected wrong programmer parameter. 2006-10-01 16:28:01 +00:00
firmware Merged Thomas' comments. 2006-09-29 22:30:03 +00:00
License.txt Erste CVS-Version 2006-09-26 18:18:27 +00:00
Readme.txt Corrected wrong programmer parameter. 2006-10-01 16:28:01 +00:00
usb-led-fader.doxygen Erste CVS-Version 2006-09-26 18:18:27 +00:00

$Id: Readme.txt,v 1.2 2006/10/01 16:28:01 rschaten Exp $

For full documentation and examples, take a look at htmldoc/index.html.


Introduction
============

The USB-LED-Fader is a device to control a number of LEDs via USB. I built it
to display the online-status of my internet-connection, the recording-status of
my videorecorder, and warnings if the available disc-space is low. You can
imagine an endless number of applications for this.

The LEDs are controlled with pulse width modulation (PWM). That way, they are
not only on or off, it is possible to control the brightness. Included in the
device is a number of 'waveforms' that can be displayed on the LEDs. That way,
one LED can display some kind of a sinus- or triangular wave without any
interaction with the controlling host.

Every LED can be controlled individually, each one can display it's own
waveforms.

You can assign three different waves to every LED: two 'eternal' waves (0 & 1).
They are displayed alternating until anything different is required. The third
wave (2) is only displayed once, afterwards the device will switch back to
alternating between the first two waves.

One wave is described by three parameters: the waveform, the duration for one
repetition of the wave and the number of repetitions before switching to the
next wave.

This version supports four LEDs, it should be quite easy to change that number
between one and eight. I have not tested any number greater than four, but I
can imagine that the load on the controller can be too high to reliably
communicate via USB.

There are three parts included in the distribution: The firmware for an ATmega8
microcontroller, a commandline-client that can be run under Linux, and the
circuits needed to build the device.

This project is based on the PowerSwitch example application by Objective
Development. Like that, it uses Objective Development's firmware-only USB
driver for Atmel's AVR microcontrollers.

Objective Development's USB driver is a firmware-only implementation of the USB
1.1 standard (low speed device) on cheap single chip microcomputers of Atmel's
AVR series, such as the ATtiny2313 or even some of the small 8 pin devices. It
implements the standard to the point where useful applications can be
implemented. See the file "firmware/usbdrv/usbdrv.h" for features and
limitations.


Building and installing
=======================

Both, the firmware and Unix command line tool are built with "make". You may
need to customize both makefiles.


Firmware
--------

The firmware for this project requires avr-gcc and avr-libc (a C-library for
the AVR controller). Please read the instructions at
http://www.nongnu.org/avr-libc/user-manual/install_tools.html for how to
install the GNU toolchain (avr-gcc, assembler, linker etc.) and avr-libc.

Once you have the GNU toolchain for AVR microcontrollers installed, you can run
"make" in the subdirectory "firmware". You may have to edit the Makefile to use
your preferred downloader with "make program". The current version is built for
avrdude with a parallel connection to an stk200-compatible programmer.

If working with a brand-new controller, you may have to set the fuse-bits to
use the external crystal:

 avrdude -p atmega8 -P /dev/parport0 -c stk200 -U hfuse:w:0xC9:m \
                                               -U lfuse:w:0x9F:m

Afterwards, you can compile and flash to the device:

 make program


Commandline client
------------------

The command line tool requires libusb. Please download libusb from
http://libusb.sourceforge.net/ and install it before you compile. Change to
directory "commandline", check the Makefile and edit the settings if required
and type

 make

This will build the unix executable "usb-led-fader" which can be used to
control the device.


Usage
=====

Connect the device to the USB-port. All LED should flash up to indicate that
the device is initialized.

Then use the commandline-client as follows:

 usb-led-fader status
 usb-led-fader set <ledId> <waveId> <waveformId> <periodDuration> <repetitionCount>
 usb-led-fader clear <ledId>
 usb-led-fader reset
 usb-led-fader show <waveformId>
 usb-led-fader test

When using the set-function, it is possible to define several waves at once.
You simply have to give the parameters for all waves. See examples below.


Parameters
----------

- ledId: ID of the LED (0-n, depending on the number of LEDs in your circuit).
- waveId: ID of the wave (0-1: constant waves, 2: override).
- waveformId: ID of the waveform (0-31: brightness, 32-37: patterns). For a
  reference to the patterns, consult the function fade_calculateWaveform() in
  the file "firmware/main.c".
- periodDuration: Time in sec/10 for one repetition of the waveform. A value of
  0 can be used to reset the wave.
- repetitionCount: Number of repetitions before switching to the next wave. A
  value of 0 can be used to repeat this forever.


Examples
--------

-> Get the status of all LEDs:
 usb-led-fader status
This will result in an output similar to this:
 LED 0           curid   curvalue     curpos     currep    nextupd
                     0          2         26          0         23
       wave   waveform     length     repeat   duration    updtime
          0         38         32          1         20         45
          1          0          1          1          0          1
          2          0          1          1          0          1
 LED 1           curid   curvalue     curpos     currep    nextupd
                     0         14         19          0         19
       wave   waveform     length     repeat   duration    updtime
          0         38         32          1         20         45
          1          0          1          1          0          1
          2          0          1          1          0          1
 LED 2           curid   curvalue     curpos     currep    nextupd
                     0         31         16          0         43
       wave   waveform     length     repeat   duration    updtime
          0         38         32          1         20         45
          1          0          1          1          0          1
          2          0          1          1          0          1
 LED 3           curid   curvalue     curpos     currep    nextupd
                     0          6          9          0         39
       wave   waveform     length     repeat   duration    updtime
          0         38         32          1         20         45
          1          0          1          1          0          1
          2          0          1          1          0          1
In this output, the values curvalue, curpos, nextupd and updtime are for
debugging purposes only. They shouldn't be of interest to the common user. The
meaning of the other values should be clear.

-> Set the first LED to keep a middle brightness:
 usb-led-fader set 0 0 15 10 1
So, on LED 0 the wave 0 is set to waveform 15. It will stay there for one
second and will be repeated once before switching to the next wave. There is no
next wave because we didn't define one, so this waveform will stay forever.

-> Now set a second wave on the first LED, a little brighter than the one
   before:
 usb-led-fader set 0 1 25 10 1
This is wave 1 on LED 0, waveform 25 indicates a constant level of brightness.
After setting the second wave, it will alternate with the first one after every
second, because both waves have the same duration and the same number of
repetitions.

-> Set a third wave on the first LED:
 usb-led-fader set 0 2 36 20 5
This sets the third wave (wave 2) on the first LED. Waveform 36 is a nice
sinus-like wave, so the LED starts to fade. One period of the fading takes 2
seconds, it is repeated for 5 times. Since this is the third wave, after the
repetitions the LED returns to alternating between wave 0 and wave 1, this wave
is discarded.

-> Set multiple waves at once:
 usb-led-fader set 0 0 15 10 1 0 1 25 10 1 0 2 36 20 5
This will set all of the above waves at once. Thus, the first LED will first
fade the sinus-wave five times, then start alternating between the two
brightnesses in one-second-rhythm.

Clear the first LED:
 usb-led-fader clear 0
This will clear all three waves on the first LED.

-> Reset the device:
 usb-led-fader reset
All LEDs will flash once, to indicate that the device is reset and the LEDs are
working.

-> Show a waveform on the screen:
 usb-led-fader show 36
This will lead to an output like the following:
 wave 36 - length 64
 31:                              *****
 30:                            *********
 29:                           ***********
 28:                         ***************
 27:                        *****************
 26:                       *******************
 25:                       *******************
 24:                      *********************
 23:                     ***********************
 22:                    *************************
 21:                    *************************
 20:                   ***************************
 19:                  *****************************
 18:                  *****************************
 17:                 *******************************
 16:                *********************************
 15:               ***********************************
 14:               ***********************************
 13:              *************************************
 12:             ***************************************
 11:             ***************************************
 10:            *****************************************
  9:           *******************************************
  8:          *********************************************
  7:          *********************************************
  6:         ***********************************************
  5:        *************************************************
  4:      *****************************************************
  3:     *******************************************************
  2:   ***********************************************************
  1: ****************************************************************
     ================================================================
Keep in mind that the width of the displayed wave corresponds to the length of
the waveform. If you display a very simple one like the constant brightness
levels (0-31), the length is 1. Therefore only one column is displayed.

-> Test the device:
 usb-led-fader test
This function sends many random numbers to the device. The device returns the
packages, and the client looks for differences in the sent and the received
numbers.


Drawbacks
=========

As mentioned above, controlling the PWM for several LEDs is a lot of work for
one small microcontroller. Speaking the USB protocol is so, either. Both
combined result in a lot of load on the device, so the communication with the
device is not 100% reliable. More than 99% though, at least in our tests.

SO BE WARNED: You should not use this device to control the state of your
nuclear reactor. If you intend to use it in that way despite of this warning,
please let me know... ;-)


Files in the distribution
=========================

- Readme.txt: The file you are currently reading.
- firmware: Source code of the controller firmware.
- firmware/usbdrv: USB driver -- See Readme.txt in this directory for info
- commandline: Source code of the host software (needs libusb).
- common: Files needed by the firmware and the commandline-client.
- circuit: Circuit diagrams in PDF and EAGLE 4 format. A free version of EAGLE
  is available for Linux, Mac OS X and Windows from http://www.cadsoft.de/.
- License.txt: Public license for all contents of this project, except for the
  USB driver. Look in firmware/usbdrv/License.txt for further info.
- Changelog.txt: Logfile documenting changes in soft-, firm- and hardware.


Thanks!
=======

I'd like to thank Objective Development for the possibility to use their driver
for my project. In fact, this project wouldn't exist without the driver.

And I'd like to give special credits to Thomas Stegemann. He wrote the
PWM-stuff, and I guess it would have been nearly to impossible to me to write
the rest of the project without his help since C isn't my natural language.


About the license
=================

Our work - all contents except for the USB driver - are licensed under the GNU
General Public License (GPL). A copy of the GPL is included in License.txt. The
driver itself is licensed under a special license by Objective Development. See
firmware/usbdrv/License.txt for further info.


(c) 2006 by Ronald Schaten - http://www.schatenseite.de