M5Stackを内蔵のESP32でWiFiサーバーとして使い、コードレスで無線ジェスチャーコントロールをしてみました(^^)/
M5Stackを内蔵のESP32でWiFiサーバーとして使い、コードレスで無線ジェスチャーコントロールをしてみました(^^)/

M5Stackを内蔵のESP32でWiFiサーバーとして使い、コードレスで無線ジェスチャーコントロールをしてみました(^^)/

M5Stackを内蔵のESP32でWiFiサーバーとして使い、コードレスで無線ジェスチャーコントロールをしてみました(^^)/

準備するもの

M5Stack (私は、Basicですが、Grayとかのほうが今後発展して使いやすいです。)

servoモーター(sg90)

Mediapipeでドローンをジェスチャーコントロールできたので、ほかの自称ロボットも操作できるのではないかと、試みました。

顔の鼻の位置の移動量におおじて、自称ロボットの顔を連動させる計画です。

*備忘録*

codeは以下の通りです。pythonのimport requestsでシリアル通信で、自称ロボットを動かすM5Stack(ESP32)ArduinoIDEにデーターを渡すのが、コツです。自称ロボットの制御については、まずArduinoでしてみましたのでこちらを参照願います。

pip install pyserial

pythonでのコードは、次の通りです。

requestsは、PythonでHTTPリクエストを簡単に扱うためのライブラリです。このライブラリを使うと、ウェブサイトに対してGETやPOSTなどのリクエストを送信し、その応答を取得することができます。

まず、requestsライブラリをインストールする必要があります。pip install requests

Pythonコード:

  • Mediapipeで鼻の位置を検出し、そのx座標をESP32にHTTPリクエストで送信します。
  • requestsライブラリを使ってESP32にGETリクエストを送信します。

import requests

ESP32のIPアドレス(シリアルモニタに表示される)

ESP32_IP = ‘http://192.168.1.100’ # 変更してください

def send_angle(angle):
  url = f”{ESP32_IP}/angle”

###

url にエンドポイント /angle を含めたESP32のURLを設定します

paramsangle パラメータを含め、HTTP GETリクエストを送信します。


  params = {‘angle’: angle}
  response = requests.get(url, params=params)

####これにより、クライアントはESP32のエンドポイント /angle に対して角度データを送信し、サーボモーターの角度を設定することができます。
  if response.status_code == 200: ###requestsの反応確認200は正常値 それ以外は異常値リクエスト失敗。


  print(f”Angle set to: {response.text}”)
  else:
  print(“Failed to send angle”)

Mediapipeとカメラ設定

import cv2
import mediapipe as mp

mp_pose = mp.solutions.pose
pose = mp_pose.Pose()
mp_drawing = mp.solutions.drawing_utils

cap = cv2.VideoCapture(0)

while cap.isOpened():
success, image = cap.read()
if not success:
break

image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = pose.process(image_rgb)

if results.pose_landmarks:
mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)

nose = results.pose_landmarks.landmark[mp_pose.PoseLandmark.NOSE]

# 鼻のx座標を0〜180の範囲に変換(サーボ1の角度範囲)
nose_x = int(nose.x * 180)
nose_x = max(0, min(180, nose_x)) # 範囲外の値を修正

###この部分では、nose_x が計算され、その値を send_angle 関数に渡しています。つまり、send_angle(nose_x) と呼び出すと、nose_x の値が send_angle 関数の angle 引数に渡されます

# 角度を送信
send_angle(nose_x)

cv2.putText(image, f’Nose X: {nose_x}’, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2, cv2.LINE_AA)

cv2.imshow(‘Pose Estimation’, image)
if cv2.waitKey(5) & 0xFF == 27:
break

cap.release()
cv2.destroyAllWindows()

M5Stack(ESP32) Arduino IDE

WiFiを使ってM5Stackの内蔵ESP32を使ってサーボモーターをコントロールするには、ESP32がWebサーバーとして動作し、クライアント(PC側)からHTTPリクエストで角度データを送信します。

M5Stackのセット:

  • WiFiに接続し、Webサーバーを立ち上げ、HTTPリクエストを処理してサーボモーターの角度を設定します。

#include <M5Stack.h>

#include <WiFi.h>

#include <WebServer.h>

// WiFi設定
const char* ssid = “接続するWiFiの_SSID”;
const char* password = “接続するWiFiの_PASSWORD”;

WebServer server(80);//port: 通常は80(HTTPのデフォルトポート)だが、省略されることが多い

int angle = 90; // 初期角度

void SG90write(int angle) {
ledcWrite(15, map(constrain(angle, 0, 180), 0, 180, 26, 123));
}

void handleRoot() {
server.send(200, “text/plain”, “M5Stack Servo Controller”);
}

//handleAngle 関数は、受け取ったリクエストから角度データを取得し、サーボモーターの角度を設定します

void handleAngle() {
if (server.hasArg(“angle”)) {
angle = server.arg(“angle”).toInt();//server.arg("angle").toInt() でその値を整数に変換し、angle 変数に格納します。
SG90write(angle);

// ディスプレイに角度を表示
M5.Lcd.fillScreen(BLACK); // 画面をクリア
M5.Lcd.setCursor(0, 0);
M5.Lcd.printf(“Angle: %d”, angle);

server.send(200, “text/plain”, String(angle));

} else {
server.send(400, “text/plain”, “Bad Request”);
}
}

void setup() {
M5.begin();
Serial.begin(115200);

// ディスプレイの初期化
M5.Lcd.clear();
M5.Lcd.setTextSize(3);
M5.Lcd.setCursor(0, 0);

// PWMチャネルの設定とピンのアタッチ
ledcSetup(15, 50, 10);
ledcAttachPin(2, 15);

// WiFi接続
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println(“Connecting to WiFi…”);


}
Serial.println(“Connected to WiFi”);

// Webサーバーのルートとハンドラーの設定
server.on(“/”, handleRoot);
server.on(“/angle”, handleAngle);   //この行は、ESP32のWebサーバーが /angle パスに対するリクエストを受け取ったときに handleAngle 関数を呼び出すことを意味しています。
server.begin();
}

void loop() {
server.handleClient();
}

ホーム » プログラミング » M5Stackを内蔵のESP32でWiFiサーバーとして使い、コードレスで無線ジェスチャーコントロールをしてみました(^^)/

投稿





コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です