前提・実現したいこと
現在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節にあるだろうということはわかるのですがそこでどのような問題が起きているのかが理解できていないため何を調べたらよいのかがわからないという状況です。
補足情報
見当違いの質問をしているかもしれませんが、お許しください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/03 03:59
2020/08/03 04:04
2020/08/03 04:05