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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

Q&A

2回答

2277閲覧

micropython ESP8266 この加速度センサがどうしても使えません。。

noi_bigin

総合スコア4

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

1グッド

1クリップ

投稿2020/03/12 10:48

編集2020/03/13 01:01

前提・実現したいこと

プログラミング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
s.k👍を押しています

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

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

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

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

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

noi_bigin

2020/03/12 11:44

申し訳ございません。。 承知致しました。 参考URLも感謝です!
thkana

2020/03/12 12:01

インデントのないPythonのプログラムなんて見る気にならないので見ていませんが、 I2Cでデータを読み込んだ段階ではなにか意味ありげなデータが取れているのですか? また、Cではどうなるのですか。 [デバイス]-(i2c)-[ESP8266]-[演算処理]-[出力] とデータが流れるはずですが、ここまでは来ている/ここからおかしくなる、というポイントを見つけるのがまず最初にやることだと思います。 > bit演算の部分が何を求めているのか これは全く別の質問ですね?
ozwk

2020/03/12 12:22

i2c = I2C(scl = Pin(5), sda = Pin(4), freq = 115200) 115200Hz…?
noi_bigin

2020/03/12 12:55

thkana 様 申し訳ございません。 コードブロックを使ってみたのですが潰れてしまいました。 各関数をmain関数内で呼び出すと0.0.0もしくは同値が16進数で出ます。 テラタームで見ておりますがそれらの数値のみです。 I2c.scanも行い配線は正しくされている事が確認されておりまして怪しいのは間違ったレジスタに読み書きしているのかと睨めっこ状態で此方に縋り付いている現状です。。 色々すいません。。
noi_bigin

2020/03/12 12:58

ozwk 様 もしかして。。 ESP8266のbaudrate入れてますねこれ。。 調べて修正してみます!有難うございます!
noi_bigin

2020/03/12 13:08 編集

thkana 様 度々すいません。。 >> bit演算の部分が何を求めているのか >これは全く別の質問ですね? 温度や角速度は私は必要としていないので抜いておりますが、 今回の質問の物と同じMPU6050のセンサデータを表示するものです。 これくらいスマートに書きたいという悩みから勝手にひとつの質問と考えてしまっておりました。 申し訳ございません。
ozwk

2020/03/13 02:56 編集

I2Cのクロックは標準は100kHzです 100kHzにして動きますか?
guest

回答2

0

ESP8266には加速度センサは内蔵されてません。

#なにかセンサを外付けされてるんでしょうか

投稿2020/03/12 23:08

y_waiwai

総合スコア87784

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

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

noi_bigin

2020/03/12 23:15

y_waiwai 様 詳細記載せず失礼致しました。 センサはMPU6050を使用しております。
y_waiwai

2020/03/12 23:22

今からでも遅くないので、その詳細を質問に追記しましょう。 で、あと回路図があればそれも提示しましょう。 #意味不明な質問には回答付きませんよ
noi_bigin

2020/03/13 00:38

承知しました!丁寧なご指摘有難うございます! 勉強不足で大変申し訳ないのですが意味不明な部分とはどこがそうなのでしょうか。。? 全部でしたらこの質問は取り下げもう1週間考えてみます! ダメならpythonは向いてないですからCで行こうと思います。 とにかく回路図すぐに書きます!
y_waiwai

2020/03/13 01:18

> 意味不明な部分 センサが何か、どう接続してるのか、というのが不明では、推測での回答にならざるを得ず、そうするぐらいなら静観しとこう、ということになってしまいます 必要な情報は載せていただいたので、取り下げる必要はありません。
noi_bigin

2020/03/13 01:22

情報不足の件、大変申し訳ございませんでした。 又、そう考えていただいた事うれしく思います。
y_waiwai

2020/03/13 01:26

CPUは違いますが、掲載されてるコードはそのまま動かせれると思います
guest

0

その加速度センサは持っていないので、Arduino M0/Pro(3.3Vで使うため)をI2Cスレーブに仕立てて適当な値を返すようにして、そのプログラムを走らせて見ました。
一応、m0側のダミープログラム

Arduino

1#include <Wire.h> 2int data = 0xffff; 3void setup() { 4 Wire.begin(0x68); 5 Wire.onReceive(receiveEvent); 6 Wire.onRequest(requestEvent); 7 Serial.begin(115200); 8} 9 10void loop() { 11 Serial.print(millis()); 12 Serial.print(" "); 13 Serial.println(data,HEX); 14 delay(100); 15} 16void receiveEvent(int howMany) 17{ 18 data = Wire.read(); // receive byte as a character 19} 20void requestEvent() 21{ 22 for(int i=0;i<128;i++){ 23 Wire.write(data+i); 24 } 25}

まず、私の手元ではself.i2c.writeto(self.addr,0x6B)はエラーになりますが、それで動いているのですか? こちらではself.i2c.writeto(self.addr, '\x68')等とする必要がありました。

少なくともI2Cに乗せたデータでなにかしらの表示、少なくとも'0.0.0'でないものは得られるので、センサの使い方に問題がある、というのが可能性でしょうか。ただし、そのプログラムで'0.0.0'という表示にはなり得ない、というのは非常に気になるところではあります。
(先程の'\x68'の件もあり、質問の情報が実際と違うのではないかと疑っています)

i2cの周波数は115200でも動いています。センサーデバイスが対応していない、という可能性は無くはないですが(I2Cの規格上考えにくいですけれど)、1割高くなって全く反応しなくなるということも考えにくいので、それは主な問題ではないでしょう。I2Cの通信が成立していなければまた別のエラーとして検出されるはずです。

bytes_tointについては、この質問内では敢えて回答しません。


回路図について
SwitchScienceのサイトにあるリンクから辿ってデータシートを見てみました。

  • 22ページの標準参考回路に入っているコンデンサ類が一切入っていません。C1,C2,C4は無くてもなんとか動くかも知れませんが(但し安定性は保証できませんね)、チャージポンプのC3が無くて動くかなぁ?

  • 11pinのFSYNCは21ページで、"Connect to GND if unused."だそうです。書いてあるとおりにしましょう。

  • 1pinのCLKINも同上

  • 8PinのVLOGICが未接続なのはかなり怪しいです。

  • ついでに、SwitchScienceのボードの回路図を見てみると、I2CのID切り替えの9pinはLowで0x68, Highで0x69となっています。オープン時にどうなるかはどこかにドキュメントがあるのでしょうが、普通はオープンでは内部プルアップでHigh扱いのことが多い(つまり0x69設定)と思いますがどうでしょう。

(感想:これ、動くのか?)

この仕様書、I2Cのレジスタマップとか載ってないのかな? そのへんは何で確認しましたか?


せっかくmicroPythonでインタプリタ環境なのですから、REPLで

Python

1ad=0x68 # 前述 本当にこれでいいのかは要確認 2i2c = I2C(scl = Pin(5), sda = Pin(4), freq = 10000) #お試しとしてクロックを下げてみる 3i2c.writeto(ad,'\x6B') # リセット これで正しいのか、ドキュメントは一応確認して下さい。少なくとも参考としているgithubに載っているやり方とはちょっと違っています 4#手打ちなら待ち時間の設定は不要でしょう 5i2c.readfrom_mem(ad,0x3B,2)

とかして、デバイスとの通信がちゃんとできているのか、それらしい値が取得出来るのかを単独で試してみればよいのではないでしょうか。

投稿2020/03/13 16:19

編集2020/03/14 00:45
thkana

総合スコア7652

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問