理解不十分だけど、STEVAL-DRONE01をMicroPythonで制御できるように、加速度センサ(LSM6DSL)のドライバをC言語で作成した。以下は動作させた例
>>> MicroPython v1.16-243-g8c4ba575f-dirty on 2021-11-07; STEVAL-DRONE01 with STM32F401CC >>> import stdrone >>> dir(stdrone) ['__class__', '__name__', 'STM32_LED', 'STM32_LSM6DSL', 'STM32_SPI3W'] >>> spi = stdrone.STM32_SPI3W() >>> sens = stdrone.STM32_LSM6DSL(spi) >>> dir(sens) ['__class__', 'start', 'get_gyro', 'get_xl'] >>> sens.start(2,2) >>> sens.get_gyro() (3, -5, -51) >>> sens.get_xl() (867, 4271, 15834)
get_xl()でLSM6DSLの加速度センサの値を取得する。DRONEをほぼ平坦に置いた状態なので、Z軸の1G分が検知されている。ジャイロ(角加速度)は誤差が出ている(置いたままでも0にならない)。
PWMはMicroPythonに実装されているのをそのまま使えるので、これで制御するための下回りはそろった。次は本命の制御プログラムの試作になる。
■追記
DRONEをいろんな角度にして、加速度センサの計測値を確認
DRONEを水平に置いた場合(Z軸で1Gを検知)
(292, -272, 16572) # 0x40bc
DRONEを真横に倒した場合(X軸で90度回転、Y軸で加速度を検知)
(-410, 16192, -1770) #0x3f40
DRONEをつんのめるように倒した場合(Y軸で90度回転、X軸で加速度を検知)
(-16270, -991, 7740) #0xc072
センサの値は符号付き16bit長なので、本来値域は-32768(0x8000) ~ 32767(0x7fff) かと思えるが、実際の計測値は値域の半分になっている。。なぜだろうか??仕様書を読み直さないと理由が分からない。
■追記
6DOFセンサを初期化する際、サンプリングレートを指定できるようにしているのだが、1,2,3の数値を直接指定するのはあまりよろしくないと思い、クラスの定数を定義した。
>>> sens = stdrone.STM32_LSM6DSL(spi) >>> dir(sens) ['__class__', 'start', 'HIGH', 'LOW_POWER', 'NORMAL', 'get_gyro', 'get_xl'] >>> sens.HIGH 3 >>> sens.LOW_POWER 1 >>> sens.NORMAL 2 >>>
これで、sens.start(sens.NORMAL, sens.NORMAL)と呼び出すことができる。動作は、sens.start(2, 2)と同じなのだが。。
■追記
時間のある時はずっと飛ばないDroneプログラミングをやっていたが、またヨメから、いつもドローンばっかりやってからに!とえらく怒られた。ちょっと静かにする予定。