Espruino firmware @ ESP8266 flashen

Door Thijsmans op maandag 4 maart 2019 20:00 - Reacties (8)
Categorie: -, Views: 2.032

In mijn vorige blog (DIY domotica multisensor < €15: ™sense) liet ik een stukje code zien dat draait op een WeMos D1 mini microprocessor (uit de ESP8266-reeks). Die code is geschreven in Javascript en draait op de Espruino-firmware. Omdat ik in een aantal volgende blogs verder zal gaan met Espruino, sta ik deze keer kort stil bij mijn keuze voor Espruino en leg ik uit hoe je de firmware zelf op een ESP8266 flasht.

Leuk om te weten: in 2013 begon Espruino als kickstarter. Gordon Williams, de drijvende kracht achter Espruino, zorgt niet alleen voor de ontwikkeling van de firmware, maar verkoopt ook kant en klare bordjes met en zonder wifi - goed te weten als de onderstaande flash-guide te moeilijk blijkt :) De bordjes kosten wat, maar dragen bij aan de ontwikkeling van de firmware. Flash je de firmware op je eigen bordje, overweeg dan een donatie ter grootte van een biertje in de kroeg, als je een leuk project in gebruik neemt.

Espruino logo

WAAROM ESPRUINO?

Laat ik vooropstellen dat het navolgende mijn voorkeur betreft, en geen Arduino-bashen is. Arduino doet ook een hoop goed en doet sommige dingen zelfs beter dan Espruino. Niet in de laatste plaats is Arduino bijvoorbeeld gewoon sneller: Espruino is immers een javascript-interpreter waar een stukje script doorheen wordt gestampt. Dat is een extra schakel in de keten, en als timing cruciaal is, is Espruino niet het meest geschikte platform. Dat gezegd hebbende, gaat mijn voorkeur toch uit naar Espruino, en wel om het volgende.

1. Achtergrond / kennis

Ik schrijf al jaren javascript (zij het voor gebruik op websites) dus met de syntaxis ben ik bekend. Dat kan ik bepaald niet zeggen van C++ van Arduino. De twee overlappen weliswaar voor een wezenlijk deel (zogenaamde control structures als for, if/else, switch/case, while etc., en het methode-denken komen in beide terug), maar juist de exacte syntaxis verschilt en dat zorgt voortdurend voor syntax errors. Maar ook voor wie deze persoonlijke achtergrond niet heeft, zijn er goede redenen te beginnen met Espruino.

2. Gemakkelijk te lezen, begrijpen en schrijven

Het tweede punt is dat javascript - naar mijn bescheiden mening - voor beginners gemakkelijker te begrijpen is. Dat komt grotendeels doordat bij C++/Arduino alle code wordt aangeroepen vanuit de loop()-methode. De processor doorloopt de loop()-methode, en is 'ie klaar, dan begint ie weer opnieuw. Espruino loopt wel van boven naar beneden alle regels code langs, maar doet dat slechts één keer. Wil je dat een taak repeterend (of uitgesteld) wordt uitgevoerd, dan gebruik je daarvoor een interval of timeout. Dat oogt gewoon wat intuitiever:

Een voorbeeld van een Arduino:

C:
1
2
3
4
5
6
7
8
9
10
void mijn_methode () {
  if (millis() > last_time_called+1000) {
    last_time_called = millis();
    // doe iets
  }
}

void loop () {
  mijn_methode();
}


Hetzelfde in Espruino:

JavaScript:
1
2
3
setInterval(function() {
  // doe iets
}, 1000);


Disclaimer: Geen zinnig mens zou bovenstaande C++ code in deze vorm gebruiken; dan zou je beter een delay() kunnen toepassen. Het gaat om het principe; bedenk er zelf de nodige code omheen.

Of een voorbeeldje van de Espruino-kickstarter, de Blink-sketch (links Espruino, rechts Arduino):

https://ksr-ugc.imgix.net/assets/000/814/294/8636dbaa206b52b969b52a53ba2f0de6_original.png?ixlib=rb-1.1.0&w=680&fit=max&v=1375977009&auto=format&gif-q=50&lossless=true&s=e70ea5f1986eb266aeeb31322c9e6063

3. Modules (libraries)

Goed, als er een platform is dat heul veul libraries kent, dan is dat Arduino. Maar ook Espruino heeft een flinke lijst modules zodat je met veel componenten direct aan de slag kunt. Deze hoef je, anders dan bij Arduino, niet eerst te downloaden. Bij het uploaden van je script naar de microprocessor worden de benodigde modules automatisch van internet geplukt en meegezonden.

Voorbeeld: in mijn vorige blog zat een DHT22-sensor (temperatuur en luchtvochtigheid), die met twee regels code de temperatuur en luchtvochtigheid op je scherm laat zien:

JavaScript:
1
2
var dht = require("DHT22").connect( PIN_NR );
dht.read( function (a) { console.log( a ); } );


Laat je liever data zien op een 16x2 LCD-scherm? Ook daarvoor is een module:

JavaScript:
1
2
3
I2C1.setup( {scl: PIN_CLOCK, sda:PIN_DATA} );
var lcd = require("HD44780").connectI2C(I2C1);
lcd.print("Hello World!");


4. Web-IDE

De Arduino-IDE heeft een vrij hoog instapniveau. Dat heeft er ook mee te maken dat de IDE, op het moment dat je je sketch naar je boardje stuurt, de gehele firmware compileert en uploadt. Dat werkt anders bij Espruino. Daarbij plaats je één keer de Espruino-firmware op je microprocessor, en die bevat een javascript-interpreter. Jouw javascript schrijf je in de web-IDE (plugin voor de Chrome-browser), en de web-IDE stuurt alleen jouw stukje javascript naar de processor. Stukje javascript gewijzigd? Bij het opnieuw verzenden van je script wordt alleen het stukje geheugen van de microprocessor overgeschreven waar het javascript is opgeslagen. De firmware zelf blijft ongewijzigd. Lekker snel!

Verder bestaat de web-IDE uit twee schermhelften. Rechts zie je de javascript-editor, en links heb je een live verbinding met de aangesloten microprocessor. Je ziet niet alleen de output van je javascript, maar kunt ook "live" code intypen op de console. Verbinden kan via USB, Bluetooth en wifi (oh yeah: OTA-updates!).

https://lh3.googleusercontent.com/FbdKqEXEYlQ7okfAmqZ5LMCVMBFJHWkskZSRCdWY9vBIzmRCC4kaJA3k_5b4EVk0G1I3KtEW=w640-h400-e365

Al met al is Espruino voor mij het juiste instapniveau gebleken. In de hoop dat je nu enthousiast bent, ga ik in op het flashen van de firmware op een ESP8266.

ESPRUINO FLASHEN OP EEN ESP8266

Voorbereiding
In deze how-to ga ik ervan uit dat je natuurlijk een ESP8266-microprocessor hebt, en die kunt aansluiten op een USB-poort van jouw systeem. Een WeMos D1 mini, of LoLin NodeMCU-bordje, heeft een micro-USB aansluiting die dat heel makkelijk maakt. Daarvoor hoef je alleen de drivers voor de CH340 serieel-naar-usb chip te installeren en de USB-kabel in te pluggen.

Een ESP01 heeft geen USB-aansluiting, dus daarbij gebruik je een USB-adapter (zie hieronder). De adapter draait op dezelfde CH340-chip en driver. Heb je een losse ESP-module, zonder pinnen, zoals een 'kale' ESP12? Dan gebruik je een FTDI (3,3V!! nooit 5V!!), of - zoals ik doe - gebruik je de USB-adapter van de ESP01. Daarvoor dien je wel dupont-kabeltjes aan de ESP12 te solderen; de pinout vind je hier.

ESP01 met USB-adapter
ESP01 met USB-adapter. Tip van het huis: soldeer een tactile switch tussen GND en GPIO0 om tijdens het booten (in de USB-poort pluggen) de boot-modus te kunnen omschakelen naar de flash-modus.

Vanaf dit punt ga ik ervan uit dat je beschikt over de benodigde hardware (ESP-module + USB-kabel/adapter) en driver. Om zeker te weten dat dit het geval is, open je het Windows Apparaatbeheer, en plug je jouw module of USB-adapter in een USB-poort. Er zou nu onder "Poorten (COM & LPT)" een melding moeten komen van een USB-Serial CH340-apparaat. Noteer meteen even het nummer van de COM-poort dat daaraan is toegewezen, dit heb je later nodig. In de onderstaande commando's ga ik steeds uit van mijn eigen COM-poort, COM13. Vervang in elk van de commando's hieronder, steeds "COM13" voor jouw poortnummer.

Vanaf hier voeren we zes stappen uit:
  1. Python (voor Windows) installeren;
  2. ESPtool.py installeren;
  3. Espruino-firmware downloaden;
  4. de firmware flashen met ESPtool.py;
  5. de web-IDE downloaden;
  6. Web-IDE starten en verbinden.
1. Python voor Windows installeren

Eerst moeten we Python installeren, omdat esptool (de firmware-flash-tool) is geschreven in Python. Python draait niet als service op de achtergrond, dus de installatie ervan zou geen impact moeten hebben op de performance van je PC. Desalniettemin gebruik ik zelf voor het flashen een oude laptop.

De meest recente versie van Python (nu: 3.7.2) kun je downloaden @ python.org/downloads/windows/. Klik onder het kopje 'Stable Releases' op de toepasselijke Windows Executable Installer om deze te downloaden.

Bij stap 1 van de installatie-wizard heb ik aangevinkt "Add Python 3.7 to PATH". Zo kun je later vanaf de command-line direct python-scripts uitvoeren, zonder dat je het volledige pad hoeft in te typen (dus: "esptool.py" in plaats van "C:/map/submap/locatie/esptool.py"). De rest van de wizard spreekt voor zich.

Heb je ervoor gekozen om Python toe te voegen aan je Windows-PATH? Vergeet dan niet een eventueel openstaand commando-prompt te sluiten en opnieuw te openen. Soms is het nodig het systeem te herstarten voordat PATH wordt geupdate.

Als je nu in een commando-prompt het commando "python" (of: "py") uitvoert, zou je moeten zien:

C:\Users\Thijsmans> python
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit
(AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

Sluit python af met [CTRL-Z] gevolgd door [ENTER]

2. esptool.py installeren

Zoals uit de naam volgt, is esptool.py een Python-based tooltje om met ESP8266 (en ESP32's) te communiceren. Python-based, dus ook te installeren met de package-manager van Python, pip. Pip is meegekomen bij de installatie van Python. Deze stap is dus eenvoudig. Open een commando-prompt, en voer het volgende commando uit:

C:\Users\Thijsmans> pip install esptool

Alle dependencies worden automatisch opgehaald, en het commando eindigt met:

Successfully installed ecdsa-0.13 esptool-2.6 pyaes-1.6.1 pyserial-3.4


3. Espruino downloaden

De laatste Espruino-firmware voor ESP's vind je altijd op https://www.espruino.com/binaries/travis/master/. Deze wordt dagelijks geupdate. Voor de ESP8266 zijn twee varianten beschikbaar: een voor modules met een flash-size van 1 MB, en een voor die met een flash-size van 4 MB. De eerste gebruik je voor een ESP01, vrijwel alle andere ESP's gebruiken de 4 MB-variant. Wil je zeker weten welke je moet hebben, sluit dan je ESP8266 aan via USB en voer het volgende commando uit:

C:\Users\Thijsmans> esptool.py --port COM13 flash_id

In de output zie je dan de detected flash size. Let op: krijg je de melding "Failed to connect" en weet je zeker dat het poortnummer klopt? Dan is je ESP niet in de flash-modus opgestart. Heeft je bordje een FLASH-knop, gebruik deze, en anders sluit je GPIO0 en GND kort tijdens het booten (ergo: inpluggen in de USB-poort). Esptool.py reset aan het einde van elk commando de ESP. Houd je GPIO0 en GND niet hardwarematig kortgesloten, dan staat je ESP dus niet langer in flash-modus. Dan even uittrekken, kortsluiten en opnieuw inpluggen.

Download het tgz-bestand "espruino_[versie]_esp8266.tgz" (= 1MB) of "espruino_[versie]_esp8266_4mb.tgz" en pak deze uit, bijvoorbeeld in C:\Users\JouwUser\espruino.

4. Flash-commando uitvoeren

Voordat we de nieuwe firmware gaan flashen, zorgen we ervoor dat de oude firmware (wat dat ook is) wordt gewist. Voer daartoe het volgende commando uit:

C:\Users\Thijsmans\espruino> esptool.py --port COM13 erase_flash

Voer daarna het volgende commando uit (laat de ^ staan, dit betekent dat het commando doorgaat op een nieuwe regel):

C:\Users\Thijsmans\espruino> esptool.py --port COM13 --baud 460800 write_flash ^
  --flash_freq 80m --flash_mode qio --flash_size 4MB-c1 ^
  0x0000 "boot_v1.6.bin" 0x1000 espruino_esp8266_user1.bin ^
  0x3FC000  esp_init_data_default.bin 0x3FE000 blank.bin

In een seconde of 10 wordt nu de firmware naar jouw ESP-module geschreven :) Let op: gebruik je een ESP01? Check dan de instructies in README_flash.txt, want daarvoor geldt dat de bin-bestanden naar afwijkende geheugenadressen moeten worden geschreven.

5. Web-IDE downloaden

Open je Chrome-browser en surf naar de Chrome web store espruino-pagina. Installeer de extensie.

6. Web-IDE starten en verbinden

Als je de web-IDE opstart, zie je het volgende scherm:

Espruino Web IDE

Sluit je ESP-module aan op de USB-poort. Als je nu op de oranje knop linksboven klikt, opent het verbindingenmenu. Als alles goed is geinstalleerd, verschijnt de COM-poort waar jouw module aan hangt, automatisch in het menu. Als je erop klikt, verschijnt in beeld:

Found ESP8266_4MB, 2v01.58
Connected to COM13

Gefeliciteerd! Je bent nu via Espruino verbonden met jouw ESP-module!

De web-IDE spreekt verder voor zich. De linker helft van het scherm is een prompt (de console), de rechter helft een code-editor. In de balk daar tussenin zie je een knopje "Send to Espruino" (de CPU met het pijltje erin). Als je daarop klikt, wordt de inhoud van de code-editor geupload naar de ESP-module en daar opgeslagen.

Wil je kunnen scripten zonder dat de module op de USB-poort is aangesloten? Dan stellen we de module zo in dat hij automatisch met de wifi verbindt, en voegen we het IP-adres toe aan het verbindingenmenu van de web-IDE. Kopieeer en plak daartoe allereerst het volgende stukje script in de editor. Pas de SSID en het wachtwoord van jouw wifi aan en upload de code met de "Send to Espruino" knop:


JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
  var wifi = require("Wifi");
  wifi.connect('ssid', 
    {password:'passwd'}, 
    function (e) { 
      console.log( e ? 
        'Fout bij verbinden: '+e : 
        'Verbonden met wifi @ '+ wifi.getIP().ip 
        ); 
    } );

  wifi.stopAP();
  wifi.save();


Vanaf nu zal de module automatisch verbinden via wifi, ook als je de module voedt met bijvoorbeeld een telefoonoplader of batterij. In nieuwe scripts die je uploadt, hoef je bovenstaande wifi-code niet meer op te nemen. De methode wifi.save() in bovenstaande code schrijft de wifi-instellingen naar een speciaal daarvoor bedoeld stukje geheugen. Dat wordt niet overschreven bij het uploaden van een nieuw script (slechts bij het opnieuw aanroepen van wifi.save()).

Om de web-IDE te kunnen verbinden met de ESP-module, dien je tot slot het IP-adres van de module toe te voegen aan het verbindingenmenu van de web-IDE. In de console zie je welk IP-adres je module toegewezen heeft gekregen. Klik op het tandwieltje in de blauwe balk (rechts bovenin), en klik op de menu-optie "Communications". In het veld "Connect over TCP Address" voer je het IP-adres van de module in. Sluit het instellingenmenu, en het IP-adres van je ESP-module is vanaf nu terug te vinden in het verbindingenmenu.

Je ESP-module met Espruino-firmware is klaar voor gebruik! Wil je meer lezen, raadpleeg dan de quick-start en de diverse tutorials.

NAWOORD
De bovenstaande stappen heb ik de afgelopen dagen succesvol doorlopen en gedocumenteerd. Mocht er iets wijzigen, of mocht je ergens tegenaan lopen, dan hoor ik het graag in de reacties!

Volgende: DIY domotica multisensor < €15: ™sense 06-02 DIY domotica multisensor < €15: ™sense

Reacties


Door Tweakers user onok, maandag 4 maart 2019 21:23

Bookmark added :)

Door Tweakers user agitri, maandag 4 maart 2019 22:34

Ik wil even mijn respect betuigen voor de genome moeite voor deze post. :)

Ga zo door!

Door Tweakers user Thijsmans, dinsdag 5 maart 2019 15:48

Dank, het is een graag gedane moeite :) Ik verspreid graag het goede woord over Espruino.

Door Tweakers user !GN!T!ON, woensdag 6 maart 2019 12:00

informatieve en goed geschreven post over een interessant onderwerp, chapeau! :)

Door Tweakers user jandirks, woensdag 6 maart 2019 14:16

Ik ben ook een fan van Espruino en heb verschilllende projectjes ermee gedaan: temperatuur meten, schakelen van lampen (bijv. de kerstboomverlichting) en infrarood besturing van de TV. Gedeeltelijk ook in combinatie met Domoticz en/of IFTTT via Google Assistant.

Voor mijn ESP8266 projectjes ben ik nu toch overgestapt naar Arduino. Ik heb toch een aantal keren gehad dat het flashen van Espruino op een NodeMCU niet werkte terwijl Arduino wel werkt.

Over het algemeen gebruik ik nu overigens Tasmota voor schakelen en temperatuur metingen.

Door Tweakers user ArnieNFW, donderdag 7 maart 2019 07:59

Erg leuk te lezen; zelf Arduino fan, maar ik heb genoeg experimenteerspul liggen en na je blog gelezen te hebben kom ik tot de conclusie dat het toch eens de moeite loont het te proberen.
Ik ben wel 'bang' (net als jandirks hierboven beschrijft) dat de veelvoud aan extra randapparatuur die ik heb liggen helaas niet zal werken.
Voor de Arduino is nogal wat hulp te vinden op het web...

Door Tweakers user Thijsmans, donderdag 7 maart 2019 20:06

Wat @jandirks schrijft ziet op het flashen op een ESP8266, jij lijkt het te hebben over componenten?

Wat betreft de ervaring van @jandirks, in het verleden kreeg ik het ook niet altijd voor elkaar. Vaak zat dat in de flash_mode (qio) en flash_size (4MB-c1). Met bovenstaande instructie gaat het bij mij eigenlijk nooit meer fout :) Ik heb trouwens ook geprobeerd een IR-led aan te sturen, met pronto-hex codes. Werkte uiteindelijk niet, maar ik weet niet of ik de juiste codes had...

En als je eens een component tegenkomt waarvoor wel een Arduino-library bestaat, maar geen Espruino-module: erg leerzaam om te porten :) Ik werk nu aan een port voor de si4703 FM-ontvanger. Bitwise operators, 16 x 16-bits registers... Weet er intussen veel meer van dan hiervoor :)

Door Tweakers user jandirks, vrijdag 8 maart 2019 13:56

Interessant @Thijsmans, ik ga die parameters snel een keer proberen. Ik weet uit mijn hoofd niet wat ik precies gebruik, maar het zou kunnen dat de flash-parameter bij mij anders ingesteld staat.


IR was inderdaad lastig werkend te krijgen. Nu ik er nog even over nadenk herinner ik me dat ik volgens mij hier ook Arduino voor gebruikt heb. Precies om dezelfde reden. Excuus!

Reactie formulier
(verplicht)
(verplicht, maar wordt niet getoond)
(optioneel)