De BBC micro:bit was een groot succes, en niet alleen in de educatieve markt waar hij voor bedoeld was. Nu komt Adafruit met de CLUE, compleet met een volwaardig display,  veel meer geheugen, Bluetooth LE en een veelheid aan geïntegreerde sensoren, daarmee vooral geschikt voor kleinere IoT-projecten. 

Sinds de successen van Arduino en Raspberry Pi is het duidelijk geworden dat er geld te verdienen valt met educatieve computers. In 2016 mengde de BBC zich in de strijd met de micro:bit, een single-board computer met een Bluetooth SoC van Nordic Semiconductor in plaats van een volwaardige Linux-geschikte processor. Sindsdien zijn er ongelooflijke verhalen opgedoken van bedrijven, zoals Spy oz in Slowakije, die geheel zijn opgebouwd rond de exclusieve distributie van het micro:bit-ecosysteem [1].

Het oude gezegde "don’t eat at a well-filled pot all by yourself for too long" is ook van toepassing op het gebied van embedded computing. De voortdurende vooruitgang op het gebied van Bluetooth SoC's heeft ertoe geleid dat de 16 MHz en 16 kB SRAM van de micro:bit achterhaald lijken. Bovendien is het 5×5 LED-display alleen geschikt om de eenvoudigste afbeeldingen weer te geven.

Adafruit valt aan met CLUE

Met de lancering van de Nordic Semiconductor nRF52840, een single-core Bluetooth SoC waarvan de ARM processor 64 MHz haalt en die is voorzien van 256 kB RAM - is een aanvalsvector geopend. Figuur 1 en figuur 2 tonen het resultaat - de Adafruit CLUE, die erg lijkt op de BBC micro:bit. Naast de SoC, die niet onmiddellijk zichtbaar is op deze foto's, is valt vooral het veel grotere scherm aan de voorzijde op. In plaats van LED's krijgen we een 240×240-pixel kleurenscherm op basis van klassieke IPS.

Adafruit CLUE (front)
Figuur 1: De aanvaller van voren...
Adafruit CLUE (back)
Figuur 2: ... en van achteren.

Een ander leuk detail van de module is de connector aan de achterkant, te zien in figuur 3. Deze connector heeft een I2C-bus met Adafruit's eigen formaat waarop gemakkelijk andere sensoren kunnen worden aangesloten. Er is ook een adapter voor het Grove-formaat dat gebruikt wordt door Seeed, bij wie verschillende redelijk geprijsde sensoren verkrijgbaar zijn.

 The STEMMA port on the CLUE
Figuur 3: De STEMMA-poort maakt het mogelijk om de Adafruit CLUE aan te sluiten op uitbreidingsboards.

Opgemerkt moet worden dat de CLUE slechts gedeeltelijk compatibel lijkt met zijn voorganger. Hoewel de connector langs de onderrand fysiek identiek is, betekent het gebruik van een ander display dat, op het eerste gezicht, veel van de beschikbare behuizingen voor de BBC micro:bit niet lijken te passen op de Adafruit CLUE.

De auteur testte deze hypothese met een ThingiVerse behuizing, beschikbaar op [2]. Het front paste duidelijk niet omdat het display van de CLUE veel groter was dan de LED-matrix van de BBC. Met dit in het achterhoofd vond de auteur het bijzonder verrassend dat het achterpaneel van de behuizing -ondanks de extra aansluitingen- goed paste. Bij nader inzien isdit waarschijnlijk te danken aan het relatief ruime ontwerp van de behuizing. Als de behuizing strakker was ontworpen, zou hij waarschijnlijk niet bruikbaar zijn geweest.

Een kwestie van programmering

Omdat het een educatief systeem is, gaat het ontwikkelen met een micro:bit anders dan bij het gebruik van klassieke embedded ontwikkelomgevingen zoals ARM Keil. Dit kan vervelend zijn voor embedded puristen, maar het is in de praktijk noodzakelijk omdat veel universiteiten niet genoeg bekwaam personeel hebben voor het debuggen van C++ (geloof mij: studenten maken soms ongelooflijk stompzinnige programmeerfouten).

In plaats daarvan wordt over het algemeen vertrouwd op een vierluik van Arduino IDE, CircuitPython, MakeCode, en Scratch. Voor CLUE zijn momenteel echter slechts twee van deze omgevingen beschikbaar. Aan MakeCode wordt gewerkt zonder bekende leverdatum, en er is geen informatie over Scratch. Wat wel wordt meegeleverd is een seriële bootloader om code te kunnen gebruiken, net als bij de Raspberry Pi Pico.

Laten we voor een eerste, klein experiment, CircuitPython aan de praat krijgen. Als je een nieuw board op de computer aansluit via de Micro-USB connector aan de achterkant, toont het display een statuspagina (Figuur 4) die informatie geeft over de bedrijfstoestand.

Info returned by the sensors
Figuur 4: Deze vooraf geïnstalleerde app toont de door de sensoren teruggezonden informatie.

Het tweemaal indrukken van de reset-knop op de achterkant van het bord zorgt er aanvankelijk voor dat de framebuffer in de display-controller van het scherm bevriest. Het aangesloten werkstation (de auteur draait Linux) ziet dan een nieuwe USB-drive waar gecompileerde code kan worden geüpload.

Interessant is dat de Adafruit CLUE altijd zichtbaar is voor de computer. Als hij niet in bootloader-mode is, detecteert dmesg hem als volgt:

tamhan@TAMHAN18:~$ dmesg
. . .
[28292.202193] usb 1-2.7: Manufacturer: Adafruit LLC
[28292.202195] usb 1-2.7: SerialNumber: 7687A137B6FDB874
[28292.204040] cdc_acm 1-2.7:1.0: ttyACM0: USB ACM device

Na dubbel indrukken van de resetknop verschijnt in plaats daarvan een USB-stick, zoals hier afgebeeld:

tamhan@TAMHAN18:~$ dmesg
. . . .
[28371.624193] sd 10:0:0:0: Attached scsi generic sg6 type 0

Dit station blijft niet voor altijd ingeschakeld! Als hij langer dan 30 seconden ongebruikt blijft, schakelt de firmware terug naar de normale werking.

Zoek Bestanden

Door de URL https://circuitpython.org/board/clue_nrf52840_express/ te bezoeken, kunnen we onze eerste stap zetten en het adafruit-circuitpython-clue_nrf52840_express-en_US-6.1.0.uf2 bestand downloaden. Dit bevat de runtime die op de USB-drive moet worden geplaatst.

Het is interessant om op te merken dat u ook een bestand met de naam CURRENT.UF2 op de drive
zult vinden. Hiermee kunt u de firmware downloaden die zich momenteel in het geheugen van het doelsysteem bevindt.

Vreemd genoeg wordt de runtime niet geleverd met een volledige bibliotheek die alle beschikbare sensoren ondersteunt. In plaats daarvan moeten we naar de URL https://circuitpython.org/libraries gaan om het archief adafruit-circuitpython-bundle-6.x-mpy-20210329.zip te downloaden en het dan uit te pakken in een handige map in het bestandssysteem.

Op dit punt moet U nog eens naar het scherm van de CLUE kijken, aangezien de runtime permanent de inhoud van de console weergeeft. Een leuke bijkomstigheid is dat het apparaat op de PC - zoals te zien in figuur 5 - het interne geheugen van de Python werkomgeving blootlegt.

The Python runtime
Figuur 5: De Python runtime stelt ook een virtueel station ter beschikking.

Het is belangrijk om de volgende mappen uit het archief in de map Libs op het toestel te plaatsen:

adafruit_apds9960
adafruit_bus_device
adafruit_display_shapes
adafruit_display_text
adafruit_lsm6ds
adafruit_register

Alsof dit nog niet genoeg werk is, verwacht Adafruit ook nog dat je de volgende individuele bestanden verzamelt. Waarom deze niet allemaal gebundeld zijn in één enkel archief is onduidelijk:

adafruit_bmp280.mpy
adafruit_clue.mpy
adafruit_lis3mdl.mpy
adafruit_sht31d.mpy
adafruit_slideshow.mpy
neopixel.mpy

Code Voorbeeld

Voor een eerste eenvoudige poging met de Python-omgeving, kunt U het voorbeeld gebruiken dat op https://learn.adafruit.com/adafruit-clue/clue-spirit-level staat. Dit implementeert een waterpas-applicatie die gebruikmaakt van verschillende CLUE-specifieke idiomen.

De eerste stap in de code is het opnemen van een groep bibliotheken:

import board
import displayio
from adafruit_display_shapes.circle import Circle
from adafruit_clue import clue

Naast het clue object, dat verschillende board-gerelateerde functies biedt, is hier ook de import van de Circle klasse interessant. De GUI-stack maakt zowel direct tekenen in een framebuffer mogelijk, als het werken met objecten die door de firmware worden omgezet in elementen die op het scherm verschijnen.

In de volgende sectie initialiseert de firmware een verwijzing naar het scherm en stelt een schermgroep object samen:

display = board.DISPLAY
clue_group = displayio.Group(max_size=4)

Het clue_group-object is interessant in die zin dat het een ‘parent element’ genereert dat doet denken aan een DOM-boom. Onze code schrijft dan min of meer willekeurige objecten naar deze boom voor weergave.

Als we naar de afbeelding in figuur 6 kijken, zien we dat de volgende stap van het programma is om de drie cirkels te genereren die verantwoordelijk zijn voor de weergave van de afbuiging en om ze te registreren voor de uitvoer:

A spirit-level
Figuur 6: Een waterpas met behulp van de sensoren aan boord.
outer_circle = Circle(120, 120, 119, outline=clue.WHITE)
middle_circle = Circle(120, 120, 75, outline=clue.YELLOW)
inner_circle = Circle(120, 120, 35, outline=clue.GREEN)
clue_group.append(outer_circle)
clue_group.append(middle_circle)
clue_group.append(inner_circle)

Daarna volgen nog enkele huishoudelijke taken, waarvan de betekenis het gemakkelijkst is te begrijpen door de onderstaande voorbeeldcode te bestuderen:

x, y, _ = clue.acceleration
bubble_group = displayio.Group(max_size=1)
level_bubble = Circle(int(x + 120), int(y + 120), 20, fill=clue.RED, outline=clue.RED)
bubble_group.append(level_bubble)

clue_group.append(bubble_group)
display.show(clue_group)

Tot slot hebben wij een lus nodig die de positiewaarden, die door de Adafruit bibliotheek via het acceleration-attribuut worden uitgevoerd, analyseert en naar de coördinaat-eigenschappen van het bubble_group-object schrijft:

while True:
    x, y, _ = clue.acceleration
    bubble_group.x = int(x * -10)
    bubble_group.y = int(y * -10)

De handigste manier om snel code uit te voeren op de CLUE is door gebruik te maken van het code.py bestand zoals weergegeven in figuur 5. De CircuitPython-firmware voert dit automatisch uit als onderdeel van elke startup. Figuur 6 laat zien wat u kunt verwachten.

Door de aanwezigheid van een Bluetooth-module kan de Clue ook gebruikt worden om te communiceren met de host computer. Op [3] geeft Adafruit een leuk voorbeeld dat het gebruik illustreert van de web Bluetooth API geïmplementeerd in Google Chrome.

En nu met C

Python kan een snelle manier zijn om onbureaucratisch resultaten uit een embedded systeem te halen. Maximale prestaties worden echter pas bereikt door gebruik te maken van C. Vooral op een single-core radiosysteem, is het implementeren van communicatie een uitdaging als de toepassing niet mag worden verstoord door timingproblemen. Daarom dwingt Adafruit de ontwikkelaars min of meer om de Arduino-IDE te gebruiken. Een real-time besturingssysteem werkt dan op de achtergrond en wijst rekenkracht toe aan de verschillende taken.

Onder Linux vereist de eerste stap een uitbreidingspakket dat de Arduino-IDE (versie 1.8.6 of hoger) in staat stelt te communiceren met de niet-standaard bootloader van de CLUE:

tamhan@TAMHAN18:~$ pip3 install --user adafruit-nrfutil
Collecting adafruit-nrfutil
  . . .
Successfully installed adafruit-nrfutil-0.5.3.post13

Vervolgens moeten we de URL https://www.adafruit.com/package_adafruit_index.json invoeren in de Board Manager om het Adafruit nRF52 boardpackage beschikbaar te maken voor download. Nadat deze stappen zijn voltooid, is het bord beschikbaar onder Tools > Board > Adafruit CLUE.

Helaas, zoals in het geval van CircuitPython, is het instellen van deze bibliotheken en andere instellingen een moeizaam proces. Meer informatie hierover kan worden gevonden op [4].

CLUE: Is Het Het Waard?

Kiest u voor de CLUE, dan krijgt u een zeer aantrekkelijk evaluatieplatform dat prettig is in het gebruik op het gebied van interfacing, gekoppeld aan de voordelen van een kleurenscherm. Daar staat tegenover dat de prijs relatief hoog is in vergelijking met de BBC micro:bit. Ook moet worden opgemerkt dat de CLUE niet 100% compatibel is met de micro:bit. De ervaring leert ons dat dit niet onbelangrijke detail de grootste impact heeft juist wanneer we in moeilijkheden verkeren, zoals bij het porten van een bestaand, werkend project tussen de twee platformen.

Wie met een schone, Nordic-gebaseerde microcontroller of radiomodule wil werken, is waarschijnlijk beter gediend met een klassiek evaluatieboard. Het komt er dus op neer dat de CLUE een sympathiek product is voor degenen die willen profiteren van een BBC micro:bit maar wat meer prestaties willen of een volledig scherm wensen.


Vragen of opmerkingen over CLUE?
Heeft u technische vragen of opmerkingen over dit artikel? Neem dan contact op met het Elektor-team via editor@elektor.com.

Vertaling: Jelle Aarnoudse