dinsdag 20 december 2022

Snelheidsmeter

Eerder al heb ik wat berichten (hier en hier) geschreven over de snelheidssensor en hoe die het analoge signaal van de versnellingsbak (lees: kabel naar de oorspronkelijke snelheidsmeter) omzet naar een digitaal signaal (blokgolf). De sensor geeft twee pulsen per omwenteling. Als de k-factor gelijk is aan 1.0, dan betekent dit per omwenteling precies één meter afgelegde weg.


Bij 120 km/h (haal ik waarschijnlijk nooit) wordt één meter afgelegd in 3600 [s/h] / 120 [km/h] = 30 milliseconde. De lengte van één puls is dan minimaal 30 / 4 = 7.5 milliseconde. De ESP32 heeft een standaard Tick Time (o.a. gebruikt voor het schakelen tussen Tasks) van 10 milliseconde. De puls al pollend inlezen in een Task is dan geen optie. Hiervoor is de blokgolf/pulstrein te snel. Met een Interrupt moet dit echter wél lukken. Interrupts kunnen de 'normale' afloop van het programma onderbreken. Wanneer een Interrupt Event optreedt, wordt een Interrupt Service Routine (ISR) aangeroepen. Dit is een functie die gebruikt wordt om het event af te handelen.

In eerste instantie heb ik gekozen om de interrupt zo in te stellen dat deze reageert op de opgaande flank van de blokgolf. Telkens wanneer de ISR doorlopen wordt, wordt de systeemtijd (het aantal microsecondes vanaf de start) van de microcontroller in een buffer gezet. Die buffer (de juiste term is eigenlijk Queue) wordt later door een 'normale' taak uitgelezen en verwerkt tot snelheid.

De eerste resultaten van deze opzet waren niet bepaald hoopgevend. Om niet te zeggen: frustrerend slecht. De tijd tussen twee pulsen schiet echt alle kanten op.

Pulstijd bij verschillende snelheden van de accuboormachine

In bovenstaande grafiek wordt de tijdsduur tussen twee interrupts in microsecondes getoond. Een korte tijd is een hoge snelheid. De meting is uitgevoerd met een accuboormachine die omgerekend ongeveer een snelheid van 120 km/h kan nabootsen. Maar wat gaat hier nu mis? Is dit een elektrisch, mechanisch of softwareprobleem? Hoe dan ook, het moet opgelost worden want met deze data kan ik geen stabiel en actueel snelheidssignaal genereren.

Mogelijk ligt het aan de snelheidskabel. Da's nog de oude kabel uit de Eend. Ik heb de snelheidsmeter in de Eend ook wel eens op en neer zien trillen bij bepaalde snelheden. Dit probleem is uit te sluiten door een meting te doen met de boormachine direct op de speedsensor; dus zonder kabel ertussen. Helaas zien die metingen er ongeveer hetzelfde uit.

Een andere mogelijkheid is de boormachine zelf. Het is er een van het brushless type. Hierin zit een softwarematige besturing van de elektromagneten die misschien iets van onbalans veroorzaakt. Een meting met een oude boormachine mét koolborstels laat ook weer zien dat het probleem niet opgelost is.

Elektrisch misschien? In eerste instantie leek dit voor mij onwaarschijnlijk omdat de meting optisch is, er een laagdoorlaatfilter met een tijdsconstante van 1 milliseconde toegepast is en de analoge meting netjes digitaal gemaakt wordt met een LM393 comparator.

Dan moet het wel aan de software liggen. Maar veel simpeler dan wat er nu geprogrammeerd is, kan het niet gemaakt worden. De ISR leest 'slechts' de processortijd uit en zet die in een buffer. Gaat er dan toch iets mis met de interruptafhandeling in de ESP32 zelf? Of zit hier jitter op of lagging in, in verband met het Real Time Operating System (FreeRTOS) van de ESP32? Het gebruik van een interrupt in een Task Switching systeem is ook wel een beetje discutabel... "Op een andere manier meten", tipte een collega. Da's natuurlijk geen slecht idee. Om uit te sluiten dat de interruptafhandeling van de ESP32 debet is aan het probleem, heb ik de meting in een Arduino UNO geprogrammeerd. De Arduino heeft geen RTOS en is hierdoor per definitie veel eenvoudiger. Er is niet veel wat de werking van de interrupt kan beïnvloeden.

De test met de Arduino liet twee problemen zien:
  1. Met enige regelmaat (ongeveer 50%) wordt de interrupt twee keer direct na elkaar afgevuurd.
  2. De tijdsduur tussen de interrupts is de helft van wat de ESP32 als resultaat gaf.
Probleem 2. is erg vreemd, want dat zou betekenen dat de Burton 240 km/h zou rijden ;-). Het lijkt net alsof de neergaande flank ook een interrupt oplevert. Probleem 1. zou betekenen dat er iets met de opgaande flank aan de hand is. Het wordt tijd om de blokgolf nog maar eens met een oscilloscoop te bekijken (5 milliseconde per divisie):


120 km/h: pulslengte ongeveer 7.5 milliseconde


Bovenstaand plaatje komt overeen met ongeveer 120 km/h. Mooie nette pulsen, korter zullen ze niet worden. Geen reden tot zorg toch? Als er echter ingezoomd wordt op de opgaande flank (500 nanoseconde per divisie), dan wordt de oorzaak duidelijk:


Onregelmatigheden in de opgaande flank.


De opgaande flank ziet er in het microseconde-bereik helemaal niet zo mooi uit. Het is heel goed mogelijk dat er twee opgaande flanken gedetecteerd worden. Dus twee snelle interrupts na elkaar. Probleem 1. is hiermee verklaard. Als er vervolgens naar de neergaande flank gekeken wordt (geen plaatje van), dan zie je ook hier wat bouncing/dender. Heel goed mogelijk dat ook hier een opgaande flank gedetecteerd wordt. Mooi, want dat verklaart probleem 2.

Interrupt events in opgaande en neergaande flank


Wel vreemd dat de LM393 dit lijkt te veroorzaken. Een snelle blik in de datasheet van de LM393 laat zien dat deze comparator een Response Time heeft van 300 nanoseconde.


Response Time uit de datasheet van de LM393


Dat klopt wel ongeveer met het scope-beeld hierboven. Verderop staat er nog een notitie in de datasheet:



www.ti.com


"Oscillation Tendencies", daar had ik geen rekening mee gehouden. Ze worden minder als de weerstand aan de ingang kleiner is dan 10 kOhm. Bij mij is die weerstand precies 10 kOhm, dus dat er nog iets dendert valt dus te verwachten. De interrupt van de Arduino/ESP32 pikt die oscillaties naadloos op.

Nu de oorzaak bekend is, kan een oplossing bedacht worden. Die is eigenlijk achteraf gezien niet zo ingewikkeld. Door een tweede interrupt binnen een bepaalde tijd ná de eerste te negeren (het grijze vlak in onderstaande figuur) wordt probleem 1. opgelost. Als de software zo geconfigureerd wordt dat er naast de opgaande flank ook een interrupt gegenereerd wordt voor een neergaande flank, en dat ook hier een snel opvolgende tweede interrupt genegeerd wordt, houden we twee nette interrupt events over. Eentje op de opgaande flank en eentje op de neergaande flank.


Twee nette voorspelbare interrupt events


Dat betekent dat er vier events per omwenteling optreden (het vijfde event in onderstaande figuur is het eerste event van de volgende omwenteling). De vier tijdsduren bij elkaar opgeteld levert precies de tijd op van één volle omwenteling en dus één meter afgelegde weg. Ideaal om de snelheid mee uit te rekenen.




Dit alles levert het volgende resultaat op met een Arduino:


Omwentelingstijden bij verschillende snelheden van de accuboormachine


Dat ziet er strak uit. De software is ongeveer een-op-een van de Arduino naar de ESP32 gezet, met als resultaat dat het hierin nu ook prima werkt. Da's fijn, want nu hoef ik in ieder geval geen nieuwe oplossing te zoeken in de hardware. Zoals de collega het al tipte, soms is het nodig om even uit te zoomen en op een andere manier te meten om achter eventuele problemen en bijbehorende oplossingen te komen.


zondag 11 december 2022

Brandstofmeter

De tankinhoud, die weergegeven wordt op het display in het dashboard - wordt gemeten met een vlotter in de tank die via een armpje een soort van potentiometer bedient. De weerstand is hoog als de tank leeg is en laag als die vol is. Jammer genoeg heb ik de tank niet uitgeliterd, dus de precieze weerstand per liter brandstof is niet helemaal bekend. Wat ik wél weet is de weerstand bij een lege tank - die kan ik namelijk meten nu er nog geen benzine in zit. De multimeter toont 380 ohm. Verder vermoed ik dat de weerstand ongeveer 0 ohm zal zijn als de tank vol is.
Ik kan natuurlijk ook nog wat meten aan de brandstofmeter in het dashboard van de Eend. Door hier een potmeter op aan te sluiten kan ik de vlotter nabootsen. Hoe die aangesloten moet worden is nog niet zo voor de hand liggend. Het metertje is namelijk van het type kruisspoelmeter.


Schematische weergave



In de meter zitten twee spoeltjes die kruislings geplaatst zijn. De spoeltjes zijn in serie aangesloten op de accuspanning. Tussen de twee spoeltjes zit een middenaftakking die naar de tankvlotter gaat. Als de tankvlotter een relatief hoge weerstand heeft gaat er door de twee spoeltjes ongeveer dezelfde stroom en genereren ze dus een vergelijkbaar magnetisch veld. Ze zijn in evenwicht en de meter staat nu op 0 (leeg). Als de weerstand van de tankvlotter afneemt, zal een deel van de stroom via de middenaftakking naar de tankvlotter lopen. Door het eerste spoeltje loopt nog de 'volledige' stroom, door het tweede spoeltje echter maar een deel. De spoeltjes zijn steeds meer uit evenwicht waardoor de meter uitslaat richting 1 (vol). Het fraaie van dit systeem is dat de voedingsspanning nauwelijks invloed heeft op de uitlezing. Het gaat niet zozeer om de absolute stroom door de spoeltjes, maar de verhouding van de stroom door de twee spoeltjes die de uitslag van de meter bepaalt.


De 'echte' spoeltjes.


Het is een beetje moeilijk te zien, maar op bovenstaande foto zie je de kruislings in elkaar geschoven spoeltjes.


De aansluitingen


Nu de potmeter (van bijv. 1 kohm) tussen de VLOTTER-aansluiting en de GND zit en de voeding (12V) aangesloten is, kan gecontroleerd worden bij welke weerstand de meter op vol en leeg staat.



spanningsloos



380 ohm



116 ohm



0 ohm


Conclusie: bij 380 ohm geeft de meter inderdaad leeg aan. Bij 0 ohm wordt vol aangegeven. Ik heb nog wat tussenstanden gemeten en kom tot de volgende tabel en grafiek:


Tabel incl. trendlijn


De wijzer van de meter staat precies op nul als de weerstand 300 ohm is. Boven de 300 ohm (tot 380 ohm) zie ik als een soort van 'reserve'. Misschien dat ik een lampje laat branden in het dashboard om dit aan te geven. De kolom 'trendlijn' laat de uitkomst van de trendlijn-functie zien die in Excel is bepaald. In onderstaande grafiek is de trendlijn (met formule) te zien die door de meetpunten loopt.


Grafiek met curve fit


Ik denk dat een rechte lijn van het beginpunt tot het eindpunt ook heel goed werkbaar is, maar omdat ik toch de beschikking heb over rekenkracht, kan ik daar net zo goed gebruik van maken.

De weerstandswaarde van de vlotter wordt in mijn Burton door één van de microcontrollers gemeten door deze in serie met een vaste weerstand te schakelen. De spanning tussen de twee weerstanden gaat variëren als er meer of minder brandstof in de tank zit. Die spanning wordt gemeten via een analoge ingang en met bovenstaande formule omgerekend naar liters.


zaterdag 3 december 2022

Multistekker

Alle schakelaars onder het dashboard zitten verbonden met een CAN-bus-module op die plek. De microcontroller heeft hiervoor niet genoeg in- en uitgangen, dus daar wordt een list toegepast. Een groot deel van de signalen wordt aangesloten via I²C I/O-expanders. Alle signalen zijn laag vermogen en dus kunnen er dunne draden gebruikt worden. Ik gebruik Mini-Lock 1.0 mm stekkers en 0.35 mm² draad.


Allemaal bij Rick Donkers vandaan. Waar anders...


Het is wel priegelwerk om kabels op een fatsoenlijke manier aan deze stekkertjes te verbinden. Maar met de LY-48B-tang zou dat nog net moeten lukken. Als je zelf aan de elektronica van een auto gaat sleutelen, is zo'n tang onontbeerlijk.


Fragiel spul.


Het knijpen van de stekker aan een kabel is een secuur werkje. Maar met beleid en een leesbril wil dat wel lukken:


Aangeknepen.


Ik vertrouw niet alleen op mijn knijpkunsten - wat overigens heel raar klinkt als ik het zo nalees - dus er komt ook nog een druppeltje soldeertin bij kijken.






Uiteindelijk komen er negen verbindingen in één multi-stekker. Twee van die stekkers zitten verbonden met de CAN-module onder het dashboard.





vrijdag 2 december 2022

Dashboard

Een tijdje terug heb ik al eens een ring gedraaid voor op het dashboard. In de ring komt een stuk plexiglas met daarachter het multifunctionele display. Nu wordt het tijd om enkele gaten in het dashboard te boren/zagen om alle knoppen en deze ring in te bevestigen.


Thuis gedraaid op de haakse slijper.


Om er een beetje in te komen ben ik begonnen met een kleiner gat; het gat voor de knop van de alarmlichten. Een knop uit een oude Volkswagen heb ik al voorzien van een witte led als vervanging voor het originele gloeilampje.


Daar zit hij, midden boven het stuur.


Rechts naast het stuur komt de startknop en nog twee schakelaars. Een schakelaar met schakelpatroon ON-OFF-ON en een met (ON)-OFF-(ON). De schakelaars hebben een lange steel met een rubberen sleeve. Ik hoop dat er nooit water over mijn dashboard zal stromen, maar je weet het maar nooit met een open auto.

Bij alle gaten in de Burton geldt, drie keer meten, één keer boren. Bij de gaten in het dashboard geldt dit in het bijzonder.


Tape plakken, meten, aftekenen...



...en dan boren.


Ook links naast het stuur komen nog twee drukknoppen. Allemaal niet teveel in het zicht, voor zover dat mogelijk is.


Twee knopjes links.



Alle knoppen zitten erin. Nu nog het display (hier nog van papier).


Het grote gat voor het display wil ik met een figuurzaag gaan zagen. Moet natuurlijk in het midden van het dashboard, maar da's helemaal niet zo gemakkelijk te meten. Dus vooral op het oog en uitlijnen met het midden van de voorruit. Met een passer met twee scherpe punten is het gat afgetekend - of eigenlijk afgekrast - op het polyester.


Nu kunnen we niet meer terug.



Gaat best goed met de figuurzaag.


Met de figuurzaag is bijna het hele gat te zagen. Alleen bovenin moest ik nog een stukje kleine gaatjes boren. Daarna voorzichtig met de dremel en als laatste met een scherp stukje schuurpapier is het gat netjes gemaakt.



Het grote gat.


Even de grote ring passen. Deze wordt vastgezet met acht verzonken schroeven. Net als bij het stuur worden deze nog even gepolijst voor het bling-bling-effect.


Even passen.


Het dashboard van de Burton is niet helemaal vlak (nooit goed begrepen waarom eigenlijk niet). Op ongeveer een kwart van de bovenkant zit een lichte knik. Zo niet heel goed zichtbaar, maar als je hier een meter of knop plaatst, moet je er wel rekening mee houden. Mijn display is zó groot dat hij een stukje over die knik heen zit. Met de bovenst twee schroeven hoop ik echter de ring 'onzichtbaar' tegen het polyester aan te kunnen trekken.

Rechts naast de ring komt nog een dikke schakelaar. Om precies te zijn een Lucas PLC5. Die is nog best lastig te monteren, met een heel smal randje en wat nokjes in de rand.

Voordat de knoppen gemonteerd zijn, zijn de polyester randjes nog even in de zwarte Epifanes gezet.



Alles op een rijtje. De Lucas PLC5 zit er netjes in.



Klaar!





Nu nog de aansluitingen aan de achterzijde. Wordt vervolgd...