STM32マイコンを用いて自作基板をつくろう

はじめに

 nucleoボードは, そこそこ高性能でかつ簡単に扱うことができ便利です. しかし, 小型化したい場合は, STM32マイコン単体を使う基板を自分で設計することになるでしょう. 本記事では, その場合に必要な周辺部品や, プログラムの書き込み方法について記します. 

 本記事では, 開発環境はCubeIDE, マイコンはSTM32F446REを用います. また, 基板設計ソフトはEagleを用います. なお, CubeIDEを用いてプログラムを書き, nucleoボードに書き込む方法は把握していることを前提とします. 

 なお, とりあえず動いてるからヨシ👉が含まれているのでご注意ください. 本記事の内容により不利益が生じても一切責任は負いません. 

 

①nucleoボードを使って試験する

nucleoボードに使いたいセンサなどをつなぎ, 試験しておきましょう. このときCubeIDE上で作成したiocファイル(設定ファイル)が自作基板の配線を決めるときの参考になります.

②基板を設計する

a. 電源関係の部品を配置する

 F446REの電源電圧は1.7~3.6Vです. ここでは3.3Vを用いることにします. レギュレータは, 例えばNJM2391DL1-33を使えばいいでしょう(秋月電子でも購入できます). データシートを見ながら, 適当にコンデンサダイオードを配置します. 下図のコンデンサの容量はテキトーです. 出力側にのみ電解コンデンサも配置しているのはなんとなくです.

f:id:tgkhtknk:20210725161758p:plain

 F446REの1番(VBAT), 19番(VDD), 32番(VDD), 48番(VDD), 64番(VDD)ピンを3.3Vに接続します. また, 18番(VSS), 31番(VSS), 47番(VSS), 63番(VSS)をGNDに接続します. また, 今回はAD変換などの機能は使わないとし, 12番(VSSA)はGNDに, 13番(VDDA)は3.3Vに接続します. 

 F446REのこれら3.3Vに接続したピンのそばに, バイパスコンデンサとしてセラミックコンデンサを配置します. 0.1μFを4つくらい(1番と64番, 13番と19番は近いので2つに1つ配置)配置しておけばたぶん大丈夫です. 

 

b. プログラム書き込み用の配線を行う

 プログラム書き込み用に, 次の6つをピンソケットに接続します. 

・3.3V 書き込み時にnucleoボードから電源供給できるようにするため

・GND nucleoボードとGNDを共通化し, きちんと書き込めるようにするため

・7番(NRST)

・46番(TMS)

・49番(TCK

・55番(SWO)プログラム書き込みのみなら必要ないが, デバッグ時に必要

また, 7番(NRST)は, チャタリング防止のために0.1μFのセラミックコンデンサを挟んでGNDに接続します. 

c. 水晶発振子の配線を行う

 内部の発振子を使う場合は必要ありません. 水晶発振子を使う場合は, 5番(RCC_OSC_IN), 6番(RCC_OSC_OUT)ピンに接続します. また, 適当なセラミックコンデンサと抵抗を水晶発振子に接続します. 

d. 動作確認用LEDの配線を行う

 LチカができるようにLEDをつけておきます. GPIO_OUTPUTに設定できるピンならどこでもよいので, 電流制限用抵抗を忘れないよう気を付け配線しましょう.

e. その他の必ず必要な周辺部品の配線を行う

 30番ピン(VCAP_1)は4.7μFのセラミックコンデンサを挟んでGNDに接続します. 60番ピン(BOOT0)は10kΩの抵抗を挟んでGNDに接続します.

f. 自分が使いたいセンサなどの配線を行う

nucleoボードで試験した使いたいセンサの配線をしましょう.

 

 下図が回路図の全体です. バイパスコンデンサは実際に配置するピンの近くではなく, 下にまとめて書いています. 

f:id:tgkhtknk:20210725161849p:plain

 

また, こちらが配線図です. もともと色々なセンサの載せていたのを取っ払って最低限必要な部品のみにしたものなので, 部品が窮屈に固まっているのは気にしないでください.

f:id:tgkhtknk:20210725162050p:plain

③プログラムを書く

a. iocファイルを編集する

 だいたいは①で使ったiocファイルで問題ないですが, いくつか確認が必要です.

・水晶発振子用のピン
5番ピンがRCC_OSC_IN, 6番ピンがRCC_OSC_OUTになっていることを確認する. 

f:id:tgkhtknk:20210725143155p:plain

 

・プログラム書き込み用のピン
46番ピンがTMS, 49番ピンがTCK, 55番ピンがSWOになっていることを確認する.

f:id:tgkhtknk:20210725144131p:plain

 

・クロック設定
 外付けした水晶発振子を用いるなら, クロック設定を変更する必要があります.

 まず, 左の赤枠部分の"input frequency"を用いる水晶発振子に合わせて変更します. 次に, 左の赤丸部分"HSE"をクリックします. "E"はExternalのEです. これをクリックすることで外部の水晶発振子を使えることになります. 

 次に, 右の赤丸部分"PLLCLK"をクリックします. ここ"System Clock Mux"にも"HSE"がありますが, これをクリックすると, クロックを逓倍して高速動作させることができなくなります. 

 最後に, 右側の赤枠"HCLK"にお好みのシステムクロックを入力します. ここでは折角なので最大の180 MHzを入力しました. (速くすると消費電力が増えるのでその辺と相談して決めましょう)入力すると, 分周と逓倍の部分が勝手にいい感じに自動で決定されます. 当然ながらTimer clocksが変わるので, タイマー関係の機能を使っている場合は気を付けます.
f:id:tgkhtknk:20210725111531p:plain

b. プログラムを書く

iocファイルからプログラムを自動生成してもらったら, 残りを自分で書きます.

④nucleoボードと自作基板をつなぐ

緑色で囲んだ部分のジャンパーピンを外す

 nucleoボードをST-LINKとして使用できるようにするため, 2つのジャンパーピンを外します. nucleoボードとして使うときにまた刺す必要があるので, なくさないように気を付けます.

配線をつなぐ

 ②bで作成した自作基板のピンソケットにつなぎます. オス-メスのジャンパワイヤが必要です. 黄色で囲んだ部分は6つありますが, 画像1番上の1つを除いた5つをつなぎます. 

・上から2番目:TCK

・上から3番目:GND

・上から4番目:TMS

・上から5番目:NRST

・上から6番目:SWO

デバッグを行わずプログラムを書き込むだけなら, SWOはつながなくていいです. 

 また, 画像の赤色で囲んだ部分は3.3Vの出力です. 自作基板に電池などをつないでいない場合は, ここを自作基板のピンソケットの3.3Vにつないで電源供給します. 

f:id:tgkhtknk:20210725003654p:plain

⑤nucleoボードとPCをつなぐ

USBケーブルでnucleoボードとPCをつなぎます. ④をする前につなぐとプログラムを書き込めなくなるので, 気を付けます.

⑥プログラムを書き込む

nucleoボードの場合と同様の手順で書き込めます. 

⑦補足

 STM32マイコンをはんだづけするときは, 温度調節機能付きのはんだごてを用いた方がよいでしょう. 例えばこういうの. ステーション型の方が使いやすいですが, あちらは高いので...

 自作基板を設計する前に, ブレッドボードで試験したいかもしれません. その場合, マイコンDIP化する必要があります. 32ピンのSTM32マイコン, 例えばF303K8の場合は, 秋月電子通商で変換基板が売られています. 通常の太さではなく細ピンヘッダを使う必要があるので気を付けてください. 

akizukidenshi.com

一方, 64ピンのSTM32マイコン, 例えばF446REの場合は厄介です. 秋月電子通商にもDIP化基板は売られていますが, 正方形にピンヘッダを刺す部分が並んでいて, ブレッドボードに刺せません. 代わりにDigikeyで見つけたこれを使っていますが, 1864円もします...

www.digikey.jp

小型学生ロケットにおいて、MPU9250のDMPによる姿勢角算出機能は使えるか?

 

はじめに

こんにちは。と-ご-かいはつかんきょ-です。

MPU9250は、加速度, 角速度, 地磁気がそれぞれ3軸搭載された安価なセンサです。扱いやすいDIP化キットが販売されていることもあり、人気が高いです。(もう生産中止してしばらく経ちますが...)

角速度を積分すれば角度が求まりますが、時間とともに誤差が蓄積します。一方で、加速度, 角速度, 地磁気の9軸の値を組み合わせれば、安価なセンサでもそれなりに使える姿勢角が取り出せます。ただ、これを実装するのは大変です。

しかし、MPU9250には大変便利な機能があります。それは、DMP(Digital Motion Processing)です。自分で相補フィルタやカルマンフィルタを実装しなくとも、いい感じに計算したクォータニオンを吐き出してくれます。

試した方の動画を見てみると、安定して姿勢角を求められるようです。

 

では、この便利な機能は、小型学生ロケットでも使えるでしょうか。結論を先に書いておくと、たぶん無理です。

ロケット向けに設計されていない

MPU9250はロケットに載せることを想定して開発されたセンサじゃありません。スマートフォンや「ドローン」に使うものです。

ですから、DMPのアルゴリズムは、スマートフォンや「ドローン」に適した設計がされているはずです。つまり、それらを使用する環境に合わせたモデル化がなされ、コードが書かれています。

スマートフォンも「ドローン」も、瞬間的に大きな加速度がかかることはありますが、概ね、加速度センサの値から鉛直方向を知ることができます。

一方、小型学生ロケットの動き方は異なります。打ち上げ前や着地後は、加速度センサの値から鉛直方向が分かるでしょう。しかし、エンジン燃焼中は数Gの加速度がかかりますし、燃焼終了後の弾道飛行中のセンサ値は0G付近を示します。

地磁気センサはどうでしょうか。ランチャーが鉄製の場合、その近くにいるときは地磁気センサの値を無視したいですが、そんな機能が実装されてるとは思えません。

DMPのアルゴリズムが想定すると思われる状況と、小型学生ロケットの環境が異なるので、使えない可能性が高いです。

ドキュメントどこ?

ここまで「たぶん」「はずです」「可能性が高い」など曖昧な書き方をしてきたのは、MPU9250のDMPの詳細が書かれたドキュメントが見つからないからです。

私が見つけきれてない可能性もありますが...

どのようなアルゴリズムで実装されているのか分からない以上、ロケットには使えません。もしかしたら、とても優れたアルゴリズムを採用しているのかもしれません。小型学生ロケットの環境下で、それぞれのセンサデータを使えるか的確に判別し、重み付けを変えながら演算してくれるかもしれません。

でも、ドキュメントがないなら知りようがありません。ロケット向けのセンサじゃないから、使えないだろうと判断するのが妥当です。

(ドキュメントの在りかを知っている方がいたら教えてください...)

結論

以上の事情から、MPU9250のDMPを小型学生ロケットで用いるのはたぶん無理です。センサフュージョンをしたいなら、自分で実装して、ロケットの状況に合わせて使うデータを切り替える必要があるでしょう。

便利な機能だけど、適材適所じゃないねという話でした。

地上を走行中のカンサットなら使えるのかな。

小型学生ロケットの地磁気センサデータの所見

 

はじめに

こんにちは。某大学の学生ロケットサークルで電装をしていた、と-ご-かいはつかんきょ-です。

今回は、以前試した地磁気センサのデータ処理結果について軽く書きます。「球面フィッティングの結果」以降が本題です。

加速度と地磁気による角度の補正

角速度を積分すると角度が得られます。しかし、それだけでは時間経過と共に誤差が蓄積するため、何らかの方法で補正する必要があります。

小型無人機では一般的に、加速度と地磁気を用いて補正します。詳細はこちらの記事が大変参考になります。

qiita.com

しかし、ロケットでは加速度を用いることは基本的にできません。加速度ベクトルがおおよそ鉛直方向を向いていないといけないので、打ち上げ前, パラシュート開放後で終端速度に達しているとき, 着地後にしか使えません。

なので、地磁気センサが重要です。地磁気ベクトル周りの誤差は修正できずに蓄積していくけど仕方ないね。

地磁気データの零点補正の方法

センサの特性, 温度, 周辺の物体などの影響で値がずれるので、姿勢の補正に地磁気データを用いる前に、零点補正をする必要があります。

この記事を参考にMATLABで実装しました。最小二乗法で球面フィッティングし、球の中心を求めます。中心の座標を差し引くことで零点補正をします。

www.slideshare.net

球面フィッティングの結果

ここから本題です。

このグラフが、以前サークルで打ち上げたロケットの、飛行中の地磁気データを用いて球面フィッティングを行った結果です。f:id:tgkhtknk:20201025205550p:plain

赤色が離床直前~離床1.7秒後までのデータ, 青色が離床1.7秒後~12秒後までのデータ, 虹色のメッシュが求めた球です。

離床前にロケットを固定するランチャーが鉄製なので、赤色のデータは球から離れています。一方、青色のデータは球にまとわり付くように並んでいて、ロケットがロールしている様子がはっきりと分かります。

地磁気のノルム

上の球面フィッティングの結果を用いて零点補正をし、地磁気のノルム(大きさ)の時間変化を求めました。その結果がこのグラフです。

f:id:tgkhtknk:20201025210546p:plain

誤差がなければ、センサの方向に関わらず一定のノルムになるはずです。

離床前は金属製ランチャーの近くにいるため、ノルムが大きいです。 離床直後は、ノルムが激しく変化しています。
その後、ノルムはだんだんと小さくなり, 離床1.5 秒後∼12 秒後は概ね一定のノルムで推移しています。

ランチャーから十分に離れた後の地磁気データは、姿勢の補正に使えそうです。

結論

2つのグラフから、最小二乗法を用いた球面フィッティングによる零点補正は適切に行えたと考えられます。

よって、機体が激しくロールすれば、事前にくるくる回して零点補正用のデータを取得しなくても、機体回収後の姿勢推定に地磁気データを用いることができると言えます。

意外と地磁気による姿勢の補正のハードルが低いことが分かったので、どしどし活用しよう!