注釈

こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Communityへようこそ!Facebook上で、仲間と一緒にRaspberry Pi、Arduino、ESP32をさらに深く探求しましょう。

なぜ参加するのか?

  • 専門的なサポート:購入後の問題や技術的な課題をコミュニティやチームの助けを借りて解決。

  • 学びと共有:スキルを向上させるためのヒントやチュートリアルを交換。

  • 限定プレビュー:新製品発表や予告編に早期アクセス。

  • 特別割引:最新製品の特別割引を楽しむ。

  • フェスティブプロモーションとプレゼント:プレゼントやホリデープロモーションに参加。

👉 私たちと一緒に探索と創造を始める準備はできましたか?[ここ]をクリックして、今すぐ参加しましょう!

レッスン52: 傾き方向インジケーター

このArduinoプロジェクトでは、MPU6050加速度計とジャイロセンサー、およびOLEDディスプレイを使用します。プロジェクトはMPU6050センサーからデータを読み取り、傾き方向を検出して、OLED画面に対応する矢印(上、下、左、右)または円(顕著な傾きがない場合)を表示します。

必要な部品

このプロジェクトでは、以下の部品が必要です。

全キットを購入するのが便利です。リンクはこちら:

名称

キットに含まれるアイテム

リンク

ユニバーサルメーカセンサーキット

94

Universal Maker Sensor Kit

以下のリンクから個別に購入することもできます。

コンポーネント紹介

購入リンク

Arduino UNO R3またはR4

購入

ジャイロスコープ & 加速度センサーモジュール (MPU6050)

購入

OLEDディスプレイモジュール (SSD1306)

-

ブレッドボード

購入

配線

../_images/Lesson_52_Tilt_direction_indicatorr_uno_bb.png

コード

注釈

ライブラリをインストールするには、Arduinoライブラリマネージャーを使用し、「Adafruit SSD1306」と「Adafruit GFX」を検索してインストールしてください。

コード解析

  1. ライブラリのインクルードとOLEDディスプレイの設定

    プロジェクトは、MPU6050センサーとOLEDディスプレイをインターフェースするために必要なライブラリをインクルードすることから始まります。OLEDディスプレイの寸法とI2Cアドレスが定義され、ディスプレイオブジェクトが作成されます。

    #include <Adafruit_MPU6050.h>
    #include <Adafruit_Sensor.h>
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    
    #define SCREEN_WIDTH 128
    #define SCREEN_HEIGHT 64
    
    #define OLED_RESET -1
    #define SCREEN_ADDRESS 0x3C
    Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
    
    Adafruit_MPU6050 mpu;
    
  2. セットアップ関数

    セットアップ関数では、シリアル通信が初期化され、MPU6050センサーが特定の加速度計およびジャイロスコープの範囲設定で初期化されます。OLEDディスプレイも初期化され、クリアされます。

    void setup(void) {
      Serial.begin(115200);
    
      if (!mpu.begin()) {
        Serial.println("Failed to find MPU6050 chip");
        while (1) {
          delay(10);
        }
      }
    
      mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
      mpu.setGyroRange(MPU6050_RANGE_500_DEG);
      mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
    
      if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
        Serial.println(F("SSD1306 allocation failed"));
        for (;;)
          ;  // Don't proceed, loop forever
      }
      display.clearDisplay();
    
      delay(100);
    }
    
  3. ループ関数

    ループ関数では、センサーデータが連続的に読み取られ、加速度の値に基づいて傾き方向が決定されます。傾き方向に応じて、OLEDディスプレイに異なる矢印や円が描画されます。

    コードはMPU6050センサーからデータを読み取り、傾き方向を検出し、対応する矢印(上、下、左、右)または円(顕著な傾きがない場合)をOLED画面に表示します。

    void loop() {
    
      display.clearDisplay();
    
      sensors_event_t a, g, temp;
      mpu.getEvent(&a, &g, &temp);
    
      Serial.print("acceleration:");
      Serial.print(a.acceleration.x);
      Serial.print(",");
      Serial.print(a.acceleration.y);
      Serial.print(",");
      Serial.println(a.acceleration.z);
    
      if (a.acceleration.x >= 2) {
        drawUpArrow();
      } else if (a.acceleration.x <= -2) {
        drawDownArrow();
      } else if (a.acceleration.y >= 2) {
        drawLeftArrow();
      } else if (a.acceleration.y <= -2) {
        drawRightArrow();
      } else {
        drawCircle();
      }
      display.display();
    
      delay(200);
    }
    
  4. 描画関数

    OLEDディスプレイに異なる形状を描画するために、いくつかのヘルパー関数が定義されています。これらの関数は``Adafruit_GFX``ライブラリを使用して、矢印や円を描画します。

    void drawUpArrow() {
      display.fillTriangle(49, 30, 64, 15, 79, 30, WHITE);
      display.fillRect(59, 30, 10, 20, WHITE);
    }
    
    void drawDownArrow() {
      display.fillTriangle(49, 36, 64, 51, 79, 36, WHITE);
      display.fillRect(59, 16, 10, 20, WHITE);
    }
    
    void drawRightArrow() {
      display.fillTriangle(70, 15, 85, 30, 70, 45, WHITE);
      display.fillRect(50, 25, 20, 10, WHITE);
    }
    
    void drawLeftArrow() {
      display.fillTriangle(60, 15, 45, 30, 60, 45, WHITE);
      display.fillRect(60, 25, 20, 10, WHITE);
    }
    
    void drawCircle() {
      display.fillCircle(64, 32, 10, WHITE);
      display.fillCircle(64, 32, 8, BLACK);
    }
    

参考資料