Communicatie met de computer: een instelbare lichtkrant

In deze tutorial breiden we de lichtkrant uit zodat de tekst kan ingesteld worden met de computer. We leggen stap voor stap uit hoe je kan communiceren met de computer door gebruik te maken van de seriële uitgang op het Dwengo-bord. Dit is zowel van toepassing op computers met een seriële poort als computers die enkel over USB-poorten beschikken.



Benodigdheden

  1. Een Dwengo-bord
  2. Een Dwengo-programmer
  3. De bijbehorende kabels
  4. Computer met een seriële-poort of USB-poort
  5. Een seriële kabel of een USB-to-serial kabel

Communiceren met een computer

De gemakkelijkste manier om het Dwengo-bord te laten communiceren met een computer is via de ingebouwde seriële driver chip, de MAX232, die signalen van een RS232-poort omzet naar signalen op TTL (transistor-transistor logica)-niveau zodat deze door de microcontroller gebruikt kunnen worden. De microcontroller van het Dwengo-bord kan dan gemakkelijk met de computer communiceren via de seriële poort door de MAX232 op de juiste manier aan te spreken.

Je begint met het inladen van de nodige bibliotheken. Aangezien we vertrekken van de tutorial over de lichtkrant laden we dezelfde bibliotheken in. Dit vullen we aan met een extra bibliotheek, dwengoUsart.h, die nodig is voor de seriële communicatie.

  1. #include <dwengoConfig.h>
  2. #include <dwengoBoard.h>
  3. #include <dwengoUsart.h>

We definiëren een macro die de maximale lengte van de door te sturen tekst aangeeft.

  1. #define PREDEFINED_LENGTH 64 // Maximum number of characters in string

In deze tutorial gaan we twee extra functies nodig hebben die we onder de main-functie definiëren. Die functies moeten we bovenaan in het C-bestand aankondigen via hun zogenaamde prototype.

  1. unsigned char newsticker(ram char *msg, unsigned char position);
  2. void str2ram(static char *dest, static char rom *src);

Het eerste prototype is voor de newsticker-functie die ook in de tutorial over de lichtkrant gebruikt werd. De tweede functie zal het mogelijk maken om een string in het programma-geheugen te kopiëren naar het data-geheugen. Anders zal de initiële boodschap die we tonen op het LCD-scherm niet aanvaard worden door de functie newsticker die enkel strings vanuit het data-geheugen aanvaardt.

In de hoofdlus maken we eerst de nodige variabelen aan, stellen we de initiële boodschap in en initialiseren we het Dwengo-bord en het LCD-scherm.

  1. void main(void) {
  2. unsigned char position = 0;
  3. char buffer[PREDEFINED_LENGTH+1];
  4. str2ram(buffer, "Initial message... "); // initial message
  5. initBoard();
  6. backlightOn();

Vervolgens beginnen we een lus die een oneindig aantal keren herhaald moet worden. In deze lus doorlopen we systematisch volgende stappen:

  1. Openen en configureren van de seriële verbinding.
  2. Boodschap versturen naar de computer.
  3. Wachten totdat de computer iets terug verstuurt. Ondertussen tonen van boodschap op de LCD van het Dwengo-bord.
  4. Inlezen van boodschap verzonden door de computer.
  5. Antwoord verzenden naar de computer.
  6. Sluiten van de seriële verbinding.

Na het starten van de oneindige lus openen en configureren we de seriële verbinding. Dit kan eenvoudig met behulp van de functie initUsart() welke de verbinding initialiseert voor een snelheid van 9600 baud. Wil je meer weten over de technische details dan kan je de voorziene handige tips over seriële communicatie raadplegen.

  1.  
  2. while(TRUE) { // do this forever
  3. // open connection
  4. initUsart();

Na het configureren van de verbinding versturen we een boodschap naar de computer.

  1. // send something
  2. putrsUSART((const far rom char *)"\nGive message\n\r");

Vervolgens wachten we op antwoord van de computer. Dit kunnen we controleren met de functie DataRdyUSART() die de waarde TRUE teruggeeft wanneer de microcontroller data ontvangen heeft via de USART-module. Daarom maken we een while-lus aan die blijft lopen zolang de functie DataRdyUSART() FALSE teruggeeft. In die while-lus roepen we dan de functie newsticker op waarmee we de boodschap in buffer tonen op het LCD-scherm.

  1. // while no new data is available
  2. while(!DataRdyUSART()) {
  3. // display message with news ticker effect
  4. setCursorLCD(0,0);
  5. position = newsticker(buffer, position);
  6. delay_ms(400);
  7. }

Wanneer de computer nieuwe data naar het Dwengo-bord verstuurt, springen we uit deze while-lus. In het volgende stukje code wordt die data dan karakter per karakter ingelezen.

  1. // read something from USART
  2. position = 0;
  3. do {
  4. while (!DataRdyUSART());
  5. buffer[position] = getcUSART();
  6. }
  7. while (buffer[position++] != '\r' && position < PREDEFINED_LENGTH);

Binnen deze do ... while-lus wordt telkens een nieuw karakter gelezen met getcUSART(). Die karakters worden opgeslagen in buffer. De variabele position bepaalt waar het huidige karakter in de buffer geschreven moet worden. We blijven lezen tot het laatste karakter gelijk is aan * '\r'* (de code voor een RETURN) ofwel tot position de maximale lengte van de buffer bereikt heeft.
Binnen deze do ... while-lus zit ook een while-lus die steeds opnieuw gaat wachten tot er nieuwe data aanwezig is. Als we dit niet zouden doen, dan zouden we met getcUSART steeds hetzelfde karakter opnieuw gaan inlezen.

  1. // null character to close the string
  2. buffer[position-1] = NULL;
  3.  
  4. // reset position
  5. position = 0;

Na de do ... while-lus sluiten we de string af met een NULL-karakter. We zetten ook position weer op 0 zodat we de volgende keer de boodschap vanaf het eerste karakter op het scherm zullen weergeven.

Om af te ronden, laten we de gebruiker weten dat zijn boodschap verwerkt is.

  1. // send something back
  2. putrsUSART((const far rom char *)"\nMessage accepted\n\r");

In stap 6 sluiten we de verbinding en sluiten we de haakjes.

  1.  
  2. // close connection
  3. CloseUSART();
  4. }
  5. }

We geven ook nog eens de functie mee die nodig is voor het lichtkrant-effect.

  1. unsigned char newsticker(ram char *msg, unsigned char position) {
  2. char i,j;
  3. j=position;
  4. for (i=0; i<16; i++) {
  5. if (msg[j]==NULL)
  6. j=0;
  7. appendCharToLCD(msg[j]);
  8. j++;
  9. }
  10. if (msg[position+1]==NULL)
  11. return 0;
  12. else
  13. return position+1;
  14. }

Ten slotte voegen we de functie toe waarmee we strings vanuit het programma-geheugen naar het data-geheugen kunnen kopiëren.

  1. void str2ram(static char *dest, static char rom *src) {
  2. while((*dest++ = *src++) != NULL);
  3. }

Openen en sluiten van seriële verbinding

In dit programma hebben we de seriële verbinding met de computer telkens opnieuw geopend en weer afgesloten (stap 1 en stap 6). Vaak is het efficiënter om de verbinding te openen bij de start van het programma en pas af te sluiten helemaal op het einde.

De verbinding gebruikt de pinnen RC2-7. Als je die pinnen voor iets anders wil gebruiken, dan moet je dus de seriële verbinding sluiten. In zo'n toepassing, is de aanpak die we hier hebben toegepast (telkens opnieuw openen/sluiten) dus wel noodzakelijk.

Aansluiten van het Dwengo-bord op de computer

Het aansluiten van het Dwengo-bord op de computer gebeurt met behulp van een seriële kabel. De kabel sluit je dan aan op de seriële poort van het Dwengo-bord en de seriële poort op de computer. Wanneer je computer geen seriële poort heeft kan je een USB-to-serial-kabel gebruiken. Hiervoor zal je wellicht nog een driver moeten installeren die meegeleverd wordt met de kabel.

Aansluiten Dwengo-port

Testen met de computer

Nadat je het Dwengo-bord geprogrammeerd en aangesloten hebt kan je beginnen testen. Hiervoor kan je een eigen computerprogramma schrijven dat boodschappen naar de seriële poort verstuurd. Echter gemakkelijker is gebruik te maken van een kant en klaar programma zoals het gratis TeraTerm Pro External link. Download en installeer dit programma en start het vervolgens op. We gaan nu een verbinding opzetten met het Dwengo-bord. Wanneer je een USB-to-serial-kabel hebt gebruikt controleer je in Configuratiescherm > Systeembeheer > Computerbeheer > Apparaatbeheer van Windows op welke COM-poort deze kabel is aangesloten. In ons voorbeeld is dat COM3.

Opzoeken com-poort


Start vervolgen TeraTerm Pro op en selecteer als connectietype serial en de correcte COM-poort. Vervolgens klik je op OK.
New connection
Navigeer vervolgens in TeraTerm Pro naar Setup > Serial port... waar je de eigenschappen van de verbinding instelt zoals op de screenshot en klik op OK.
Connection settings
Zet ook in het menu Setup > Terminal Local echo aan zodat je in de terminal van TeraTerm Pro kan zien wat je zelf typt en klik op OK.
Terminal settings
Je hebt nu een verbinding met het Dwengo-bord. Als het goed is, verschijnt er een boodschap op het scherm wanneer je het Dwengo-bord aanschakelt of reset.

Give message


Je kan nu zelf ook een boodschap van versturen naar het Dwengo-bord. Typ je boodschap in en druk op RETURN als je klaar bent. Die boodschap zal dan verschijnen op het LCD-scherm van het Dwengo-bord. Als je wil kan je nieuwe boodschappen sturen.

Message accepted

Verder spelen

Met de kennis van deze tutorial kan je heel leuke dingen doen. Zo kan je met behulp van het Dwengo-bord een servo-motor besturen via de computer. Als je daarop bijvoorbeeld een webcam monteert ben je steeds in beeld. Ook het bouwen van een mini-domotica-systeem waarbij je de computer en het Dwengo-bord kan gebruiken om een aantal lichten aan- of af te schakelen behoren nu tot de mogelijkheden.

BroncodeBronbestanden zijn enkel toegankelijk voor geregistreerde gebruikers. Als je al een account hebt op de Dwengo site, gelieve dan in te loggen, anders kan je je eerst registreren.