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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

Arduino

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

Q&A

解決済

1回答

2474閲覧

ArduinoでMPU6050とLEDを使って角度を可視化したいがうまくいかない

s004091674695

総合スコア1

C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

Arduino

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

0グッド

0クリップ

投稿2020/08/03 03:31

前提・実現したいこと

現在Arduinoで6軸加速度センサー(MPU6050)で取得したY軸のデータを用いてその値によってLEDを光らせようと思っています。検出されたおおよその角度をLEDの光っている個数で可視化させたいということです。8個のLEDを並べて+の角度と-の角度を4個ずつで表現します。

発生している問題

しかし実際にコードを実装してみると角度(acc_y)は0付近なのに対してLEDの光り方は角度が 0.80 > acc_y >= 0.60 の時のものになってしまいます。

ソースコード

ArduinoIDE

1#include <Wire.h> 2#define SRCLK (8) 3#define RCLK (9) 4#define SER (10) 5 6int16_t axRaw, ayRaw, azRaw, gxRaw, gyRaw, gzRaw, temperature; 7 //a:acceleration g:gyro(角加速度) 8float acc_x,acc_y,acc_z; 9float acc_angle_x,acc_angle_y,acc_angle_z; 10float gyr_x,gyr_y,gyr_z; 11 12void setup() { 13 pinMode(SER,OUTPUT); 14 pinMode(RCLK,OUTPUT); 15 pinMode(SRCLK,OUTPUT); 16 Serial.begin(9600); 17 Wire.begin(); 18 TWBR = 12; 19 20 Wire.beginTransmission(0x68); 21 Wire.write(0x6B); 22 Wire.write(0x00); 23 Wire.endTransmission(); 24 25 //Gyro初期設定 26 Wire.beginTransmission(0x68); 27 Wire.write(0x1C); 28 Wire.write(0x10); 29 Wire.endTransmission(); 30 31 //加速度センサー初期設定 32 Wire.beginTransmission(0x68); 33 Wire.write(0x1B); 34 Wire.write(0x08); 35 Wire.endTransmission(); 36 37 //LPF設定 38 Wire.beginTransmission(0x68); 39 Wire.write(0x1A); 40 Wire.write(0x05); 41 Wire.endTransmission(); 42 43} 44 45 46void loop() { 47 Wire.beginTransmission(0x68); 48 Wire.write(0x3B); 49 Wire.endTransmission(); 50 Wire.requestFrom(0x68, 14); 51 while (Wire.available() < 14); 52 axRaw = Wire.read() << 8 | Wire.read(); 53 ayRaw = Wire.read() << 8 | Wire.read(); 54 azRaw = Wire.read() << 8 | Wire.read(); 55 temperature = Wire.read() << 8 | Wire.read(); 56 gxRaw = Wire.read() << 8 | Wire.read(); 57 gyRaw = Wire.read() << 8 | Wire.read(); 58 gzRaw = Wire.read() << 8 | Wire.read(); 59 60 // 取得した加速度値を分解能で割って加速度(G)に変換する 61 acc_x = axRaw / 4096.0; //スケールファクタの設定 62 acc_y = ayRaw / 4096.0; //FS_SEL_2 4096LSB/g (Least Significant Bit:量子化単位) 63 LED(); 64 acc_z = azRaw / 4096.0; 65 66 // 加速度からセンサ対地角を求める 67 acc_angle_x = atan2(acc_y, acc_z) * 360 / (2.0*PI); 68 acc_angle_y = atan2(acc_x, acc_z) * 360 / (2.0*PI); 69 acc_angle_z = atan2(acc_x, acc_y) * 360 / (2.0*PI); 70 71 // 取得した角速度値を分解能で割って角速度(deg/s)に変換する 72 gyr_x = gxRaw / 65.5; //スケールファクタの設定 73 gyr_y = gyRaw / 65.5; //FS_SEL_1 65.5LSB/(deg/s) 74 gyr_z = gzRaw / 65.5; 75 76 77 Serial.print("acc_x:"); Serial.print(acc_x); Serial.print(","); 78 Serial.print("acc_y:"); Serial.print(acc_y); Serial.print(","); 79 Serial.print("acc_z:"); Serial.print(acc_z); Serial.print(","); 80 Serial.print("gyr_x:"); Serial.print(gyr_x); Serial.print(","); 81 Serial.print("gyr_y:"); Serial.print(gyr_y); Serial.print(","); 82 Serial.print("gyr_z:"); Serial.print(gyr_z); Serial.print(","); 83 //Serial.print("ang_x:"); Serial.print(acc_angle_x); Serial.print(","); 84 Serial.print("\n"); 85 delay(200); 86 87} 88 89//LEDの光るパターン 90byte MAX80 = 0b11110000; 91 92byte MAX60 = 0b01110000; 93 94byte MAX40 = 0b00110000; 95 96byte MAX20 = 0b00010000; 97 98byte all = 0b00000000; 99 100byte MAXm20 = 0b00001000; 101 102byte MAXm40 = 0b00001100; 103 104byte MAXm60 = 0b00001110; 105 106byte MAXm80 = 0b00001111; 107 108//シフトレジスタによるLEDの制御(acc_yが0.20変化するごとにLEDが点灯の仕方が変わる) 109void LED(){ 110 byte lightpoint;//光る場所 111 if(acc_y >= 0.80){ 112 lightpoint = MAX80; 113 } 114 else if(0.80 > acc_y >= 0.60){ 115 lightpoint = MAX60; 116 } 117 else if(0.60 > acc_y >= 0.40){ 118 lightpoint = MAX40; 119 } 120 else if(0.40 > acc_y >= 0.20){ 121 lightpoint = MAX20; 122 } 123 else if(0.20> acc_y >-0.20){ 124 lightpoint = all; 125 } 126 else if(-0.20 >= acc_y > -0.40 ){ 127 lightpoint = MAXm20; 128 } 129 else if(-0.40 >= acc_y > -0.60){ 130 lightpoint = MAXm40; 131 } 132 else if(-0.60 >= acc_y > -0.80){ 133 lightpoint = MAXm60; 134 } 135 else if(-0.80 >= acc_y ){ 136 lightpoint = MAXm80; 137 } 138 139 shiftOut(SER,SRCLK,LSBFIRST,lightpoint); 140 141 digitalWrite(RCLK,LOW); 142 digitalWrite(RCLK,HIGH); 143 }

試したこと

原因がif節にあるだろうということはわかるのですがそこでどのような問題が起きているのかが理解できていないため何を調べたらよいのかがわからないという状況です。

補足情報

見当違いの質問をしているかもしれませんが、お許しください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

else if(0.80 > acc_y >= 0.60){

おそらく、条件文の書き方が間違っています

else if((0.80 > acc_y) >= 0.60){

こういう解釈になりますが、これでいいのでしょうか

投稿2020/08/03 03:52

y_waiwai

総合スコア87774

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

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

s004091674695

2020/08/03 03:59

数学的な考え方で0.80 > (acc_y) >= 0.60 のようにしたいです。 そのために else if(0.80 > acc_y, acc_y>= 0.60) といった形にする必要があるということでしょうか?
y_waiwai

2020/08/03 04:04

それするなら、 else if((0.80 > acc_y)&&(acc_y >= 0.60)){ ですね。 #他のところも同様
s004091674695

2020/08/03 04:05

ありがとうございます。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問