LPD8806

From Frack - Hackerspace Friesland
Jump to navigationJump to search
Onderwerp: RGB Flexistrip
LPD8806 flexistrip.jpg
Deskundigen
Gebruiker Elmer.jpg Elmer
Gebruiker Elmer.jpgElmer de Looff (Elmer) Rol: niet-deelnemer Deskundig met: Arduino, ENC28J60, Elektronica, GnuCash, HTML, LPD8806, Linux, MediaWiki, Mercurial, Netwerken, OpenVPN, Programmeren, Python, SSH, Software, Solderen Beginnend met: Dm-crypt, Javascript Werkt aan: Geen projecten :(
,
Afbeelding Anoniem.png Failbaitr
Failbaitr Rol: deelnemer Deskundig met: Arduino, CNC, CNC-Frezen, Canvas, Digitale Fabricatie, ENC28J60, Glasvezel lassen, HTML, Hydroponics, Javascript, LPD8806, Linux, Mercurial, Programmeren, Python, Robotica, Software, Stappenmotor Beginnend met: Elektronica Werkt aan: Geen projecten :(
,
Afbeelding Anoniem.png Lian
Lian (Lian) Rol: niet-deelnemer Deskundig met: Elektronica, LPD8806, Solderen Werkt aan: Geen projecten :(
,
Gebruiker CrazyA.jpg CrazyA
Gebruiker CrazyA.jpgCrazyA Rol: deelnemer Deskundig met: AVR, Arduino, Blender, Elektronica, GL-Inet, LPD8806, POV-Ray, RaspberryPi Werkt aan: Geen projecten :(
Onderdeel van Arduino, Elektronica
RGB Flexistrip wordt o.a. gebruikt in
Bedlights, Buildboard, Cirkelklok, LPD8806-Lan, Ledstrip Miniprojecten, Ledtafel

De LPD8806 ledstrip is flexibele strip met 32 of 52 leds per strekkende meter. De leds zijn invididueel aan te sturen en instelbaar in meer dan 2 miljoen kleuren.

Flexistrip hardware

De strip is voorzien van 32 of 52 leds per meter. Per twee SMT 5050 RGB leds is er een LPD8806 chip op de strip geplaatst die de aansturing van de RGB leds verzorgt. Het maximale vermogen van de strips is als volgt:

  • 32 leds / meter: 32 * 3 * 5V * 20mA = 9.6W per meter
  • 52 leds / meter: 52 * 3 * 5V * 20mA = 15.6W per meter

Dit zijn de maximale vermogens, waar alle leds op volle helderheid wit schijnen. Teruggerekend naar stromen betekent dat er 2 tot 3 Ampere loopt per meter strip. Volgens de leverancier (Greeled Electronic) zijn de sporen op de strip goed voor stromen tot ~6 Ampere. Dit betekent dat de strip elke 10 meter moet worden voorzien van voeding. De data-signalen zijn door te koppelen mits er sprake is van common ground.

De strip is per set van 2 leds opdeelbaar. Men houdt dan een LPD8806 chip en 2 leds op een 4-6cm strip. De strip heeft een +5V en GND om vermogen te leveren aan de leds en regelchips, alsmede een SPI interface met aan een kant data en clock in en aan de andere kant data en clock uit. Dit maakt het mogelijk de strips door te lussen, maar betekent ook dat aansturing vanaf de juiste kant moet komen.

LPD8806

Gedetailleerde informatie naar aanleiding van het reverse-engineeren van de Adafruit led-flexistrip is beschikbaar op de Arduino forums. Het lijkt dat de chip is ontwikkeld voor hoogkwaliteit DMX aansturing.

De chips zijn voorzien van zes uitgangen, met pulsbreedtemodulatie op 4000Hz. Elk van de uitgangen is instelbaar op 256 helderheidsniveaus (1024 met extra programmeren van de IC's), maar in de uitvoering die op de strips verwerkt is zijn slechts 127 niveaus mogelijk (meer details hierover bij de aansturing). De nominale stroom die geleverd kan worden is 18mA per uitgang (absoluut maximum is 20mA).

De 2-draads SPI aansturing heeft een maximale snelheid van 20MHz en kan tot 2000 doorgeschakelde chips aansturen. Meer informatie in te vinden in het datasheet van Greeled Electronic.

Flexistrips met LPD8806 PWM-chips worden (o.a.) verkocht door:

SMT RGB 5050 Led

Datasheet

Gedeelde specificaties

  • Voorwaartse stroom: 20mA (100mA piek)
  • Inkijkhoek: 120 graden
  • Sperstroom (bij 5V): 10uA

Rood:

  • Voorwaartse spanning: 2.0V (1.8-2.2V)
  • Golflengte: 625nm (620-630nm)
  • Helderheid bij 20mA: 650mcd (500-800mcd)

Groen

  • Voorwaartse spanning: 3.2V (3.0-3.4V)
  • Golflengte: 520nm (515-525nm)
  • Helderheid bij 20mA: 1000mcd (800-1200mcd)

Blauw

  • Voorwaartse spanning: 3.2V (3.0-3.4V)
  • Golflengte: 465nm (460-470nm)
  • Helderheid bij 20mA: 400mcd (300-500mcd)


Uit de ontvangen RGB-flexistrip (52 leds / meter) zijn de volgende specificaties af te leiden:

  • Rood
    • Voorschakelweerstand: 150Ω
    • Stroom: 20mA (3V / 150Ω)
    • Geschatte helderheid: 650mcd
  • Groen
    • Voorschakelweerstand: 120Ω
    • Stroom: 15mA (1.8V / 120Ω)
    • Geschatte helderheid: 750mcd
  • Blauw
    • Voorschakelweerstand: 120Ω
    • Stroom: 15mA (1.8V / 120Ω)
    • Geschatte helderheid: 300mcd

Gemeten vs berekende waarden

Alle meetwaarden zijn bij 5V voedingsspanning.

  • Totaal berekend stroom per led: 50mA
  • Totaal gemeten stroom per led: ~45mA
  • Totaal gemeten stroom per LPD8806 IC: 210μA
  • Weerstand per meter strip: 200mΩ (gemeten op 5V lijn)

Aansturing

Arduino LPD8806 library

De door Adafruit beschikbaargestelde LPD8806 library maakt het zeer eenvoudig om de strips aan te sturen. Nadat de klasse is geinitialiseerd (met de lengte van de strip), is elke LED individueel adresseerbaar en in te stellen met eenvoudige RGB kleurcommando's. De show methode stuurt de gehele informatie naar de strip en zorgt dat alles zichtbaar wordt.

Bij de library zijn een aantal voorbeeldprogramma's geleverd, die direct gebruikt kunnen worden om je eigen programma's op te baseren. Hieronder is een simpel programma dat een groengekleurde pixel heen en weer stuurt.

#include <LPD8806.h>
#include <SPI.h>
 
const int
  interval = 20,
  ledCount = 160;
LPD8806
  strip = LPD8806(ledCount); // Using hardware SPI on pins 11 & 13
const unsigned long
  backgroundColor = strip.Color(0, 0, 0),
  flyingDotColor = strip.Color(0, 120, 50);
 
void setup() {
  strip.begin();
}
 
void loop() {
  // Sends green dot back and forth.
  // Each position lights up for the configured duration
  // Bug: ends of strip light up 2x longer
  static int ledPosition = 0;
  while (ledPosition < ledCount)
    updateWait(ledPosition++);
  while (ledPosition > 0)
    updateWait(--ledPosition);
}
 
void updateWait(int currPosition) {
  // Set the color for the new position to the dot color
  strip.setPixelColor(currPosition, flyingDotColor);
  strip.show();
  // After making the LED light up, set it to the background color.
  // This way we don't have to keep track of the previous position,
  // and it will still properly turn off.
  strip.setPixelColor(currPosition, backgroundColor);
  delay(interval);
}

Kleuren en Latch

In de communicatie met de LPD8806 chips wordt de kleur van elke led opgegeven als een triplet van drie bytes. Het MSB moet hierbij altijd 1 zijn. Dit betekent dat er voor elk kleurkanaal 7 bits, of 128 mogelijkheden, overblijven (0-127 inclusief). Dit levert een maximaal aantal kleurcombinaties op van iets meer dan twee miljoen.

Wanneer de strip op deze manier wordt aangesproken zullen de kleuren altijd direct zichtbaar worden. Ook de individuele rood/groen/blauw componenten worden direct zichtbaar. Het is dan ook belangrijk dat de kleuren op hoge snelheid worden gecommuniceerd naar de strip, zodat er geen waarneembare flikkering ontstaat.

Nadat een LPD8806 chip genoeg bytes heeft ontvangen om alle uitgangen juist in te stellen wordt alle communicatie doorgestuurd naar de volgende in serie geschakelde chip (relay mode). Dit maakt het mogelijk om zeer grote lengtes strip aan te sturen met een enkele SPI bus.

Wanneer er een nul wordt gestuurd (bij voorkeur een byte 0x00, maar alles van 0x00 t/m 0x7F werkt vermoedelijk) zullen alle chips in relay mode deze doorsturen en daarna terugvallen in de normale modus. Op deze manier kan weer aan het begin van de strip begonnen worden met het bijwerken van de kleuren. Er is verder geen adressering van de chips aanwezig.

Kleurvolgorde

De Adafruit strip heeft per led een kleurvolgorde groen, rood, blauw. De strips zoals we ze van Greeled hebben ontvangen hebben een andere kleurvolgorde, te weten: blauw, rood, groen. Wanner gebruikgemaakt wordt van de Adafruit LPD8806 library moet deze kleurvolgorde worden aangepast in de setPixelColor methode (in lpd8806.cpp).

Bij eigen applicaties die geen gebruik maken van de LPD8806 library is het aan te bevelen om de kleurvolgorde instelbaar te maken. Dit maakt het eenvoudiger om het programma te laten werken op strip met een andere kleurvolgorde.

Arduino SPI voorbeeld

De SPI aansturing in de Arduino omgeving maakt het ook uitermate eenvoudig om de strip direct aan te spreken zonder gebruik te maken van de bovengenoemde LPD8806 library:

#include <SPI.h>
 
#define LPD8806_LATCH (0)
 
const byte stripLength = 160;
const byte fadeDelay = 20; // Milliseconds between brightness changes
const byte brightness[] = {1, 3, 7, 15, 31, 63, 127, 63, 31, 15, 7, 3};
 
void setup() {
  // Start & configure SPI communication
  SPI.begin();
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE0);
  SPI.setClockDivider(SPI_CLOCK_DIV2); // 8MHz
}
 
void loop() {
  for (byte level = 0; level < sizeof(brightness); ++level) {
    for (byte pos = stripLength; pos-- > 0;)
      for (byte repeats = 3; repeats-- > 0;)
        SPI.transfer(0x80 | brightness[level]);
    SPI.transfer(LPD8806_LATCH);
    delay(fadeDelay);
  }
}

Meer voorbeelden en projecten

In de Frack GitHub groep zijn een aantal repositories te vinden die animaties laten zien op de ledstrip.

Gebruiker Elmer.jpg Elmer
Gebruiker Elmer.jpgElmer de Looff (Elmer) Rol: niet-deelnemer Deskundig met: Arduino, ENC28J60, Elektronica, GnuCash, HTML, LPD8806, Linux, MediaWiki, Mercurial, Netwerken, OpenVPN, Programmeren, Python, SSH, Software, Solderen Beginnend met: Dm-crypt, Javascript Werkt aan: Geen projecten :(

heeft ook een repository met daarin een verzameling mini-projectjes voor de ledstrip.

Vergelijkbare hardware

LPD88xx familie

Naast de LPD8806 zijn er ook de LPD8803, LPD8809 en LPD8812 varianten in deze chipfamilie. Zoals te verwachten zijn de laatste nummers indicatief voor het aantal aanstuurbare uitgangen. Voor ledstrip lijkt alleen de 6-uitgangsvariant populair te zijn.

WS2801

De WS2801 werkt op een vergelijkbare manier als de LPD8806, maar stuurt slechts drie uitgangen aan. Dit betekent dat er maar 1 RGB led aangesloten kan worden, wat de maximale led-dichtheid verlaagt. De interface is hier ook een 2-draads SPI interface.

WS2811

De WS2811 is redelijk bijzonder in de zin dat het een 5050-LED en een controller chip in een behuizing samenbrengt. Dit betekent dat de dichtheid van de strip een stuk groter kan worden (60 leds / meter, individueel afknipbaar). De aansturing van de chip gaat over een one-wire protocol (de strip heeft 3 aansluitingen, +5V, GND, Data). Meer informatie via insomnialighting en Hackaday.