【Arduino】ArduinoとOLEDディスプレイで画像を動かす:ジャイロセンサー(ADXL345)を使用した例

目次

概要

Arduinoを使い、OLEDディスプレイ上で任意の画像を表示し、ジャイロセンサー(ADXL345)のデータに応じて画像を動かすプロジェクトを紹介します。このプロジェクトでは、センサーの傾きを読み取り、画像を上下左右に移動させます。加えて、画像を回転させる実装が難しい理由も説明します。


ピンの配置

以下のように配線を行います。

必要な部品

  • Arduino Nano × 1
  • 0.96インチOLEDディスプレイ(SSD1306) × 1
  • ADXL345加速度センサー × 1
  • ジャンパーワイヤー × 数本
  • ブレッドボード(必要に応じて)

配線表

パーツピンArduinoピン説明
OLEDディスプレイVCC3.3V電源供給
GNDGNDグラウンド
SDAA4I2Cデータライン
SCLA5I2Cクロックライン
ADXL345センサーVCC3.3V電源供給
GNDGNDグラウンド
SDAA4I2Cデータライン
SCLA5I2Cクロックライン
SDOGNDアドレス設定

コード

以下のコードは、OLEDディスプレイに表示される画像をADXL345のデータに基づいて動かす例です。

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// OLEDディスプレイの設定
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// ADXL345センサーのインスタンス
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);

// ビットマップデータ(Image2cppで生成した画像)
const unsigned char bitmap_example[] PROGMEM = {
    0xFF, 0x81, 0x81, 0xFF, 0x00, 0x00, 0xFF, 0x81,
    // 必要に応じて完全なデータを貼り付ける
};

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

  // OLEDディスプレイの初期化
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println("OLEDの初期化に失敗しました。");
    while (1);
  }
  display.clearDisplay();

  // ADXL345センサーの初期化
  if (!accel.begin()) {
    Serial.println("ADXL345の初期化に失敗しました。");
    while (1);
  }
  accel.setRange(ADXL345_RANGE_16_G); // 測定範囲を設定
}

void loop() {
  sensors_event_t event;
  accel.getEvent(&event);

  // X, Y軸データを取得し、マッピング
  int xOffset = map(event.acceleration.x * 10, -100, 100, -32, 32);
  int yOffset = map(event.acceleration.y * 10, -100, 100, -32, 32);

  // 画面をクリアして画像を移動
  display.clearDisplay();
  display.drawBitmap(32 + xOffset, 16 + yOffset, bitmap_example, 64, 64, SSD1306_WHITE);
  display.display();

  // デバッグ出力
  Serial.print("X軸: ");
  Serial.print(event.acceleration.x);
  Serial.print(" Y軸: ");
  Serial.println(event.acceleration.y);

  delay(100);
}

インストールしなきゃいけないライブラリー一覧

以下のライブラリをArduino IDEのライブラリマネージャからインストールしてください。

  1. Adafruit GFX Library
    • OLEDディスプレイのグラフィック描画用。
  2. Adafruit SSD1306
    • OLEDディスプレイの制御用。
  3. Adafruit Sensor
    • センサーの統一されたインターフェース用。
  4. Adafruit ADXL345
    • ジャイロセンサー(ADXL345)用。

エラー解説と対処方法

エラー1: ディスプレイの初期化に失敗

エラーメッセージ:

OLEDの初期化に失敗しました。

原因:

  • I2Cアドレスが正しく設定されていない可能性。

対処方法:

  • I2Cスキャナを使ってアドレスを確認し、display.begin()の第2引数を適切に変更。

エラー2: ADXL345の初期化に失敗

エラーメッセージ:

ADXL345の初期化に失敗しました。

原因:

  • 配線ミスまたはセンサーの電源不足。

対処方法:

  • 配線を再確認し、センサーのVCCが3.3Vに接続されていることを確認。

画像が傾く処理が難しい理由

  1. 画像の回転処理が重い:
    • Adafruit GFXライブラリは、画像を回転させる直接的な機能を提供していません。
    • 画像を回転させる場合、すべてのピクセルの位置を計算し直す必要があります。
  2. OLEDの制約:
    • ディスプレイの解像度(128×64)では、回転後の画像がはみ出す可能性があります。
  3. メモリ使用量:
    • 回転処理には多くのメモリと計算が必要で、Arduino Nanoのような限られたリソースでは実現が難しいです。

まとめ

今回のプロジェクトでは、ADXL345ジャイロセンサーを使用して、OLEDディスプレイ上の画像を動かしました。以下が主なポイントです。

  • ジャイロセンサーのデータを取得し、map()関数で画面座標に変換。
  • Adafruitライブラリを使って画像を動的に描画。
  • 画像の傾きを表現する回転処理は、リソース制約により難しい。

これらの方法を使うことで、センサーの動きをリアルタイムに表示するプロジェクトを簡単に作成できます。

IT・ガジェット・電子工作の知識をこれひとつで

画像に alt 属性が指定されていません。ファイル名: KU-Assocb-2017810-640x100._V518059506_.jpg

ここまで読んでいただきありがとうございます。最後に宣伝をさせてください。

PCアプリの操作解説、最新のガジェット情報、そして電子工作の専門書まで。 Kindle Unlimitedなら、あらゆるジャンルのIT・デジタル関連書籍が読み放題です。

「仕事の効率化」から「趣味の深掘り」まで、高価な専門書をわざわざ買わずに、必要な情報をその場で引き出せるのが最大のメリット。 現在は30日間の無料体験や、対象者限定の「3ヶ月499円」プランなどが用意されています。まずはご自身のアカウントでお得なオファーが表示されるかご確認ください。

[Kindle Unlimited 読み放題プランをチェックする]

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次