{
"$type": "site.standard.document",
"canonicalUrl": "https://bisse.nl/blog/posts/2022/01-15-project11",
"path": "/posts/2022/01-15-project11",
"publishedAt": "2022-01-15T11:00:00.000Z",
"site": "at://did:plc:t4bzqfd4wo3ukq62opjuvy2u/site.standard.publication/3mpeliratc624",
"tags": [
"esp32"
],
"textContent": "Repost van Tumblr. Sources op github.\n\nIk heb een ESP32 Pico gekocht. Ik heb er nog geen toepassing voor.\nEerst wil ik de verschillende manieren waarop je hem kunt\nprogrammeren uitproberen.\n\n\n\nDe Pico is smal genoeg om op een enkel\nbreadboard te gebruiken. Voor grotere ESP32's heb je twee breadboards\nnaast elkaar nodig.\n\nTests\n\nMet behulp van verschillende platforms maakte ik een demo met deze functies:\n\n Systeeminformatie printen op seriële monitor\n WiFi gebruiken\n NTP gebruiken\n Tijd omzetten van UTC naar lokale tijd\n Tijdzone Europe/Amsterdam: CET-1CEST,M3.5.0/2,M10.5.0/3\n Met tussenpauzes actuele tijd printen op seriële monitor\n MQTT\n Publish tijd van opstarten (lokale tijd)\n Subscribe\n Last will and testament\n Twee LEDs die afwisselend knipperen\n Snelheid instelbaar via MQTT\n Een LED aansturen met PWM\n Helderheid instelbaar via MQTT\n\n1. Arduino IDE\n\nMeer hier.\n\nDe eerste versie demo was snel klaar. Ik heb het programma opgezet\nzoals ik gewend ben met Arduino, met een standaard setup() en loop().\nVoor NTP en MQTT heb ik de library's gebruikt die ik eerder al in\nproject 08 gebruikte.\n\nMaar m'n code voor het omzetten van UTC naar lokale tijd kon ik\nachterwege laten. De library's voor ESP kunnen overweg met tijdzones.\n\n2. Espressif\n\nMeer hier.\n\nESP-IDF is de officiële ontwikkelsoftware voor ESP van Espressif.\nGebruik dit als je alles uit je ESP32 wilt halen. Beheer van het\nproject gebeurt grotendeels via de command line.\n\nToen ik tutorials zocht op Youtube kwam ik al snel het begrip RTOS\ntegen. Espressif maakt gebruik van (een aangepaste vorm van) FreeRTOS.\nHet is de moeite waard je daarin te verdiepen. Voor simpele projecten\nvolstaat de gebruikelijk opzet van Arduino met setup() en loop(),\nmaar voor complexere projecten, waarin je ESP veel processen tegelijk\nmoet aansturen, volstaat dat niet. Dan wil je een RTOS gebruiken, met\nz'n aparte taken, queues, en wat er nog meer bij komt kijken. Het doet\ndenken aan Go met z'n goroutines en channels, dus ik voelde me er direct\nvertrouwd mee.\n\nDe documentatie is goed, op één ding na: er wordt bij functies niet\nvermeld welke headers je moet gebruiken. Dus moet je zoeken in de\nheaderfiles waar een functie is gedeclareerd.\n\nIk bleek geen externe library's nodig te hebben. Alle functionaliteit\ndie ik nodig had wordt door Espressif zelf geboden.\n\n3. Arduino IDE met RTOS\n\nMeer hier.\n\nNa m'n implementatie met Espressif wilde ik kijken of ik dezelfde\nprincipes van RTOS kon toepassen in de Arduino IDE (uiteraard alleen\nvoor ESP). Dat werd demo2. Het bleek goed te doen. Ook hier bleek dat ik\nin plaats van de externe library's voor NTP en MQTT gewoon Espressif\nzelf kon gebruiken.\n\nIn Arduino IDE gebruik je niet de standaard library's van Espressif, maar\nde library's die door Espressif voor de Arduino IDE zijn ontwikkeld.\nIk weet niet in hoeverre dit dezelfde functionaliteit biedt als de\nstandaardversie van Espressif. Je hebt niet de mogelijkheid om alle\nparameters voor het compileerproces te tunen. Misschien is dit een\nvoordeel.\n\nEn je hoeft je minder zorgen te maken om het gebruik van headers. Dat\ngaat voor een groot deel vanzelf.\n\n4. MicroPython\n\nMeer hier.\n\nDit werkt makkelijk. Als je MicroPython eenmaal hebt geïnstalleerd op\nje ESP32 kun je met rshell de REPL starten of bestanden van en naar\nje ESP kopiëren.\n\nMaar het is en blijft Python. Ik ben geen fan. Dat gedoe met spaties\nleidt onherroepelijk tot problemen bij grotere projecten.\n\nVerder is de functionaliteit beperkt. Tijdzones kent MicroPython niet.\nVoor MQTT moest ik een externe implementatie gebruiken. In MicroPython\nis wel ondersteuning voor de protocollen die gebruikt worden in\nmicrocontrollers, zoals I²C, SPI, UART, etc, maar daarmee kun je nog\nniet elke sensor of display dat gebruik maakt van die protocollen\nbesturen. Je moet een implementatie hebben voor dat specifieke\napparaat, ergens een library downloaden, of zelf schrijven. \n\nHetzelfde geldt natuurlijk voor Arduino, maar voor Arduino zijn al\nheel veel library's geschreven. Met MicroPython weet ik dat zo niet.\n\n5. NodeMCU\n\nMeer hier.\n\nDit is beter dan MicroPython. Hetzelfde idee, maar met Lua als\nprogrammeertaal in plaats van Python. Dat is natuurlijk een groot\nvoordeel.\n\nAlle functionaliteit die ik voor dit project nodig had is aanwezig in\nNodeMCU. Inclusief NTP, lokale tijd via tijdzones, en MQTT.\n\nEr is niet één kernel van NodeMCU voor je ESP. Je compileert er zelf\neen nadat je hebt besloten welke modules je wilt gebruiken. Daardoor\nkan NodeMCU veel modules aanbieden, terwijl de uiteindelijke kernel\nniet groter wordt dan nodig. Een groot voordeel op een apparaat waar\nhet geheugen zeer beperkt is.\n\n6. Lua RTOS\n\nMeer hier.\n\nEen andere variant van Lua voor de ESP. Het gebruik is net iets\nsimpeler dan met NodeMCU, maar dat komt doordat er maar één kernel is.\nEn omdat alles wat Lua RTOS te bieden heeft in die ene kernel moet is\ner uiteraard een kleiner aanbod van modules. \n\nLua RTOS ondersteunt geen tijdzones, dus hiervoor moest ik weer m'n\neigen code bakken.\n\nMQTT ondersteunt geen last will and testament.\n\n7. Mongoose OS\n\nMeer hier.\n\nMongoose OS is een ramp. Ergens had ik gelezen dat dit het ideale OS voor\nde ESP32 zou moeten zijn. Niet dus. Je kunt programmaatjes schrijven\nin iets wat lijkt op JavaScript, maar waarin je niet eens twee strings\nmet elkaar kunt vergelijken. Het is me niet gelukt mijn demo in\nMongoose te implementeren.\n\nBovendien is er geen REPL, dus de helft van motivatie om een\ngeïnterpreteerde taal te gebruiken ontbreekt.\n\nJe kunt in Mongoose OS ook in C programmeren, maar waarom zou je?\nDan heb je geen REPL en geen snelle uploads van scripts.\n\n8. Zephyr\n\nWat is Zephyr? The Zephyr® Project\nstrives to deliver the best-in-class RTOS for connected\nresource-constrained devices, built to be secure and safe. Het is\nvooral een ton aan software die je moet downloaden, waarbij weinig\ngaat zoals de handleiding veronderstelt, voordat je in staat bent om\nhet simpelste programmaatje te compileren (een blink-programma), dat\ndan ook nog niet lukt. Een hello world, dat kreeg ik wel aan de\npraat.\n\nUiteindelijk komt het neer op het schrijven van een programma in C,\nwaarna je een build doet, en dan alles naar je apparaat moet flashen.\nNet als Arduino IDE en Espressif, maar dan veel ingewikkelder.\n\nWat is het doel? Standaardisatie? Iets dat op alle IoT-apparaten zou\nmoeten draaien? Dat lijkt mij een illusie. Met microcontrollers en zo\nwil je geen ballast. \n\n9. CircuitPython\n\nIk had het vage idee dat CircuitPython beter (verder) ontwikkeld zou\nzijn dan MicroPython (de eerste is immers niet voor niets een vork van\nde laatste), dus wilde ik kijken wat CircuitPython te bieden heeft.\n\nCircuitPython wordt niet ondersteund voor de ESP32. Wel voor de\nESP32-S2. Zou ik een kernel voor de ESP32-S2 op de ESP32 kunnen laten\ndraaien? Mij is het niet gelukt. Bij mijn pogingen om het voor elkaar\nte krijgen raakte ik verstrikt in de documentatie, die extreem slecht\ngeorganiseerd en verwarrend is. \n\nIk denk niet dat als ik eenmaal een board heb die wel door\nCircuitPython wordt ondersteund, om dan alsnog CircuitPython te\ngebruiken.\n\nHet is en blijft toch Python.\n\nConclusies\n\nWelk platform kun je nu het best gebruiken voor het programmeren van\nde ESP32? Wat mij betreft blijven er twee duidelijke favorieten over.\n\nArduino IDE\n\nVoor kleine of grote eindtoepassing gebruik je de Arduino IDE.\n\nJe kunt\nje programma's op twee manieren vorm geven. De traditionele\nArduino-manier, met z'n setup en loop. Dit is alleen geschikt voor\nsimpele dingen, maar je kunt het wel makkelijker exporteren naar\nandere apparaten.\n\nOf je gebruikt de FreeRTOS in Espressif, wat simpele\ndingen een klein beetje complexer maakt (hoewel dat meevalt), en\ngrotere projecten een stuk handelbaarder. Je programma exporteren naar\neen ander soort board wordt dan wel ingewikkeld.\n\nHet nadeel van het werken met de Arduino IDE (of direct met Espressif) is dat je voor\nelke verandering in de code die je wilt testen het complete programma\nmoet compileren en flashen naar je apparaat. Dat is tijdrovend. En het\nis niet goed voor je apparaat om heel vaak een groot deel van het\nflashgeheugen te overschrijven.\n\nNodeMCU\n\nVoor graduele ontwikkeling, dingen testen, met kleine stukjes scripts\nwerken, direct commando's naar je board sturen, voor dit alles is een\nscripttaal en een REPL ideaal, en wat mij betreft is NodeMCU de\nduidelijke winnaar.\n\nBehalve de snellere ontwikkeling met NodeMCU (in vergelijking met\nArduino IDE) levert dit programmacode op die een stuk compacter en\nleesbaarder is dan de C++-code voor Arduino. Als je een complete\ntoepassing voor NodeMCU hebt geschreven, en het werkt prima, en\nsnelheid is niet echt een issue, dan kun je besluiten geen C++-versie\nte maken, maar gewoon de Lua-versie te blijven gebruiken.\n\nHet is ook veel sneller om een Lua-programma te vervangen dan een\nC++-programma te moeten compileren en flashen.\n\nVervolg\n\nMijn testtoepassing is erg simpel.\n\nVolstaat voor optimaal programmeren van de ESP32 de Arduino IDE, of\nheb je voor sommige dingen toch de ontwikkelomgeving van Espressif nodig?\n\nLua kent coroutines. Hoe gebruik je die effectief in NodeMCU?\n\nWordt NodeMCU actief doorontwikkeld? Hoe zit het met ondersteuning\nvoor verschillende soorten displays en sensors en zo in NodeMCU? \n\nDat laatste is iets wat ik in de toekomst wil testen.",
"title": "Project 11 — ESP32: vergelijking van platforms"
}