ESP32の送信出力(TxPower)を変更する方法

## 1.はじめに
今回はESP32の送信出力を変更する方法について紹介します。

送信出力(TxPower)とは無線通信においての信号の強さを示してます。
（dBm単位、整数または浮動小数点数）

RSSI(Received Signal Strength Indication)とは受信信号の強さを示してます。
単位は送信出力と同じ[dBm]です。

ESP32とは低消費電力でありながら、Wi-FiやBluetooth通信が可能なマイクロコントローラです。

↓こんなやつです。
![PXL_20241218_012854674~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888572/01361295-c927-5340-eb02-4aa925738607.jpeg)

## 2.実験環境について
- **ESP32** : 2台 (AP側とSTA側に分けて使用します)
- **言語** : MicroPython  
- **ファームウェア** : ESP32_GENERIC-20241025-v1.24.0
- **IDE** : Thonny  
- **その他** : 
  - モバイルバッテリー（1台）  
  - ケーブル（使用するESP32の端子に適したものを用意してください）

送信出力が変更できてるか確認するため、ESP32を2台を使って通信を行います。
1台をAP(アクセスポイント)として、もう1台をSTA(クライアント）に分けて通信を行っていきます。
また、送信出力を変更したことによる通信可能な距離が変わるのかも確認します。

**送信出力について**
今回の測定では、送信出力を2,5,10,15,20,および21[dBm]に設定して測定します。
```送信出力のコードについて
ap.config(essid=ssid, txpower=21)  #送信出力を21[dBm]に設定。ここで変更
```
上記のtxpowerの値をいじることで変更できます。

**測定距離について**
今回の測定は最大距離100mまで行います。
10mごとに位置を移動し、各地点でRSSIを100回測定します。

**測定の流れ（例: 送信電力を21とした場合）**
10m地点
STA側のESPを10m移動させ、RSSIを100回記録します。
20m地点
さらに10m移動し、RSSIを100回記録します。
同様に30m、40m...と繰り返し、最大距離100m地点まで測定します。


## 3.実験コード
```py:AP側のboot.py
#boot.py
import network
import time

# AP初期化
ssid = "cdslT"
ap = network.WLAN(network.AP_IF)
ap.active(True)
ap.config(essid=ssid, txpower=21)  #送信電力を21[dBm]に設定。ここで変更
print("AP active with configuration:", ap.ifconfig())

# 接続待機
while not ap.active():
    time.sleep(1)

print("AP boot complete.")
```
```py:AP側のmain.py
#main.py
import socket

def start_server():
    ap = network.WLAN(network.AP_IF)

    # サーバーのソケット設定
    addr = socket.getaddrinfo('0.0.0.0', 12345)[0][-1]
    s = socket.socket()
    s.bind(addr)
    s.listen(1)
    print("Server listening on port 12345")

    while True:
        cl, addr = s.accept()
        print(f"Client connected from {addr}")
        cl.send("RSSI request".encode('utf-8'))
        cl.close()
start_server()
```
```py:STA側のboot.py
#STAboot.py
import network
import time

# STA初期化
ssid = "cdslT"
sta = network.WLAN(network.STA_IF)
sta.active(True)
sta.connect(ssid)

# 接続待機
while not sta.isconnected():
    time.sleep(1)

print("STA boot complete. Connected to AP:", sta.ifconfig())
```
```py:STA側のmain.py
#main.py
import network
import socket
import time
from machine import SoftI2C, Pin
p2 = Pin(2, Pin.OUT)

#ファイル名は適宜変更
def rssi_log(count, rssi):
    with open("100m_tx21.txt", "a") as f:
        f.write(f"Count: {count}, RSSI: {rssi}\n")

def APconnect():
    sta = network.WLAN(network.STA_IF)
    count = 0

    for i in range(100):
        try:
            # APに接続
            addr = socket.getaddrinfo('192.168.4.1', 12345)[0][-1]
            s = socket.socket()
            s.connect(addr)

            # データ受信
            s.recv(1024)
            rssi = sta.status('rssi')  # RSSI値取得
            count += 1

            # ログに記録
            rssi_log(count, rssi)

            # count が 100になったら青LEDを点灯
            if count == 100:
                p2.on()  # LED点灯

            # 通信成功時のメッセージ
            print(f"{count} OK,Count: {count}, RSSI: {rssi}")

            s.close()
        except Exception as e:
            print(f"Error: {e}")
        finally:
            s.close()

        time.sleep(0.1)

APconnect()
```
## 4.実験コードの結果
STA側の実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888572/44f3f66a-5371-d00f-49e1-0ff0a728bb95.png)

このような結果が出てくれば問題ありません。
記述されたファイル内容は以下のようになっていれば大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888572/26136c77-7727-e1e7-7545-f3d93885caeb.png)


AP側はこれといった結果表示はないですが、念のため結果を示します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888572/a980247d-c638-4a1e-a8f9-7785c43c8817.png)
このような表示になっていれば、STA側と通信が成功してます。

## 5.実験結果
RSSIの平均を取ってグラフにしたのが以下の画像になります。
![basic_experiment_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888572/b6bb44ef-20a1-f255-c018-f7df47f8f3c1.png)
横軸が距離[m]で、縦軸がRSSI[dBm]になってます。
私の実験環境では、RSSIが-90[dBm]より低くなると通信が途切れてしまいました。
送信出力が10[dBm]の時は80[m]しか測定できず、5[dBm]の時は70[m]と送信出力を下げていくにつれて、通信可能な距離が下がっていくことがわかりました。

## 6.参考サイト
https://docs.micropython.org/en/latest/library/network.WLAN.html


https://docs.micropython.org/en/latest/library/network.html

https://qiita.com/shu223/items/7c4e87c47eca65724305