加速度センサーとジャイロセンサーをArduinoで使って学び、Telloの慣性ユニットに触れる(^_-)-☆
加速度センサーとジャイロセンサーをArduinoで使って学び、Telloの慣性ユニットに触れる(^_-)-☆

加速度センサーとジャイロセンサーをArduinoで使って学び、Telloの慣性ユニットに触れる(^_-)-☆

  • 例:

adlx345
sensor

#include <Wire.h> //Wire.h: I2C通信に必要なライブラリ。
#include <Adafruit_Sensor.h>   //ADXL345用のAdafruitライブラリ
#include <Adafruit_ADXL345_U.h>  //ADXL345用のAdafruitライブラリ

/* Assign a unique ID to this sensor at the same time *///センサーオブジェクトの初期化
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);   //accelという名前でセンサーオブジェクトを作成//=12345はセンサーのユニークID

void displaySensorDetails(void)  //センサーの基本情報をシリアルモニターに出力します
{
  sensor_t sensor;//sensor_t構造体を使用して、以下の情報を表示します。
  accel.getSensor(&sensor);
  Serial.println("------------------------------------");
  Serial.print  ("Sensor:       "); Serial.println(sensor.name);//センサー名
  Serial.print  ("Driver Ver:   "); Serial.println(sensor.version);//ドライバのバージョン
  Serial.print  ("Unique ID:    "); Serial.println(sensor.sensor_id);//ユニークID
  Serial.print  ("Max Value:    "); Serial.print(sensor.max_value); Serial.println(" m/s^2");//加速度の最大値(単位は m/s²)
  Serial.print  ("Min Value:    "); Serial.print(sensor.min_value); Serial.println(" m/s^2");//加速度の最小値(単位は m/s²)
  Serial.print  ("Resolution:   "); Serial.print(sensor.resolution); Serial.println(" m/s^2");  //解像度(単位は m/s²)
  Serial.println("------------------------------------");
  Serial.println("");
  delay(500);
}

void displayDataRate(void)  //センサーのデータ取得レート(サンプリングレート)を表示
{
  Serial.print  ("Data Rate:    "); 
  
  switch(accel.getDataRate())//現在のデータレートを取得//switch文で該当する値を文字列として表示
  {
    case ADXL345_DATARATE_3200_HZ:
      Serial.print  ("3200 "); 
      break;
    case ADXL345_DATARATE_1600_HZ:
      Serial.print  ("1600 "); 
      break;
    case ADXL345_DATARATE_800_HZ:
      Serial.print  ("800 "); 
      break;
    case ADXL345_DATARATE_400_HZ:
      Serial.print  ("400 "); 
      break;
    case ADXL345_DATARATE_200_HZ:
      Serial.print  ("200 "); 
      break;
    case ADXL345_DATARATE_100_HZ:
      Serial.print  ("100 "); 
      break;
    case ADXL345_DATARATE_50_HZ:
      Serial.print  ("50 "); 
      break;
    case ADXL345_DATARATE_25_HZ:
      Serial.print  ("25 "); 
      break;
    case ADXL345_DATARATE_12_5_HZ:
      Serial.print  ("12.5 "); 
      break;
    case ADXL345_DATARATE_6_25HZ:
      Serial.print  ("6.25 "); 
      break;
    case ADXL345_DATARATE_3_13_HZ:
      Serial.print  ("3.13 "); 
      break;
    case ADXL345_DATARATE_1_56_HZ:
      Serial.print  ("1.56 "); 
      break;
    case ADXL345_DATARATE_0_78_HZ:
      Serial.print  ("0.78 "); 
      break;
    case ADXL345_DATARATE_0_39_HZ:
      Serial.print  ("0.39 "); 
      break;
    case ADXL345_DATARATE_0_20_HZ:
      Serial.print  ("0.20 "); 
      break;
    case ADXL345_DATARATE_0_10_HZ:
      Serial.print  ("0.10 "); 
      break;
    default:
      Serial.print  ("???? "); 
      break;
  }  
  Serial.println(" Hz");  
}

void displayRange(void) //加速度の計測範囲を表示します。
{
  Serial.print  ("Range:         +/- "); 
  
  switch(accel.getRang())   //現在の範囲を取得し、±16g, ±8g, ±4g, ±2gのいずれかを表示
  {
    case ADXL345_RANGE_16_G:
      Serial.print  ("16 "); 
      break;
    case ADXL345_RANGE_8_G:
      Serial.print  ("8 "); 
      break;
    case ADXL345_RANGE_4_G:
      Serial.print  ("4 "); 
      break;
    case ADXL345_RANGE_2_G:
      Serial.print  ("2 "); 
      break;
    default:
      Serial.print  ("?? "); 
      break;
  }  
  Serial.println(" g");  
}
void setup(void) 
{
#ifndef ESP8266
  while (!Serial); // for Leonardo/Micro/Zero
#endif
  Serial.begin(9600);//シリアル通信の初期化 
  Serial.println("Accelerometer Test"); Serial.println("");
  
  /* Initialise the sensor */
  if(!accel.begin())
  {
    /* There was a problem detecting the ADXL345 ... check your connections */
    Serial.println("Ooops, no ADXL345 detected ... Check your wiring!");
    while(1);
  }

  /* Set the range to whatever is appropriate for your project */
  accel.setRange(ADXL345_RANGE_16_G);//測定範囲を±16gに設定//コメントアウトを変更すれば、別の範囲も選択可能
  // accel.setRange(ADXL345_RANGE_8_G);
  // accel.setRange(ADXL345_RANGE_4_G);
  // accel.setRange(ADXL345_RANGE_2_G);
  
  /* Display some basic information on this sensor */
  displaySensorDetails();
  
  /* Display additional settings (outside the scope of sensor_t) */
  displayDataRate();
  displayRange();
  Serial.println("");
}

void loop(void) 
{
  /* Get a new sensor event */ 
  sensors_event_t event; 
  accel.getEvent(&event);
 
  /* Display the results (acceleration is measured in m/s^2) */
  Serial.print("X: "); Serial.print(event.acceleration.x); Serial.print("  ");  //X軸: 横方向の加速度。
  Serial.print("Y: "); Serial.print(event.acceleration.y); Serial.print("  ");//Y軸: 縦方向の加速度。
  Serial.print("Z: "); Serial.print(event.acceleration.z); Serial.print("  ");Serial.println("m/s^2 "); //Z軸: 高さ方向の加速度。
  delay(500);
               
              
}
X: 2.28  Y: 2.31  Z: 9.85  m/s^2
X: 0.63  Y: 0.16  Z: 9.96  m/s^2
X: 1.61  Y: 2.35  Z: 10.12  m/s^2
X: -2.20  Y: 4.90  Z: 7.18  m/s^2

LED
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>

// ADXL345センサーを初期化
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);

// LEDのピン番号
const int led1 = 2;  // 前
const int led2 = 3;  // 後ろ
const int led3 = 4;  // 右
const int led4 = 5;  // 左

void setup() {
  Serial.begin(9600);

  // LEDピンを出力に設定
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);

  // ADXL345の初期化
  if (!accel.begin()) {
    Serial.println("ADXL345を検出できません。接続を確認してください。");
    while (1);
  }

  accel.setRange(ADXL345_RANGE_16_G);  // 測定範囲を±16Gに設定
}

void loop() {
  sensors_event_t event;
  accel.getEvent(&event);  // ADXL345から加速度データを取得
  
  float x = event.acceleration.x;
  float y = event.acceleration.y;

  Serial.print("X軸: "); Serial.print(x); Serial.print(" m/s^2 ");
  Serial.print("Y軸: "); Serial.print(y); Serial.println(" m/s^2 ");

  // 傾きの閾値(m/s^2)
  float threshold = 5.0;    //threshold を5.0 m/s²に設定しています。この値を超えるかどうかで傾きを判定します。

  // LEDの点灯制御
  digitalWrite(led1, y > threshold);    // 前に傾けたらLED1//傾きの方向に応じたLEDを点灯させます
  digitalWrite(led2, y < -threshold);   // 後ろに傾けたらLED2
  digitalWrite(led3, x > threshold);    // 右に傾けたらLED3
  digitalWrite(led4, x < -threshold);   // 左に傾けたらLED4

  delay(100);  // 100msの遅延//100ミリ秒ごとにデータを更新し、LEDの点灯を切り替えます
}

#include <Wire.h>
#include <MPU6050.h>

MPU6050 mpu;

void setup() {
  Serial.begin(115200);
  Wire.begin();  // Arduino AVRではピン番号を指定しない

  // MPU6050の初期化
  mpu.initialize();
  if (mpu.testConnection()) {
    Serial.println("MPU6050の接続に成功しました");
  } else {
    Serial.println("MPU6050の接続に失敗しました");
    while (1);  // エラー時は停止
  }
}

void loop() {
  int16_t ax, ay, az;
  int16_t gx, gy, gz;

  // 加速度とジャイロのデータを取得
  mpu.getAcceleration(&ax, &ay, &az);
  mpu.getRotation(&gx, &gy, &gz);

  // データを表示
  Serial.print("加速度 (X, Y, Z): ");
  Serial.print(ax); Serial.print(", ");
  Serial.print(ay); Serial.print(", ");
  Serial.println(az);

  Serial.print("ジャイロ (X, Y, Z): ");
  Serial.print(gx); Serial.print(", ");
  Serial.print(gy); Serial.print(", ");
  Serial.println(gz);

  delay(1000);  // 0.5秒ごとにデータを取得
}
ジャイロ (X, Y, Z): 1235, 290, -170
加速度 (X, Y, Z): 15076, 1992, -6080
ジャイロ (X, Y, Z): -950, 5698, -4739
加速度 (X, Y, Z): 6788, 9320, -1992
ジャイロ (X, Y, Z): 4236, -11815, -7154
加速度 (X, Y, Z): 5924, 15716, 52

#include <WiFi.h>
#include <Wire.h>
#include <MPU6050.h>
#include <WebServer.h>  // HTTPサーバー用ライブラリ

// Wi-FiのSSIDとパスワード
const char* ssid = "30******-2G";   #WIFI ID
const char* password = "2********";  #PASS WORD

// Webサーバーのポートを80番に設定
WebServer server(80);
MPU6050 mpu;

// センサーデータを保持する変数
int16_t ax, ay, az;
int16_t gx, gy, gz;

// センサーのデータを取得してHTML形式で返す
void handleRoot() {
  mpu.getAcceleration(&ax, &ay, &az);
  mpu.getRotation(&gx, &gy, &gz);

  String html = "<html><body><h1>MPU6050 Sensor Data</h1>";
  html += "<p><strong>Acceleration (X, Y, Z):</strong> " + String(ax) + ", " + String(ay) + ", " + String(az) + "</p>";
  html += "<p><strong>Gyro (X, Y, Z):</strong> " + String(gx) + ", " + String(gy) + ", " + String(gz) + "</p>";
  html += "</body></html>";

  server.send(200, "text/html", html);
}

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi");

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }

  Serial.println("\nWiFi connected.");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  Wire.begin();
  mpu.initialize();

  if (mpu.testConnection()) {
    Serial.println("MPU6050の接続に成功しました");
  } else {
    Serial.println("MPU6050の接続に失敗しました");
    while (1);
  }

  // ルートパスに対するハンドラを設定
  server.on("/", handleRoot);

  // HTTPサーバーを開始
  server.begin();
  Serial.println("HTTPサーバーが開始されました");
}

void loop() {
  // クライアントからのリクエストを処理
  server.handleClient();
}

30
31
33
34
36
32

ホーム » プログラミング » 加速度センサーとジャイロセンサーをArduinoで使って学び、Telloの慣性ユニットに触れる(^_-)-☆

投稿





コメントを残す

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