Inhoudsopgave:

5x4 LED-displaymatrix met behulp van een Basic Stamp 2 (bs2) en Charlieplexing: 7 stappen
5x4 LED-displaymatrix met behulp van een Basic Stamp 2 (bs2) en Charlieplexing: 7 stappen

Video: 5x4 LED-displaymatrix met behulp van een Basic Stamp 2 (bs2) en Charlieplexing: 7 stappen

Video: 5x4 LED-displaymatrix met behulp van een Basic Stamp 2 (bs2) en Charlieplexing: 7 stappen
Video: Charlieplexing 2024, Juli-
Anonim
5x4 LED-displaymatrix met behulp van een Basic Stamp 2 (bs2) en Charlieplexing
5x4 LED-displaymatrix met behulp van een Basic Stamp 2 (bs2) en Charlieplexing

Heb je een Basic Stamp 2 en wat extra LED's rondhangen? Waarom niet spelen met het concept van charlieplexing en een uitvoer maken met slechts 5 pinnen.

Voor deze instructable zal ik de BS2e gebruiken, maar elk lid van de BS2-familie zou moeten werken.

Stap 1: Charlieplexing: wat, waarom en hoe

Laten we eerst het waarom uit de weg ruimen. Waarom charlieplexen gebruiken met een Basic Stamp 2? ---Proof of concept: leer hoe Charlieplexing werkt en leer iets over de BS2. Dit kan voor mij later nuttig zijn om snellere 8-pins chips te gebruiken (slechts 5 van hen zullen i/o zijn). --- Nuttige reden: in principe is er geen. De BS2 is veel te traag om weer te geven zonder merkbare flikkering. Wat is charlieplexing?---Charlieplexing is een methode om een groot aantal LED's aan te sturen met een klein aantal microprocessor-i/o-pinnen. Ik leerde over charlieplexing van www.instructables.com en jij kunt dat ook: Charlieplexing LED's- The theoryHoe veel LED's aan te sturen met een paar microcontroller-pinnen. Ook op wikipedia: CharlieplexingHoe kan ik 20 leds aansturen met 5 i/o-pinnen?---Lees de drie links onder "Wat is charlieplexing?" door. Dat verklaart het beter dan ik ooit zou kunnen. Charlieplexing is anders dan traditioneel multiplexen, waarbij één i/o-pin voor elke rij en elke kolom nodig is (dat zou een totaal zijn van 9 i/o-pinnen voor een 5/4-scherm).

Stap 2: Hardware en schema

Hardware en schema
Hardware en schema

Materialenlijst:1x - Basic Stamp 220x - light emitting diodes (LED's) van hetzelfde type (kleur en spanningsval)5x - weerstanden (zie hieronder betreffende weerstandswaarde)Auxiliary/Optioneel:Programmeermethode van uw BS2Momentary drukknop als resetschakelaar6v -9vVoeding afhankelijk van uw versie van de BS2 (lees uw handleiding) Het schema: Dit schema is samengesteld met de mechanische lay-out in gedachten. U ziet het raster van LED's aan de linkerkant, dit is de richting waarvoor de BS2-code is geschreven. Merk op dat bij elk paar LED's de anode is aangesloten op de kathode van de andere. Ze zijn dan verbonden met een van de vijf i/o-pinnen. Weerstandswaarden: U moet uw eigen weerstandswaarden berekenen. Controleer de datasheet van uw LED's of gebruik de LED-instelling op uw digitale multimeter om de spanningsval van uw LED's te vinden. Laten we wat berekeningen doen: Voedingsspanning - Spanningsdaling / Gewenste stroom = Weerstandswaarde De BS2 levert 5v gereguleerd vermogen en kan 20ma leveren van stroom. Mijn LED's hebben een daling van 1,6 V en werken op 20 ma.5v - 1.6v /.02amps = 155ohm. Om je BS2 te beschermen, moet je de volgende hogere weerstandswaarde gebruiken van wat je krijgt met de berekening, in dit geval denk ik dat het 180 ohm zou zijn. Ik gebruikte 220 ohm omdat mijn ontwikkelbord die waarde van de weerstand erin heeft ingebouwd voor elke i / o-pin. OPMERKING: ik geloof dat, aangezien er een weerstand op elke pin zit, dit de weerstand op elke led effectief verdubbelt, aangezien de ene pin V+ is en de andere Gnd. Als dit het geval is, moet u de weerstandswaarden halveren. Het nadelige effect van een te hoge weerstandswaarde is een dimmer LED. Kan iemand dit verifiëren en me een PM of opmerking achterlaten zodat ik deze informatie kan bijwerken? Programmeren: Ik heb een ontwikkelbord gebruikt met een DB9-connector om de chip direct op het bord te programmeren. Ik gebruik deze chip ook op mijn soldeerloze breadboard en heb een In Circuit Serial Programming (ICSP) -header opgenomen. De header is 5 pinnen, pinnen 2 tot en met 5 verbinden met pinnen 2-5 op een DB9 seriële kabel (Pin 1 is ongebruikt). Houd er rekening mee dat om deze ICSP-header te gebruiken pinnen 6 en 7 op de DB9-kabel met elkaar moeten worden verbonden. Reset: Een kortstondige reset-knop is optioneel. Dit trekt gewoon pin 22 naar de grond wanneer deze wordt ingedrukt.

Stap 3: Breadboarden

Breadboarden
Breadboarden
Breadboarden
Breadboarden

Nu is het tijd om de matrix op een breadboard te bouwen. Ik heb een aansluitstrip gebruikt om één poot van elk ledpaar met elkaar te verbinden en een kleine jumperdraad om de andere poten te verbinden. Dit wordt gedetailleerd beschreven in de close-upfoto en wordt hier uitgebreid uitgelegd: 1. Oriënteer uw breadboard zodat deze overeenkomt met de grotere afbeelding2. Plaats LED 1 met de anode (+) naar u toe en de kathode (-) van u af.3. Plaats LED 2 in dezelfde richting als de Anode (+) in de aansluitklemmenstrook van de LED 1 kathode.4. Gebruik een kleine jumperdraad om de anode van LED 1 te verbinden met de kathode van LED 2.5. Herhaal dit totdat elk paar LED's aan het bord is toegevoegd. Ik gebruik wat normaal de voedingsbusstrips van het broodbord zijn als busstrips voor de BS2 I/O-pinnen. Omdat er maar 4 busstrips zijn gebruik ik een aansluitstrip voor P4 (de vijfde I/O aansluiting). Dit is te zien op de grotere afbeelding hieronder.6. Sluit de klemmenstrook voor de kathode LED 1 aan op de P0-busstrook. Herhaal dit voor elke oneven genummerde LED en vervang de juiste P* voor elk paar (zie het schema).7. Sluit de klemmenstrook voor de LED 2-kathode aan op de P1-busstrook. Herhaal dit voor elke oneven genummerde LED en vervang de juiste P* voor elk paar (zie het schema).8. Sluit elke busstrip aan op de juiste I/O-pin op de BS2 (P0-P4).9. Controleer alle aansluitingen om er zeker van te zijn dat ze overeenkomen met het schema.10. Vier. OPMERKING: In de close-up ziet u dat het niet lijkt alsof ik stap 7 heb gevolgd omdat de verbinding met de tweede I/O-pin op de Anode van de oneven genummerde LED's zit. Onthoud dat de kathode van de even genummerde LED's is verbonden met de anode van de oneven genummerde LED's, zodat de verbinding hoe dan ook hetzelfde is. Als deze opmerking u in de war brengt, negeert u deze gewoon.

Stap 4: Basisprincipes van programmeren

Om charlieplexing te laten werken, zet je slechts één led tegelijk aan. Om dit met onze BS2 te laten werken, hebben we twee basisstappen nodig: 1. Stel de uitvoermodi voor de pinnen in met behulp van het OUTS-commando.2. Vertel de BS2 welke pinnen als uitgangen moeten worden gebruikt met behulp van het DIRS-commando. Dit werkt omdat de BS2 kan worden verteld welke pinnen hoog en laag moeten worden gestuurd en zal wachten om dit te doen totdat je opgeeft welke pinnen de uitgangen zijn. Laten we eens kijken of de dingen correct zijn aangesloten door probeer gewoon LED 1 te knipperen. Als je naar het schema kijkt, kun je zien dat P0 is aangesloten op de kathode (-) van LED 1 en P1 is aangesloten op de anode van diezelfde LED. Dit betekent dat we P0 laag en P1 hoog willen rijden. Dit kan als volgt worden gedaan: "OUTS = %11110" die P4-P1 hoog en P0 laag maakt.(% geeft aan dat een binair getal moet volgen. Het laagste binaire cijfer staat altijd aan de rechterkant. 0=LAAG, 1=HOOG) De BS2 slaat die informatie op, maar handelt er niet naar totdat we aangeven welke pinnen outputs zijn. Deze stap is essentieel omdat er slechts twee pinnen tegelijkertijd moeten worden uitgevoerd. De rest moeten ingangen zijn, die die pinnen in de hoge impedantie-modus zet, zodat ze geen stroom zullen zinken. We moeten P0 en P1 sturen, dus we zullen die instellen op uitgangen en de rest op ingangen, zoals: "DIRS = %00011".(% geeft aan dat een binair getal moet volgen. Het laagste binaire cijfer staat altijd aan de rechterkant. 0 =INPUT, 1=OUTPUT)Laten we dat samenvoegen tot een bruikbare code:' {$STAMP BS2e}' {$PBASIC 2.5}DO OUTS = %11110 'Drive P0 laag en P1-P4 hoog DIRS = %00011 'Set P0- P1 als uitgangen en P2-P4 als ingangen PAUZE 250 'Pauzeer voor LED om aan te blijven DIRS = 0' Zet alle pinnen op Input. Hierdoor wordt de LED PAUSE 250 uitgeschakeld 'Pauze voor LED om uit te blijven LOOP'

Stap 5: De ontwikkelingscyclus

Nu we hebben gezien dat één pin werkt, is het tijd om ervoor te zorgen dat ze allemaal werken.20led_Zig-Zag.bseDeze bijgevoegde code zou elk van de 20 LEDS in een zigzagpatroon moeten oplichten. U zult merken dat nadat elke pin de bak heeft verlicht, ik "DIRS = 0" gebruik om alle pinnen weer in inputs te veranderen. Als u de OUTS wijzigt zonder de uitgangspinnen uit te schakelen, kunt u wat "ghosting" krijgen, waarbij een led die niet moet branden tussen de cycli kan knipperen. Als u de W1-variabele aan het begin van deze code verandert in "W1 = 1" daar zal slechts een pauze van 1 milliseconde zijn tussen elke knippering van de LED. Dit veroorzaakt een persistent of vision (POV) -effect waardoor het lijkt alsof alle LED's branden. Dit heeft als effect dat de LED's zwakker worden, maar het is de essentie van hoe we karakters op deze matrix zullen weergeven.20led_Interpreter_Proto.bse. LED's in een bruikbaar patroon. Dit bestand is mijn eerste poging. U zult zien dat onderaan het bestand de karakters zijn opgeslagen in vier regels van 5 cijfers binair. Elke regel wordt ingelezen, geparseerd en er wordt een subroutine aangeroepen telkens wanneer een led moet branden. Deze code werkt, door de cijfers 1-0 te bladeren. Als u het toch probeert uit te voeren, merkt u dat het wordt geplaagd door een zeer trage verversingssnelheid waardoor de tekens bijna te langzaam knipperen om te worden herkend. Deze code is om vele redenen slecht. Ten eerste nemen vijf cijfers binair net zoveel ruimte in beslag in de EEPROM als 8 cijfers binair, aangezien alle informatie in groepen van vier bits wordt opgeslagen. Ten tweede vereist de SELECT CASE die wordt gebruikt om te beslissen welke pin moet worden verlicht, 20 gevallen. De BS2 is beperkt tot 16 gevallen per SELECT-bewerking. Dit betekent dat ik die beperking moest omzeilen met een IF-THEN-ELSE-statement. Er moet een betere manier zijn. Na een paar uur hoofd krabben ontdekte ik het.

Stap 6: een betere tolk

Elke rij van onze matrix bestaat uit 4 LED's, elk kan aan of uit zijn. De BS2 slaat informatie op in zijn EEPROM in groepen van vier bits. Die correlatie zou het ons veel gemakkelijker moeten maken. Daarnaast komen vier bits overeen met de decimale getallen 0-15 voor een totaal van 16 mogelijkheden. Dit maakt of SELECT CASE veel gemakkelijker. Hier is het cijfer 7 zoals opgeslagen in de EEPROM:'7 %1111, %1001, %0010, %0100, %0100, Elke rij heeft een decimaal equivalent aan 0-15, dus we lezen een rij in vanuit het geheugen en voer het rechtstreeks naar de SELECT CASE-functie. Dit betekent dat de voor mensen leesbare binaire matrix die wordt gebruikt om elk teken te maken (1 = led aan, 0 = led uit) de sleutel is voor de interpreter. Om dezelfde SELECT CASE voor elk van de 5 rijen te gebruiken, heb ik een andere select case gebruikt om de DIRS en OUTS als variabelen in te stellen. Ik las eerst in elk van de vijf regels van het karakter naar variabelen ROW1-ROW5. Het hoofdprogramma roept vervolgens de subroutine op om het teken weer te geven. Deze subroutine neemt de eerste rij en wijst de vier mogelijke OUTS-combinaties toe aan variabele outp1-outp4 en de twee mogelijke DIRS-combinaties aan direc1 & direc2. LED's knipperen, de rijteller wordt verhoogd en hetzelfde proces wordt uitgevoerd voor elk van de andere vier rijen. Dit is veel sneller dan het eerste interpreterprogramma. Dat gezegd hebbende, is er nog steeds een merkbare flikkering. Bekijk de video, de camera maakt de flikkering veel erger, maar je snapt het idee. Door dit concept over te zetten naar een veel snellere chip, zoals een picMicro of een AVR-chip, zouden deze karakters kunnen worden weergegeven zonder een merkbare flikkering.

Stap 7: Waar te gaan vanaf hier?

Ik heb geen cnc-frees of etsbenodigdheden om printplaten te maken, dus ik zal dit project niet bedraden. Als je een molen hebt en geïnteresseerd bent om samen te werken om van hieruit verder te komen, stuur me dan een bericht. Ik zou graag betalen voor materialen en verzending, nog gelukkiger om iets van een afgewerkt product voor dit project te laten zien.

Andere mogelijkheden: 1. Port deze naar een andere chip. Dit matrixontwerp kan worden gebruikt met elke chip die 5 i/o-pinnen beschikbaar heeft die geschikt zijn voor drie toestanden (pinnen die hoog, laag of ingangsvermogen (hoge impedantie) kunnen zijn). 2. Met een snellere chip (misschien AVR of picMicro) kun je de schaal vergroten. Met een 20-pins chip zou je 14 pinnen kunnen gebruiken om een 8x22 display te charlieplexen en de resterende pinnen gebruiken om seriële commando's van een computer of een andere controller te ontvangen. Gebruik nog drie 20-pins chips en je kunt een scrollend scherm hebben dat 8x88 is voor in totaal 11 karakters tegelijk (afhankelijk van de breedte van elk karakter natuurlijk). Veel geluk veel plezier!

Aanbevolen: