Nixieklok met ArduinoNa mijn eerste experimenten met een arduino, was mijn bedoeling om ooit de sturing van de verwarming te laten gebeuren met een arduino. En nu is het zover! Ik heb ondertussen heelwat ervaring met het programmeren van de Arduino (zie nixieklok met arduino). Omdat deze schakeling met recuperatie-onderdelen is gebouwd geweest heb ik de electronica en de programmatie moeten aanpassen aan wat beschikbaar was. Deze schakeling zal je ook niet op het internet terugvinden, althans niet in die uitvoering. Achteraf is zelfs een thermometerfunktie bijgeplaatst. |
-
Waarom was die arduino nu ook weer nodig?De arduino is dus nodig om de thermostaat van de verwarming over de dode zone heen te helpen zodat de hysterese kleiner wordt. Mijn streefcijfer is minder dan 1°, en als het kan zelfs minder dan 0.5°.Om de thermostaat automatisch bij te stellen (zodat de dode zone overbruigd kan worden) gebruik ik een kleine servo-motor. Alle kleine servo-motoren die in de model vliegtuigbouw en dergelijke gebruikt worden hebben dezelfde specificaties: een voedingsspanning van 4.8V tot 6V (4 of 5 NiMH batterijen) en een bereik van 180° (dat is ruim voldoende om de thermostaat te bedienen). De aansturing is ook standaard, met een PWM signaal waarvan de totale tijd 20ms bedraagt en de puls van 1 tot 2ms gaat. Bij een pulsduur van 1.5ms staat de servo-motor in het midden van zijn bereik. Op de site van arduino kan je een include vinden zodat je de servomotor eenvoudig kan aansturen door een funktie aan te roepen. De servomotor kan 180 stappen zetten van minimum PWM signaal tot maximaal PWM signaal.
Gaandeweg wordt de thermostaat relatief aangestuurd. Is de gewenste temperatuur niet bereikt en staat de brander niet aan, dan wordt de positie van de servomotor een stap verhoogd. Hetzelfde gebeurt in omgekeerde richting als de temperatuur bereikt is en de brander aan staat. De absolute positie van de thermostaat speelt geen rol meer: de thermostaat wordt bijgeregeld om de hysteresis te verminderen. De countdown timer (van 20 naar 0 per minuut) geeft aan hoe snel er bijgeregeld kan worden. Als de servo-motor niet meer bijgesteld moet worden, dan is dit een teken dat de gevraagde temperatuur bereikt is. De setwaarde van de servo-motor voor deze temperatuur zou dan gebruikt kunnen worden als startwaarde als later dezelfde temperatuur opnieuw gevraagd wordt. Het blijkt echter dat deze waarde niet stabiel is, het electronisch systeem regelt constant wat bij. Er is dus geen ideale thermostaatstand om een bepaalde temperatuur te halen. De mogelijkheid om de startwaarde op te slaan is daarom niet in gebruik genomen (de startwaarde kan enkel manueel gewijzigd worden als dat nodig zou zijn). Is er minder warmte nodig en moet de brander uitschakelen, dan zal de ruimtetemperatuur beginnen zakken, waardoor de arduino zal ingrijpen om de thermostaat te verhogen zodat er geen dip in de temperatuur ontstaat. Ook als er overshoot dreigt zal de regelaar snel ingrijpen (eenmaal dat we buiten de stabilisatietijd zitten). De arduino heeft een analoge ingang voor de ruimtetemperatuur. De electronica die de temperatuur meet heeft een differentiator zodat de traagheid (massa van de Pt1000) opgevangen wordt. De temperatuur die naar de arduino gestuurd wordt is de effektieve temperatuur van de ruimte, niet de temperatuur van de sensor.
BedieningEen arduino uno heeft geen eigen aanduiders, geen keyboard en geen VGA of HDMI uitgang. Je moet dus zelf de input/output voorzien. Het is echt programmeren op machinetaal niveau (gelukkig doe ik dat graag).We hebben eerst een funktieaanduider met 8 leds (aktief hoog) en 8 druktoetsen die via dezelfde lijnen uitgelezen kunnen worden. Omdat we bij deze toepassing voldoende poorten hebben (dat was wat anders met de nixie-klok) hebben we geen poort expander nodig. De programmatie wordt daardoor ook een pak eenvoudiger voor dit deel. Zou men een 4099 gebruiken, dan zou men slechts 5 lijnen nodig hebben. De leds geven de aktieve funktie aan, maar een niet-oplichtende led geeft niet aan dat de bijhorende druktoets niet zou werken.
De drukknoppen hebben leds om aan te geven dat de funktie aktief is, hier kunnen enkel de eerste 5 leds en de laatste led aangestuurd worden. Indien de leds gedoofd zijn werkt de controller in manuele modus (alsof men de thermostaat manueel zou verdraaien). Tboost wordt bijvoorbeeld gebruikt als de gangdeur wordt geöpend om de temperatuurval te onderdrukken. Drukt men op de PID toets, dan komt men in een nieuw menu.
De leds van drukknop 2, 3, 7 en 8 kunnen aangestuurd worden, led 6 knippert om aat te geven dat we in het PID menu zitten. Met ++ en -- kunnen alle PID parameters gewijzigd worden. Dit zijn de servo parameters die gewijzigd kunnen worden (tweede menu):
Met dezelfde 8 datalijnen uit de arduino gaan we de 8 drukknoppen uitlezen. We zetten eerst alle 8 datalijnen laag. De leds doven even, maar de scanfunctie is zo snel dat dit niet opvalt. Eén voor één wordt een lijn hoog gezet en wordt de tweede analoge ingang gemeten (de eerste analoge ingang gebruiken we voor de temperatuur). We gebruiken een analoge ingang omdat we onvoldoende digitale lijnen hebben, maar dit heeft nog een extra voordeel: door een extra weerstand te gebruiken kan men het aantal drukknoppen verdubbelen en zelfs verdrievoudigen. Dit is misschien een uitbreiding voor later. Na het scannen van de 8 toetsen worden de datalijnen weer voor de aansturing van de leds gebruikt. Om de seconde doen we een scan van de toetsen. In PID en servo modus worden de + en - toets sneller gescand éénmaal dat gedetecteerd wordt dat één van de toetsen ingedrukt is (om een snellere instelling mogelijk te maken). DisplayAls display gebruiken we een alfanumerieke LCD aanduider met 4 regels van 20 tekens, serieel aangestuurd (9600 baud). De indeling van het display wijzigt niet als de controller in een andere modus zit: de funkties worden door de leds aangegeven.Rechts: het display dat gebruikt zal worden heeft 4 regels van 20 tekens. Dergelijke displays worden doorgaans parallel aangestuurd (per byte of nibble), maar met een extra ic op de print kan het display ook serieel aangestuurd worden (9600 baud), wat veel gemakkelijker te programmeren is. Je hebt dan maar drie aansluitdraden nodig: massa, 5V en serieel (TX op de arduino, RX op de module). De arduino kan standaard serieel communiceren (via een aparte chip, dus zonder de processor te belasten), maar vaak wordt er een software-serieële communicatie gebruikt. Waarom dit zo gedaan wordt lees je verder op de software-pagina. Hier ook wordt er een software-serieele poort gebruikt.
ElectronicaDe electronica wordt op een andere pagina besproken.
Arduino poorten
Servo loop en kacheltemperatuurVoor het corrigeren van de positie van de thermostaat moet ik weten of de brander aan of uit staat. Er is geen feedback van de thermostaat van de gaskachel: ik moet dus een extra sensor gebruiken. De afvoerbuis (verbrandingsgassen) is een dunne buis die snel opwarmt en snel afkoelt, zodat de software na 5 seconden kan weten of de brander aan staat of niet.Waarom is dit belangrijk? Veronderstel dat het systeem op t16 staat (nachttemperatuur). Het is echter niet echt koud buiten, waardoor de temperatuur nooit daalt tot de ingestelde temperatuur, zelfs als slaat de brander nooit aan. Bij een "domme" regeling zou de t16 servo instelwaarde echter voortdurend naar beneden geregeld worden, de setwaarde wordt immers niet bereikt. Een ander voorbeeld is: ik kom 's avonds laat thuis na een lange dag zonder verwarming. De temperatuur thuis bedraagt 12° en moet naar 19°. Om de ingestelde temperatuur te bereiken heeft de gasbrander echter een zekere tijd nodig. Als de brander aanstaat en op hoog vermogen werkt om de ingestelde temperatuur te halen, heeft het geen nut de t19 servo instelwaarde te verhogen. Deze meting moet niet echt nauwkeurig zijn: de software moet enkel weten of de brander aanstaat of niet.
Variabelen en constantenEen aantal waarden zijn constant gedurende het volledige programma. Andere waarden kunnen gewijzigd worden door het programma (of door de bediening) en worden opgeslagen in EEPROM als het menu verlaten wordt.Na het starten worden de opgeslagen parameters uitgelezen en het systeem op 13° gezet (led 12° en led +1 aan).
Normale temperatuur : 19° (constante)
Servomotor start value 19° (autowijziging, opslag)
Offset temp (bediening, opslag)
Servomotor gewenste positie (na temperatuurinstelling of correctie) Countdown timer, tijd verstreken na een temperatuurinstelling. Na een wijziging van de ingestelde temperatuur wordt de servolus even open gezet.
Arduino, een echte PLC?De arduino is eigenlijk een miniatuur PLC (programmable logic controller), enkel de relais-sturing (uitgang) en de opto-couplers (ingang) ontbreken. De zich herhalende lus, een kenmerk van de PLC komt ook voor in de programmatie van de arduino.De arduino mist een funktie die echte PLC's wel hebben: de flankdetectie (Positive Transition Sensing en Negative Transition Sensing). Rechts de voorstelling van een paar funkties in ladder-diagram. Een minpunt van de arduino interface is eigenlijk ook dat je niet met een ladder diagram kan programmeren. Het zou interessant zijn om de arduino ook te kunnen programmeren via ladder. Wie voelt zich geroepen om een windows (of linux) interface te schrijven? Op de site staan er zeer eenvoudige voorbeelden om de mensen te helpen met basisprojecten, maar van zodat dat je een wat complexer programma wenst te schrijven, dan lukt het niet meer voor de meeste gebruikers. Met de ladder kan je ook mensen aanspreken die nooit geprogrammeerd hebben, maar die wel een electrisch schema kunnen lezen. De listing van de arduino software voor de sturing van de gasverwarming staat op deze pagina. De kode wordt nog regelmatig aangepast. |
Publicités - Reklame