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.

Geen opmerkingen:

Een reactie posten