Ledbar
Eth0 is een high-tech-geek-outdoor-conferentie. Op dit event is een lounge aanwezig met een bar. Op basis hiervan is het idee ontstaan om een bar te ontwerpen in het thema van eth0.
Contents
Algemene omschrijving
Eth0 is een high-tech-geek-outdoor-conferentie die gepland staat deze zomer. Deze conferentie is gericht op delen van kennis op het gebied van IT-gerelateerde onderwerpen. o.a. Veiligheid, programmeren, netwerken, hacken en ethiek, nieuwe (open) technologieën. Het thema voor deze editie is "lights". Op dit event is een lounge aanwezig met een bar. Op basis hiervan is het idee ontstaan om een bar te ontwerpen in het thema van eth0. Deze bar is niet zomaar een bar. We creëren, doordat de bezoekers van eth0 een 'bijdrage' te laten leveren aan de bar, o.a. een sfeer waarbij de bezoekers zich verbonden voelen. Deze bar dient als een plaats waarbij de bezoekers zijn/haar drank kan aanschaffen, en de bezoekers ook met elkaar in contact komen. Om in het thema van eth0 de bar te ontwerpen, kiezen we voor het gebruik van leds.
Doel van het project
Het doel van deze bar is om tijdens eth0 een mooi project te demonstreren vanuit Frack. Met de bar hopen we ook alle community's "samen" af te beelden in een prominent onderdeel van eth0. De bar bestaat uit 3 platen, op de linkse plaat staat "Frack" de middelste plaat is leeg en de meest rechtse plaat staat "eth0" op. Het is de bedoeling dat de community's hun logo op de middelste plaat plakken (of iets anders afbeelden waarmee hun aanwezigheid gedemonstreerd wordt). De bar is natuurlijk een onderdeel waar vrijwel iedereen langs zal komen, dus iedereen zal kunnen zien welke community's vertegenwoordigd zijn.
Het thema van eth0 is lights. Door de bar van eth0 met leds te versieren is er, in de lounge, gelijk een groot onderdeel dat aan het thema voldoen. Jildou is coördinator van de Lounge, waardoor dit goed uitkomt.
Daarnaast zal de interface om de leds mee aan te sturen opengesteld worden voor iedereen die op eth0 is. Zo kunnen mensen samenwerken aan een zo leuk mogelijke bar.
Algemeen design
Het algemeen design van de bar bestaat uit drie losse platen. (We hebben voor drie losse platen gekozen om dit zo gemakkelijk mogelijk naar eth0 te vervoeren, en later de platen aan elkaar te bevestigen aan de hand van scharnieren). De twee buitenste platen bevatten de verschillende kleuren leds. De middelste plaat wordt gebruik om tijdens eth0 de verschillende aanwezige hackerspaces zijn of haar 'bericht' achter te laten d.m.v. stiften/verf. De twee buitenste platen die de leds bevatten, hebben een eigen desgin. De ene plaat geeft het logo van eth0 weer, de andere plaat geeft de tekst "Frack" weer. Deze teksten/logo's zijn uitgetekend op de platen, en vervolgens zijn er gaten geboord waardoor er leds door de plaat heen gestoken worden. Deze leds zijn d.m.v. een lijm pistool vastgelijmd in het desbetreffende uitgeboorde gat. Op deze manier worden de leds optimaal bevestigd.
Specificaties van het algemene design
- Kleur van de platen: Grijs/zwart
- Grootte boorgaten: 3 mm
- Aantal platen: 3
- 'Patronen' op de platen: Frack en eth0
- Afmetingen per plaat: 81 cm bij 122 cm
- Totale grootte van de bar: 243 cm bij 122 cm
- Aantal leds: ±500
- Kleuren van de leds: Wit, Rood, Geel, Blauw, Groen.
Benodigdheden
- 1 grote plaat triplex
- Verf
- Verfroller
- Terpetine
- ~500 leds
- Lijm
- Electriciteitsdraad
- Soldeertin
Leds
Voor het project worden de volgende leds gebruikt. Elke LED die in de bar wordt geplaatst moet voorzien worden van een voorschakelweerstand. De blauwe, groene en witte leds zijn identiek aan elkaar m.b.t. tot het gewenste potentiaalverschil over de leds. Hierdoor zijn dezelfde voorschakelweerstanden nodig. Dit geldt ook voor de rode en de gele leds. De leds zijn daarom in de volgende twee samenstellingen terug te vinden in de bar. Per letter zien we dus één van deze samenstellingen terug:
Samenstelling 1:
- Groen
- Blauw
- Wit
Benodigde voorschakelweerstand: 56 Ω
Samenstelling 2:
- Rood
- Geel
Benodigde voorschakelweerstand: 120 Ω
Deze twee samenstellingen van leds bieden qua ontwerp van de PCB voordelen. Er is namelijk per letter, afhankelijk welke LED samenstelling deze letter heeft, maar één bepaalde PCB nodig met één bepaalde voorschakelweerstand. Je krijgt hierdoor twee verschillende PCB's met elk zijn eigen voorschakelweerstand.
Voorschakelweerstand bepalen
Waarom een voorschakelweerstand?
Een voorschakelweerstand dient als een spanningsdeler. Dit betekend dat door de voorschakelweerstand een deel van de spanning over de weerstand komt te staan, en een ander deel over de LED. Bij een LED hebben we te maken met een bepaald gewenst potentiaal verschil. Bij dit gewenste potentiaal verschil brand de LED met zijn maximale lichtsterkte. Afwijkend van dit potentiaal verschil geeft een LED wat minder vel brandt, of juist doorbrandt.
Om de desbetreffende voorschakelweerstand te bepalen van de LED zijn er een aantal gegevens nodig. Één van deze gegevens is het gewenste potentiaalverschil over de LED. Deze wordt in de specificaties van de leds gegeven. Om de voorschakelweerstand te bepalen hebben we te maken met de volgende voorbeeld situatie:
Een weerstand die in serie geschakeld staat met de LED, aangesloten op een spanningsbron. De spanningsbron levert een spanning van 5,0 Volt, en het gewenste potentiaalverschil over de LED is 2,0 Volt.
Om de voorschakelweerstand te berekenen gebruiken we de wet van Ohm, deze luidt als volgt: U = I × R
Omschrijven geeft: R = U ÷ I
Waarbij:
- U = Gewenste potentiaal verschil over de weerstand
- I = Stroomsterkte (In dit geval hebben we een serie schakeling, in een serie schakeling is de stroomsterkte overal gelijk)
- R = Weerstand, de voorschakelweerstand waar we naar 'op zoek' zijn.
Het gewenste potentiaal verschil betekend dat er 2,0 Volt spanning staat over de LED. Het laatste component in de schakeling is de weerstand. Hierover staat een spanning van 5,0 - 2,0 = 3,0 Volt. De waarde van 3,0 Volt vullen we in de variabele U. De waarde van variabele I kunnen we bepalen aan de hand van de multi-meter. Hiermee kunnen we meten hoeveel stroomsterkte de LED kan 'verdragen'. De waarde die hierbij gevonden wordt vullen we in voor de variabele I.
Dan wordt de rekensom als volgt: R = 3,0 Volt ÷ x Ampère
Spanning (VR) | Stroom (mA) | Weerstand (Ω) |
---|---|---|
3 | 10 | 300 |
3 | 20 | 150 |
3 | 50 | 60 |
2.5 | 10 | 250 |
2.5 | 20 | 125 |
2.5 | 50 | 50 |
Bevestiging van elektronica aan de bar
Op de achterkant van de bar wordt de elektronica bevestigd die nodig zijn voor de werking van de bar. De volgende delen zullen aangesloten worden op de achterkant van de bar:
- PCB's (Negen stuks)
- Draden (Van de LED naar de PCB)
PCB bevestiging
De PCB bevat een aantal kwetsbare onderdelen. Deze willen we zo optimaal mogelijk beschermen, om ook later nog in dergelijke projecten in de space de componenten en/of de PCB's te kunnen her gebruiken.
Mogelijkheid 1
Om de PCB van boven af te beschermen, nemen we een stuk hout ten grootte van de PCB. Op de plaat bevestigen we naast de vier hoekpunten van de PCB, afstandsmoertjes. Hierop kan het stuk hout bevestigd worden. Er wordt op deze manier bescherming gecreëerd voor de PCB, en er is nog mogelijkheid om de PCB te demonteren wanneer dat nodig is.
Mogelijkheid 2
We plaatsen een stuk schuimrubber op de houten plaat. Op het stuk schuimrubber bevestigen we de PCB.
Draden bevestiging
De draden zijn een zwak punt binnen het geheel. Dit komt namelijk door de soldeer verbindingen tussen de draden en de leds. Soldeer verbindingen zijn slecht bestand tegen frequente en heftige trillingen, hierdoor kunnen ze los raken. Om het project optimaal te laten werken betekend het dat de draden ook optimale bescherming nodig hebben.
Mogelijkheid 1
Afzonderlijk worden de draden aan de leds gesoldeerd. Daarna worden deze draden gebundeld in groepen van 10, met behulp van tie wraps.
Mogelijkheid 2
We nemen per letter een aantal UTP kabels. In een UTP kabel zitten 8 andere kabels. Deze binnenste kabels kunnen gebruikt worden voor het aansluiten van de leds aan de PCB's. We knippen de UTP kabel deels open, aan zowel de uiteinde als het begin, en strippen vervolgens elk begin en einde van de 8 binnenste kabels. We kunnen dus acht leds aan sluiten op één stuk UTP kabel. Hierdoor komen we uit op 5 stukken UTP kabel per letter. (Immers, gemiddeld 40 De 8 verschillende draden binnen de UTP kabel worden omgeven door een plastic hulsel. Waardoor de draden 'georganiseerd' zijn en er geen warboel ontstaat. Deze 5 UTP kabels per letter kunnen gebundeld worden door een metalen beugeltje.
PCB
Een overzicht van het schema en het uiteindelijke ontwerp van de PCB.
Onderdelen
De PCB bestaat uit de volgende onderdelen:
- ATTiny2313
- 10x 74HC595
- 10x ULN2803
- 80x plaats voor een voorschakelweerstand
- 2x aansluiting voor een voeding van 5 volt
- 2x DB9 connector, 1 voor data in en 1 voor data out
- MAX232 voor de RS232 communicatie
Algemene werking
Elke PCB heeft 1 ATTiny2313 microcontroller(μC) die 10 stuks 74HC595 (schuifregisters) aanstuurt, die elk via een ULN2803 de leds aansturen. De AVR kan via een RS232 aansluiting data ontvangen, en via een 2e aansluiting bytes doorsturen. De bedoeling is om met de PC een reeks bytes naar de eerste module te sturen. Deze module stript zijn eigen 10 bytes van de reeks waarna hij de rest doorstuurt naar de volgende printplaat. Als er een X aantal milliseconde geen data ontvangen is gaat de AVR de data uitklokken naar de schuifregisters waarna hij een update puls geeft en de leds aangestuurd worden.
Firmware
- Ledbar AVR firmware op http://www.bemso.nl/ledbar/ledbar.7z
- Delphi aansturing http://www.bemso.nl/ledbar/ledbarpc.7z
Software
Random drive
heeft voor demonstratie en testdoeleinden een simpele Python applicatie geschreven om de leds van de bar aan te sturen. Deze is de vinden in de Frack Mercurial repository in de map //frack/projects/ledbar/random_drive.py
.
Light
Elke uitgang van de controller bordjes wordt in deze applicatie (en library om nieuwe applicaties op te bouwen) geabstraheerd als Light
object. Deze objecten kennen een gewenste helderheid die in te stellen is op 17 niveaus (in stappen van een zestiende van nul naar 100%). Voor elk van de helderheden is er een 16-stappen bit-patroon dat met grote snelheid herhaald wordt.
Alle lichten worden met een helderheid van 0 geinitialiseerd en na elke run van een patroon (16 stappen) wordt gekeken of de gewenste helderheid nog overeenstemt met de huidige helderheid. Als dit niet het geval is wordt deze met een enkele stap aangepast in de richting van de gewenste helderheid. Hierna wordt er weer een volledit bit-patroon afgespeeld voordat de evaluatie opnieuw begint. Deze bit-patronen worden met ongeveer 200Hz verwerkt, is de verwachting, wat zorgt voor een goede kwaliteit pulsbreedtemodulatie. Ook betekent dit dat de helderheid maximaal elke 80 milliseconden met een zestiende verandert, ofwel een volledige overgang van aan naar uit doorloopt in 256 stappen (1.3 seconden).
Mixer en Demo applicatie
De Mixer
is het onderdeel dat alle Light
objecten bij elkaar houdt. Bij elke iteratie van de mixer worden alle 480 gekoppelde Light
objecten geraadpleegt voor de volgende stand van de uitgang. Deze worden dan per 8 gegroepeerd om een byte samen te stellen en samen vormt dit een 60-karakter tekenreeks die teruggegeven wordt.
De demo-applicatie biedt deze tekenreeks vervolgens aan aan de Write
methode van de OutputWriter
, welke het commando naar de seriele poort stuurt, of print op het scherm (met in deze applicatie wat additionele stap-informatie).
Demo: Random
Het LED-bord wordt geïnitialiseerd met een deel van de LED aan. Deze leds zullen inschakelen en halverwege deze transisite wordt voor elk van de uitgangen weer willekeurig bepaald of deze naar een aan of uit stand zal schakelen. De standaardkans voor een uitgang om op deze wijze getoggled te worden is 25%. Dit betekent dat gemiddeld elke anderhalve seconde er 25% van de leds beginnen met een wisseling van intensiteit (ofwel 0->100%, ofwel 100->0%).
Hieronder links een demonstratie van de functionele test. Hier worden 9 leds aangestuurd (met commando's voor de volle 480) op ~160Hz bij vier niveaus pulsbreedtemodulatie.
Demo: Trail
Het tweede demonstratie programma is er een waar de leds zo geschakeld worden dat er een spoor van verlichting ontstaat. De code is op het moment vast ingesteld om een spoor van 50 leds te maken waarvan de kop en staart 4 leds lang zijn (het spoort gaat door terwijl de leds nog inschakelen).
Door een bug in de huidige LED-bar firmware ontstaan er een aantal sporen wanneer slechts een deel van de uitgangen wordt aangestuur. Wanneer er bijvoorbeeld 80 uitgangen worden aangestuurd, worden de statusen van de shiftregisters gekopieerd naar alle andere gekoppelde bordjes. Op deze manier is 5x meer bandbreedte beschikbaar voor uitermate nette pulsbreedtemodulatie. Dit is in het rechter filmpje te zien.
Gebruik applicatie
Wanneer de applicatie zonder verdere opties wordt gestart wordt de eerste beschikbare USB-seriele poort gebruikt om op 115,200 baud signalen te sturen. De standaard kans van wisselen is zoals genoemd 25%.
Usage: random_drive.py [demo_name] [options] Options: -h, --help show this help message and exit -d DEVICE Serial device to write to, or "screen" for terminal. -p PERCENT Percentage chance of toggling LED output state. -l LIGHTS Number of lights to generate a pattern for.
Zoals hierboven te lezen kan de kans van wisselen aangepast worden met -p
en het uitvoerapparaat kan gekozen worden met -d
. Het aantal uitgangen waarvoor er een patroon gemaakt worden kan aangepast worden met -l
. Wanneer er minder uitgangen aangestuurd worden zal de update-frequentie hoger liggen.
Voorbeeld van aansturen:
python random_drive.py random -d screen -p 5 -l 80
Bovenstaande zal de Random demo uitvoeren en alle LED-informatie naar de terminalsturen, dit om debugging makkelijker te maken. Tevens is veel scrollende output op een terminal een duidelijk kenmerk van een UNIX-guru ;-) Bovendien zal elk commando goed zijn om 80 leds aan en uit te schakelen (of in dit geval, 10 bytes te printen).
Hieronder de manier om de uitvoer naar de tweede USB-seriele poort te sturen, met een aangepaste 45% kans op wisselen van uitgang. Wanneer er geen aantal te schakelen uitgangen wordt aangegeven valt dit terug op de standaard 480 (80 uitgangen * 6 bordjes):
python random_drive.py random -d /dev/ttyUSB1 -p 45
Kostenoverzicht
Dit kostenoverzicht geeft weer wat de totale investering wordt om de Ledbar te realiseren. Hierbij nemen we de volgende ontwerp keuze in acht:
- leds individueel aangestuurd, Meerdere effecten/overgangen zijn mogelijk.
Kosten PCB en componenten
Aantal | (Bestelnummer) | Product | Per stuk | Totaal |
---|---|---|---|---|
50 | HKR10S-ND | CONN SOCKET IDC 10POS W/STR TIN | 0,26140 | € 13,07 |
100 | ULN2803APG(ONHZN-ND | IC DRIVER DARL 8CH 50V .5A 18DIP | 0,42870 | € 42,87 |
10 | ATTINY2313A-PU-ND | IC MCU AVR 2K FLASH 20MHZ 20DIP | 0,72640 | € 7,26 |
12 | 296-6940-5-ND | IC DUAL EIA-232 DRVR/RCVR 16-DIP | 0,49000 | € 5,88 |
50 | 1189-1421-ND | CAP ALUM 1UF 50V 20% RADIAL | 0,09520 | € 4,76 |
135 | 490-5401-ND | CAP CER 0.1UF 50V RADIAL | 0,08460 | € 11,42 |
12 | CTX1081-ND | CRYSTAL 14.7456 MHZ SERIES FUND | 0,25600 | € 3,07 |
25 | BC1004CT-ND | CAP CER 18PF 50V 5% RADIAL | 0,22200 | € 5,55 |
110 | 296-4619-5-ND | IC 8BIT SHFT REG TRI-ST 16-DIP | 0,34940 | € 38,43 |
500 | CF14JT56R0CT-ND | Weerstand 56 ohm | 0,01088 | € 5,44 |
500 | CF14JT120R0CT-ND | Weerstand 120 ohm | 0,01088 | € 5,44 |
10 | PCB | € 169,77 | ||
Totaal | € 312,96 |
Kosten platen + Leds
Product | Aantal | Totale prijs |
---|---|---|
Hout | 1 | €10,75 |
Scharnieren | 4 | €17,07 |
leds | 800 | €14,95 |
Kosten totaal
Bestaande uit:
- PCB: € 312,96
- Algemene designkosten: €42,75
Maakt een totaal van € 355,71.