Leon van der Horst - Microcontrollers

2-weg data
communicatie

Arduino

Boarduino

Basic Stamp

JeeLink/Node

Projecten

Workshop

Links

 

Twee-weg communicatie, ofwel stuur een commando heen en krijg een antwoord terug. Een echte interactie tussen twee apparaten. Bijvoorbeeld te gebruiken voor het maken van een afstandsbediening waarbij men bepaalde zaken kan aansturen of uitlezen.

Wat hebben we nodig? We beginnen met één Arduino Duemilanove of Uno en een touchscreen van 2,4" of 2,8". Verder een tweetal JeeNodes V4 of V5 met bijbehorende LCD-plugs en LCD's (16x4).

Het touchscreen neemt enorm veel I/O poorten van de Arduino in beslag, er blijven slechts enkele poorten beschikbaar, waaronder analoog 4 en 5. Dat komt goed uit, want laat dit nu net de signalen zijn die gebruikt worden voor I²C: Analoog 4 = SDA, Analoog 5 = SCL of SCK.
Helaas biedt het niet genoeg vrije poorten om een RF12 transceiver aan te sluiten en ook zijn de Rx en Tx lijnen (digitaal 0 en 1) die voor de communicatie met de USB worden gebruikt niet beschikbaar. Voor het debuggen zou dat handig geweest zijn, maar goed via I²C hebben we een mogelijkheid vanuit de Arduino die zo'n touchscreen bevat te communiceren en dat doen we naar een JeeNode.

De JeeNode V4 en V5 bevatten naast de benodigde RF12 (voor de draadloze communicatie) ook een 4-tal softwarematige I²C poorten en één hardwarematige I²C poort (welke Analoog 4 en 5 gebruikt).

Deze softwarematige I²C poorten kunnen op hun beurt allerlei I²C sensoren aansturen, maar ook extra digitale of analoge I/O poorten. Hiervan zijn bij JeeLabs diverse producten verkrijgbaar.

Voor een eerste test wordt er gebruik gemaakt van een analoge temperatuur sensor, de TMP36. Deze hebben we ook gebruikt in de Oomlout CIRC lessen (zie les CIRC-10).
Neem één van de twee JeeNodes en monteer daar deze TMP36 op als volgt: We gebruiken de P4 poort van de JeeNode en sluiten de GND van de TMP36 aan op de G, de plus van de TMP36 sluiten we aan op de P en de analoge output pin van de TMP36 sluiten we aan op de A. Het beste is om de pootjes van de TMP36 krimpkous te doen als isolatie, omdat twee pinnen verbogen moeten worden en er kans op sluiting onstaat, ze kunnen makkelijk contact met elkaar maken in deze verbogen toestand. Verder de LCD-plug van JeeLabs aansluiten op P1.

Op de andere JeeNode wordt ook een LCD aangesloten op P1.

De Arduino met touchscreen wordt met een 6-aderige kabel aangesloten op de JeeNode's I²C aansluiting (genaamd PSI, let op, dat is dus NIET de SPI/ISP connector!). Zorg daarbij dat zowel de analoog 4 (SDA) en analoog 5 (SCL of SCK) via een weerstand van ongeveer 1k8 Ohm naar de plus is geschakeld en verbind ook de GND en Power door.

Voor het touchscreen is de tft_lib library nodig, welke op de site van nuelectronics.com is te downloaden. Installeer deze in de "libraries" directory in de programma directory van Arduino.
Tevens zit er op dit touchscreen shield een SD-kaart lezer welke we ook gebruiken. Er staan bijvoorbeeld enkele BMP-files op welke gebruikt worden als achtergrond plaatjes.
Tip: Gebruik geen SDHC kaartjes, deze kunnen niet gelezen worden!
Je kunt echter ook zonder het kaartje aan de slag, dan zijn alle achtergronden wit.

De twee sketches, één voor beide JeeNode's en één voor de Arduino met touchscreen kunnen hier (laatste update: Zondag 21 november 2010) gedownload worden als RAR-bestand. Dit is inclusief de gebruikte achtergrond plaatjes en enkele noodzakelijke files, zoals een aangepast lettertype het font "SMG_LCD.h". Laat die extra files in de directory staan waar de sketch staat en zet de plaatjes op een SD-kaart.

Voordat we data gaan versturen, dienen we eerst te bepalen wat we ermee willen. Dit resulteert in een protocol, waarin vastgelegd wordt wat voor soort data we hebben en hoe het wordt verzonden en ontvangen, dit zowel voor de I²C verbinding tussen de Arduino en de Jeenode als voor de draadloze verbinding tussen de JeeNode's.
Dit protocol voorziet in adressering opdat je kunt achterhalen waar iets vandaan komt, voor het geval je met meerdere JeeNode's gaat werken. Elk onderdeel, Arduino of JeeNode, heeft dus zijn eigen adres, dit is een byte (totaal geeft dit 256 devices). In het pakketje wat verstuurd wordt komt het adres te staan waar het naar toe moet en waar het vandaan komt. Eigenlijk zoals we ook bij de normale post toepassen (geadresseerde en afzender). Tevens komt er nog een derde adres bij, welke later invulling gaat krijgen indien noodzakelijk. Stel dat het bereik van de RF12 transceiver niet voldoende is, dan kun je een JeeLink gebruiken als doorgeefluik, dit is een radiobaken die in feite niets anders doet dan alle data die het ontvangt doorsturen. Dit wordt ook wel een relay of repeater station genoemd.
Verder een commando (1 byte) en vier parameters (waarvan 2 bytes zijn en 2 integers zijn).

Stel we willen van een temperatuur sensor weten hoeveel graden het is, we noemen deze "temperatuur sensor 1". Het commando hiervoor kan de byte 0x10 zijn (hexadecimale notatie, waarbij 0x10 gelijk staat aan de decimale waarde 16). Dan in parameter 1 geven we op om welke sensor het gaat, in dit geval 0x01.

De adressen die gebruikt worden zijn:
0x00 voor de Arduino.
0x01 voor de JeeNode die via I²C aan de Arduino is aangesloten.
0x02 voor de JeeNode die in ons (scheeps)model komt.
0x03 en hoger zijn bedoeld voor extra JeeNode's.
0xF0 - 0xFE is gereserveerd voor een repeater/relay station.

In de software wordt rekening gehouden met het eigen adres (voordat je een JeeNode programmeert, zet dan het juiste adres in de sketch). Hierdoor blijft er één sketch die voor alle JeeNode's gebruikt kan worden, dat scheelt enorm met programmeren. Je moet anders voor elke JeeNode een eigen sketch bijhouden en met de vele versies software die nog gaan volgen is dat later niet meer te overzien.
Er vind commando herkenning plaats en daarop een corresponderende actie uitgevoerd. In dit geval het meten van diverse sensoren en deze waarde retour zenden.
In de test ziet dit er als volgt uit:

Hoofdmenu                              Communicatie test menu                         LCD bij JeeNode

Naast een enkele temperatuur sensor (TMP36) die nu nog tijdelijk direct op een analoge ingang van de Atmel op de JeeLink is aangesloten, wordt inmiddels ook gebruik gemaakt van andere JeeLabs pluggen, waaronder een Pressure Plug (pp1) en een Extender Plug (ep1).
De Pressure Plug meet de druk, ofwel het is een digitale barometer.
De Extender Plug is een digitale 8-pins I/O uitbreiding, welke via I²C 8 poorten als input of output kan schakelen. De eerste plug (er kunnen er 4 op elke softwarematige I²C poorten van de JeeLink aangesloten worden), dient bij deze eerste test puur als 8 outputs. In het communicatie menu op het touchscreen zien we deze extender plug terug als "Switch1". De corresponderende virtuele knoppen ernaast (01 t/m 08) geven de status weer van de desbetreffende I/O-poort (rood is aan, blauw is uit). Klikken op Switch1 zorgt ervoor dat alle 8 poorten uit gaan op de bijbehorende extender plug.

Het meten van de accuspanning (tot 12V) gaat volgens het principe dat hier is beschreven in een ander project.

Verder zijn we gestart met het maken van een eigen extender plug (16-bit digitale I/O) op basis van de MCP23017 chip, zie hier voor meer info over dit aparte project.

 

Wordt vervolgd...

 

 

Naar elektronica          Naar microcontrollers          Naar hoofd pagina