FreeRTOS demos gatt_server を動かす(ESP-IDF)
初めて記事を書きます。
最近zennっていう人のブログによくヒットするな、と思ってたら、そうゆうことじゃなかったです。
流れとしては下記の通りです。Windows11。
0.esp32を買う
1.AWS IoT CoreからFreeRTOSダウンロード
2.「1.AWS IoT CoreからFreeRTOSダウンロード」に同梱されている「ESP-IDF」をインストール
3.ちょっとだけデモのソースを修正
4.esp32に書き込み
5.動作確認
0.esp32を買う
私が購入したのは下記リンク先のものです。
特に配線はいりません。
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