Grunderna i CircuitPython för snabb mikrostyrenhetsbaserad prototypning och utveckling
Bidraget med av DigiKeys nordamerikanska redaktörer
2019-03-14
Python-språket har gjort programmeringen tillgängligare men det utformades att köras på datorer och andra maskiner med mycket resurser för bearbetning, minne och kringutrustning. För inbäddade system med tajtare resurs- och gränssnittsbegränsningar har en optimerad version för mikrostyrenheter, som kallas MicroPython, blivit populär. Så mycket att öppen källkod-communityn har börjat använda MicroPython på vissa mikrostyrenheter och utvecklingskort för att stödja mikrostyrenhetsutveckling i större skala.
I den här artikeln introduceras en sådan anpassning, Adafruits CircuitPython. Efter en kort diskussion om Python, i jämförelse med det klassiska inbäddade utvecklingsspråket C++, diskuteras i artikeln hur Python har utvecklats till MicroPython och nu CircuitPython. Därefter beskrivs processen att skriva programvara med hjälp av CircuitPython innan flera utvecklingskort från Adafruit och andra leverantörer som stöder CircuitPython-miljön introduceras.
Anledningen till Python
Det ursprungliga Arduino-utvecklingskortet och dess många efterföljare har varit mycket populära mikrostyrenhetsbaserade utvecklingskort för tillverkar-, hobby- och studentprojekt, samt för inbäddade prototyper. Men Arduinos IDE och programmeringsspråk baseras på C++, en kraftfullt men komplext kompilerat språk med udda syntax och stränga interpunktionsregler som är avskräckande för oerfarna programmerare.
Python är ett nyare programmeringsspråk. Det är ett tolkat, interaktivt, objektorienterat språk som kombinerar slående programmeringskraft med en mycket tydlig syntax. Det är känt för sin skriv- och läsbarhet samt för den enklare syntaxen. De här egenskaperna kombineras för att minska antalet programmeringsfel och gör det enklare att återanvända kod och därmed få en snabbare programutveckling.
Språkets tolkande egenskaper ger omedelbar programmeringsfeedback som uppmuntrar till experiment och snabb inlärning. Därför är Python nu det första programmeringsspråk som många studerande och tillverkare lär sig.
En nackdel är att Python utformades att köras på datorer och större maskiner med mycket RAM-minne, stora mängder masslagring och ett omfattande användargränssnitt med tangentbord, stor skärm och mus. Det utformades inte som ett inbäddat programmeringsspråk. Men en slimmad, effektiv implementering av programmeringsspråket Python 3 – MicroPython – har vuxit fram som skapades och optimerades att köras inom en mikrostyrenhets begränsade resurser.
Öppen källkod-communityn har uppmärksammat MicroPythons lovande egenskaper som inbäddat programmeringsspråk och har börjat använda det på vissa mikrostyrenheter och utvecklingskort för att stödja mikrostyrenhetsutveckling i större skala. Till exempel har Adafruit utvecklat ett eget MicroPython: CircuitPython. Det har utformats för att förenkla experimentering och inlärning för att programmera på billiga mikrostyrenhetskort och är skräddarsytt för de mikrostyrenheter och maskinvaruresurser som är tillgängliga på Adafruits utvecklingskort. CircuitPython är förinstallerat på flera av Adafruits utvecklingskort och kan installeras på andra.
Skillnader mellan C++ och Python
Med tanke på Arduino IDE:s slagkraft och närvaro, och de många Arduino-utvecklingskort som är tillgängliga nu är det rimligt att fråga varför en version av Python kan behövas för inbäddad utveckling. En jämförelse av språken ger svaret.
C++ är ett förlängning av det äldre C-språket med objektorienterade tillägg. Även med de här tilläggen är C++-koden något kryptisk eftersom det har kvar den C-syntax som ursprungligen skapades av Kernigan och Ritchie på Bell Labs i slutet av 1960-talet och början av 1970-talet. C designades avsiktligt för att mappas enkelt till maskininstruktioner för en målprocessor. Den här benägenheten att prioritera datorns behov framför programmerarens är uppenbar i språkets syntax. Eftersom kommersiella mikroprocessorer inte fanns förrän 1971 utvecklades C ursprungligen för minidatorer. C-kompilatorer för mikrostyrenheter utvecklades gradvis till användbara verktyg under 1980-talet. C har alltid varit ett kompilerat språk, liksom C++.
Den danske datavetaren Bjarne Stroustrup började utveckla C++ 1979. Hans första lärobok om språket gavs ut 1985. C++ blev inte ett standardprogrammeringsspråk förrän 1998. Liksom C riktade Stroustrup sitt C++-språk mot större datorer. Arduino IDE (Integrated Development Environment – integrerad utvecklingsmiljö), som utvecklades 2003, gjorde C++ användbart för mikrostyrenheter.
Python är också ett objektorienterat språk. Det utvecklades av den nederländske programmeraren Guido van Rossumin och första versionen släpptes 1991. I Pythons syntaxdesign betonas kodens läsbarhet – för människor – vilket är en huvudskillnad mellan Python och C++. Skrivbarheten, som är nära kopplad till läsbarheten, är en annan egenskap till Pythons fördel. Skrivbarhet innebär att programmerare generellt kan skriva program snabbare med Python, vilket uppmuntrar till experiment och kan förkorta prototypnings- och utvecklingscykeln.
En andra stor skillnad är att Python är ett tolkat språk, mycket som programmeringsspråket Basic som dök upp för minidatorer på 1960-talet och blommade ut på riktigt under 1970-talet med introduktionen av mikrodatorer. Liksom Basic uppmuntrar den tolkande karaktären hos Python till att experimentera, och därigenom inlärning genom att avskaffa redigera/kompilera/ladda ned/köra-utvecklingscykeln som används för kompilerade programmeringsspråk. Men till skillnad från Basic är Python ett modernt, objektorienterad högnivåspråk som inkorporerar ett halvt sekel med framsteg inom datavetenskap som har kommit fram sedan Basic först utvecklades.
Till exempel behöver Pythons variabler inte deklareras eller typbestämmas innan de används. Programmerare behöver inte oroa sig för om en variabel ska vara ett heltal eller ett flyttal. Python-tolkaren räknar ut allt och gör lämpliga val vid körtid.
Två skillnader till mellan C++ och Python är stränghantering och interpunktion. Många programmerare tycker att stränghanteringen i C++ är trubbig och förvirrande. Pythons stränghantering är mycket enklare och påminner mycket om Basics enkla och uppskattade stränghanterande funktioner, länge ansett som en stark sida hos Basic.
Och interpunktionen i C och C++ – särskilt klammerparenteser ({}) – är en annan stötesten för nya och till och med erfarna programmerare. Det känns om att det alltid finns ett udda antal klammerparenteser i ett program, vilket betyder att programmeraren måste gräva ned sig i koden för att hitta var den saknade klammerparentesen ska vara. Python har ingen sådan kinkig interpunktion, utan här används indrag, vilket ger Python-koden dess läsbarhet.
MicroPythons ursprung
Liksom C och C++ utformades Python ursprungligen för att köras på större datorer. Därför krävde språket för många resurser för att programmera mikrostyrenheter. Den australiske programmeraren och fysikern Damien George utvecklade därför en version av Python som kallas MicroPython, som kan köras på en mikrostyrenhets mer begränsade resurser. Arduino-utvecklingskort var tidiga maskinvarumål för MicroPython.
Kärnan i MicroPythons interaktiva natur är dess kommandogränssnitt, formellt kallad REPL-fönster (read-eval-print-loop), som normalt fungerar via en seriell anslutning som ansluter en värddator till ett mikrostyrenhetsbaserat utvecklingskort. REPL-gränssnittet liknar mycket kommandoradsgränssnitten i Basic på 1970- och 1980-talet. Det accepterar användarinmatningar (enkla uttryck eller satser), utvärderar dem och returnerar resultat till användaren via REPL-fönstret eller utför kommandot inbäddat i satsen.
Med hjälp av REPL-gränssnittet kan du köra frågor på en variabel, växla en I/O-rad eller skicka en sträng med tecken till ansluten kringutrustning. Raden tolkas och körs direkt när du trycker på Retur. Så fungerar ett tolkat språk.
Den här MicroPython-funktionen underlättar utforskande programmering och felsökning och är en av aspekterna av MicroPython som gör språket lättanvänt för både nybörjare och erfarna programmerare. REPL-användargränssnittet stöder snabbare utvecklingscykler jämfört med Arduino IDE:s klassiska cykel: redigera, kompilera, köra och felsöka. Även erfarna programmerare har nytta av att kunna experimentera med nya typer av kringutrustning interaktivt med hjälp av MicroPythons REPL-användargränssnitt.
CircuitPython-stöd för utvecklingskort
Varje mikrostyrenhet har en unik uppsättning kringutrustning och varje utvecklingskort bidrar till den listan. All den här kringutrustningen kräver stöd för bibliotek. Det gäller för både Arduino IDE och MicroPython. Dessutom finns det många tilläggsenheter, som Adafruits 1655 NeoPixel addresserbar RGB LED, som också kräver stöd för bibliotek.
Adafruit har, för att ge en högre grad av stöd, utvecklat en egen version av MicroPython, som kallas CircuitPython, för att uppfylla de specifika kraven för flera av företagets billiga mikrostyrenhetsbaserade utvecklingskort. Företaget har även konverterat många kringutrustningsbibliotek från dess enorma Arduino-samling, som redan tillhandahåller en stort och växande antal kringutrustningsbibliotek för CircuitPython.
Adafruit har utformat en serie mikrostyrenhetsbaserade utvecklingskort uttryckligen för att stödja CircuitPython. Dessa är:
- 3333 Circuit Playground Express, med tio adresserbara, kontrollerbara RGB LED (figur 1)

Figur 1: Adafruits 3333 Circuit Playground Express, med tio adresserbara, kontrollerbara RGB LED. (Bildkälla: Adafruit)
- Utvecklingskortet 3500 Trinket M0 som bara är 27 x 15,3 x 2,75 mm (figur 2)

Figur 2: Adafruits utvecklingskort 3500 Trinket M0 som bara är 27 x 15,3 x 2 mm. (Bildkälla: Adafruit)
- 3501 Gemma M0 är inte större än ett mynt och kan drivas via USB-porten eller en separat batteriport (figur 3)

Figur 3: Adafruits 3501 Gemma M0 är inte större än ett mynt och kan drivas via USB-porten eller en separat batteriport. (Bildkälla: Adafruit)
- 3403 Feather M0 Express är ett utvecklingskort som har ett litet kopplingsdäckområde för anpassade kretsar (figur 4)

Figur 4: Adafruits utvecklingskort 3403 Feather M0 Express som har ett litet kopplingsdäckområde för anpassade kretsar. (Bildkälla: Adafruit)
De här fyra mikrostyrenhetsbaserade utvecklingskorten från Adafruit är alla baserade på SAMD21-mikrostyrenheter med inbyggt USB-stöd, från Microchip Technology (tidigare Atmel). Men CircuitPython har stöd för mer än Adafruits utvecklingskort och mikrostyrenheten SAMD21. Olika versioner av CircuitPython för andra utvecklingskort med andra mikrostyrenheter börjar också dyka upp, till exempel Adafruits 3406 Feather NRF52 och Nordic Semiconductors nRF52-DK, båda baserade på mikrostyrenheten nRF52832 från Nordic Semiconductor. Utvecklingskortet nRF52840-DK från Nordic Semiconductor, (figur 5), baserat på företagets mikrostyrenhet nRF52840, stöds även av CircuitPython. Båda mikrostyrenheterna som de här tre korten är baserade på har BLE (Bluetooth Low Energy) integrerat på chippet, med lämpligt programvarustöd.

Figur 5: Nordic Semiconductors utvecklingskort nRF52840-DK har integrerat stöd för BLE. (Bildkälla: Nordic Semiconductor)
Utveckla med CircuitPython
Adafruit har ett unikt tillvägagångssätt att placera CircuitPython på utvecklingskort utformade för att direkt stödja språket. Anslut något av dessa kort till en värddators USB-port så visas kortet som en diskenhet för datorn. Den här diskenhetens rotkatalog visar de kritiska CircuitPython-filerna, inklusive tolkaren, användarprogrammet och en mapp som innehåller biblioteksfilerna. Det här arrangemanget gör det enkelt för värddatorn att få åtkomst till utvecklingskortet med hjälp av dess befintliga filsystem och drivrutiner.
CircuitPython-användargränssnittet på värddatorn kräver en öppen källkod-redigerare och ett REPL-gränssnitt som kan laddas ned kostnadsfritt. Adafruit rekommenderar en öppen källkod-app med namnet Mu, som visas i figur 6. Mu-skärmen är indelad i ett kodfönster där redigeringen sker och REPL-fönstret för kontroll och övervakning där programmeraren styr utvecklingskortets CircuitPython-tolkare.

Figur 6: Adafruit rekommenderar användning av ett programmeringsgränssnitt med öppen källkod, Mu. Mu-skärmen är indelad i ett kodfönster där redigeringen sker och REPL-fönstret för kontroll och övervakning där programmeraren styr utvecklingskortets CircuitPython-tolkare. (Bildkälla: codewith.mu/en/tutorials/1.0/adafruit)
Genom att skriva ett program i kodfönstret och klicka på ”Spara”-knappen i Mu sparas koden på Adafruits utvecklingskort i SAMD21-mikrostyrenhetens flashminne på chippet. All CircuitPython-kod finns på utvecklingskortet på mikrostyrenhetens flashminne. Kom ihåg att CircuitPython-kortet ser ut som en diskenhet för datorn, så det är inte onaturligt utifrån operativsystemets perspektiv.
Slutsats
Python-språket ger programmerare många fördelar, som interaktiv programmering, experimentering och felsökning. Den har en enklare, mer mänsklig språksyntax, utan variabeldeklarationer eller -skrivning, och har ingen besvärlig interpunktion. MicroPython är en variant av Python 3 som gör mikrostyrenhetsprogrammering i Python möjlig.
Adafruit har anpassat MicroPython för att härleda CircuitPython för direkt maskinvarusupport för att ytterligare förenkla experimentering och inlärning och påskynda programvaruutveckling. CircuitPython stöder redan flera billiga mikrostyrenhetsbaserade utvecklingskort baserade på Microchips SAMD21-mikrostyrenheter samt andra utvecklingskort baserade på Nordic Semiconductors BLE-aktiverade nRF-mikrostyrenheter.
Ytterligare resurser
- Maker.io-bloggen – Python
- Maker.io-bloggen – Use MicroPython in Microcontrollers (Använda MicroPython i mikrostyrenheter)
- Maker.io-projekt – Portera ett Arduino-bibliotek till CircuitPython – Vl6180X-avståndssensor
- Maker.io-projekt – Circuit Playground Firmata
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.




