質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

2回答

2465閲覧

Arduinoを使用して、ジャイロセンサMPU6050の角度変化をProcessingで表現したいです。

msmsmsmsmsms

総合スコア15

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2019/06/12 12:11

編集2019/06/12 13:09

Arduinoを使用して、ジャイロセンサMPU6050の角度変化をProcessingで表現したいです。

■現在の状況
正確な角度がProcessingの動きに反映されない
小刻みにモデルが動く(delayやxGyroValueの閾値を入れるが完ぺきには改善されません)

■Arduino
Arduinoから以下信号をI2CでProcessingに送っております。
xGyroValue = Roll
yGyroValue = Pitch
zGyroValue = Yaw

■Processing出力結果
イメージ説明

■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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/06/12 12:13

このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
guest

回答2

0

ベストアンサー

ジャイロで得られるのは回転の加速度です。
角度に変換するためには積分しなきゃいけないはずですが、そういうプログラムになっていないように見えます。また、スケーリングもめちゃくちゃでは。

私はMPU9250しか持っていないので確認は出来ませんが、MPU6050で検索すればサンプルプログラムは見つかると思います。ありがちなArduino(C++)で書かれていてもProcessing(Java)に書き換えるのはそんなに難しくないと思いますので、確認されてみては。

投稿2019/06/15 07:01

thkana

総合スコア7652

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

どういうフォーマットでシリアルで送ってるかわかりませんが、
想定通りに受信されてるでしょうか。そこらへんをまずチェックしましょう

#想定どおりに受信されてるならあとはデータの取扱の問題


for(int i = 0; i < 50; i++){ //50回センサ値を読み込んで平均を算

xGyroAngleValue = xGyroAngleValue + xGyroAngleValue1; yGyroAngleValue = yGyroAngleValue + yGyroAngleValue1; zGyroAngleValue = zGyroAngleValue + zGyroAngleValue1; }

これ、単に同じ値を50回足してるだけで、平均にもなってないですね
また
xGyroAngleValue、yGyroAngleValue、zGyroAngleValue の初期値はどうなってるねん、という問題もありますねー

投稿2019/06/12 12:24

編集2019/06/12 12:41
y_waiwai

総合スコア87784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

msmsmsmsmsms

2019/06/12 12:27

データは想定通り受信しております。 そのデータを使用してProcessingで表現するところに苦心しております。
y_waiwai

2019/06/12 12:32

んでは、 > println(time); > println(xGyroValue); > println(yGyroValue); > println(zGyroValue); はきちんと受信データ通りの数値が出ている?
msmsmsmsmsms

2019/06/12 13:10

Processing受信データを追記いたしました。 おかしな点や足りない点がありましたらご指摘いただけないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問