16.8.2021 Platformio

Harry Karvonen, Pispalan IT

Tänään tutustuin TinyGS ohjelman kääntämiseen ja lataamiseen ESP32 mikro-ohjaimelle. Projektin kehittäjät suosittelevat Platformio:n käyttämistä ja päätin tutustua miten tämä toimii. Platformio on Python:lla toteutettu käännösympäristö, joka huolehtii kirjastojen hakemisesta, koodin kääntämisestä ja binäärin lataamisesta mikro-ohjaimelle. Tarkempia tietoja osoitteesta https://docs.platformio.org/en/latest/.

Ennen tähän Platformioon tutustumista yritin esptool.py:tä käyttäen ladata binäärin mutta törmäsin ongelmaan, että ohjelma mitä latasin, ei ollut kokonainen levykuva flash-muistista vaan vain osa. Tämän lisäksi olisin tarvinnut kolme muuta binääripakettia. Totesin että tietoa ei ollut nopeasti saatavilla, niin päätin kunnioittaa kehittäjien ohjetta ja käyttää Platformiota.

Asennus on suoraviivainen ja tein sen pip:llä aikaisemmin pystyttämääni esptool Python-virtuaali-ympäristöön.

$ pip install platformio
# ...
$ platformio --version
PlatformIO Core, version 5.1.1
# tai
$ pio --version
PlatformIO Core, version 5.1.1

Seuraavaksi noudin TinyGS-projektin lähdekoodin Github:sta.

$ git clone https://github.com/G4lile0/tinyGS.git
...
$ cd tinyGS

Varsinainen ohjelman kääntäminen tapahtuu tinyGS-hakemistossa kutsumalla Platformiota. Hakemistossa on platformio.ini-tiedosto, joka määrittää kääntämisen vipuja ja muita tietoja.

$ platformio run

Tässä menee jonkin aikaa, koska Platformio hakee puuttuvat kirjastot ja tämän jälkeen tekee käännöstyön. Tämän vaiheen jälkeen voi tarkastella mitä binääritiedostoja muodostui. Nämä löytyvät .pio/build/heltec_wihi_lora_32-hakemiston alta.

$ ls .pio/build/heltec_wifi_lora_32/
firmware.bin      lib0af  lib330  lib471  lib694  lib9d4  libb17  libec2                 libFrameworkArduinoVariant.a
firmware.elf      lib0cb  lib3d3  lib4b3  lib6e1  liba2a  libd27  libf08                 partitions.bin
FrameworkArduino  lib2d5  lib40f  lib4e7  lib98a  liba5b  libe11  libFrameworkArduino.a  src

Ohjelman lataaminen mikro-ohjaimeen tapahtuu antamalla run-komennolle vipu -t upload. Käyttetty vipu --upload-port on valinnainen ja sitä ei tarvitse antaa, jos koneessa on vain yksi mirko-ohjain kytkettynä.

$ platformio run -t upload --upload-port /dev/ttyACM0 
Processing heltec_wifi_lora_32 (platform: espressif32; board: heltec_wifi_lora_32; framework: arduino)
----------------------------------------------------------------------------------------------------------------------
Tool Manager: Installing platformio/tool-mkspiffs @ ~2.230.0
Tool Manager: tool-mkspiffs @ 2.230.0 has been installed!
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/heltec_wifi_lora_32.html
PLATFORM: Espressif 32 (3.3.1) > Heltec WiFi LoRa 32
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
DEBUG: Current (esp-prog) External (esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES: 
 - framework-arduinoespressif32 3.10006.210326 (1.0.6) 
 - tool-esptoolpy 1.30100.210531 (3.1.0) 
 - tool-mkspiffs 2.230.0 (2.30) 
 - toolchain-xtensa32 2.50200.97 (5.2.0)
Converting tinyGS.ino
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 34 compatible libraries
Scanning dependencies...
Dependency Graph
|-- <ArduinoOTA> 1.0
|   |-- <Update> 1.0
|   |-- <WiFi> 1.0
|   |-- <ESPmDNS> 1.0
|   |   |-- <WiFi> 1.0
|-- <ESPmDNS> 1.0
|   |-- <WiFi> 1.0
|-- <Update> 1.0
|-- <ArduinoJson> 6.17.2
|-- <IotWebConf> 3.0.1
|   |-- <DNSServer> 1.1.0
|   |   |-- <WiFi> 1.0
|   |-- <WebServer> 1.0
|   |   |-- <WiFi> 1.0
|   |   |-- <FS> 1.0
|   |-- <WiFi> 1.0
|   |-- <EEPROM> 1.0.3
|   |-- <ESPmDNS> 1.0
|   |   |-- <WiFi> 1.0
|   |-- <Update> 1.0
|-- <Wire> 1.0.1
|-- <ESP8266 and ESP32 OLED driver for SSD1306 displays> 4.2.0
|   |-- <Wire> 1.0.1
|   |-- <SPI> 1.0
|-- <PubSubClient> 2.8
|-- <WiFi> 1.0
|-- <WiFiClientSecure> 1.0
|   |-- <WiFi> 1.0
|-- <HTTPClient> 1.2
|   |-- <WiFi> 1.0
|   |-- <WiFiClientSecure> 1.0
|   |   |-- <WiFi> 1.0
|-- <HTTPUpdate> 1.3
|   |-- <HTTPClient> 1.2
|   |   |-- <WiFi> 1.0
|   |   |-- <WiFiClientSecure> 1.0
|   |   |   |-- <WiFi> 1.0
|   |-- <Update> 1.0
|   |-- <WiFi> 1.0
|-- <RadioLib> 4.2.0
|   |-- <SPI> 1.0
|-- <ESPNtpClient> 0.2.5
|   |-- <WiFi> 1.0
|   |-- <Ticker> 1.1
Building in release mode
Compiling .pio/build/heltec_wifi_lora_32/src/tinyGS.ino.cpp.o
In file included from tinyGS/src/Radio/Radio.h:27:0,
                 from /home/kayttaja/tinygs/tinyGS/tinyGS/tinyGS.ino:76:
lib/RadioLib/src/RadioLib.h:50:4: warning: #warning "God mode active, I hope it was intentional. Buckle up, lads." [-Wcpp]
   #warning "God mode active, I hope it was intentional. Buckle up, lads."
    ^
Retrieving maximum program size .pio/build/heltec_wifi_lora_32/firmware.elf
Checking size .pio/build/heltec_wifi_lora_32/firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM:   [==        ]  17.0% (used 55672 bytes from 327680 bytes)
Flash: [========= ]  93.8% (used 1229068 bytes from 1310720 bytes)
Configuring upload protocol...
AVAILABLE: esp-prog, espota, esptool, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa
CURRENT: upload_protocol = esptool
Looking for upload port...
Use manually specified: /dev/ttyACM0
Uploading .pio/build/heltec_wifi_lora_32/firmware.bin
esptool.py v3.1
Serial port /dev/ttyACM0
Connecting.....
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 98:cd:ac:f3:d7:3c
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Flash will be erased from 0x00001000 to 0x00005fff...
Flash will be erased from 0x00008000 to 0x00008fff...
Flash will be erased from 0x0000e000 to 0x0000ffff...
Flash will be erased from 0x00010000 to 0x0013cfff...
Compressed 17104 bytes to 11191...
Writing at 0x00001000... (100 %)
Wrote 17104 bytes (11191 compressed) at 0x00001000 in 0.4 seconds (effective 377.7 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 128...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (128 compressed) at 0x00008000 in 0.0 seconds (effective 568.0 kbit/s)...
Hash of data verified.
Compressed 8192 bytes to 47...
Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.1 seconds (effective 740.1 kbit/s)...
Hash of data verified.
Compressed 1229168 bytes to 697353...
Writing at 0x00010000... (2 %)
...
Writing at 0x0013856e... (100 %)
Wrote 1229168 bytes (697353 compressed) at 0x00010000 in 11.2 seconds (effective 881.4 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
============================================ [SUCCESS] Took 22.94 seconds ============================================

Latauksen valmistuttua saadaan mikro-ohjaimen näytölle eloa. Seuraan lisää ohjeita ja saan yhteyden mikro-ohjaimeen WLAN-yhteydellä. Teen alustavat asetukset. Vielä puuttuu MQTT-palvelimen käyttäjätunnus ja salasana. Siksi kommentoin mqtt.loop() pois loop():sta. MQTT-tunnusten luominen on nopeaa ja helppoa. Ei vaadi ihmiskontatkia vaan onnistuu TinyGS Personal Bot:n avulla Telegrammia käyttäen.

Flashasin vielä toisen laitteen ja kokeilin testipaketin lähettämistä paketeissa tulleilla antenneilla ja onnistunut lähetys saatiin aikaiseksi. Seuraavaksi on tarkoitus tutkia antenni vaihtoehtoja.