Arduino BOB's gebruiken om sensoren en randapparaten snel te evalueren
Bijgedragen door De Noord-Amerikaanse redacteurs van DigiKey
2019-10-30
De opkomst van het Internet of Things (IoT) heeft veel innovatieve startups geïnspireerd om aansluiting bij deze belangrijke ontwikkeling te zoeken. Maar veel van deze startups hebben kleinere ontwikkelteams en zien dat producten steeds sneller marktrijp moeten zijn. Het resultaat is dat individuele ontwerpers van veel verschillende technische gebieden en taken kennis moeten hebben, zoals analoog, digitaal, radiofrequent en draadloze en bedrade netwerken. Het is vanzelfsprekend dat zij voortdurend op zoek zijn naar manieren om het evalueren van ic's, sensoren en randapparaten te versnellen en de kosten ervan te verlagen.
Eén optie is de evaluatie- en ontwikkelsets van ic-leveranciers te gebruiken bij het ontwikkelen van hun producten. Aangenomen dat er goede ondersteuning wordt geleverd, is dat een prima aanpak. Maar een andere optie is om naar het Arduino-ecosysteem te kijken. Dit is begonnen als een speelterrein voor hobbyisten, maar is uitgegroeid tot een volwaardig ecosysteem voor ontwikkeling en ondersteuning.
In dit artikel laten wordt getoond hoe ontwerpers een Arduino kunnen gebruiken om al vroeg in de ontwerpcyclus ic's, randapparaten en sensoren te evalueren door middel van open source hardware in de vorm van break-out-boards (BOB's) voor sensoren en randapparaten, samen met open source software als bibliotheken en voorbeeldprogramma's. Zo kan men realtime klokken (RTC's) van Maxim Integrated en BOB's from Adafruit Industries gebruiken
De opkomst van het IoT
Eén van de eerste voorbeelden van het IoT stamt uit het begin van de jaren 80 toen een Coca Cola-machine op de Carnegie Mellon University aangesloten werd zodat de programmeurs konden zien of er nog dranken in zaten en of die koud waren, voordat ze naar de machine toe gingen. Het IoT als concept kreeg pas in 1999 officieel zijn naam.
Over het exacte moment waarop het IoT echt ontstond wordt nog gediscussieerd. Misschien is de beste definitie van de geboorte van het IoT zoals we dat nu kennen: "het moment dat er meer 'dingen' of 'voorwerpen' dan mensen met het internet waren verbonden". Op basis daarvan werd het IoT naar schatting ergens tussen 2008 en 2009 geboren, afgaande op de verhouding dingen/mensen die van 0,08 in 2003 naar 1,84 in 2010 was gegroeid.
De opkomst van de Arduino
De ontwikkeling van het IoT viel samen met de opkomst van de Maker Movement kort na de eeuwwisseling. De Arduino werd voor het eerst in 2005 wereldwijd uitgerold, hetzelfde jaar waarin het tijdschrift Make ontstond en slechts één jaar voordat de eerste Maker Faire werd gehouden.
De Arduino heeft vanaf het begin van zijn ontstaan geavanceerde open source hardware- en software-ecosystemen doen ontstaan. Het enige wat ontbrak, was een manier om de goed ondersteunde Arduino-ecosystemen naar de professionele ontwerpers te brengen om hun werk te vereenvoudigen en hun producten sneller marktrijp te maken.
De oplossing kwam haast vanzelf: het grote ecosysteem dat rond de Arduino ontstond, veroorzaakte een onverwacht zijeffect: professionele ontwerpers gingen de Arduino gebruiken om sensoren en randapparaten te evalueren voordat ze die in hun eigen ontwerpen gingen toepassen. Hier zijn nu veel voorbeelden van, zoals een RTC.
Voorbeeld evaluatie van een randapparaat met behulp van een RTC
Bijna elke moderne 32-bits microcontroller bevat een geïntegreerde RTC, net als veel 16-bits en zelfs 8-bits microcontrollers. Hoewel hierdoor het benodigde oppervlak op printplaten afneemt, evenals het aantal te gebruiken onderdelen en de kosten voor het eindproduct, heeft het gebruik van een interne RTC ook nadelen.
Eén van de nadelen is dat de microcontroller zijn interne RTC door software gestuurd moet in- en uitschakelen, dus als er bijvoorbeeld een storing in de voeding optreedt, de microcontroller hangt of er een bug in de code zit, dan kan de RTC onbedoeld worden uitgeschakeld. Een externe RTC wordt daarentegen als veel robuuster gezien, omdat hij een aparte voedingsaansluiting en apart kristal heeft en minder gauw per ongeluk door de code in de microcontroller kan worden uitgeschakeld. Bovendien wordt een externe RTC meestal geïmplementeerd op een grotere chip dan de microcontroller, zodat hij door zijn grotere siliciumoppervlak minder last heeft van 'bit-flips', d.w.z. kleine eenmalige verstoringen als gevolg van straling, zoals kosmische straling.
Voorbeelden van RTC ic's: Maxim Integrated DS1307 en DS3231
Twee uiterst populaire RTC ic's zijn de DS1307 en de DS3231 van Maxim Integrated. Beide apparaten houden informatie over secondes, minuten, uren, dag, datum, maand en jaar bij, houden automatisch rekening met maanden die korter zijn dan 31 dagen en schrikkeljaren en ondersteunen 12- en 24-uurs notatie. Beide apparaten communiceren tevens met de host microcontroller via een seriële I2C-bus en ze beschikken over een circuit dat storingen in de voeding detecteert en automatisch naar een back-upvoeding overschakelt (meestal een batterij), waarbij de tijdfuncties ononderbroken doorgaan (Afbeelding 1).
Afbeelding 1: De DS1307 is een goed voorbeeld van een externe RTC. Externe RTC's hebben als voordeel dat ze over een eigen lokaal kristal en voedingsrail beschikken en hebben geen last van haperingen in de code. Ze communiceren met de host microcontroller via een I2C-interface. (Bron afbeelding: Maxim Integrated)
Het is natuurlijk belangrijk om de gegevensbladen te controleren op de verschillen tussen deze apparaten. Zo heeft de DS1307 een voedingsspanning van 5 volt nodig plus een extern kristal. De nauwkeurigere DS3231 werkt daarentegen met een voedingsspanning van 2,3 tot 5,5 volt en beschikt over een geïntegreerde temperatuurgecompenseerde kristaloscillator (TCXO) en kristal.
Soms zijn de verschillen tussen deze componenten niet direct duidelijk. Beide apparaten produceren bijvoorbeeld een blokvormig uitgangssignaal dat bij software-activatie een externe pull-up-weerstand nodig heeft. Maar bij de DS1307, kan het blokvormige uitgangssignaal met een frequentie van 1 Hertz (Hz), 4,096 kilohertz (kHz), 8,192 kHz of 32,768 kHz worden geprogrammeerd. Ter vergelijking kan bij de DS3231 dit uitgangssignaal met een frequentie van 1 Hertz (Hz), 1,024 kilohertz (kHz), 4,096 kHz of 8,192 kHz worden geprogrammeerd.
Bij de DS1307 is de nauwkeurigheid van de klok afhankelijk van de nauwkeurigheid van het kristal en de nauwkeurigheid van de afstemming tussen de capacitieve belasting van de oscillatorschakeling en de capacitieve belasting waarvoor het kristal is afgestemd. Daar staat tegenover dat de temperatuurgecompenseerde DS3231 een specifiekere nauwkeurigheid heeft van ±2 minuten per jaar van -40 tot +85 °C (Afbeelding 2).
Afbeelding 2: De DS3231 is een temperatuurgecompenseerde kristaloscillator met een nauwkeurigheid van ±2 minuten per jaar over een temperatuurbereik van -40 tot +85 °C. (Bron afbeelding: Maxim Integrated)
Als we aannemen dat beide apparaten volgens de gegevensbladen in principe voldoen, hoe kunnen ontwerpers ze dan in een realistische omgeving evalueren? Eén oplossing zou zijn om van meet af aan maatwerk break-out-boards (BOB's) te ontwerpen en te bouwen evenals de code die nodig is om ze aan te sturen. Een snellere en meer kosteneffectieve oplossing zou zijn om standaard BOB's te gebruiken en code die binnen de Arduino hardware- en software-ecosystemen zijn ontwikkeld.
Voorbeelden van RTC BOB's: Adafruit DS1307 en ChronoDot
Twee populaire BOB's voor de DS1307 en DS3231 ic's zijn de Adafruit 3296 DS1307 Real-Time Clock BOB (Afbeelding 3) en de 255 ChronoDot Ultra-Precise Real-Time Clock V2.1 BOB (Afbeelding 4).
Afbeelding 3: Adafruit DS1307 RTC BOB. (Bron afbeelding: Adafruit Industries)
Afbeelding 4: ChronoDot Ultra-Precise Real-Time Clock v2.1 BOB (Bron afbeelding: Adafruit Industries)
In combinatie met een geschikt microcontroller-ontwikkelingsboard, bijvoorbeeld een Arduino Uno R3, en open source bibliotheken en voorbeeldcode die vanaf het internet kunnen worden gedownload, kunnen professionele ontwerpers van embedded systemen en IoT-apparaten direct aan de slag.
Als de evaluaties van de ontwerpers afgerond zijn, kunnen zij de geschikte delen van de open source hardware-ontwerpen voor de BOB's gebruiken en deze zonder meer in hun eigen ontwerpen inbouwen. Ze kunnen de open source bibliotheken en de code die zij op basis van de open source voorbeelden hebben ontwikkeld, op dezelfde manier in hun eigen producten gebruiken.
Hardware tips en trucs voor softwareontwikkelaars
Zoals hierboven gesteld, communiceren zowel de DS1307 als de DS3231 RTC's via een seriële I2C-bus met de host microcontroller. Eén van de vallen waar softwareontwikkelaars in kunnen trappen, is dat voor beide signalen op deze bus (SCL en SDA genoemd) pull-up-weerstanden nodig zijn.
De DS1307 en de DS3231 (ChronoDot) BOB van Adafruit hebben zo'n weerstand niet, ook al heeft de ChronoDot aansluitpunten genaamd R1 en R2 waarop zij kunnen worden aangesloten.
De reden dat de pull-up-weerstanden niet aanwezig zijn, is dat er op een I2C-bus meerdere apparaten (ic's of BOB's) aangesloten kunnen zijn. De I2C-bus gebruikt een 7-bits adres, waarbij 27 = 128. Adres 0000000 is een algemeen oproepadres dat wordt gebruikt om alle apparaten op de bus te adresseren, zodat de bus theoretisch 127 aparte appraten kan ondersteunen. In de praktijk is het echte aantal apparaten dat kan worden ondersteund beperkt door de capacitantie van de bus, inclusief de capacitantie van de sporen en de belastingen, die begrensd is op 400 picofarad (pF).
Er bestaat een formule die hardwareontwerpers gebruiken om de equivalente waarde van meerdere parallel geschakelde weerstanden te bepalen. In het kader van deze discussie kunnen we het volgende eenvoudige voorbeeld bekijken. Als twee apparaten pull-up-weerstanden van gelijke waarde hebben, dan is de resulterende weerstand de helft van die waarde. Bij vier gelijke pull-up-weerstanden is dit een kwart.
Als er op de bus al een I2C-apparaat is met pull-up-weerstanden, dan hoeft er verder niets te worden gedaan. Als er nog geen pull-up-weerstanden aanwezig zijn en de ontwerper er 100% zeker van is dat er in de toekomst geen BOB met on-board pull-up-weerstanden wordt toegevoegd, dan kunnen het beste twee weerstanden van 4,7 kilo-ohm (kΩ) elk als pull-up-worden gebruikt. Maar als er een kans is, dat er in de toekomst een BOB met pull-up-weerstanden wordt toegevoegd, dan kunnen op dat moment het beste twee weerstanden van 10 kΩ elk worden toegevoegd omdat dat goed gaat zowel voordat als nadat de andere BOB aan de bus wordt toegevoegd.
Software tips en trucs voor hardwareontwikkelaars
De 'wire' bibliotheek is een communicatiebibliotheek voor tweedraads communicatie met I2C-apparaten. Bij de Arduino wordt deze meegeleverd als onderdeel van de geïntegreerde ontwikkelomgeving (IDE) en een ontwerper hoeft alleen maar de instructie #include <Wire.h> aan het begin van het programma op te nemen.
De echte truc is het vinden van een geschikte RTC-bibliotheek. Een goede is de Adafruit RTClib, die vanaf GitHub kan worden gedownload. Neem vervolgens de instructie #include "RTClib.h" aan het begin van het programma op.
Verderop in het programma, meestal nadat de constanten zijn gedefinieerd, moet een instantie van de RTC worden aangemaakt door middel van de instructie RTC_ DS1307 RTC; of RTC_DS3231 RTC;, afhankelijk van de gebruikte BOB.
Nog verderop, als de ontwikkelaar het hele programma initialiseert (binnen de functie setup() in het geval van een Arduino basisontwerp), moeten de instructies Wire.begin(); en RTC.begin(); worden opgenomen om de I2C-communicatie en het RTC-subsysteem te initialiseren.
Met de op de eerder genoemde GitHub-pagina beschikbare voorbeelden kan een ontwerper snel aan de slag om de actuele datum en tijd op te vragen en aan te passen. Minder evident is het hoe het blokvormige uitgangssignaal kan worden verkregen. Standaard is dit uitgangssignaal niet actief om energie te besparen. Deze pin kan actief worden gemaakt om bijvoorbeeld op 1 Hz te werken en dit signaal dan te gebruiken om een interrupt op de host microcontroller aan te sturen.
Een softwareontwikkelaar kan dit zonder probleem in de code in de bibliotheek opzoeken, maar dit kan lastiger zijn voor een hardwareontwikkelaar, vandaar dat we hier een korte samenvatting geven:
Bij de DS1307 moeten alleen maar een of meer instructies te worden opgenomen in de vorm RTC.Ds1307SqwPinMode(<option>); waar de volgende waardes voor 'option' worden ondersteund: ON, OFF, SquareWave1HZ, SquareWave4kHz, SquareWave8kHz en SquareWave32kHz.
Net zo moeten bij de DS3231 een of meer instructies te worden opgenomen in de vorm RTC.Ds3231SqwPinMode(<option>); waar de volgende waardes voor 'option' worden ondersteund: ON, OFF, DS3231_SquareWave1Hz, DS3231_SquareWave1kHz, DS3231_SquareWave4kHz en DS3231_SquareWave8kHz.
Conclusie
Ontwikkelaars die in kleinere teams werken en onder meer tijdsdruk staan om de producten marktrijp te maken, moeten van meerdere gebieden op de hoogte zijn om ic's, sensoren en randapparaten sneller en goedkoper te evalueren. Zoals we hebben laten zien, is één van de mogelijkheden hiervoor het gebruik van de Arduino met open source hardware in de vorm van break-out-boards (BOB's) voor sensoren en randapparaten, in combinatie met open source software in de vorm van bibliotheken en voorbeeldprogramma's.
Disclaimer: The opinions, beliefs, and viewpoints expressed by the various authors and/or forum participants on this website do not necessarily reflect the opinions, beliefs, and viewpoints of DigiKey or official policies of DigiKey.




