😽

FreeRTOS demos gatt_server を動かす(ESP-IDF)

2023/01/16に公開

初めて記事を書きます。
最近zennっていう人のブログによくヒットするな、と思ってたら、そうゆうことじゃなかったです。

流れとしては下記の通りです。Windows11。
0.esp32を買う
1.AWS IoT CoreからFreeRTOSダウンロード
2.「1.AWS IoT CoreからFreeRTOSダウンロード」に同梱されている「ESP-IDF」をインストール
3.ちょっとだけデモのソースを修正
4.esp32に書き込み
5.動作確認

0.esp32を買う

私が購入したのは下記リンク先のものです。
特に配線はいりません。
https://www.amazon.co.jp/gp/product/B086QKRY25/

1.AWS IoT CoreからFreeRTOSダウンロード

AWS IoT => デバイスソフトウェア => ダウンロード用のソフトウェアを設定 => Connect to AWS IoT - ESP32-DevKitCのQuick Connect => 開始方法 => ダウンロードのみ

解凍してFreeRTOSフォルダにコマンドプロンプトで入ります。
私の場合は下記の通りです。

D:\GattServerTest\freertos-1673860592529\FreeRTOS>

2.「1.AWS IoT CoreからFreeRTOSダウンロード」に同梱されている「ESP-IDF」をインストール

下記のコマンドを実行します。

vendors\espressif\esp-idf\install.bat

3.ちょっとだけデモのソースを修正

Visual Studio CodeでD:\GattServerTest\freertos-1673860592529\FreeRTOSを開きます。

3.1 まずはどのデモを動かすのかの設定

aws_demo_config.hで下記のように修正。

// #define CONFIG_CORE_MQTT_MUTUAL_AUTH_DEMO_ENABLED
#define CONFIG_BLE_GATT_SERVER_DEMO_ENABLED

3.2 ネットワークタイプの設定

iot_demo_runner.cを下記のように修正。

void DEMO_RUNNER_RunDemos( void )
{
    /* These demos are shared with the C SDK and perform their own initialization and cleanup. */

    static demoContext_t mqttDemoContext =
    {
        //.networkTypes                = democonfigNETWORK_TYPES,
        .networkTypes                = AWSIOT_NETWORK_TYPE_BLE,

iot_demo_freertos.cを下記のように修正。

static int _initialize( demoContext_t * pContext )
{
    ・・・
    if( status == EXIT_SUCCESS )
    {
        // if( AwsIotNetworkManager_EnableNetwork( configENABLED_NETWORKS ) != configENABLED_NETWORKS )
        if( AwsIotNetworkManager_EnableNetwork( pContext->networkTypes ) != pContext->networkTypes )
	・・・

3.3 カスタムサービスの設定

iot_ble_config_defaults.hを下記のように修正。

// #define IOT_BLE_ADD_CUSTOM_SERVICES    ( 0 )
#define IOT_BLE_ADD_CUSTOM_SERVICES    ( 1 )

3.4 デバッグ用にprintfする

static void prvCounterUpdateTaskFunction( void * pvParams )
{
    ・・・
    while( 1 )
    {
        ( void ) xTaskNotifyWait( xBitsToWait, 0, &ulSetBits, xCounterUpdateInterval );

        if( ulSetBits & EVENT_BIT( eGattDemoReset ) )
        {
            ulCounter = 0;
            vLoggingPrintf("Count reset.\n"); // 追加
        }
        else if( ulSetBits & EVENT_BIT( eGattDemoStart ) )
        {
            xStarted = pdTRUE;
            vLoggingPrintf("Counter start.\n"); // 追加
        }
        else if( ulSetBits & EVENT_BIT( eGattDemoStop ) )
        {
            xStarted = pdFALSE;
            vLoggingPrintf("Counter stop.\n"); // 追加
        }

        if( xStarted == pdTRUE )
        {
            ulCounter++;
            vLoggingPrintf("Count => %u\n.", ulCounter); // 追加
	・・・

4.esp32に書き込み

下記のコマンドを順に実行します。

vendors\espressif\esp-idf\export.bat
cmake -DVENDOR=espressif -DBOARD=esp32_devkitc -DCOMPILER=xtensa-esp32 -S . -B ..\build\  -G Ninja
cmake --build ..\build\

「Generated D:/GattServerTest/freertos-1673860592529/build/aws_demos.bin」と表示されればOKです。
esp32をUSBでパソコンと接続、デバイスマネージャーでポートを確認、下記コマンドを順に実行します(下記コマンドはポートが4だった場合)。

set ESPPORT=COM4
cmake --build ..\build --target flash

Connecting........と表示されたらesp32の「BOOT」ボタンを押します。

5.動作確認

とりあえずTeraTermでどうゆう状態か確認します。
TeraTermの設定 => シリアルポートを開き、ポートとスピードを変更します。

「新しい接続」を押して書き込んだプログラムを動作させ表示を見ます。
下図の下線を引いた箇所のような文言が出ていればesp32が見つけてください、と言っています。

5.1 接続

AndroidにnRF Connectというアプリを入れて接続、送受信を確認します。
SCANNERというタブでESP3というデバイスが見つかるかと思います。
OPEN TABをクリックし、CONNECTを押します。

TeraTermに下記のような文言が出ればesp32とAndroidが接続、ということのようです。

BLE Connected to remote device, connId = 0

5.2 送受信

引き続きnRF Connectというアプリで動作を確認します。
一番下の「Unkown Service」を押下し、サービス一覧を表示します。
PropertiesがREAD,WRITEになっているCharacterristic(人によって違うのかもしれませんが、おそらく下4桁がFF02。iot_ble_gatt_server_demo.hの#define gattDemoCHAR_CONTROL_UUID)の「↑」を押し、「New value」に「0x00」を入力してsendを押すと、esp32が受信、カウントアップが開始します。TeraTarmにカウントアップされていく様子がわかります。

TeraTermの表示

0x01をsendするとCounterがstop、0x02をsendするとCounterがresetされて0に戻ります。

また、別のCharacterristic(おそらく下4桁がFF01。iot_ble_gatt_server_demo.hの#define gattDemoCHAR_COUNTER_UUID)の「↓」を押すと、現在のカウントがValueに表示されます。

コールバック関数として設定されている「prvWriteCommand」という関数の引数「pEventParam」内の「pParamWrite」に受信したデータが入っているようです。TEXT(UTF-8)に設定し文字列を送るとesp32で受信できます。

所感

AWSにMQTTパブリッシュに関する情報は多いのですが、ESP-IDF、BLEとなると途端に情報が少なく、だいぶ時間がかかりました。
参考になれば幸いです。

Discussion