De basisbeginselen van CircuitPython voor snelle prototypering en ontwikkeling op basis van microcontrollers
Bijgedragen door De Noord-Amerikaanse redacteurs van DigiKey
2019-03-14
Hoewel Python het programmeren toegankelijker heeft gemaakt, was deze taal ontworpen voor gebruik op pc's en andere machines met veel verwerkingsbronnen, geheugen en randapparatuur. Voor embedded-systemen die te maken hebben met striktere beperkingen voor bronnen en interfaces, is een geoptimaliseerde versie voor microcontrollers, MicroPython genaamd, populair geworden. Zo populair dat de open-source community MicroPython heeft aangepast voor specifieke microcontrollers en ontwikkelingsborden om serieuze microcontroller-ontwikkeling te ondersteunen.
In dit artikel wordt zo'n aanpassing geïntroduceerd: CircuitPython van Adafruit. Na een korte bespreking van Python, in vergelijking met de klassieke voor embedded development gebruikte taal C ++, zal worden beschreven hoe Python is geëvolueerd naar MicroPython en nu naar CircuitPython. Vervolgens wordt beschreven hoe software met behulp van CircuitPython wordt geschreven, waarna wordt stilgestaan bij verschillende ontwikkelingsborden van Adafruit en andere leveranciers die de CircuitPython-omgeving ondersteunen.
De reden voor Python
Het originele Arduino ontwikkelingsbord en zijn vele opvolgers waren zeer populaire microcontroller-ontwikkelingsborden voor maker-, hobby- en studentenprojecten, alsmede voor embedded prototypen De Arduino IDE en programmeertaal zijn echter gebaseerd op C ++, een krachtige maar complexe gecompileerde taal met een vreemd uitziende syntaxis en strenge interpunctieregels die een ontmoedigend effect hebben op beginnende programmeurs.
Python is een nieuwere programmeertaal. Het is een geïnterpreteerde, interactieve, object-georiënteerde taal die krachtige programmeerprestaties combineert met een zeer duidelijke syntaxis. Hij staat bekend om zijn schrijfbaarheid en leesbaarheid, maar ook om zijn eenvoudigere syntaxis. Deze kenmerken dragen er samen toe bij het aantal programmeerfouten te verminderen en hergebruik van codes gemakkelijker te maken, waardoor de ontwikkeling van software wordt versneld.
De interpretatieve aard van de taal biedt directe feedback aan programmeurs, die worden aangemoedigd om te experimenteren en de taal zo snel te leren. Om deze redenen is Python momenteel de eerste programmeertaal die vele studenten en makers leren.
Een nadeel is dat Python is ontworpen voor gebruik op pc's en grotere machines met meer dan genoeg RAM, veel massaopslag en een uitgebreide gebruikersinterface met een toetsenbord, een groot scherm en een muis. Python was niet ontworpen om een embedded-programmeertaal te zijn. Maar vervolgens verscheen er een aangepaste versie ten tonele, een slanke, efficiënte implementatie van de Python 3-programmeertaal, MicroPython genaamd, specifiek gemaakt en geoptimaliseerd om binnen de beperkte resources van een microcontroller te werken.
De open-source community begreep het potentieel van MicroPython voor embedded programmering en heeft de programmeertaal aangepast voor specifieke microcontrollers en ontwikkelingsborden, om serieuze microcontroller-ontwikkeling te ondersteunen. Adafruit heeft bijvoorbeeld een eigen variant van MicroPython ontwikkeld, CircuitPython genaamd. Deze programmeertaal, ontworpen om experimenten te vereenvoudigen en te leren programmeren op goedkope microcontrollerborden, is afgestemd op de microcontrollers en de hardware-resources die beschikbaar zijn op de ontwikkelingsborden van Adafruit. CircuitPython is op verschillende ontwikkelingsborden van Adafruit al voorgeïnstalleerd, en kan op andere borden worden geïnstalleerd.
Verschillen tussen C++ en Python
Gezien het momentum en de aanwezigheid van de Arduino IDE en de vele Arduino-ontwikkelingsborden die momenteel beschikbaar zijn, is het niet vreemd om je af te vragen waarom er een versie van Python nodig zou zijn voor embedded development. Een vergelijking tussen de talen geeft hierop antwoord.
C++ is een extensie van de oudere C taal met object-geöriënteerde extensies. Zelfs met deze extensies is de C ++ -code enigszins cryptisch, omdat hij de C-syntaxis, oorspronkelijk gecreëerd door Kernigan en Ritchie in Bell Labs, eind jaren zestig en begin jaren zeventig, behoudt. C was speciaal ontworpen om gemakkelijk in machine-instructies voor een targetprocessor in kaart te worden gebracht. Deze tendens om eerder naar de behoeften van de machine te kijken dan naar die van de programmeur komt duidelijk naar voren in de syntaxis van de taal. Aangezien commerciële microprocessors pas in 1971 verschenen, was C oorspronkelijk ontwikkeld voor minicomputers. C-compilers voor microprocessors zijn in de jaren tachtig geleidelijk uitgegroeid tot nuttige hulpmiddelen. C is altijd een gecompileerde taal geweest, net als C++.
De Deense computerwetenschapper Bjarne Stroustrup begon in 1979 met de ontwikkeling van C ++. Zijn eerste tekstboek over de taal verscheen in 1985. C++ werd pas in 1998 een standaard programmeertaal. Net als C was de C++ taal van Stroustrup oorspronkelijk gericht op grotere computers. De Arduino IDE (integrated development environment), ontwikkeld in 2003, maakt C++ bruikbaar voor microcontrollers.
Python is ook een object-georiënteerde taal. Hij werd ontwikkeld door de Nederlandse programmeur Guido van Rossum en in 1991 voor het eerst uitgebracht. Het syntactische ontwerp van Python legt de nadruk op de leesbaarheid van codes —voor mensen—en dit is een fundamenteel verschil tussen Python en C++. Schrijfbaarheid, nauw verbonden met leesbaarheid, is een ander kenmerk in het voordeel van Python. Schrijfbaarheid betekent dat over het algemeen wordt gevonden dat Python dat programmeurs sneller toepassingen laat schrijven, waardoor experimenteren wordt bevorderd en prototyperings- en ontwikkelingscycli kunnen worden verkort.
Een belangrijk ander verschil is dat Python een geïnterpreteerde taal is, net zoals de Basic programmeertaal die in de jaren zestig voor het eerst verscheen voor minicomputers en die in de jaren zeventig tot echte bloei kwam met de introductie van microcomputers. Net als bij Basic moedigt de interpretatieve aard van Python experimenten aan en bevordert zo het leerproces, ook al omdat wordt afgezien van de vele stappen (bewerken/compileren/downloaden/uitvoeren) van de ontwikkelingscyclus die wordt gebruikt voor gecompileerde programmeertalen. Anders dan Basic is Python echter een moderne, hoogwaardigere, object-geöriënteerde taal die een halve eeuw aan stappen vooruit in de computerwetenschap, gezet sinds Basic voor het eerst werd ontwikkeld, omvat.
De variabelen van Python hoeven bijvoorbeeld niet voor gebruik te worden aangegeven of getypt. Programmeurs hoeven zich geen zorgen te maken of een variabele een geheel getal of een getal met drijvende komma moet zijn. De Python-interpreter zoekt het allemaal uit en maakt de juiste keuzes tijdens runtime.
Twee andere verschillen tussen C++ en Python zijn stringverwerking en interpunctie. Veel programmeurs vinden dat stringverwerking in C ++ onhandig en verwarrend is. De stringverwerking van Python is veel eenvoudiger en doet sterk denken aan de eenvoudige en populaire string-verwerkingscapaciteiten van Basic, iets wat lang werd beschouwd als een sterk punt van Basic.
Ook vormt de interpunctie in C en C++ —met name accolades ({})—een frequent struikelblok voor nieuwe en zelfs ervaren programmeurs. Het lijkt alsof er altijd een oneven aantal accolades in een programma zit, wat betekent dat de programmeur in de code moet graven om uit te vinden waar de ontbrekende accolade moet komen. Python is niet zo kieskeurig voor wat de interpunctie betreft, maar gebruikt wel inspringingen, wat de reden is voor de goede leesbaarheid van de Python-code.
De herkomst van MicroPython
Net als C en C++ werd Python aanvankelijk ontworpen om op grotere computers te draaien. Hierdoor vereiste de taal teveel resources om voor het programmeren van microcontrollers te kunnen worden gebruikt. De Australisch programmeur en natuurkundige Damien George ontwikkelde daarom een versie van Python, MicroPython genaamd, die op de meer beperkte resources van een microcontroller kon draaien. Arduino-ontwikkelingsborden waren onder de eerste hardware targets voor MicroPython.
De interactieve aard van MicroPython is gecentreerd op de bedieningsinterface, formeel REPL (read-eval-print-loop)-venster genaamd, die gewoonlijk werkt via een seriële aansluiting die een host-pc met een microcontroller-ontwikkelingsbord verbindt. De REPL-interface vertoont sterke gelijkenis met de Basic commandoregel-interfaces uit de jaren zeventig en tachtig. De interface accepteert gebruikersinvoer (enkele uitdrukkingen of instructies), evalueert deze en geeft vervolgens resultaten terug aan de gebruiker via het REPL-venster of voert de opdracht uit die in de instructie is ingesloten.
Met behulp van de REPL-interface is het mogelijk om een variabele te ondervragen, een I/O-lijn om te schakelen of een tekenstring naar een aangesloten randapparaat te sturen. De regel wordt geïnterpreteerd en onmiddellijk uitgevoerd zodra er op de enter-toets wordt gedrukt. Dat is de aard van een geïnterpreteerde taal.
Deze eigenschap van MicroPython vergemakkelijkt verkennend programmeren en debuggen en is één van de aspecten van MicroPython die de taal voor zowel beginners als ervaren programmeurs eenvoudig te gebruiken maken. De REPL-gebruikersinterface ondersteunt snellere ontwikkelingscycli vergeleken met de klassieke bewerk-compileer-run-debug cyclus van Arduino IDE. Zelfs ervaren programmeurs doen hun voordeel met de mogelijkheid om met behulp van de REPL-gebruikersinterface van MicroPython interactief kunnen experimenteren met nieuwe randapparatuurtypes.
CircuitPython ondersteuning voor ontwikkelingsborden
Elke microcontroller heeft een unieke set van randapparatuur en elk ontwikkelingsbord wordt aan die lijst toegevoegd. Deze randapparaten vereisen ondersteunende bibliotheken. Dit geldt zowel voor Arduino IDE als voor MicroPython. Bovendien bestaan er veel add-on randapparaten, zoals de 1655 NeoPixel adresseerbare RGB LED van Adafruit, die ook bibliotheekondersteuning vereisen.
Om een hoger niveau van ondersteuning te kunnen bieden, heeft Adafruit zijn eigen versie van MicroPython ontwikkeld, CircuitPython genaamd, om aan de specifieke vereisten van verschillende van de goedkope microcontroller-ontwikkelingsborden van het bedrijf te voldoen. Het bedrijf heeft ook veel perifere bibliotheken van zijn immense Arduino-verzameling omgebouwd tot CircuitPython-bibliotheken, en biedt zo al een groot en steeds groeiend aantal perifere ondersteuningsbibliotheken voor CircuitPython.
Adafruit heeft speciaal om CircuitPython te ondersteunen een lijn van microcontroller-ontwikkelingsborden ontworpen. Dit zijn:
- 3333 Circuit Playground Express met tien adresseerbare, regelbare RGB-leds (Afbeelding 1)

Afbeelding 1: 3333 Circuit Playground Express van Adafruit is uitgerust met tien adresseerbare, regelbare RGB-leds. (Bron afbeelding: Adafruit)
- 3500 Trinket M0 ontwikkelingsbord dat slechts 27 mm x 15,3 mm x 2,75 mm meet (Afbeelding 2)

Afbeelding 2: het 3500 Trinket M0 ontwikkelingsbord van Adafruit meet slechts 27 mm x 15,3 mm x 2 mm. (Bron afbeelding: Adafruit)
- 3501 Gemma M0 heeft ongeveer het formaat van een Amerikaanse munt van 25 cent en kan via de USB-poort of een aparte batterijpoort worden gevoed (Afbeelding 3)

Afbeelding 3: de 3501 Gemma M0 van Adafruit heeft ongeveer het formaat van een Amerikaanse munt van 25 cent en kan via de USB-poort of een aparte batterijpoort worden gevoed. (Bron afbeelding: Adafruit)
- 3403 Feather M0 Express is een ontwikkelingsbord dat een kleine breadboard-zone voor aangepaste schakelingen heeft (Afbeelding 4)

Afbeelding 4: het 3403 Feather M0 Express ontwikkelingsbord van Adafruit heeft een kleine breadbord-zone voor aangepaste schakelingen. (Bron afbeelding: Adafruit)
Deze vier microcontroller-ontwikkelingsborden van Adafruit zijn allemaal gebaseerd op de SAMD21 microcontrollers met native USB ondersteuning van Microchip Technology(voorheen Atmel). CircuitPython ondersteunt echter meer dan de ontwikkelingsborden van Adafruit en de SAMD21 microcontroller. Er beginnen ook versies van CircuitPython voor andere ontwikkelingsborden met andere microcontrollers te verschijnen, waaronder de ontwikkelingsborden 3406 Feather NRF52 van Adafruit en nRF52-DK van Nordic Semiconductor, beiden gebaseerd op de nRF52832 microcontroller van Nordic Semiconductor. Daarnaast wordt ook het nRF52840-DK ontwikkelingsbord van Nordic Semiconductor (Afbeelding 5), gebaseerd op de nRF52840 microcontroller van het bedrijf, door CircuitPython ondersteund. Beide microcontrollers waarop deze drie borden zijn gebaseerd hebben Bluetooth Low Energy (BLE) geïntegreerd op chip, met passende software-ondersteuning.

Afbeelding 5: nRF52840-DK ontwikkelingsbord van Nordic Semiconductor heeft geïntegreerde BLE ondersteuning. (Bron afbeelding: Nordic Semiconductor)
Ontwikkelen met CircuitPython
Adafruit heeft gekozen voor een unieke benadering om CircuitPython op ontwikkelingsborden te plaatsen die zijn ontworpen om de taal direct te ondersteunen. Plug één van deze borden in de USB-poort van een host-pc en het bord verschijnt als een disk drive op de pc. De root directory van deze disk drive toont de voornaamste CircuitPython-bestanden, waaronder de interpreter, het gebruikersprogramma en een map met de bibliotheekbestanden. Deze indeling maakt het gemakkelijk voor de host-pc om toegang te krijgen tot het ontwikkelingsbord met behulp van het bestaande bestandssysteem en de geïnstalleerde stuurprogramma's.
De CircuitPython-gebruikersinterface op de host-pc vereist een gratis, te downloaden open-source editor en REPL-interface. Adafruit raadt een open-source toepassing met de naam Mu aan, zoals te zien op Afbeelding 6. Het Mu-scherm is opgesplitst in een codevenster waar de editing plaatsvindt en het REPL-besturings- en bewakingsvenster waar de programmeur de CircuitPython-interpreter van het ontwikkelingsbord bestuurt.

Afbeelding 6: Adafruit raadt aan een open-source programmeerinterface, Mu genaamd, te gebruiken. Het Mu-scherm is opgesplitst in een codevenster waar de editing plaatsvindt en het REPL-besturings- en bewakingsvenster waar de programmeur de CircuitPython-interpreter van het ontwikkelingsbord bestuurt. (Bron afbeelding: codewith.mu/en/tutorials/1.0/adafruit)
Door een programma in het codevenster te typen en op de “Save”-knop van Mu te drukken, wordt de code opgeslagen naar de CircuitPython ontwikkelingsborden van Adafruit in het grote flash-geheugen op de chip van de SAMD21 microcontroller. Alle CircuitPython-code bevindt zich op het ontwikkelingsbord in het flash-geheugen van de microcontroller. Onthoudt dat het CircuitPython-bord er op de pc uitziet als een disk drive, dit is dus geen onnatuurlijke actie vanuit het perspectief van een besturingssysteem.
Conclusie
De Python-taal biedt programmeurs vele voordelen, waaronder interactieve programmering, en mogelijkheden voor experimenteren en het opsporen van fouten. De taal heeft een vereenvoudig syntaxis die meer gelijkenis vertoont met de menselijke taal, zonder dat variabelen hoeven te worden opgegeven of getypt en zonder ingewikkelde interpunctie. MicroPython is een variatie van Python 3 die het programmeren van microcontrollers in Python mogelijk maakt.
Adafruit heeft een aangepaste variant van MicroPython ontwikkeld, CircuitPython, voor directe hardware-ondersteuning met als doel het experimenteer- en leerproces nog verder te vereenvoudigen en software-ontwikkeling te versnellen. CircuitPython ondersteunt reeds diverse goedkope microcontroller-ontwikkelingsborden die zijn gebaseerd op de SAMD21-microcontrollers van Microchip, alsmede ontwikkelingsborden die gebaseerd zijn op de nRF microcontrollers met BLE van Nordic Semiconductor.
Aanvullend documentatiemateriaal
- Maker.io blog - Python
- Maker.io blog – MicroPython gebruiken in microcontrollers
- Maker.io Project - Overdracht van een Arduino bibliotheek naar CircuitPython - VL6180X afstandsensor
- Maker.io Project – 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.




