ESP32 Breakout über den UART des Raspberry Pi 3 flashen

Die Esp-32 Chips gibts als Devboards mit USB-Schnittstelle und integriertem USB/Serial-Wandler oder als „Buttoned Breakout Boards“ ohne zusätzliche Beschaltung.

Nur was macht man ohne einen extra 3.3-Volt RS232-Wandler? Man benutzt seinen Raspberry Pi.

Verkabelt wird wie folgt:

Raspberry Pi ESP-32
Tx Rx
Rx Tx
Ground Gnd
3.3V 3.3V

Mein Programm kompiliere ich auf meinem großen PC, den Raspberry benutze ich nur zum Programmieren, denn es ist ziemlich kompliziert, die ESP32-Toolchain auf dem Raspberry Pi zu installieren.

Also auf dem PC erstmal ein ESP-32 Programm erstellen und kompilieren. Ich nehme statt Arduino lieber platformio, weil.

cd ~
mkdir esp32
cd esp32
virtualenv --python=python2.7 venv_platformio
. ./esp32/venv_platformio/bin/activate
pip install platformio
mkdir wifitest
cd wifitest
platformio init

Nun die Datei ~/esp32/wifitest/platformio.ini so ergänzen:

[platformio]
env_default = esp32


[env:esp32]
platform = espressif32
framework = espidf
monitor_baud = 115200
board = lolin32
board_flash_mode = dio

Das ausgewählte Board ist egal.

Eine Datei ~/esp32/wifitest/src/main.c nach dem offiziellen Template anlegen:

#include "freertos/FreeRTOS.h"
#include "esp_wifi.h"
#include "esp_system.h"
#include "esp_event.h"
#include "esp_event_loop.h"
#include "nvs_flash.h"
#include "driver/gpio.h"

esp_err_t event_handler(void *ctx, system_event_t *event)
{
    return ESP_OK;
}

void app_main(void)
{
    nvs_flash_init();
    tcpip_adapter_init();
    ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) );
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK( esp_wifi_init(&cfg) );
    ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) );
    ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );
    wifi_config_t sta_config = {
        .sta = {
            .ssid = "SSID",
            .password = "passwrd",
            .bssid_set = false
        }
    };
    ESP_ERROR_CHECK( esp_wifi_set_config(WIFI_IF_STA, &sta_config) );
    ESP_ERROR_CHECK( esp_wifi_start() );
    ESP_ERROR_CHECK( esp_wifi_connect() );

    gpio_set_direction(GPIO_NUM_4, GPIO_MODE_OUTPUT);
    int level = 0;
    while (true) {
        gpio_set_level(GPIO_NUM_4, level);
        level = !level;
        vTaskDelay(300 / portTICK_PERIOD_MS);
    }
}

mit

platformio run

kompilieren. Bei allen platformio Befehlen darauf achten, dass das virtual environment aktiviert ist, in das platformio hinein installiert wurde. Aktivieren mit . ./esp32/venv_platformio/bin/activate, deaktivieren mit deactivate.

Auf dem Raspberry Pi muss das esp-idf Toolkit installiert werden, denn darin befindet sich das Tool zum Flashen.

# Raspberry
sudo apt-get install git python python-serial
cd ~
mkdir esp32
cd esp32
git clone --recursive https://github.com/espressif/esp-idf.git

Außerdem muss der Serielle Port freigegeben werden, der ist derzeit noch als Login-Shell unter Benutzung.

sudo raspi-config
# -> Interfacing-Options
#   -> Serial
#     -> Would you like a login shell to be accessible over serial? -> No
#     -> Would you like the serial port hardware to be enabled? -> Yes
# -> Finish
#   -> Reboot now

Seit dem Raspberry Version 3 liegt die Serielle Schnittstelle nicht mehr unter /dev/ttyAMA0 sondern unter /dev/ttyS0. AMA0 ist stattdessen die serielle Schnittstelle der Bluetoothfunktionalität.

Dann legen wir auf dem Raspberry Pi ein Script an, dass sich die Dateien vom großen PC holt und auf den ESP-32 flasht: ~/esp32/get_and_flash.

#!/bin/bash

REMOTEBUILDDIR=daniel@yak.local:esp32/wifitest/.pioenvs/esp32/

mkdir -p tmp
scp ${REMOTEBUILDDIR}partitions_table.bin tmp
scp ${REMOTEBUILDDIR}firmware.bin tmp
scp ${REMOTEBUILDDIR}bootloader.bin tmp

. ~/esp32/venv_platformio/bin/activate

python2.7 ~/esp32/esp-idf/components/esptool_py/esptool/esptool.py --chip esp32 --port "/dev/ttyS0" --baud 115200 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 tmp/bootloader.bin 0x8000 tmp/partitions_table.bin 0x10000 tmp/firmware.bin

Die Adressen bzw den ganzen Befehl habe ich aus dem Kommando platformio run --target upload -v extrahiert.

Jetzt muss nur noch irgendwie eine OTA-Flash-Möglichkeit her.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.