Arduinoに接続したジャイロセンサKXR94-2050の動きをProcessingに表示したいです
■困っていること
Processingに表示したBOXが滑らかに動きません
滑らかに動くようにご指南ください
Arduino
1#include <I2Cdev.h> 2 3String str_out; //文字列 4uint32_t time; //時間 5unsigned long times = 0; 6 7const int xAxisPin = 0; // 加速度センサのx軸に接続したアナログピンの番号 8const int yAxisPin = 1; // 加速度センサのy軸に接続したアナログピンの番号 9const int yAxisPin = 2; 10 11void setup() { 12 Serial.begin(57600); 13} 14 15void loop() { 16 times = millis(); 17 18 int xAxisValue = analogRead(xAxisPin); // x軸とy軸の値を読み取る 19 int yAxisValue = analogRead(yAxisPin); 20 int zAxisValue = analogRead(zAxisPin); 21 22 str_out = String(times) + ", " + String(xAxisValue) + ", " + String(yAxisValue) + ", " + String(zAxisValue); 23 Serial.println(str_out); 24 25 delay(100); 26} 27 28// 今回は-1から1までにスケーリングする必要があるためfloatで同じ計算をする 29float mapInFloat(float x, float iMin, float iMax, float oMin, float oMax) { 30 return (x - iMin) * (oMax - oMin) / (iMax - iMin) + oMin; 31}
Processing
1import processing.serial.*; 2 3 int lf = 10; 4 Serial myPort; 5 String datline = null; 6 PrintWriter file; 7 8float xAxisValue; 9float yAxisValue; 10float zAxisValue; 11float time; 12 13final float ratio = 0.2; // 加速度センサの前回の値と今回の値をミックスする比率 14 15float xAxisValueLast = 511; // 前回のx軸とy軸の値(初期値は0〜1023の中央値) 16float yAxisValueLast = 511; 17 18void setup(){ 19 println(Serial.list()); 20 frameRate(20); 21 noStroke(); 22 file = createWriter("sholder0614.csv"); 23 24myPort = new Serial(this, "COM5", 57600); 25myPort.clear(); 26datline = myPort.readStringUntil(lf); 27datline = null; 28 } 29 30void settings(){ 31 size(1200, 600, P3D); 32 } 33 34void draw() { 35 background(0); 36 pushMatrix(); 37 translate(width / 2, height / 2, -30); 38 39while( myPort.available() > 0) { 40 datline = myPort.readStringUntil(lf); 41 if(datline != null){ 42 43float[] splitdata = float(datline.split(",")); 44if(splitdata.length == 4 ) { 45 time = splitdata[0]; 46 xAxisValue = splitdata[1]; 47 yAxisValue = splitdata[2]; 48 zAxisValue = splitdata[3]; 49} 50 51 float xAxisValueSmoothed = xAxisValue * ratio + xAxisValueLast * (1.0 - ratio); //スムージング 52 float yAxisValueSmoothed = yAxisValue * ratio + yAxisValueLast * (1.0 - ratio); 53 54 xAxisValueLast = xAxisValueSmoothed; // 前回の値としてスムージングした値をセット 55 yAxisValueLast = yAxisValueSmoothed; 56 57 float xAxisSinTheta = map(xAxisValueSmoothed, 306, 716, -1, 1); //値を-1から1までの範囲にしてsinθの値とする 58 float yAxisSinTheta = map(yAxisValueSmoothed, 306, 716, -1, 1); 59 60 xAxisSinTheta = constrain(xAxisSinTheta, -1, 1); // 値を-1から1までの範囲に制限 61 yAxisSinTheta = constrain(yAxisSinTheta, -1, 1); 62 63 //println(datline); 64 //println(time); 65 //println(asin(xAxisSinTheta)); 66 //println(-asin(yAxisSinTheta)); 67 68 rotateZ(asin(xAxisSinTheta)); // マウスの代わりに加速度センサの値でコントロール 69 rotateX(-asin(yAxisSinTheta)); 70 71 file.print(time); file.print(","); 72 file.print(xAxisValue);file.print(","); 73 file.println(yAxisValue); 74 } 75 } 76 77scale(100); 78beginShape(QUADS); 79 80fill(255, 0, 0); 81 vertex(-3, 0.5, 0.5); 82 vertex( 3, 0.5, 0.5); 83 vertex( 3, -0.5, 0.5); 84 vertex(-3, -0.5, 0.5); 85 86fill(0, 255, 0); 87 vertex( 3, 0.5, 0.5); 88 vertex( 3, 0.5, -0.5); 89 vertex( 3, -0.5, -0.5); 90 vertex( 3, -0.5, 0.5); 91 92fill(0, 0, 255); 93 vertex( 3, 0.5, -0.5); 94 vertex(-3, 0.5, -0.5); 95 vertex(-3, -0.5, -0.5); 96 vertex( 3, -0.5, -0.5); 97 98fill(255, 255, 0); 99 vertex(-3, 0.5, -0.5); 100 vertex(-3, 0.5, 0.5); 101 vertex(-3, -0.5, 0.5); 102 vertex(-3, -0.5, -0.5); 103 104fill(0, 255, 255); 105 vertex(-3, 0.5, -0.5); 106 vertex( 3, 0.5, -0.5); 107 vertex( 3, 0.5, 0.5); 108 vertex(-3, 0.5, 0.5); 109 110fill(255, 0, 255); 111 vertex(-3, -0.5, -0.5); 112 vertex( 3, -0.5, -0.5); 113 vertex( 3, -0.5, 0.5); 114 vertex(-3, -0.5, 0.5); 115 116endShape(); 117popMatrix(); 118} 119 120void keyPressed() { 121 if (key == ENTER) { 122 file.flush(); 123 file.close(); 124 exit(); 125 } 126}
回答1件
あなたの回答
tips
プレビュー