Arduino + 3軸加速度センサ + Processing シリアル通信

バージョン情報
Arduino Nano , Arduino IDE 1.0.5 , processing 2.2.1 , windows 8.1

3軸加速度センサを使ってみた。

材料

加速度センサ:MPU6050
Arduino nano

参考にしたページ:こちら

回路

MPU6050_nano

Arduino ソース

expampleのMPU6050_raw.inoをほぼそのまま使用。

#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"

MPU6050 accelgyro;

int16_t ax, ay, az;
int16_t gx, gy, gz;

#define LED_PIN 13
bool blinkState = false;

String str_out;

void setup() {
    Wire.begin();
    Serial.begin(38400);

    // initialize device
    Serial.println("Initializing I2C devices...");
    accelgyro.initialize();

    // verify connection
    Serial.println("Testing device connections...");
    Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");

    // configure Arduino LED for
    pinMode(LED_PIN, OUTPUT);
}

void loop() {
    // read raw accel/gyro measurements from device
    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

    str_out = String(ax) + "," + String(ay) + "," + String(az) + "," + String(gx) + "," + String(gy) + "," + String(gz);
    Serial.println(str_out);
    
    // blink LED to indicate activity
    blinkState = !blinkState;
    digitalWrite(LED_PIN, blinkState);
}

Processing ソース

加速度センサの値(ax,ay,az)の値を使ってBoxを表示させてみた。
cameraの使い方は前回の記事を参照。
シリアル通信の記事はこちらを参照。

import processing.serial.*;

PShape box1;
PVector v_center, v_camera;
Serial myPort;
int lf = 10;
String str_get_data = null;
String buf[];
int ax,ay,az;

void setup(){

  size(500,500,P3D);

  v_center = new PVector(0.0,0.0,0.0);
  v_camera = new PVector(700.0,900.0,700.0);

  box1 = createShape(BOX,100,100,100);
  box1.translate(50,50,50);
  
  myPort = new Serial(this, "COM5", 38400);  
}

void draw(){
  background(200);

  //枠  
  noFill();
  strokeWeight(1);
  stroke(0,0,0);
  translate(250, 250, 250);
  box(500, 500, 500);
  translate(-250, -250, -250);
  
  //XYZ方向
  strokeWeight(3);
  stroke(255,0,0);
  line(0,0,0,500,0,0);
  stroke(0,255,0);
  line(0,0,0,0,500,0);
  stroke(0,0,255);
  line(0,0,0,0,0,500);
 
  //オブジェクト配置
  shape(box1);
  
  //カメラ配置
  camera(v_camera.x, v_camera.y, v_camera.z, v_center.x,v_center.y,v_center.z, 0.0, 0.0, -1.0);

}

void serialEvent(Serial myPort){
  str_get_data = myPort.readStringUntil(lf);
       
  if (str_get_data != null){
    str_get_data = trim(str_get_data);    //改行コード取り除き
    buf = split(str_get_data,",");
    
    try{
      fill(255,127,0);
      stroke(0,0,0);
      ax = int(buf[0])/100*2;
      ay = int(buf[1])/100*2;
      az = int(buf[2])/100*2;
      box1 = createShape(BOX,ax,ay,az);
      box1.translate(ax/2,ay/2,az/2);
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
}

動作確認

コメントを残す

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