インタラクティブ 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()
コピーしました!
実行と動作確認
すべての準備が整いました。以下の手順に従ってプロジェクトを実行し、センサーの傾きでキューブが動く様子を確認しましょう。
- 回路の確認: 作成した回路に間違いがないか、再度確認します。
- ESP32への書き込み: Arduino IDEでESP32にプログラムを書き込み、PCに接続したままにします。
- Pythonプログラムの実行: PCでPythonスクリプトを実行します。`SERIAL_PORT`が正しく設定されていることを確認してください。
- 動作確認: PCにウィンドウが表示され、立方体が描画されます。センサーを傾けると、その動きに合わせて立方体がリアルタイムで回転すれば成功です!
プロンプト
esp32とMPU6050を繋いでPCに仮想シリアルでデータを渡すCのプログラムとPC側では3軸の加速度データに応じて立方体を動かすPythonのプログラムを作ってください
PythonはPyOpenGLとpygameのライブラリを使ってください
コメント
コメントを投稿