ESP32 UARTでechoする

ESP32 UARTでechoする

今回はUARTのサンプル echo を動かしてみます。

この記事は JTAG でデバッグすることを前提にして書いています。
環境構築については こちら をご覧になってください。

投稿時の開発環境を記しておきます。

PC:
Windows10 OS

開発ボード :
ESP32-DevKitCーVE
(Soc : ESP32-D0WD-V3)

デバッガー(H/W):
FT2232D

デバッガー (S/W) :
Visual Studio Code + PlatformIO + ESP-IDF Framework

概要

ブロック図を載せておきます。

デバッガー FT2232D は USBシリアルポートを2つ持っていて、JTAGデバッッグの他にシリアル通信を行うことができます。

これによりMonitorとは別に、PCとESP32間でUARTを使うことができます。

今回は Tera Term で COM n2 の通信ポートを使って ESP32 とつないで echo プログラムを動かしてみます。

PCから送信したものを ESP32で受け取って、それをそのまま返信するという簡単なものです。

プロジェクトをつくる

使っていたプロジェクトを開いていたら、File – Close Folder して閉じておきます。

その後にVSCodeからPlatformIOをOpenします。

以下の内容でプロジェクトを新規に作成します。

Name : ESP32E-UART-echo
Board : Espressif ESP32 Dev Module
Framework : Espressif IoT Development Framework

Name : ESP32E の “E” は Framework (Espressif IoT Development Framework)の頭文字を示しています。

(後から見てわかるように、ESP-IDFを使うことを明示しています)

次にplatformio.ini に以下の3行を追加して、 Ctrl + s で保存しておきます。

COM[4]の4の部分はデバイスマネージャーのポート(COMとLPT)で Silicon Labs CP210x から始まるCOMの番号を記述します。

debug_tool = minimodule
upload_port = COM[4]
monitor_speed = 115200

UARTのAPIリファレンスとサンプル

UARTのAPIは こちら を参照してください。

サンプルプログラムは こちら を参考にしました。

PlatformIOで Eresspsif IoT Development Framework を選択したことにより、以下のローカルフォルダからも参照可能なはずです。

C:\Users\xxxxx\.platformio\packages\framework-espidf\examples\peripherals\uart\uart_echo

(xxxxxは皆さまのユーザー名)

コーディングする

main.c を以下のようにコーディングしてビルドしておきます。
//以降にコメント文をつけてみました。

UARTのAPIについては こちら をご覧ください。

#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/uart.h"
#include "driver/gpio.h"
#include "sdkconfig.h"

// (1)
// UART1の送受信をGPIOの番号で指定する
#define CONFIG_EXAMPLE_UART_TXD 23 // (1)
#define CONFIG_EXAMPLE_UART_RXD 22 // (1)

// (2) UART1の指定
#define CONFIG_EXAMPLE_UART_PORT_NUM 1 // (2)
// (3) 通信速度
#define CONFIG_EXAMPLE_UART_BAUD_RATE 9600 // (3)

// (4) スレッドのスタックサイズ
#define CONFIG_EXAMPLE_TASK_STACK_SIZE 4096 // (4)

#define ECHO_TEST_TXD (CONFIG_EXAMPLE_UART_TXD)
#define ECHO_TEST_RXD (CONFIG_EXAMPLE_UART_RXD)
#define ECHO_TEST_RTS (UART_PIN_NO_CHANGE)
#define ECHO_TEST_CTS (UART_PIN_NO_CHANGE)

#define ECHO_UART_PORT_NUM      (CONFIG_EXAMPLE_UART_PORT_NUM)
#define ECHO_UART_BAUD_RATE     (CONFIG_EXAMPLE_UART_BAUD_RATE)
#define ECHO_TASK_STACK_SIZE    (CONFIG_EXAMPLE_TASK_STACK_SIZE)

#define BUF_SIZE (1024)

static void echo_task(void *arg)
{
// (5) uart_param_config()に渡すパラメーター設定用の構造体
    uart_config_t uart_config = { // (5)
        .baud_rate = ECHO_UART_BAUD_RATE,
        .data_bits = UART_DATA_8_BITS,
        .parity    = UART_PARITY_DISABLE,
        .stop_bits = UART_STOP_BITS_1,
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
        .source_clk = UART_SCLK_APB,
    };
    int intr_alloc_flags = 0;
// (6) この if は通らない。 intr_alloc_flags = 0 としておいて良さそう
#if CONFIG_UART_ISR_IN_IRAM // (6)
    intr_alloc_flags = ESP_INTR_FLAG_IRAM;
#endif

// (7) ドライバーのインストール
    ESP_ERROR_CHECK(uart_driver_install(ECHO_UART_PORT_NUM, BUF_SIZE * 2, 0, 0, NULL, intr_alloc_flags)); // (7)
// (8) パラメーター設定
    ESP_ERROR_CHECK(uart_param_config(ECHO_UART_PORT_NUM, &uart_config)); // (8)
// (9) UART1のピン設定
    ESP_ERROR_CHECK(uart_set_pin(ECHO_UART_PORT_NUM, ECHO_TEST_TXD, ECHO_TEST_RXD, ECHO_TEST_RTS, ECHO_TEST_CTS)); // (9)

// (10)送受信用バッファメモリーの確保
// スタックサイズが充分に大きければ、別に malloc() でなくても良さそう
    uint8_t *data = (uint8_t *) malloc(BUF_SIZE); // (10)

    while (1) {

// (11) 受信用関数
// 第3引数で指定したバイト数分を受信するか、第4引数で指定した時間が経過すると戻ってくる
// 第4引数は (20 / portTICK_RATE_MS) で 20msec 待ち

        int len = uart_read_bytes(ECHO_UART_PORT_NUM, data, BUF_SIZE, 20 / portTICK_RATE_MS); // (11)

// (12) 送信用関数

        uart_write_bytes(ECHO_UART_PORT_NUM, (const char *) data, len); // (12)
    }
}

void app_main(void)
{
// (13)スレッドの作成
    xTaskCreate(echo_task, "uart_echo_task", ECHO_TASK_STACK_SIZE, NULL, 10, NULL); // (13)
}

通信環境を準備する

Tera Term を起動します。

新しい接続でシリアルのラジオボタンを選び、USB Serial Port のCOMを選択します。

設定 – シリアルポートで以下の通りに設定します。

スピードを 9600 にしました。

設定 – 端末でローカルエコーにチェックを入れておきます。

echoの動作を確認する

ビルドエラーがないことを確認したら F5キーを押してデバッグモードに入ります。

タスクバーが青からオレンジ色にかわったら、もう一度F5キーを押してプログラムを動作させます。

Tera Term から文字を送ると、それがそのまま返ってきます。

送った文字が2つ表示されれば成功です。

github esp32e-uart-echo にプロジェクトをアップしましたので、よろしければご覧になってください。

( 環境: Visual Studio Code + PlatformIO + ESP-IDF Framework )

UARTカテゴリの最新記事