Arduino snelheid

Door Blokker_1999 op zondag 17 november 2013 19:09 - Reacties (16)
Categorie: /var, Views: 4.755

Dit weekend heb ik me bezig gehouden met wat leuk speelgoed. 2 grote LED matrix displays van elks 16x64. Deze displays zijn afkomstig uit de interne bestemmingsaanduiders van de M6 rijtuigen.

Deze displays vormden een leuke uitdaging. Ze worden voor ons op maat gemaakt, maar eigenlijk weten we zeer weinig van deze displays. De leverancier van deze displays gaf recent een interessante demo bij ons op kantoor met deze displays voor een ander project. Bij deze demo gebeurde de aansturing met behulp van een arduino microcontroller. Daar ik thuis zelf zo een controller heb liggen dacht ik: dat moet ik ook eens proberen.

De uitdaging was alleen iets groter dan eerst voorzien. De elektronische schemas van het display zijn welliswaar beschikbaar in de datasheet van de displays, maar de aanduidingen op die schemas zijn onleesbaar. Met veel geduld, een multimeter en scherpe meetpennen die door de beschermlak gaan toch het schema kunnen herconstrueren en de aansluitingen kunnen bepalen, tijdens het weekend nog altijd sneller dan deze aan de leverancier te vragen ;).

Direct volgde de volgende tegenslag. De meeste voorbeelden die je online vind gaan er van uit dat je een datalijn hebt per rij die je gaat aansturen. dat geeft dat je een volledige kolom in 1 keer kunt weergeven en dat je dus kolom per kolom kan weergeven. Helaas, niet op deze displays. Omdat we 16 rijen hebben heeft men ervoor gekozen deze achter een 1-of-8 Decoder/Demultiplexer te plaatsen waardoor je slechts 1 rij gelijktijdig kan laten oplichten. Als ik kolom per kolom wens op te bouwen moet ik dan ook elke LED apart gaan laten oplichten wat de scantime over het display enorm de hoogte indrijft. De eerste code die ik geschreven heb paste dit principe toe, maar bleek uiteindelijk onwerkbaar.

Na even mijn hersenen te pijnigen er toch achter gekomen hoe het dan wel moet. Je stuurt de data voor de hele lijn in 1 keer door de schuifregisters, latcht deze vast, zet je uitgang hoog voor die rij, en terwijl die rij oplicht laad je de data voor je volgende rij in je schuifregister. Eenmaal ingeladen, even je uitgang laag brengen, latch loslaten, vastzetten, van rij verspringen en uitgang terug hoog zetten.

Als dit snel genoeg gaat krijg je zo een proper beeld van je display. … Maar hier komt arduino op zich te kort. Omdat de arduino software een eigen programeertaal heeft gaat er redelijk wat snelheid verloren. Na het herschrijven van de software had ik dan ook een enorm flikkerend (en dus storend) beeld.

Ik ben dan op het internet op zoek gegaan, en je kan blijkbaar digitalWrite(PIN STATE); ook vervangen daar volwaardige C code. Volgens testen die ik ben tegengekomen gaat het met C-stijl code ongeveer 10x sneller. Nadat ik de 2 meest gebruikte pinnen in mijn code had omgevormd was het beeld op het display gewoon stabiel te noemen. Ik ben dan nu ook bezig met de andere pinnen ook nog om te vormen.

Arduino heeft alle pinnen netjes genummerd, maar om deze rechtstreeks aan te spreken moet je deze vertalen naar het juiste poortnummer van je controller, hiervoor kan je op het internet figuren vinden, ook op de arduino website zoals voor mijn eigen Mega2560.

Het direct aansturen van de pinnen doe je op volgende manier:

Een poort hoog zetten:
PORT{letter} |= _BV(P{letter}{number});

Een poort laag zetten:
PORT{letter} &= ~_BV(P{letter}{number});

Een voorbeeld van Pin13 op mijn Mega2560 (poort B7):
PORTB |= _BV(PB7); //PIN13 hoog
PORTB &= ~_BV(PB7); //PIN13 laag

Wanneer snelheid belangrijk is loont het dus om de arduino code te vervangen door C-stijl code die de AVR GCC compiler kan verstaan. Nog beter is uiteraard om de arduino omgeving volledig links te laten liggen en helemaal in C-stijl te gaan programmeren.

http://tweakers.net/ext/f/UxqcP4BaqR8oUSjjr6y7iDUw/medium.jpg

Volgende dingen op het programma: mijn ASCII tabel verder uitwerken (op dit moment enkel het alfabet in hoofdletters), display uitbreiden naar een formaat dat vergelijkbaar is zoals we het in de trein terug vinden, animaties toevoegen (text scrolling), communicatieprotocol toevoegen, … . Maar ook bestaat de kans dat ik de arduino ga inruilen voor iets anders, zoals een pandabord met sturing via de GPIO pinnen.