Arduinoで自作のフライトコントローラでクワッドコプター
10年くらい前に作った、自作のフライトコントローラが探したら出てきました。ArduinoのIDEでAtmega328PにUSBシリアル変換を使ってプログラムを書き込み。
受信機の信号を4チャンネル入れて、クワッド区コプター用にESCの出力を4チャンネル持ってて6DOFのIMUをI2Cで読みとって、あとはソフト頑張ってギリギリ浮くくらいまでには作りました。
数学的に弱いので移動平均と積算で簡易的なフィルタを作って姿勢を読み取って制御してたのでなかなか厳しかったです。
その時の動画はこちら。
これよりもう少し安定するところまでできたのですが、APMを購入したので乗せ換えてしまって動画は残ってませんでした。
今は、昨日試したMadgwickフィルタとか簡単に使えるライブライブラリが用意されてるのでもっと安定して飛ばせるかも。
受信機の信号を4チャンネル入れて、クワッド区コプター用にESCの出力を4チャンネル持ってて6DOFのIMUをI2Cで読みとって、あとはソフト頑張ってギリギリ浮くくらいまでには作りました。
数学的に弱いので移動平均と積算で簡易的なフィルタを作って姿勢を読み取って制御してたのでなかなか厳しかったです。
その時の動画はこちら。
これよりもう少し安定するところまでできたのですが、APMを購入したので乗せ換えてしまって動画は残ってませんでした。
今は、昨日試したMadgwickフィルタとか簡単に使えるライブライブラリが用意されてるのでもっと安定して飛ばせるかも。
BMP280 気圧センサ
ボッシュの高精度気圧センサを買ってみた。
以前のBMP085はあるけど、それより精度上がってるかな?と思って。
在庫を探したら、他にも気圧センサ持ってる。STマイクロエレクトロニクスのLPS331AP
これも結構精度良かった。
早速ピンをハンダ付けして、Arduinoで動作確認。
I2Cで接続かと思って接続して動かそうとしても、not foundになる。
サンプルを読んだら、デジタルピンで接続するようになってる。
ほか、参照したサイトは以下。
Arduinoで気圧センサー(GY-BMP280)を使い気圧を取得してみた‼
https://toccho.net/2022/05/10/gy-bmp280-arduino/
プロッタで表示。
データは少しスムージングしてる。
絶対値より相対値が欲しいので、相対値としては、0.02hPaくらい、感覚的には30㎝上下くらいの変化が取れてる。
以前のBMP085はあるけど、それより精度上がってるかな?と思って。
在庫を探したら、他にも気圧センサ持ってる。STマイクロエレクトロニクスのLPS331AP
これも結構精度良かった。
早速ピンをハンダ付けして、Arduinoで動作確認。
I2Cで接続かと思って接続して動かそうとしても、not foundになる。
サンプルを読んだら、デジタルピンで接続するようになってる。
ほか、参照したサイトは以下。
Arduinoで気圧センサー(GY-BMP280)を使い気圧を取得してみた‼
https://toccho.net/2022/05/10/gy-bmp280-arduino/
プロッタで表示。
データは少しスムージングしてる。
絶対値より相対値が欲しいので、相対値としては、0.02hPaくらい、感覚的には30㎝上下くらいの変化が取れてる。
Madgwickフィルタを使ってみよう その3
センサを探している間に、もうちょっと戻ってMadgwickフィルタを調べる。
そもそもMadgwickってなに?
Madgwick Filterを読んでみた
https://qiita.com/fumiya_sato/items/df28dff5ccc653183235
この中の記述
MadgwickフィルタのMadgwickは提唱した人の名前だそうだ。
原論文は、An efficient orientation filter for inertial and inertial/magnetic sensor arrays
”カルマンフィルタに比べて、高速で同程度以上の精度を実現したらしいフィルタです.”
”収束が遅いらしいとか・・・?”
ここまでわかって安心。
この記事の中で最初に出てくる、クォータニオンというのもいまいち理解できてないので検索。
クォータニオンとは何ぞや?:基礎線形代数講座
https://techblog.sega.jp/entry/2021/06/15/100000
この中の記述...
”クォータニオンは日本語では四元数(しげんすう)と訳されるもので、1843年にハミルトンにより発見された複素数を拡張した代数体系であり、3次元の回転の表現としても多くの利点を備えている。”
これで分かった気になって先に進む。
Sparkfunの6DOFセンサが読み出せたので、こちらの記事のMadgwickフィルタのサンプルに FreeSixIMU のライブラリとセンサの読み取り値を読み取った入れ込む。
MadgwickフィルタのライブラリをArduinoで使う
https://qiita.com/Ninagawa123/items/9520bad3c78ee40194fc
しかし、フィルタ動いてる気配がない。0付近の値がふらふらしてるだけ。
多分違うセンサを使ってるせい。そりゃそうだ。
数値の大きさとか、軸の並びとか、変化分の極性とか違う可能性はある。
なので、再度MPU-6050がどんな値を出してるのか、フィルタにどんな値を入れればいいのかを確認。
こちらのサイトをからMPU6050の値を確認。動画から、重力加速度を1として、角速度を度/秒くらいの値にしてやればいいようだ。傾きや変化の向きも確認した。
Arduinoから MPU6050の値を取得してみる
https://garchiving.com/how-to-use-mpu6050-in-arduino/
Sparkfunの6DOFは、重力加速度が220くらい、角速度が度/秒に直すと4倍くらいの値が出てたので、単純に値を割ってMadgwickフィルタに与える。
すると、Arduinoのシリアルポートからそれっぽい値が出だした。
次にProsessingを起動、サイトのコードをコピペ。動かしてもポートが読めないとのエラー。
ポートを調べて、0番に直す。
int available_serialport = 0;
すると画面上で平板が動き出した。でも回転してもヨー軸が回らない。
値が上手く取り込めてないのかと、dataの読み出し部分を確認しても問題なし。
画面の表示部分を読んでみたら、そもそもサイトのコードでヨー軸を回転させてない。
なので、コードに1行追加。
rotateY(radians(data[2])); //YAW軸追加
再起動すると、画面上で平板がセンサを動かした通りに動き出した。
やってみて分かったのは、初期状態を水平にしてから起動した方がいい。ひっくり返した状態から起動すると、正しい状態を得るのに時間がかかる。
レスポンスは早い。
これを使ってドローンを自作できるかも、と思った。
そもそもMadgwickってなに?
Madgwick Filterを読んでみた
https://qiita.com/fumiya_sato/items/df28dff5ccc653183235
この中の記述
MadgwickフィルタのMadgwickは提唱した人の名前だそうだ。
原論文は、An efficient orientation filter for inertial and inertial/magnetic sensor arrays
”カルマンフィルタに比べて、高速で同程度以上の精度を実現したらしいフィルタです.”
”収束が遅いらしいとか・・・?”
ここまでわかって安心。
この記事の中で最初に出てくる、クォータニオンというのもいまいち理解できてないので検索。
クォータニオンとは何ぞや?:基礎線形代数講座
https://techblog.sega.jp/entry/2021/06/15/100000
この中の記述...
”クォータニオンは日本語では四元数(しげんすう)と訳されるもので、1843年にハミルトンにより発見された複素数を拡張した代数体系であり、3次元の回転の表現としても多くの利点を備えている。”
これで分かった気になって先に進む。
Sparkfunの6DOFセンサが読み出せたので、こちらの記事のMadgwickフィルタのサンプルに FreeSixIMU のライブラリとセンサの読み取り値を読み取った入れ込む。
MadgwickフィルタのライブラリをArduinoで使う
https://qiita.com/Ninagawa123/items/9520bad3c78ee40194fc
しかし、フィルタ動いてる気配がない。0付近の値がふらふらしてるだけ。
多分違うセンサを使ってるせい。そりゃそうだ。
数値の大きさとか、軸の並びとか、変化分の極性とか違う可能性はある。
なので、再度MPU-6050がどんな値を出してるのか、フィルタにどんな値を入れればいいのかを確認。
こちらのサイトをからMPU6050の値を確認。動画から、重力加速度を1として、角速度を度/秒くらいの値にしてやればいいようだ。傾きや変化の向きも確認した。
Arduinoから MPU6050の値を取得してみる
https://garchiving.com/how-to-use-mpu6050-in-arduino/
Sparkfunの6DOFは、重力加速度が220くらい、角速度が度/秒に直すと4倍くらいの値が出てたので、単純に値を割ってMadgwickフィルタに与える。
すると、Arduinoのシリアルポートからそれっぽい値が出だした。
次にProsessingを起動、サイトのコードをコピペ。動かしてもポートが読めないとのエラー。
ポートを調べて、0番に直す。
int available_serialport = 0;
すると画面上で平板が動き出した。でも回転してもヨー軸が回らない。
値が上手く取り込めてないのかと、dataの読み出し部分を確認しても問題なし。
画面の表示部分を読んでみたら、そもそもサイトのコードでヨー軸を回転させてない。
なので、コードに1行追加。
rotateY(radians(data[2])); //YAW軸追加
再起動すると、画面上で平板がセンサを動かした通りに動き出した。
やってみて分かったのは、初期状態を水平にしてから起動した方がいい。ひっくり返した状態から起動すると、正しい状態を得るのに時間がかかる。
レスポンスは早い。
これを使ってドローンを自作できるかも、と思った。
Madgwickフィルタを使ってみよう その2
ずいぶん前に購入して無人機に組み込んで使ったけど、その後に分解してジャンクになってた6軸センサを見つけた。
このページの物
SparkFun 6 Degrees of Freedom IMU Digital Combo Board - ITG3200/ADXL345
https://www.sparkfun.com/products/retired/10121
古くて今は販売終了品、Arduinoのライブラリも見当たらず。
でも以前使ったよなぁ、と思いながらバックアップのHDDを探したら、Arduinoバージョン1の時に使った
FreeSixIMU
というライブラリが見つかった。
今のバージョンのArduinoのライブラリフォルダに入れて再起動すると無事センサが使えた。
スケッチ中ではこんな感じで、6軸をanglesという配列で読み出せます。
sixDOF.getValues(angles); // 6軸センサ読み取り
ax=angles[0];
ay=angles[1];
az=angles[2];
gx=angles[3];
gy=angles[4];
gz=angles[5];
これでMadgwickフィルタを使えるんじゃ...?
このページの物
SparkFun 6 Degrees of Freedom IMU Digital Combo Board - ITG3200/ADXL345
https://www.sparkfun.com/products/retired/10121
古くて今は販売終了品、Arduinoのライブラリも見当たらず。
でも以前使ったよなぁ、と思いながらバックアップのHDDを探したら、Arduinoバージョン1の時に使った
FreeSixIMU
というライブラリが見つかった。
今のバージョンのArduinoのライブラリフォルダに入れて再起動すると無事センサが使えた。
スケッチ中ではこんな感じで、6軸をanglesという配列で読み出せます。
sixDOF.getValues(angles); // 6軸センサ読み取り
ax=angles[0];
ay=angles[1];
az=angles[2];
gx=angles[3];
gy=angles[4];
gz=angles[5];
これでMadgwickフィルタを使えるんじゃ...?
Madgwickフィルタを使ってみよう その1
制御が専門の知り合いの先生がドローンのソフトを一から解説しながら組んでて、自分のやってみたいけど理解が追いつかない。
でもロボットやってる知人からMadgwickフィルタがいいって話を聞いて試してみようと思った。
Madgwickフィルタで検索するとすぐヒット。
MadgwickフィルタのライブラリをArduinoで使う
https://qiita.com/Ninagawa123/items/9520bad3c78ee40194fc
斜めよみしたら紹介されてるセンサを買ってつないだらすぐ動きそう。
ということで、MPU-6050 を購入したのですが不良品だったようなので中断。
でもロボットやってる知人からMadgwickフィルタがいいって話を聞いて試してみようと思った。
Madgwickフィルタで検索するとすぐヒット。
MadgwickフィルタのライブラリをArduinoで使う
https://qiita.com/Ninagawa123/items/9520bad3c78ee40194fc
斜めよみしたら紹介されてるセンサを買ってつないだらすぐ動きそう。
ということで、MPU-6050 を購入したのですが不良品だったようなので中断。