mpu6050螺陀儀+3D物件(node-red)-esp32

 mpu6050螺陀儀+3D物件(node-red)-esp32

實作之前

去年一直想實驗用螺陀儀來驅使網頁上的3D物件同步動作
但礙於對html&css的知識實在太少,所以只能想想....,後來接
觸到node-red這門強大的圖形介面前/後端,支援了非常多樣
的套件,可以說只要想的到前後端大概都能找的到圖形套用
不久前,心血來潮查了一下3D,果然沒讓我失望,後來自己
摸索了幾天,稍微試出了一點成果。

先上視頻看一下

附言:我承認還是有一些空間可以準確點和進步,因為發現可能是
mpu-6050使用久了有點問題,有時會歸零,加上後端的設定須要給它
條件,不動時就定住。

須要的配備

  • 樹莓派裡裝有Broker,Node-red
  • esp32
  • mpu6050

Node-red上安裝


npm install node-red-contrib-web-babylonjs







然後瀏覽器網址列輸入:http://192.168.---.---:1880/scene/


esp32的部份

接線&匯入mpu-6050函式庫


程式碼

#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>

WiFiClient espClient;
PubSubClient client(espClient);

Adafruit_MPU6050 mpu;

const char *ssid="---";
const char *password="-------";
const char *mqtt_ip="192.168.--.---";
const char *topic="esp32/3d";

void wificonn(){
  WiFi.begin(ssid, password);
  while (WiFi.status()!=WL_CONNECTED){
    Serial.print(".");
    delay(500);
  }
  Serial.println("connected successful");
  Serial.println(WiFi.localIP());
}

void reconnect(){
  while (! client.connected()){
    Serial.println("MQTT connected");
    if (client.connect("esp32Client")){
      Serial.println("connected");
    }else{
      Serial.print("failed connected is : ");
      Serial.println(client.state());
      delay(2000);
    }
  }  
}
void setup() {
  Serial.begin(115200);
  wificonn();
  client.setServer(mqtt_ip, 1883);
  if (! mpu.begin()){
    Serial.print("mpu6050無法工作!");
    while (1){
      delay(10);
    }
  Serial.print("mpu6050已進入工作狀態!");
  }
 
}

void loop() {
  if (! client.connected()){
    reconnect();
  }
  client.loop();
  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);
  Serial.print("Gyroscope ");
  Serial.print("X: ");
  Serial.print(g.gyro.x, 1);
  Serial.print(" rps, ");
  Serial.print("Y: ");
  Serial.print(g.gyro.y, 1);
  Serial.print(" rps, ");
  Serial.print("Z: ");
  Serial.print(g.gyro.z, 1);
  Serial.println(" rps");
  float x=g.gyro.x;
  float y=g.gyro.y;
  float z=g.gyro.z;
  char gx[16]="";
  char gy[16]="";
  char gz[16]="";
  dtostrf(x,1,2,gx);
  dtostrf(y,1,2,gy);
  dtostrf(z,1,2,gz);
  client.publish("esp32/3dx", gx);
  client.publish("esp32/3dy", gy);
  client.publish("esp32/3dz", gz);
  delay(300);
}







留言

這個網誌中的熱門文章