今回は,2つのESP32を使い,同期処理をする方法について説明します.
モチベーション
この題材にした理由は2つのESP32を使い,同期処理をすれば1台にかかる負担が減り,プログラムがスムーズにいくのでは?というところからやってみました.
1台目のESP32
1台目のESP32は先に処理したいメインのプログラムになります.今回は同期処理させたい部分をtime.sleep(10)という風にしました.
同期タイミングはsync_pin.value(1)でGPIO4の信号をHIGHに設定したら同期します.同期終了タイミングとして, sync_pin.value(0)でGPIO4の信号をLOWにします.
from machine import Pin
import time
# GPIO4を出力用に設定
sync_pin = Pin(4, Pin.OUT)
def main():
print("プログラム開始")
# 同期信号をHIGHに設定
sync_pin.value(1)
print("GPIO4をHIGHに設定")
# 10秒間スリープするというプログラムを同期処理のメインの処理
time.sleep(10)
# プログラム終了時に同期信号をLOWに設定
sync_pin.value(0)
print("GPIO4をLOWに設定")
print("プログラム終了")
if __name__ == "__main__":
main()
2台目のESP32
2台目のESP32は1台目のESP32のある部分のプログラムと同期処理させたいプログラムです.1台目のESP32のtime.sleep(10)と同期して,その時間を計測しています.同期タイミングは1台目のESP32のsync_pin.value(1)の信号を受け取ったら同期を始め,sync_pin.value(0)の信号を受け取ったら同期終了です.
from machine import Pin
import time
# GPIO5を入力用に設定(プルダウン抵抗を有効化)
sync_pin = Pin(5, Pin.IN, Pin.PULL_DOWN)
def main():
print("待機中...")
# 初期化時に強制的にLOW状態を待つ
print("LOW状態になるまで待機...")
while sync_pin.value() == 1:
time.sleep_ms(100)
print(f"現在のピン状態: {sync_pin.value()}")
print("LOW状態を検出、HIGH待機開始")
# HIGH信号を待つ
while sync_pin.value() == 0:
time.sleep_ms(10)
print("同期信号を検出: 測定を開始")
start_time = time.ticks_ms()
# LOW信号になるまで待つ
while sync_pin.value() == 1:
time.sleep_ms(10)
end_time = time.ticks_ms()
print(f"測定完了: 実行時間 = {time.ticks_diff(end_time, start_time)} ミリ秒")
if __name__ == "__main__":
main()
実行手順
始めに2台目のESP32のファイル(input.py)を動かします.
次に1台目のESP32のファイル(output.py)を動かします.
この時,1台目のESP32は2台目のESP32に信号をGPIO 4から送り,2台目のESP32は以下のようになります.
そうすると以下の実行結果のようになります.
実行結果
1台目のESP32の結果です.
2台目のESP32の結果です.
考察
同期処理の結果は9997ミリで10秒(10000ミリ秒)ではありませんでした.これは1台目のESP32の信号を送受信した時間の差ではないかと考えています.