Physical computing/Signalen en events

Uit Lab
Naar navigatie springen Naar zoeken springen
Physical computing
Arduino Basis
  1. Led-0: breadboard, LED, weerstand
  2. Blink-1
  3. Button-1
  4. Blink-freq: frequentie
  5. Blink-PWM: pulsbreedte-modulatie
  6. Analoge input

Inleiding

We onderscheiden twee soorten inputs: signalen en events.

Signalen

Een signaal heeft op elk moment een waarde. Voorbeelden van signalen:

  • het signaal van een drukknop (button);
  • het signaal van een temperatuursensor;
  • het signaal van een hart (electrocardiogram, ECG);
  • het signaal van een versnellingsmeter (accelerometer);

<<figuur van een signaal>>

Een drukknop levert een tweewaardig of "logisch" signaal; elektrisch gezien een lage spanning (0V) of een "hoge" spanning (meestal 5V of 3.3V). In de software komt dat overeen met de getallen 0 en 1, of de logische waarden False en True.

Veel andere sensoren leveren een analoog signaal, zoals bijvoorbeeld een temperatuursensor. Dit analoge signaal wordt op discrete momenten in de tijd bemonsterd; de analoge waarde van een monster wordt omgezet in een getal (gediscretiseerd) door een Analoog/Digitaal (A/D) omzetter.

  • Opmerking: het resultaat van de A/D omzetting is meestal een geheel getal (integer), in een beperkt bereik; bijvoorbeeld 0..1023 voor een 10-bits A/D omzetter. Deze waarde kun je vervolgens omrekenen naar een fysieke eenheid, bijvoorbeeld "°C"; daarvoor heb je meestal een floating point getal nodig. Soms is het handiger om met de oorspronkelijke gehele getallen te rekenen; soms werk je met de fysieke eenheden, als floating point getal. (Het werken met floating point getallen heeft enkele nadelen: (i) je krijgt mogelijk wat precisie-verlies; (ii) het kost meer rekenkracht - wat vooral voor microcontrollers een punt kan zijn.)

Events

<< figuur van een event>>

Een event vindt plaats op één enkel ondeelbaar moment. De waarde van de event is alleen op dat moment gedefinieerd. Voorbeelden van events:

  • het indrukken van een drukknop (of: het loslaten daarvan)
  • eem muisklik
  • het schudden van de microbit
  • een hartslag
  • een stap
  • het ontvangen van een radiobericht
In de grafische gebruikersinterface (GUI) van een computer spelen events een grote rol: het indrukken van een toets, een muis-klik, het aanraken van een touchscreen, zijn allemaal voorbeelden van input-events die door de interface-software afgehandeld worden.
Als de duur van een "event" wel een rol speelt dan kun je ook afzonderlijke events gebruiken voor het begin en het einde. Voorbeeld: het indrukken en het loslaten van een drukknop.

Detecteren van een event in een signaal

Als je events nodig hebt, terwijl de sensor alleen maar een signaal levert, dan heb je signaalverwerking nodig om de events in het signaal te detecteren. Dit kan heel eenvoudig zijn, bijvoorbeeld het detecteren van het indrukken van een knop. In andere gevallen, zoals het detecteren van de hartslagen in een ECG, is dit lastiger. Voor het detecteren van een event in een signaal heb je een stukje van de historie van het signaal nodig. Voor het detecteren van het indrukken van een drukknop is dat alleen de waarde van het signaal op het vorige tijdstip. Voor het betrouwbaar detecteren van een "stap" in het signaal van een accellerometer (versnellingsmeter) heb je meer waarden uit de historie nodig.

De microbit-software bevat al de nodige event-detectie. Je kunt zo voor de versnellingsmeter events gebruiken als "schudden", "logo omhoog", "logo omlaag", "vrije val".

<>

Analoge en digitale signalen; bemonstering

Een analoog signaal is continu: dit heeft op elk moment in de tijd een waarde in een continu domein.

We noemen een signaal "analoog" omdat de waarde van het signaal analoog is met een fysieke grootheid. Bijvoorbeeld: het elektrische signaal van een microfoon is analoog met de geluidstrillingen in de lucht. Of, de weerstand van een lichtgevoelige weerstand is analoog met de lichtsterkte op elk moment.
Meestal werken we met elektrische signalen: die zijn het gemakkelijks te verwerken (versterken, filteren, enz.)

Een digitaal signaal is discreet: dit heeft alleen op bepaalde momenten in de tijd een waarde, in een discreet (geheeltallig) domein.

Een digitale computer werkt met eindige getallen;

Getallen van het type "floating point" zijn zwevende-komma getallen met een eindig aantal significate cijfers: in de meeste gevallen (voor 32-bit floats) "slechts" 23 bits, ofwel ongeveer 7 decimalen.

Voor sensoren en actuatoren hebben we vaak aan 16-bits gehele getallen voldoende: vaak is een sensor niet nauwkeuriger dan 1%.

Hoeveel decimalen heb je nodig voor een temperatuursensor van 0..100 graden, met een nauwkeurigheid van 1/10 graad?

Over nauwkeurigheid en precisie

  • toevallige fouten ("ruis") en systematische fouten
  • herhaalbaarheid
  • doeltreffendheid

Dit betreft vnl. eigenschappen van sensoren.

Detecteren van events

Voor het detecteren van een event in een signaal hebben we, naast de huidige waarde van het signaal, een stukje van de signaal-historie nodig. In het eenvoudige geval van het indrukken van een drukknop hebben we aan de vorige waarde genoeg.

Speciale gevallen van eventdetectie:

  • temperatuurregeling: temperatuur komt boven (of onder) een bepaalde grens
    • de regeling is vaak een hysterese-regeling: de grens voor het uitschakelen ligt anders dan voor het inschakelen.
    • de event-detectie doe je eigenlijk op basis van de toestand van de schakeling (niet van de temperatuur alleen): als de temperatuur onder een bepaalde grens komt, en de CV is nog niet ingeschakeld, dan schakel je deze in.
    • bij een CV komt daar nog een effect bij: je compenseert voor een zekere "overshoot", er is nog de nodige warmte in de installatie als je de brander uitschakelt. (Je laat de pomp dan ook langer lopen.) (Voor zover ik weet schakelt de thermostaat alleen de CV; de schakeling van de pomp gebeurt vanuit de ketel.)
    • vgl. het koken van melk op een elektrisch fornuis...

Afhandelen van events

De "normale" manier om een event af te handelen is door de bijbehorende handler-functie ("on event") uit te voeren. Dit is het model dat bijvoorbeeld bij grafische gebruikersinterfaces gebruikt wordt, zoals met JavaScript in de browser.

Er zijn een paar zaken om rekening mee te houden:

  • elke input-event kan in principe op elk moment optreden: je hebt de buitenwereld niet in de hand. Hooguit kun je op basis van fysieke eigenschappen aangeven met welke snelheid processen plaatsvinden.
  • maar: je bent mogelijk niet op elk moment in elke input geïnteresseerd. Afhankelijk van de huidige toestand (mode) zijn sommige inputs relevant, andere niet.
  • ook al heb je met de buitenwereld een bepaald protocol afgesproken, je kunt er niet vanuit gaan dat de buitenwereld zich aan deze regels houdt. (En: je kunt er niet op rekenen dan de buitenwereld in andere opzichten betrouwbaar is.)

Events en automaten

Bij besturingstoepassingen maken we vaak gebruik van eindige automaten. De invoer- en uitvoertekens van een automaat komen dan overeen met invoer- en uitvoer-events.

Een eenvoudig voorbeeld is het aan- en uitschakelen van een LED met een drukknop. Bij elke druk op de knop schakelt de LED om: van uit naar aan en omgekeerd.

De automaat hiervoor heeft twee toestanden, 0 (LED uit) en 1 (LED aan). Er is 1 input-symbool: "push". Dit zorgt voor een overgang naar de andere toestand. Bij deze overgang hoort een output-symbol: van 0 naar 1: "led-on", van 1 naar 0: "led-off".

<<fig>>

Dit kunnen we op de volgende manier in een programma omzetten:

Events en messages (berichten)

Een andere manier om met events om te gaan is om deze om te zetten in messages (berichten). Deze berichten kunnen lokaal afgehandeld worden, of ze kunnen gecommuniceerd worden naar andere systemen, om daar af te handelen.

Een voordeel van messages is dat deze compleet asynchroon afgehandeld kunnen worden, zoals in het geval van NodeRed.

Een "blok" (node, thing?) voor het afhandelen van een message kan een (strikte) functie zijn, maar ook een automaat, met een eigen toestand. Een dergelijke automaat-blok kan meerdere event-streams als input hebben, of als output.

NodeRed

NodeRed is een grafisch programmeersysteem voor dataflow/event/messageflow. Een "normaal" blok heeft message/event-inputs en message/event-outputs.

NodeRed is gebaseerd op een message-model; dat verschilt op een aantal punten van een event-model. Messages zijn niet globaal, maar worden alleen via verbindingen tussen knopen gecommuniceerd. Op elk moment kunnen meerdere messages van eenzelfde type onderweg zijn. Bij events is dat niet (altijd) het geval; maar je kunt ook in dat geval een event-queue gebruiken voor het bufferen van events.

Events hebben een globaal karakter, en een "publish/subscribe" karakter. Elk programmaonderdeel kan zich abonneren op een event.

NodeRed is gebaseerd op Node.js.

ThingFlow

Opmerking: de laatste activiteiten rond thingflow lijken van 2017. Dat lijkt niet gunstig voor de continuïteit. Maar: de hele implementatie is niet erg groot, dit is relatief eenvoudig te onderhouden of aan te passen.

Thingflow voor de microbit? De implementatie is niet erg groot of ingewikkeld, het lijkt mij dat dit zou moeten werken.

Ik vind de naamgeving van ThingFlow in een aantal opzichten niet handig: (i) ik zou (in een IoT-omgeving) nodes voor de verwerking nooit "things" noemen; (ii) ik zou een OutputThing eerder "inputNode" noemen.
Ik heb nog geen ervaring met het gebruik van deze aanpak voor een microcontroller; ik ben benieuwd welke voor- en nadelen dit heeft.