Inleiding

Werken met microcontrollers vindt plaats in het gebied van "Physical Computing" waarbij interactie met de omgeving gebeurt via sensoren en actuatoren. Doordat er weinig of geen tekstuele communicatie is met de gebruiker, is het soms zeer moeilijk om een sketch te debuggen.  De seriële monitor is een onderdeel van de Arduino IDE en biedt de mogelijk om seriële data van de Arduino zichtbaar te maken.

Reageert een sketch niet zoals verwacht, dan kan je door gebruik te maken van seriële monitor makkelijker je fout opsporen. Deze data kan zeer divers zijn. Het kan gaan van gewoon tekst als "'Start" om aan te geven dat een bepaald gedeelte van de sketch uitgevoerd wordt, maar kan ook waarden van variabelen zijn, of de status van een ingang.

De seriële monitor kan een zeer sterk instrument zijn. Het is dan ook een goede praktijk om standaard een verbinding te maken tussen de Arduino en de seriële monitor. Ook als je voor de praktische werking van je sketch niet noodzakelijk is.

Data kan zowel verstuurd worden van de Arduino naar de seriële monitor, maar ook omgekeerd. Je kan dus de seriële monitor als een input apparaat gebruiken. Dit laatste gaan we hier niet behandelen en focussen wij ons volledig op de data versturen van de Arduino naar de seriële monitor 

Verbinding maken met de seriële monitor

Voordat je data kan verzenden naar de seriële monitor gaan we de verbinding moeten openen. Bij het openen van de verbinding ga je moeten aangeven op welke snelheid de data gaat verstuurd worden. Dit wordt gegeven in baud of bps (bits per second).  De snelheid geeft aan hoeveel bits (0 of 1) er per seconden verstuurd worden. De instructie om de seriële communicatie te starten is Serial.begin(<snelheid>);

Bijvoorbeeld:

Serial.begin(9600);

De snelheid waarmee de data verstuurd wordt, gaat moeten overeenkomen met de snelheid waarmee de data gelezen wordt. 

Wordt de data trager gelezen dan verstuurd, dan gaat de computer een aantal bits missen. In het omgekeerde geval, als de computer sneller gaat lezen als de data verstuurd wordt, zullen een aantal bits dubbel gelezen worden. In beide gevallen zal de verstuurde data niet overeenkomen met de ontvangen data.

Met welke snelheid communiceren?

Hoe sneller je data verstuurd wordt, hoe meer kans je krijgt op fouten. Trager versturen van de data vertraagd de uitvoering van je script. Je gaat dus een evenwicht moeten zoeken tussen snelheid en accuraatheid. Gelukkig is de hoeveelheid data die moet verstuurd worden beperkt. Meestal is het zelf noodzakelijk om je script te vertragen om de data leesbaar te maken voor de gebruiker. De standaard waarde van 9600 baud leidt tot goede resultaten.

Omdat de verbinding éénmalig wordt geopend, wordt deze code in de setup() geplaatst.

void setup(){
   Serial.begin(9600);
}

Opmerking:

In de simulatieomgeving Tinkercad is er geen fysieke data transfer tussen een Arduino en de computer, alles gebeurt in de simulatieomgeving. Bij het openen van de scherm van de seriële monitor ga je daarom niet de snelheid van data-overdracht moeten ingeven. In de code ga je wel de snelheid moeten aangeven. Doe je dit niet, dan zal dit een foutmelding opleveren bij het starten van de simulatie

Data versturen naar de seriële monitor

Wanneer je data verstuurd naar de seriële monitor, dan kan je aangeven of er na de data een end-of-line (EOL) teken wordt meegestuurd. End-of-line of regeleinde teken zorgt ervoor dat na het versturen van de data er een nieuwe lijn gestart wordt. De volgende data die verstuurd wordt, wordt op de volgende regel getoond.

De instructie voor het versturen van data met einderegel-teken is:

Serial.println(<gegeven>);

In onderstaande sketch krijgt in een iteratie (een lus) de variabele i achtereenvolgens de waarde 1, 2, 3, 4 en 5. Deze waarde wordt met Serial.println(i); naar de serial monitor verstuurd. Deze sketch werd uitgevoerd in de simulatieomgeving en het resultaat wordt getoond.

void setup()
{
  Serial.begin(9600);
  for (int i=1;i<=5;i++){
    Serial.println(i);
  }
}

void loop()
{
}

Sm2

Door om het Tinkercad logo te klikken (hiernaast) open je de simulatie

Simulate => Simulatie starten => code => Serial monitor

Bij Seriel.println( ) staat de ln voor het starten van een nieuwe lijn. Laten we dit weg dan krijgen we de instructie die data verstuurd naar de seriële monitor zonder dat een einderegel-teken meegestuurd wordt.

Serial.print(<gegeven>);

Passen we dit toe op de vorige sketch dan krijgen we:

void setup()
{
  Serial.begin(9600);
  for (int i=1;i<=5;i++){
    Serial.print(i);
  }
}

void loop()
{
}

Data combineren

Enkel cijfers in je seriële monitor zegt niets. Zeker als er op verschillende plaatsen data wordt doorgegeven, dan moet je weten welke data bij welke variabele hoort.

Herhalen we het eerste script, waarin de waarde van i getoond wordt in de seriële monitor, maar nu met meer informatie voor de gebruiker dan krijgen we:

We gaan hier tekst en numerieke data combineren. Per instructie kunnen we slechts één gegeven meegeven. 

Dit gegeven kan 

  • een constante zijn:
    Serial.println(3.14);
    Serial.println("X is een onbekende");

  • een variabele
    Serial.println(i);

  • het resultaat van een bewerking
    Serial.println(2+i),

Maar onderstaande combinatie lukt niet:

Serial.println("x = ",i);

Om bovenstaand resultaat te bekomen gaan we ofwel de data van één lijn in één variabele plaatsen, of je gaat de data in twee stappen moeten versturen.

  1. Verstuur de tekst "x =" zonder een einderegel-teken. De volgende data die verstuurd wordt zal op dezelfde lijn getoond worden
    Serial.print("x = ");

  2. Verstuur de waarde
    Serial.println(i);

De volledige sketch ziet er dan als volgt uit:

void setup()
{
  Serial.begin(9600);
  for (int i=1;i<=5;i++){
    Serial.print("x = ");
    Serial.println(i);
  }
}

void loop()
{
}

Extra parameters

Soms kan een combinatie van parameters een verrassend resultaat opleveren.

In onderstaande sketch is i geen integer (geheel getal) maar een float (floating number -> reëel getal).

Voeg je aan de Serial.println() instructie de parameter 3 toe:

Serial.println(i,3);

dan zou je verwachten dat nadat het resultaat van i getoond wordt,  het cijfer 3 op het scherm verschijnt. Het cijfer 3 gaat hier echter de nauwkeurigheid, of het aantal cijfers na de komma aangeven. 

void setup()
{
  Serial.begin(9600);
  for (float i=1;i<=5;i++){
    Serial.print("x = ");
    Serial.println(i,3);
  }
}

void loop()
{
}

Als i niet van het type float maar van het type integer, dan is het resultaat nog verrassender

void setup()
{
  Serial.begin(9600);
  for (int i=1;i<=5;i++){
    Serial.print("i = ");
    Serial.println(i,3);
  }
}

void loop()
{
}

De waarde van i wordt nu niet weergegeven met 3 cijfers na de komma, wat vreemd zou zijn voor een geheel getal. De waarde van i wordt wel weergegeven in het talstelsel 3.

  • 1: 1*3^0 ==> 1
  • 2: 2*3^0 ==> 2
  • 3: 1*3^1 + 0*3^0 ==> 10
  • 4: 1*3^1 + 1*3^0 ==> 11
  • 5: 1*3^1 + 2*3^0 ==> 12

Oefeningen

Oefening 1:

Zorg dat in de seriële monitor het volgende verschijnt:

Je kan de code in de simulatieomgeving aanpassen: Classes ==> Arduino Afstandsonderwijs ==> Les 3 - Seriële monitor => SerialMon Oef01