ESP32&PYTHON3Dキューブガイド

インタラクティブ ESP32 & Python 3Dキューブガイド

インタラクティブ ESP32 & Python 3Dキューブガイド

MPU6050センサーの傾きで3Dオブジェクトを動かそう

プロジェクト概要

このプロジェクトでは、MPU6050センサーで計測した傾き(加速度)データをESP32からPCへリアルタイムに送信します。PC側ではPythonプログラムがそのデータを受け取り、3Dの立方体を傾きに合わせて回転させます。このガイドを通じて、ハードウェアとソフトウェアの連携を体験しましょう。

⚙️ハードウェア

  • ESP32 開発ボード
  • MPU6050 3軸ジャイロ/加速度センサー
  • ブレッドボードとジャンパーワイヤー
  • PC接続用USBケーブル

💻ソフトウェア

  • Arduino IDE と ESP32 ボードマネージャー
  • Python 3.x
  • Arduinoライブラリ: `Adafruit MPU6050`
  • Pythonライブラリ: `pyserial`, `PyOpenGL`, `pygame`

回路の接続

ESP32とMPU6050をI2C通信で接続します。以下の表と図を参考に、正確に配線してください。VCCは3.3Vに接続するのがポイントです。

MPU6050 ピン ESP32 ピン 役割
VCC 3V3 電源 (3.3V)
GND GND 接地
SCL GPIO 22 I2C クロック
SDA GPIO 21 I2C データ
ESP32

3V3

GND

G22

G21

MPU6050

VCC

GND

SCL

SDA

ESP32側のプログラム (Arduino)

このプログラムは、MPU6050から加速度データを読み取り、`ax,ay,az` という形式でシリアルポートに出力し続けます。

ライブラリのインストール

Arduino IDEのライブラリマネージャで `Adafruit MPU6050` を検索し、インストールしてください。依存ライブラリも一緒にインストールします。

#include <Adafruit_MPU6050.h> #include <Adafruit_Sensor.h> #include <Wire.h> Adafruit_MPU6050 mpu; void setup(void) { Serial.begin(115200); while (!Serial) { delay(10); } if (!mpu.begin()) { Serial.println("MPU6050が見つかりませんでした。"); while (1) { delay(10); } } Serial.println("MPU6050 Found!"); mpu.setAccelerometerRange(MPU6050_RANGE_8_G); mpu.setGyroRange(MPU6050_RANGE_500_DEG); mpu.setFilterBandwidth(MPU6050_BAND_21_HZ); delay(100); } void loop() { sensors_event_t a, g, temp; mpu.getEvent(&a, &g, &temp); Serial.print(a.acceleration.x); Serial.print(","); Serial.print(a.acceleration.y); Serial.print(","); Serial.println(a.acceleration.z); delay(50); }
コピーしました!

PC側のプログラム (Python)

このPythonスクリプトは、シリアルポートからデータを受信し、その値に基づいてPyOpenGLで描画した立方体をリアルタイムで回転させます。

ライブラリのインストール

ターミナルで以下のコマンドを実行して、必要なライブラリをインストールします。

pip install pyserial PyOpenGL pygame
コピーしました!

以下のコード内の `SERIAL_PORT` を、ご自身の環境に合わせて変更してください。

import pygame from pygame.locals import * from OpenGL.GL import * from OpenGL.GLU import * import serial import math SERIAL_PORT = "COM3" BAUD_RATE = 115200 def draw_cube(): vertices = ((1, -1, -1), (1, 1, -1), (-1, 1, -1), (-1, -1, -1), (1, -1, 1), (1, 1, 1), (-1, -1, 1), (-1, 1, 1)) edges = ((0, 1), (0, 3), (0, 4), (2, 1), (2, 3), (2, 7), (6, 3), (6, 4), (6, 7), (5, 1), (5, 4), (5, 7)) surfaces = ((0, 1, 2, 3), (3, 2, 7, 6), (6, 7, 5, 4), (4, 5, 1, 0), (1, 5, 7, 2), (4, 0, 3, 6)) colors = ((1, 0, 0), (0, 1, 0), (0, 0, 1), (1, 1, 0), (0, 1, 1), (1, 0, 1)) glBegin(GL_QUADS) for i, surface in enumerate(surfaces): glColor3fv(colors[i]) for vertex in surface: glVertex3fv(vertices[vertex]) glEnd() glColor3f(0.0, 0.0, 0.0) glBegin(GL_LINES) for edge in edges: for vertex in edge: glVertex3fv(vertices[vertex]) glEnd() def main(): try: ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=0.1) print(f"シリアルポート {SERIAL_PORT} を開きました。") except serial.SerialException as e: print(f"エラー: シリアルポート {SERIAL_PORT} を開けません。: {e}") return pygame.init() display = (800, 600) pygame.display.set_mode(display, DOUBLEBUF | OPENGL) pygame.display.set_caption("ESP32 MPU6050 3D Cube Demo") gluPerspective(45, (display[0] / display[1]), 0.1, 50.0) glTranslatef(0.0, 0.0, -10) glEnable(GL_DEPTH_TEST) pitch, roll = 0, 0 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: ser.close() pygame.quit() quit() if ser.in_waiting > 0: try: line = ser.readline().decode('utf-8').strip() if line: ax, ay, az = map(float, line.split(',')) pitch = math.atan2(-ax, math.sqrt(ay**2 + az**2)) * 180 / math.pi roll = math.atan2(ay, az) * 180 / math.pi except (ValueError, IndexError, UnicodeDecodeError): continue glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glLoadIdentity() gluPerspective(45, (display[0] / display[1]), 0.1, 50.0) glTranslatef(0.0, 0.0, -10) glRotatef(pitch, 1, 0, 0) glRotatef(roll, 0, 0, 1) draw_cube() pygame.display.flip() pygame.time.wait(10) if __name__ == "__main__": main()
コピーしました!

実行と動作確認

すべての準備が整いました。以下の手順に従ってプロジェクトを実行し、センサーの傾きでキューブが動く様子を確認しましょう。

  1. 回路の確認: 作成した回路に間違いがないか、再度確認します。
  2. ESP32への書き込み: Arduino IDEでESP32にプログラムを書き込み、PCに接続したままにします。
  3. Pythonプログラムの実行: PCでPythonスクリプトを実行します。`SERIAL_PORT`が正しく設定されていることを確認してください。
  4. 動作確認: PCにウィンドウが表示され、立方体が描画されます。センサーを傾けると、その動きに合わせて立方体がリアルタイムで回転すれば成功です!

プロンプト

esp32とMPU6050を繋いでPCに仮想シリアルでデータを渡すCのプログラムとPC側では3軸の加速度データに応じて立方体を動かすPythonのプログラムを作ってください

PythonはPyOpenGLとpygameのライブラリを使ってください

コメント