Command:

     pio run -e node_a -t upload --upload-port /dev/ttyACM0
Here's a sample compile & upload session:

    (rnsenv) jlpoole@jp /usr/local/src/microreticulum/microReticulumTbeam/exercises/00_usb_radio_check $ pio run -e node_a -t upload --upload-port /dev/ttyACM0
    Processing node_a (platform: espressif32; framework: arduino; board: esp32-s3-devkitc-1)
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Verbose mode can be enabled via `-v, --verbose` option
    CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32-s3-devkitc-1.html
    PLATFORM: Espressif 32 (6.12.0) > Espressif ESP32-S3-DevKitC-1-N8 (8 MB QD, No PSRAM)
    HARDWARE: ESP32S3 240MHz, 320KB RAM, 8MB Flash
    DEBUG: Current (esp-builtin) On-board (esp-builtin) External (cmsis-dap, esp-bridge, 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.20017.241212+sha.dcc1105b 
    - tool-esptoolpy @ 2.40900.250804 (4.9.0) 
    - tool-mkfatfs @ 2.0.1 
    - tool-mklittlefs @ 1.203.210628 (2.3) 
    - tool-mkspiffs @ 2.230.0 (2.30) 
    - toolchain-riscv32-esp @ 8.4.0+2021r2-patch5 
    - toolchain-xtensa-esp32s3 @ 8.4.0+2021r2-patch5
    LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
    LDF Modes: Finder ~ chain, Compatibility ~ soft
    Found 34 compatible libraries
    Scanning dependencies...
    Dependency Graph
    |-- RadioLib @ 6.6.0
    |-- SPI @ 2.0.0
    Building in release mode
    Retrieving maximum program size .pio/build/node_a/firmware.elf
    Checking size .pio/build/node_a/firmware.elf
    Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
    RAM:   [=         ]   6.0% (used 19768 bytes from 327680 bytes)
    Flash: [=         ]   8.8% (used 294065 bytes from 3342336 bytes)
    Configuring upload protocol...
    AVAILABLE: cmsis-dap, esp-bridge, esp-builtin, 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...
    Using manually specified: /dev/ttyACM0
    Uploading .pio/build/node_a/firmware.bin
    esptool.py v4.9.0
    Serial port /dev/ttyACM0
    Connecting...
    Chip is ESP32-S3 (QFN56) (revision v0.2)
    Features: WiFi, BLE, Embedded Flash 8MB (GD)
    Crystal is 40MHz
    USB mode: USB-Serial/JTAG
    MAC: 48:ca:43:5a:93:a0
    Uploading stub...
    Running stub...
    Stub running...
    Changing baud rate to 460800
    Changed.
    Configuring flash size...
    Flash will be erased from 0x00000000 to 0x00003fff...
    Flash will be erased from 0x00008000 to 0x00008fff...
    Flash will be erased from 0x0000e000 to 0x0000ffff...
    Flash will be erased from 0x00010000 to 0x00057fff...
    SHA digest in image updated
    Compressed 15104 bytes to 10430...
    Writing at 0x00000000... (100 %)
    Wrote 15104 bytes (10430 compressed) at 0x00000000 in 0.2 seconds (effective 519.1 kbit/s)...
    Hash of data verified.
    Compressed 3072 bytes to 146...
    Writing at 0x00008000... (100 %)
    Wrote 3072 bytes (146 compressed) at 0x00008000 in 0.0 seconds (effective 584.3 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 721.9 kbit/s)...
    Hash of data verified.
    Compressed 294432 bytes to 164378...
    Writing at 0x00010000... (9 %)
    Writing at 0x0001bc31... (18 %)
    Writing at 0x00024a76... (27 %)
    Writing at 0x0002a8b3... (36 %)
    Writing at 0x0002fd85... (45 %)
    Writing at 0x000350b4... (54 %)
    Writing at 0x0003b4b4... (63 %)
    Writing at 0x000455f6... (72 %)
    Writing at 0x0004c5eb... (81 %)
    Writing at 0x00051c54... (90 %)
    Writing at 0x00057b42... (100 %)
    Wrote 294432 bytes (164378 compressed) at 0x00010000 in 1.9 seconds (effective 1241.1 kbit/s)...
    Hash of data verified.

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

    Environment    Status    Duration
    -------------  --------  ------------
    node_a         SUCCESS   00:00:08.731
    ==================================================================================== 1 succeeded in 00:00:08.731 ====================================================================================
    (rnsenv) jlpoole@jp /usr/local/src/microreticulum/microReticulumTbeam/exercises/00_usb_radio_check $

Here's an example of what displays in the console:

Booting LoRa test...

Initializing radio...
Radio chip: SX1262
Frequency: 915.000 MHz
SF: 7 BW: 125 CR: 5
radio.begin returned: 0
alive 0
       Sending test frame...
TX state: 0
Starting receive...
startReceive returned: 0
alive 1
       Sending test frame...
TX state: 0
Starting receive...
startReceive returned: 0
alive 2
