Arduinoを使用して、ジャイロセンサMPU6050の角度変化をProcessingで表現したいです。
■現在の状況
正確な角度がProcessingの動きに反映されない
小刻みにモデルが動く(delayやxGyroValueの閾値を入れるが完ぺきには改善されません)
■Arduino
Arduinoから以下信号をI2CでProcessingに送っております。
xGyroValue = Roll
yGyroValue = Pitch
zGyroValue = Yaw
■Processing
processing
1import processing.serial.*; 2 3 int lf = 10; 4 Serial myPort; 5 String datline = null; 6 PrintWriter file; 7 8float xGyroValueLast = 0; 9float yGyroValueLast = 0; 10float zGyroValueLast = 0; 11 12float xGyroValue; 13float yGyroValue; 14float zGyroValue; 15 16float xGyroAngleValue1 = 0; 17float yGyroAngleValue1 = 0; 18float zGyroAngleValue1 = 0; 19float xGyroAngleValue = 0; 20float yGyroAngleValue = 0; 21float zGyroAngleValue = 0; 22 23float time = 0; 24 25void setup(){ 26 println(Serial.list()); 27 frameRate(20); 28 noStroke(); 29 file = createWriter("xGyroValue.csv"); 30 31myPort = new Serial(this, "COM3", 115200); 32myPort.clear(); 33datline = myPort.readStringUntil(lf); 34datline = null; 35 } 36 37void settings(){ 38 size(1200, 600, P3D); 39 } 40 41void draw() { 42 background(0); 43 pushMatrix(); 44 translate(width / 2, height / 2, -30); 45 46while( myPort.available() > 0) { 47 datline = myPort.readStringUntil(lf); 48 if(datline != null){ 49 println(datline); 50 51float[] splitdata = float(datline.split(",")); 52if(splitdata.length == 4) { 53 time = splitdata[0]; 54 xGyroValue = splitdata[1]; 55 yGyroValue = splitdata[2]; 56 zGyroValue = splitdata[3]; 57} 58 59 xGyroAngleValue1 = xGyroValueLast - xGyroValue; 60 yGyroAngleValue1 = yGyroValueLast - yGyroValue; 61 zGyroAngleValue1 = zGyroValueLast - zGyroValue; 62 63 xGyroValueLast = xGyroValue; 64 yGyroValueLast = yGyroValue; 65 zGyroValueLast = zGyroValue; 66 67 for(int i = 0; i < 50; i++){ //50回センサ値を読み込んで平均を算 68 xGyroAngleValue = xGyroAngleValue + xGyroAngleValue1; 69 yGyroAngleValue = yGyroAngleValue + yGyroAngleValue1; 70 zGyroAngleValue = zGyroAngleValue + zGyroAngleValue1; 71 } 72 xGyroAngleValue = xGyroAngleValue / 50; 73 yGyroAngleValue = yGyroAngleValue / 50; 74 zGyroAngleValue = zGyroAngleValue / 50; 75 76 if(xGyroValue < 1){ 77 xGyroValue = 0; 78 } 79 80 if(yGyroValue < 1){ 81 yGyroValue = 0; 82 } 83 84 if(zGyroValue < 1){ 85 zGyroValue = 0; 86 } 87 88 println(time); 89 println(xGyroValue); 90 println(yGyroValue); 91 println(zGyroValue); 92 93//file.print(time);file.print(",");file.print(xGyroAngleValue);file.print(",");file.print(yGyroAngleValue);file.print(",");file.println(zGyroAngleValue); 94 95 } 96} 97 rotateX(xGyroAngleValue); 98 rotateY(yGyroAngleValue); 99 rotateZ(zGyroAngleValue); 100 101scale(100); 102beginShape(QUADS); 103 104fill(255, 0, 0); 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(0, 255, 0); 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 116fill(0, 0, 255); 117 vertex( 3, 0.5, -0.5); 118 vertex(-3, 0.5, -0.5); 119 vertex(-3, -0.5, -0.5); 120 vertex( 3, -0.5, -0.5); 121 122fill(255, 255, 0); 123 vertex(-3, 0.5, -0.5); 124 vertex(-3, 0.5, 0.5); 125 vertex(-3, -0.5, 0.5); 126 vertex(-3, -0.5, -0.5); 127 128fill(0, 255, 255); 129 vertex(-3, 0.5, -0.5); 130 vertex( 3, 0.5, -0.5); 131 vertex( 3, 0.5, 0.5); 132 vertex(-3, 0.5, 0.5); 133 134fill(255, 0, 255); 135 vertex(-3, -0.5, -0.5); 136 vertex( 3, -0.5, -0.5); 137 vertex( 3, -0.5, 0.5); 138 vertex(-3, -0.5, 0.5); 139 140endShape(); 141popMatrix(); 142delay(100); 143 } 144 145 void keyPressed(){ 146 if (key == ENTER) { 147 file.flush(); 148 file.close(); 149 exit(); 150 } 151}
このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
回答2件
あなたの回答
tips
プレビュー