donderdag 31 december 2020

Multifunctioneel display - De modules

Op het dashboard van de Burton komt maar één 'teller' (lees: meter, klok). Huh, één teller hoor ik je denken... Da's best weinig. Klopt! De meeste Burtons hebben juist veel metertjes op het dashboard. Zelfs zoveel dat er een bijrijder nodig is om ze allemaal uit te lezen 😉. Hartstikke mooi, maar bij mij dus maar eentje en daar moet dan ook best wel wat info op verschijnen. In het vorige bericht staat een lijstje. In datzelfde bericht staan ook enkele onderdelen van het display genoemd. Die wil ik in dit bericht de revue laten passeren.


1: Primair display

In het midden van het display komen vier 7-segmentdisplays. Hierop wordt normaliter de snelheid gepresenteerd. Nu heb je bij de Burton geen vier cijfers nodig om de snelheid te laten zien. Sterker nog, meestal zullen twee cijfers voldoende zijn. Waarom dan toch vier cijfers? Twee redenen: (1) omdat een snelheid met twee cijfers dan netjes in het midden staat en (2) dan kan ik er eventueel ook nog het toerental op tonen. Bijvoorbeeld als de Burton in de sport-mode staat 😂.

De 7-segmentdisplays worden met een TM1637 aangestuurd. De TM1637 stuurt de displays gemultiplext aan. De vier displays komen op een gaatjesprint, eentje met van die lange banen (strip board). Altijd handig om dit van tevoren even uit te tekenen.

Strip Board in DIYLC

De pootjes van de TM1637 zijn op een handige manier ingedeeld. Alle segmentaansturingen zitten aan een kant. Daar is vast over nagedacht. De displays, het IC en de weerstanden komen aan de bovenkant van de gaatjesprint. De verbindingen aan de onderkant. Even scherp blijven bij het solderen. Het is niet de eerste keer dat ik rechts/links of boven/onder door elkaar haal...

Soldeerzijde

Later spuit ik nog wat plastic spray op de soldeerzijde, maar wel pas als ik zeker weet dat ik er niet meer met de soldeerbout bij hoef.

Componentzijde


De 7-segmentdisplays zijn nu nog voorzien van een beschermende folie. Die haal ik er pas op het laatste moment vanaf.


2: Secundair display

Naast de vier 7-segmentsdisplays van hierboven komt er nog een rijtje 7-segmentdisplays in het apparaat. Zes stuks van een kleiner formaat. Hierop kan de kilometerteller, de tripmeter, het toerental of nog iets anders getoond worden. Misschien wel twee dingen gelijktijdig. Software is geduldig...


Omdat deze module wat minder ruimte krijgt (zie verderop), wordt de TM1637 dwars geplaatst. De TM1637 kan maximaal zes 7-segmentdisplays aansturen. Er zitten drie van die kleine cijfers in één component gestopt (zie foto). Wel even rekening houden met de aansluitmogelijkheid van de 7-segmentdisplays. Je hebt ze in common-anode en common-kathode. In eerste instantie wilde ik ze met een schuifregister aansturen, totdat ik de - in mijn ogen veel gemakkelijkere - TM1637 tegen kwam. En wat denk je, ik had natuurlijk de verkeerde type displays in huis.

Oh, de module op zijn kop.


3: OLED-module

Om de flexibiliteit van het geheel te vergroten stop ik nog twee kleine OLED-displays in het apparaat. Deze zijn met een tweedraads-bus (I²C) aan te sturen en zijn goed te lezen in direct zonlicht. Ze sturen per pixel namelijk actief licht uit, i.p.v. de achtergrondverlichting bij TFT's enz. De helderheid is instelbaar, maar wel beperkt. Beide displays maken gebruik van dezelfde I²C-bus, dus de flexibiliteit gaat niet ten koste van uitgangen op de microcontroller. Wel wordt de software een stukje complexer. Omdat ik gebruik maak van het development framework van Espressif (de maker van de ESP32-chip) en niet van het afgeleide Arduino-framework, heb ik veel minder bibliotheken ter beschikking.

Twee kleine OLED-display's

De OLED-displays hebben een resolutie van 128 x 64 pixels. Hier valt weinig aan te solderen, omdat ze al op een klein printje zitten met een I²C-interface. Kwestie van aansluiten dus. Er moet alleen een klein SMD-weerstandje omgesoldeerd worden op één van de twee displays. Anders zouden ze op hetzelfde I²C-adres staan. Aangezien ze op dezelfde bus zitten moet het adres verschillend zijn. De meeste displays staan standaard op adres 78(hex), maar kunnen door deze handeling ook op 7A(hex) gezet worden.


4. Indicatielampjes

De vierde module van het multifunctionele display is een stick met acht neopixels. De neopixels kunnen onafhankelijk van elkaar en in alle kleuren van de regenboog aangestuurd worden. De helderheid is groot en dus zijn de neopixels ideaal voor het gebruik als storingslampjes en andersoortige indicatoren. De aansturing van de neopixels gebeurt met één enkele datalijn. De timing is echter behoorlijk kritisch en kan per type neopixel of fabrikant verschillend zijn. Een tijdje terug heb ik hier al eens wat over geschreven.

Acht neopixels op een stick...

De gaatjes in de stick zijn erg klein. Op de foto is te zien dat een klein stukje gaatjesprint gebruikt wordt voor de bevestiging van deze module in het uiteindelijke display.


De vier modules zijn los van elkaar gefabriceerd en niet op één enkele gaatjesprint om de eenvoudige reden dat de afzonderlijke displays verschillende diktes hebben. Ze moeten uiteindelijk op gelijke hoogte uitkomen. Met de inbusboutjes kan per module de hoogte ingesteld worden. Uiteindelijk wordt het geheel op een plaatje Trespa samengesteld.

Alle modules samengesteld

Hoogte van de modules afzonderlijk instelbaar

Het plaatje Trespa wordt uiteindelijk met wat stukjes aluminium hoekprofiel achter het dashboard bevestigd. Aan de voorzijde komt een gedraaide aluminium ring en donker plexiglas. De microcontroller die het geheel bestuurt komt in een klein spuitgietkastje aan de achterkant van het plaatje Trespa. Hierover in volgende berichten meer.

dinsdag 29 december 2020

Multifunctioneel display - Intro

In eerdere berichten is al te lezen dat onze Burton voorzien gaat worden van wat elektronische componenten. Niet zozeer om de motor aan te sturen, maar vooral voor de lampen en het dashboard. Het dashboard gaat trouwens een vrij minimalistisch uiterlijk krijgen. Weinig klokken, meters en lampjes. Hoewel... vooral weinig onderdelen. Alle "klokken, meters en lampjes" wil ik verzamelen in één enkel multifunctioneel apparaat/display. Nu heb ik overwogen om een centrale tablet te plaatsen, vergelijkbaar met wat in moderne auto's de de facto standaard lijkt te worden. Maar dat heeft in een open auto wel wat nadelen (regen, diefstal, leesbaarheid in direct zonlicht). Hoewel al die nadelen oplosbaar zijn heb ik toch gekozen voor het ontwikkelen van een eigen multifunctioneel display. Het wordt een rond display dat een plekje krijgt ergens midden op het dashboard van de Burton. De volgende bedieningen en uitlezingen worden onderdeel van dit display:

  • Snelheidsmeter
  • Toerental
  • Kilometerstand totaal
  • Tripmeter
  • Tijd
  • Brandstofmeter
  • Kachelbediening
  • Interval ruitenwisser
  • Lampjes voor knipper- en alarmlicht
  • Lampje dimlicht
  • Lampje groot licht
  • Lampje oliedruk
  • Lampje reservoir remolie
  • Lampje handrem
  • Lampje choke
  • Lampje accuspanning
  • Lampje brandstof
Mogelijk dat er in de toekomst nog wat bijkomt, zoals een oliedrukmeter, olietemperatuurmeter, mistlampindicator, accuspanningsmeter, enz... Maar voorlopig is bovenstaand lijstje lang genoeg 😉. Dit universele display wordt aangesloten op de CAN-bus. Onder het dashboard zal het qua bekabeling dus wel rustig blijven.

Om alle data te presenteren stop ik de volgende onderdelen in het display:
  • 4 stuks 7-segmentdisplay (groot) - voor de snelheidsmeter
  • 6 stuks 7-segmentdisplay (klein) - voor kilometerstand/tripmeter
  • 2 stuks OLED-display (klein) - diverse instellingen en uitlezingen
  • 1 stuks 8-neopixel stick - voor alle lampjes
De aansturing van de 7-segmentdisplay's gebeurt via de TM1637-interface. De OLED-displays worden via I²C aangestuurd. De neopixels hebben een één-draads aansluiting op de microcontroller. Alles bijeen niet meer dan zeven data/clock-lijntjes.

De bediening van dit alles wil ik uitvoeren met één enkele rotary encoder met drukknop. Hiervoor moet nog een aansluiting en driver bedacht worden. Dat klinkt gemakkelijker dan het is.

Rotary Encoder EC11

Een rotary encoder van het type EC11 heeft een A- en een B-aansluiting die bij het draaien aan de knop hoog en laag worden. Het A-signaal is een halve pulsbreedte verschoven t.o.v. het B-signaal. De stippellijnen in onderstaand schema geven de voelbare 'rustposities' van de knop aan. De encoder die ik gebruik heeft 20 van die rustposities per omwenteling.

Pulstreintjes

Door de faseverschuiving tussen A en B is het mogelijk om het roteren zelf én de rotatierichting te bepalen. Door bij de opgaande flank van A de status van B te bekijken weet je of je rechts- of linksom aan het draaien bent. De meeste eenvoudige rotary encoders maken gebruik van sleepcontacten en die introduceren wel wat uitdagingen. Ze slaan wel eens een vlakje over als te snel gedraaid wordt (de maximum rotatiesnelheid is vaak vastgelegd in de datasheet). Verder zorgen ze net als andere mechanische schakelaars voor contactdender.

Als de microcontroller niets anders te doen zou hebben, zou je in een oneindige loop de ingangen A en B uit kunnen lezen en hier een stukje software voor kunnen schrijven. Alleen heeft de microcontroller al best wat taken uit te voeren, dus dat uitlezen wordt anders opgelost.

Een plausibele oplossing zou het gebruik van interrupts zijn. De ESP32 heeft echter nog een andere mogelijkheid: de Pulse Counter. Dit is een 16-bits high speed counter, uitgevoerd in de hardware van de chip, speciaal bedoeld om op- en/of neergaande flanken van een digitale input te tellen. De ESP32 bezit acht van deze counter units met ieder twee channels waarbij elk channel ook nog 'bestuurd' kan worden door een tweede digitale input. En die mogelijkheid is ideaal voor de toepassing met een rotary encoder, want hiermee kan bepaald worden of de counter op of af moet tellen. Verder is het mogelijk om een 'filter' op de ingang te configureren waarmee het probleem van contactdender opgelost wordt. De mogelijkheden van de ESP32 blijven me verbazen.


Configuratie Pulse Counter Unit

Met de .neg_mode en de .pos_mode wordt geconfigureerd dat alleen op de opgaande flank van A geteld wordt. Met de .hctrl_mode en .lctrl_mode wordt geconfigureerd wat er gebeurt als signaal B hoog of laag is tijdens de opgaande flank van A: optellen of aftellen. Na het configureren en activeren van de counter doet de ESP32 zelfstandig zijn werk. De counter hoeft alleen nog maar af en toe door de software uitgelezen te worden.

De knop-functie van de rotary encoder wordt trouwens wel met een interrupt opgelost. Het gebruik van interrupts in combinatie met een task switching operating system als FreeRTOS levert nog wel een extra uitdaging op. De interrupt hoort namelijk bij een specifieke taak. Wat als die taak net niet aan de beurt is, of wat als er net geswitcht zou moeten worden als de interrupt service routine bezig is? Verder is de knop-functie van de rotary encoder een mechanische schakelaar en veroorzaakt dus ook contactdender. Hier worden - vaker dan gewenst - interrupts op gegenereerd. Allemaal zaken om rekening mee te houden.

Inmiddels begint het allemaal een beetje vorm te krijgen en zijn de eerste stappen in de richting van het multifunctionele display gezet. Ook hier zijn de stapjes klein en duren ze altijd weer langer dan gedacht, maar daarom is het ook een hobby. Enkele sfeerfoto's:


Testopstelling op breadboard


De twee OLED's achter een stukje donker plexiglas


Alle display-elementen komen achter donker plexiglas. Zo krijgt het geheel een rustig(er) uiterlijk. In een volgend bericht laat ik zien hoe het geheel samengesteld wordt. Daar moet ik trouwens nog wel een ei over leggen.