【Arduino】Arduinoとジャイロセンサー(ADXL345)を使ったリアルタイムバイク画像制御【Processing編】

Arduinoとジャイロセンサー(ADXL345)を組み合わせ、センサーのデータを元にリアルタイムでバイクの画像を制御する方法をご紹介します。Processingを使って、ジャイロセンサーのデータに応じてバイクの画像を回転させ、視覚的にバイクの傾きを確認できます。

概要

ADXL345は、加速度センサーで、3軸の加速度を測定できます。これを使って、バイクの傾きやウイリーなどの動きをリアルタイムで表現します。Processingを使うことで、Arduinoで取得したデータをグラフィカルに表現し、バイクの画像を制御します。

必要なもの

  • Arduino UNO(またはお好きなArduinoボード)
  • ADXL345ジャイロセンサー
  • Processingソフトウェア
  • シリアル通信用のコード

ArduinoとADXL345の接続方法

ADXL345はI2C通信を使用するため、以下のように接続します。

  • GNDArduinoのGND
  • VCCArduinoの5V
  • SDAArduinoのA4(I2Cデータライン)
  • SCLArduinoのA5(I2Cクロックライン)

Arduinoコード

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

Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_U(12345); // センサーの初期化

void setup() {
  Serial.begin(9600);
  
  if (!accel.begin()) {
    Serial.println("ADXL345 not detected. Check your wiring!");
    while (1);
  }

  Serial.println("ADXL345 detected!");
}

void loop() {
  sensors_event_t event; 
  accel.getEvent(&event);
  
  // X, Y, Zの加速度データをシリアル通信で送信
  Serial.print(event.acceleration.x);
  Serial.print(",");
  Serial.print(event.acceleration.y);
  Serial.print(",");
  Serial.println(event.acceleration.z);
  
  delay(100); // 少し待機
}

Processingでのバイク画像制御

上記のArduinoコードで取得したX、Y、Z軸の加速度データをProcessingで受け取り、バイクの画像をリアルタイムに回転させます。画像が指定された角度を超えると、異なる画像を表示するように制御します。

バイクの画像(bike_front.png,bile_side.png)はjavaファイルと同じフォルダに置いています。好きな画像をダウンロードしてください。

import processing.serial.*;  // シリアル通信用ライブラリ

PImage bikeFront;          // 正面のバイク画像
PImage bikeSide;           // 横から見たバイク画像
PImage bikeSide45;         // 傾き45度の横画像
PImage currentSide;        // 現在の横画像

Serial myPort;             // シリアルポートオブジェクト
String input;              // シリアルからの入力データ
float x = 0, y = 0, z = 0; // X, Y, Zデータ
float angle = 0;           // 傾きの角度
float sideAngle = 0;       // 横画像の傾き角度

void settings() {
  size(800, 800); // ウィンドウサイズ
}

void setup() {
  // バイクの画像を読み込む
  bikeFront = loadImage("bike_front.png"); // 正面のバイク画像
  bikeSide = loadImage("bike_side.png");   // 横のバイク画像
  bikeSide45 = loadImage("bike_side_45angle.png"); // 傾き45度の横画像
  bikeFront.resize(300, 150); // 正面画像のサイズを変更
  bikeSide.resize(300, 150);  // 横画像のサイズを変更

  // シリアルポートを指定
  String portName = "COM4"; // Arduinoが接続されているポート(適切なポートに変更)
  myPort = new Serial(this, portName, 9600); // シリアル通信を開始
  myPort.bufferUntil('\n'); // 行末(改行)まで受信を待機
}

void draw() {
  background(200); // 背景色を灰色に設定
  
  // バイクの正面画像を傾ける
  angle = atan2(y, z); // YとZデータから傾き角度を計算
  translate(width / 3, height / 2); // 画面中央に移動
  rotate(-angle); // 画像を傾ける
  imageMode(CENTER); // 画像の中心を回転軸にする
  image(bikeFront, 0, 0); // バイクの正面画像を描画

  // 横画像の処理
  pushMatrix(); // 現在の描画設定を保存
  translate(width * 2 / 3 - 150, height / 2 + 75); // 横画像の位置を画面右側に設定
  sideAngle = atan2(y, z); // YとZデータからウイリー角度を計算
  if (degrees(sideAngle) > 45) {
    currentSide = bikeSide45; // 傾きが45度を超えたら画像を切り替え
  } else {
    currentSide = bikeSide; // デフォルト画像を使用
  }
  rotate(-sideAngle); // 横画像を傾ける
  image(currentSide, 0, 0); // 横画像を描画
  popMatrix();
}

// シリアルデータを受信
void serialEvent(Serial myPort) {
  input = trim(myPort.readStringUntil('\n')); // 改行までのデータを取得
  println("Received: " + input); // 受信データをコンソールに表示(デバッグ用)
  
  // カンマ区切りで分割
  String[] values = split(input, ',');
  if (values.length == 3) { // XYZデータが正しく受信できている場合のみ処理
    x = float(values[0]); // X軸データ(今回は使用しない)
    y = float(values[1]); // Y軸データ
    z = float(values[2]); // Z軸データ
  }
}

コードの解説

  1. bikeFrontbikeSide の画像を読み込む
    • bikeFront は正面画像、bikeSide は横画像として読み込みます。追加で、45度の横画像 bikeSide45 も読み込みます。
  2. atan2(y, z) 関数で角度を計算
    • Y軸とZ軸の加速度データを基に、atan2() 関数で傾きの角度を計算します。この角度により、バイクの画像を回転させます。
  3. 傾きが45度を超えた場合に画像を切り替え
    • 横からの画像は、傾きが45度を超えると bikeSide45 に切り替え、傾きがそれ以下の場合は bikeSide を表示します。
  4. シリアル通信でのデータ受信
    • Arduinoから送信された加速度データ(X, Y, Z)を受け取り、リアルタイムでバイクの画像を制御します。

まとめ

この方法を使うと、ADXL345ジャイロセンサーから得たデータをリアルタイムにProcessingでグラフィカルに表示できます。バイクの画像を傾けたり、画像を切り替えたりすることが可能です。このアプローチは、センサーから得たデータに基づいて動的なビジュアルを作成する際に非常に効果的です。

ここまで読んでいただきありがとうございました。

目次

スクールの紹介

最後に宣伝をさせてください。

技術で未来を切り拓く―あなたの夢を現実にするプログラミングスクール

Webデザインやプログラミングで成功を目指している方々にとって、このオンラインスクールは夢を叶えるための最適な場所です。皆さんのキャリアを次の段階へと引き上げるためにデザインされたこのスクールは、一人ひとりの成功を心から願い、それを実現するための全てを提供しています。ここでは、このスクールの魅力について詳しくご紹介します。

◆圧倒的な費用対効果
このオンラインプログラミングスクールは、Web系教育において最高の費用対効果を提供しています。多くの高額スクールが存在する中で、ここではリーズナブルな価格で、質の高い教材、無限のサポート、そして実際に市場で求められるスキルの習得機会を提供しています。

◆現役フリーランスの講師陣
講師たちは全員、現役のフリーランスプロフェッショナルです。市場で活躍している講師から直接、最新のトレンドや実践的なスキルを学べるのは、このスクールの大きな特徴です。

◆柔軟な学習コース
固定のコースがなく、学習者の興味やニーズに応じて自由に学習できます。進路変更も自由で、最低契約期間は1ヶ月という柔軟性を持っています。自分のペースで、自分に合った学習が可能です。

◆無制限の添削とサポート
理解できるまで、そして満足するまで、無制限に添削と質問への回答を提供しています。進路相談や技術面以外の相談にも対応しており、全面的にサポートします。

◆社長から学べる貴重な機会
デザイナー、プログラマー、ディレクター、マーケターとして豊富な経験を持つ社長から直接学べるのも、このスクールの特別な点です。他のスクールでは得られない、貴重な機会です。

◆実績作りへの徹底的なサポート
就職、転職、フリーランスとして成功するためには、高品質な実績が必要です。生徒の作品レベルを最大限に高め、市場で求められる実績を作り上げることに力を入れています。案件を取得できない生徒には、直接案件を提供することもあります。

◆メッセージからの約束
高額な授業料を支払わせて結果を出せないスクールとは違い、物理的なサポートは提供できないかもしれませんが、継続的な努力を通じて最高の結果を出せるようにサポートします。一緒に不正なスクールを撲滅し、あなたの夢を実現しましょう。

このプログラミングスクールは、Webデザインやプログラミングでの成功を目指す方々に必要な全てを備えています。今こそ、このコミュニティに参加し、あなたのキャリアを加速させる時です。

詳しくはこちら↓

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

この記事を書いた人

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

目次