前提・実現したいこと
プログラミング1ヵ月の初級者です。
電子工作が好きでIoTを最近始めました。
arduinoではC言語で動かすことができたのですが、最近wifiを使いたい事のもあってESP8266で動かそう。
ついでにマイクロパイソンがお勧めとの事で1から書いて見たのですが、帰ってくるデータは0.0.0となってしまい困っております。
以下のコードを参考にしたり、([参考コード Github]](https://github.com/adamjezek98/MPU6050-ESP8266-MicroPython/blob/master/mpu6050.py))
エラーは出ていない為デバッグとして各値をprint()で調べてもデータが取れない状況です。
最低限の行動ではありますがデータシートやレジスタ、リファレンスは読める部分はとにかく読み漁りました。
とても有名なセンサとの事でここでつまずいてしまってとても落ち込んでおります。。
どうかヒントを頂けませんでしょうか。。?
該当のソースコード&試したこと###
python
1from machine import Pin,I2C 2import struct 3import time 4 5class MPU6050: 6 def __init__(self, i2c,addr=0x68): 7 self.i2c = i2c 8 self.addr = addr 9 self.i2c.writeto(self.addr,0x6B) #センサをリセット 10 print("init") 11 print(self.i2c.readfrom_mem(self.addr,0x6B,1)) time.sleep_ms(50) #センサがリセットされるのを待つ 12 13 def read_data(self): #accelxでwriteto()を使いここでバイトを読む&値を取り出そうとしていたが上手くいかず。 14 while True: 15 try: 16 data = self.i2c.readfrom_mem(self.addr,0x3B,6) #センサから返される6バイトを読む 17 except OSError: 18 pass 19 else: 20 if len(data) == 6: #6バイト読んだらループから抜ける 21 break 22 _val,_checksum = struct.unpack('>hB',data) #読んだ6バイトから値とチェックサムを取り出す 23 return _val 24 25 def accelx(self): 26 return self.i2c.readfrom_mem(self.addr,0x3B,2) #加速度センサX HとLの2バイトを読む。アクセスしたい所が連番なので下の関数 27 #(accelyとaccelz)を消して6バイト読んでもいいのかも知れない。 28 #(1つ下のreturnが悪いかもと思いreturnをこの分に仮設定。 29 #この一文もwriteto(self.addr,0x38)でした。) 30 //return self.read_data() #read_data関数で値とチェックサムを取り出す。 31 def accely(self): 32 return self.i2c.readfrom_mem(self.addr,0x3D,2) #加速度Y 33 //return self.read_data() 34 def accelz(self): 35 return self.i2c.readfrom_mem(self.addr,0x3F,2) #加速度Z 36 #return self.read_data() 37 38def main(): 39 i2c = I2C(scl = Pin(5), sda = Pin(4), freq = 115200) 40 mpu6050 = MPU6050(i2c) 41 print() 42 43 while True: 44 print(mpu6050.accelx(),',',mpu6050.accely(),',',mpu6050.accelz()) 45 time.sleep_ms(1000) 46 47if __name__ == '__main__': 48 main()
補足情報(FW/ツールのバージョンなど)
windows10
エディターVScode
ファイル転送ampy
pythonは2.7と3です。今回は2.7で書きました。
ハード
ESP8266 or ESP32
センサ MPU6050
又、大変厚かましいと存じておりますが、最初に取り上げました参考サイト様のbytes_tointからが1行ずつ調べても何をやっているのかさっぱりわかりませんでした。
特にbit演算の部分が何を求めているのか気になって夜も少ししか寝れません。。↓
python
1 2 def bytes_toint(self, firstbyte, secondbyte): 3 if not firstbyte & 0x80: 4 return firstbyte << 8 | secondbyte 5 return - (((firstbyte ^ 255) << 8) | (secondbyte ^ 255) + 1) 6 7 def get_values(self): 8 raw_ints = self.get_raw_values() 9 vals = {} 10 vals["AcX"] = self.bytes_toint(raw_ints[0], raw_ints[1]) 11 vals["AcY"] = self.bytes_toint(raw_ints[2], raw_ints[3]) 12 vals["AcZ"] = self.bytes_toint(raw_ints[4], raw_ints[5]) 13 vals["Tmp"] = self.bytes_toint(raw_ints[6], raw_ints[7]) / 340.00 + 36.53 14 vals["GyX"] = self.bytes_toint(raw_ints[8], raw_ints[9]) 15 vals["GyY"] = self.bytes_toint(raw_ints[10], raw_ints[11]) 16 vals["GyZ"] = self.bytes_toint(raw_ints[12], raw_ints[13]) 17 return vals # returned in range of Int16