chakokuのブログ(rev4)

日々のごった煮ブログです

STEVAL-DRONE01用MicroPython拡張モジュールの試作

理解不十分だけど、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プログラミングをやっていたが、またヨメから、いつもドローンばっかりやってからに!とえらく怒られた。ちょっと静かにする予定。