動き系のセンサーは、どんなものか調べてみるのと、動力系と合わせて倒立振子をつくってみようと思ってます。
どんなものかは、Youtubeに沢山出てます。
センサー情報を元にモーターを制御するのはいろいろと難しい感じですが、結構サンプルもあるのでなんとかなりそうな感じです。目に見えて動くものはわかりやすいのでお勉強にはよろしいかと。
購入したのはBOSCH社BMX055です。めちゃくちゃ小さいです。3つ並んだ真ん中のチップに3つのセンサーが入ってます。他は電源レギュレータと信号線のレベル変換器です。
I2Cのアドレスや駆動電圧により、ジャンパーが必要です。
JP1,JP2,JP3はすべてオープンのため、I2Cアドレスは以下のとおりです。
加速度 | 0x19 |
ジャイロ | 0x69 |
磁気 | 0x13 |
JP6オープン,J7ショート,J8オープンとして、電源は3.3V,信号レベルは3.3Vに設定しました。J7は基盤の裏面を半田でジャンパーします。写真わかりにくいですがAEの右上を半田でジャンパーしてます。
ESP32基盤はこんな感じでいろいろと乗っかってます。
動作確認はmicropythonで実施します。先人の知恵をGithubで見つけました。すんなりいくかと思えばそうはいかずです。Pybordで動いたコードのようで、ちょっと修正が必要です。センサーは、I2Cアドレス3つでそれぞれ読み出さないといけないので、加速度、ジャイロ、地磁気センサーそれぞれを1つのデバイスに入れた感じです。コードもそのようになっていて、センサー毎にライブラリになってました。
こちらを参考に
https://github.com/micropython-IMU/micropython-bmx055
bma2x2.py→加速度センサ
bmg160.py→ジャイロセンサ
bmm050.py→地磁気センサ
それぞれがライブラリになっていて、importで読み込む必要があります。
今日のところは、加速度とジャイロまで読み取れるところまで出来ました。
uPyCraftの画面キャプチャーです。下の黄色枠に加速度の3軸(x,y,z)、ジャイロの3軸(x,y,z)計6個の値を0.5秒毎にESP32が読み取って表示しています。
地磁気は次回に。この値だけではよくわからないので、時間変化とともにわかるように可視化も必要です。センサー動かさなくても値が微妙に変わっているので、感度の調整や値の補正も必要なのかもです。
シリアルにセンサー情報をprintするためのpythonコードです。いろいろといらない部分もありますが。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# BOSCH bmx055 sensor | |
# bma2x2.py bmg160.py が必要 | |
from machine import Pin, I2C | |
from bma2x2 import BMA2X2 | |
from bmg160 import BMG160 | |
import time | |
i2cBMX055 = I2C(scl=Pin(4), sda=Pin(5)) | |
print('I2C setup') | |
accl=BMA2X2(i2cBMX055, 0x19) | |
gyro=BMG160(i2cBMX055, 0x69) | |
# accl sensor | |
print('accl.Range=',BMA2X2.get_range(accl)) | |
print('accl.Filter_bw=',BMA2X2.get_filter_bw(accl)) | |
time.sleep(1) | |
# gyro sensor | |
# BMG160.get_filter_bwは読めない。timing? | |
print('gyro.Range=',BMG160.get_range(gyro)) | |
#print('o.filter_bw=',BMG160.get_filter_bw(gyro)) | |
while True: | |
print('accl:',BMA2X2.xyz(accl),'gyro',BMG160.xyz(gyro)) | |
time.sleep(0.5) |