MPU-6050基板作ってみた(前半)基板設計

ロケットなど飛翔体の姿勢計測を気軽な値段でなんとかならないかと思案している今日この頃です。(もっと他にやらないといけないことがあるけど・・・w

その中で目をつけているのがInvenSence社のMPU-6000というセンサーです。

SparkfunからMPU-6050という型番違いのセンサは売られているのですが、これはインターフェイスがI2Cだけなので高速サンプリングを考えてSPIも対応しているMPU-6000を使って動きの早いものの姿勢を計測したいと考えていました。

MPU-6000が発売されたタイミングでTOIDAさんがInvenSenceから購入するということで複数人で共同購入しました。

同時にTOIDAさんが試しに使っていたMPU-6050のRev.Cがなぜか加速度のレンジが2倍になっている(最大±16Gのはずが±32G)になっているということからロケットなどに使えるのではないかということでMPU-6050を譲ってもらいました。

そこで以下のような基板を作ってみました。

  • 加速度ジャイロはMPU-6050
  • 地磁気はHMC5883L
  • 気圧計はMPL115A2
  • 以上をI2Cで外に出す

加速度ジャイロと地磁気以外は秋月で買える部品にしようとした結果、かなり微妙な基板になったのですが、これのハンダ付けをどうしようか悩んで試行錯誤したのでそれは後半に書こうと思います。

写真はFusionPCBに発注かけて2枚しか使う予定無いのに18枚届いてテンションあがったところです。

参考

市販品でセンサは違うけど近いものとしてはこのようなものがありました。

http://www.pololu.com/catalog/product/1265

今後やりたいことは全部下のリンク先のもの十分という市販品もありますが、勉強のために自作することは悪いことではないかと思っているところです。

http://www.pololu.com/catalog/product/1256

http://www.pololu.com/catalog/product/1255

ロケット用センサーボードに部品実装してみた

電子工作ネタの進捗です。

以前MTM07にこっそり展示していたセンサボードですが、回路に不備があったのでRev.Bを発注した後、部品を実装してみました。

かっこ良くできたのでお気に入りです。

加速度センサとジャイロセンサのハンダ付けが難しく時間がかかりましたがホットエアーを使用して、その他は手ハンダで実装しました。

実装の後、TinyFeatherというオートパイロットシステムの一部として使えるようにという計画の下、Fenrirさんの秘密基地にお邪魔して火入れを行いました。

デバッグ用にコネクタを作って、Arduinoに繋げて動くかどうか試験を行なっています。

ひっくり返したり振ったりしてみると、それっぽい値は出ているので一安心です。

ロケット用センサボード設計した【MTM07に出展予定】

趣味の電子工作ネタ。ブログの文体を統一できない系男子です。

今週末東京工業大学で行われるMake Tokyo Meeting(MTM07)という素人?の電子工作やなんだか面白いものを作ってる人の展示会に『はかるひと』という団体名で『加速度ジャイロ』の展示をします。

fenrirさんHirakuTOIDA さん両氏がすごいもの展示するのに混ざる形です。

設計したもの

今自分たちが作っているようなロケットやモデルロケットは瞬間的な加速度や勢い良くスピンしたりすることがあってそういうところを計測できると機体の特性がよくわかったり、エンジンの特性がわかったり色々なことがわかります。精度も上がればロケットの姿勢がわかるので制御みたいなことの礎になります。

ただ、現在sparkfunなどで安く売られている慣性計測装置(IMU)と呼ばれるものはデータ取得間隔が広すぎて瞬間的な値がわからなかったり、高加速度は得られなかったりします。

ここらへんを上手く取れるように使いやすいセンサボードを設計してみました。

Super SylphideやTiny Featherという無人航空機(UAV)用のオートパイロット装置を開発しているfenrirさんを師匠として、Tiny Featherの拡張モジュールとして設計しました。

飛行機用だったTiny Featherをロケット用にも使えるようにするというプロジェクトです。

高性能なTiny Featherに載っかることによってスーパーなことができるようになるはずです。

専用の拡張モジュールとしてだけではなく、レギュレータで電圧を落としているので3.3Vから5Vまで入力電圧が使えるし、SPIで出力しているので汎用性は高くなっています。適当なマイコンに繋げてやってデータを取ることができます。

今はFusion PCBに基板を発注、Digikeyに部品発注で共に到着待ちの段階です。

MTMは今週末なのにまだ届いてないということで、がんばっても動いているところは展示できるかどうかってところだけど、一緒に展示している人たちがすごすぎるのでいいかなぁっと笑

測れるもの

  • 加速度 ±19[G]
  • 角速度 500[deg/sec]
  • 気圧(絶対圧) 平地から高度14kmぐらいまで(よくわかんない)
  • アナログ出力の外付けセンサ6ch

これらを高分解能な16bit精度で1秒間に1000回以上測れる予定です。

大きさも長辺5cm、短辺3.5cm程度なのでかなり小さいです。

PCB

基板のミスがあって早速Rev.Bを頼まないといけないと思っているところです。

複数枚作る予定なので、サポートも何も出来ないけど必要な人買ってくれないかなぁ。

無線で使えるものだとかなり高いみたいだし、お安くするのになぁ

これの簡易版みたいな感じですね

温度計作ってみた

大学でロケット作るサークルを主催してます。(突然

ロケットには電子工作が必要になってきて、新入生に電子工作を教えたいなと思い、基本的なことを学べる用に教材的に基板を設計してみた。機能のわりに大きいのはハンダ付け初心者にハンダ付けさせるためです。なるべく大きな部品使うようにしてますし。

基板は大学にある基板切削機という電子工作用のNCフライスで作った。相変わらず配線のセンスがなさすぎて悲しくなってくるが、反面教師的な部分も無いと教材っぽくないのでご愛嬌かなと。

前に作ったのと同様に

ArduinoのDuemilanoveやUNOに使われているATmega328PというマイコンにArduinoのブートローダーを書きこんで、電源系、セラロック(背面に取り付けてあるので見えない)を付けた。あとはATmega328Pのピン通りに配線した。本物のArduinoとブレッドボードでプロトタイピングをしておいて、本番として自分で作った基板に載せられる。ハンダ付けも簡単で、そこそこのモノが出来て、なにより完成が早い。

あとは

Arduinoで遊ぼう – PC用ファンの回転数を表示する

ここにある7セグLEDライブラリを使って、温度センサはLM60を使って作った。

間違ってアノードコモンを買ってしまったので、

上記のライブラリのSevenSegment.cppの

const uint8_t SevenSegment::NUMERICAL_NUMBER[] = {

の先を

/*0*/ SEG_G_BIT | SEG_DP_BIT,

/*1*/ SEG_A_BIT | SEG_D_BIT | SEG_E_BIT | SEG_F_BIT | SEG_G_BIT | SEG_DP_BIT,

/*2*/ SEG_C_BIT | SEG_F_BIT | SEG_DP_BIT,

/*3*/ SEG_E_BIT | SEG_F_BIT | SEG_DP_BIT,

/*4*/ SEG_A_BIT | SEG_D_BIT | SEG_E_BIT | SEG_DP_BIT,

/*5*/ SEG_B_BIT | SEG_E_BIT | SEG_DP_BIT,

/*6*/ SEG_B_BIT | SEG_DP_BIT,

/*7*/ SEG_D_BIT | SEG_E_BIT | SEG_F_BIT | SEG_G_BIT | SEG_DP_BIT,

/*8*/ SEG_DP_BIT,

/*9*/ SEG_E_BIT | SEG_DP_BIT,

に変えて、

void SevenSegment::digitOn(void)の関数の中身を

digitalWrite(_digitPins[_currentDigit], HIGH);

void SevenSegment::digitOff(void)の関数の中身を

digitalWrite(_digitPins[_currentDigit], LOW);

にそれぞれ変更した。

やってることは

1.アノードコモンとカソードコモンで点灯時の電圧のHIGHとLOWが逆なので逆にした

2.元のライブラリでは表示させるLEDの場所を指定していたのを、逆に消すLEDの場所を指定した

というだけ。

温度センサは2つ。基板に取り付けたものと、ケーブルを伸ばした先の温度を測るためのもの。(写真は後者を取り付ける前)

気温ですら1℃ぐらいの誤差があるけど、外付けの温度計も切り替えて測れるようにしたので、実用性はあるかなと思う。

100円ショップで温度計が買えるこの時代に800円程度かけて温度計自作するのは悲しくなるけど、それ以上に工作が楽しくて、達成感と勉強できて良かった感は他の何にも変えられないものです。

ワークショップ

【追記】ワークショップ形式でサークルで新入生に作ってもらった。基本的なことを教えながら作ってもらった。同じ基板で同じセンサ・プログラムでも表示される温度が変わってくることなんて、本を読んで勉強してるだけでは理解できないことなので良い教材になったかなと思った。

簡単なハンダ付け練習とLEDチカチカさせて、LCDにHelloWorld表示させた後にこのレベルだとプログミング辺りに少しレベルの乖離があったみたいだけど一日でかなりの達成感を感じてもらえてモチベーション上げてもらえたので良かったかなと。電子工作は修行のような忍耐強さが必要なので、マイコンいじるのが好きになってもらえるのが何よりだった。

ロケット用の慣性計測ユニット作ってみた

作ってみたったら作ってみた。

2011年6月4日に自分たちで作ったロケットを伊豆大島で打ち上げてきた。

詳しいことは別のページに書くことにして、久々に面白い(exciting)作業ができたのでブログにしてみる

自分たちが作ったロケットがどのように飛行したのか、どこまで飛んだのか、機体にどのような変化があったか、これらがわかるとただ単に打ち上げて楽しかっただけではなく工学的な面白さが出てくる。

ということで慣性計測ユニットを作ってみた。

諸々の都合があって、開発にかけられる時間は非常に限られていた。

今回書く慣性計測ユニットだけではなくパラシュート分離機構用のタイマー作りや普段の研究室生活、ロケット打ち上げまでの事務一般、ロケット本体の仕上げなどの作業をしながら2週間弱しか開発期間がなかった。無給のブラック企業を素でいくぐらいの忙しさだった。

このため、開発の工数を少なくして、新しく勉強することを最小限にしながら自分が満足できるクオリティのものを作ることをコンセプトにした。

マイコン

AVRのATMEGA328PにArduinoのブートローダを書きこんでDIPのマイコン単体でArduinoとして動かした。

28ピンのAVRのICに3端子レギュレータから5VのVccとGNDと16MHzのセラロック(発振子)だけを付けてやればArduinoとして動く。

ピンの役割などはATMEGAのデータシートを見ながら動かした。

3.3Vの電源が取れないだけでそれ以外はArduinoとして動くのでロケットに積むために小型化したい要求と開発が早くて簡単だという要求を満たしていた。

ブートローダの書き込みはここを参考にして、書いてあるとおり行った。

搭載センサ

センサによっては3.3V駆動だったり入出力がRS232Cレベル(3.3V)だったりするのでセンサへの入力になる部分は分圧抵抗を入れて5V→3.3Vにした。

気圧センサSCP1000

秋月で買える気圧センサで測定範囲300hPa~1200hPaで2Hz程度で出力が取れるので高度計として使用した。

大気圧1013hPaとしてざっくりと10mで1hPaの変化があるのに分解能が1.5Paあるということで理論的には分解能15cmぐらいがわかるはずと思って採用した。

実際はノイズがあったり、風が当たると動圧で気圧が変化するなどがあり、建物1階の高さの判別ができる程度だった。つまり、3mの違いはセンサから読み取れる。

SPI通信で値が出てきてくれるのも使いやすかった。

3軸加速度+3軸ジャイロセンサ

SparkfunのIMUフュージョンボードを使用した。

IMU3000(3軸ジャイロセンサ)とADXL345(3軸加速度センサ)を合わせたもので、両方の値がI2Cで取得できる。

レジスタを最初にいじれば最大加速度などを変えられる。値段が少し高いが5G以上の加速度を取得したく、勉強する時間がない、実装をいかに早くできるかが勝負という今回の目的に非常によく合っていた。すごく小さいし。

最初はわけわからなかったが、データシートをしっかり読みこんだら使えた。

GPSモジュール

秋月のGPSモジュールGT-723Fを買ってたが、逆起電圧をかけてしまったのか、何時まで経っても衛星を補足してくれないただの金属片になってしまったので泣く泣くその場にあったGT-720Fを使用した。

RS232Cレベルの出力だったがArduinoのピンにそのまま接続して大丈夫だった。

入力部分は分圧抵抗で3.3V近くまで落としている。

ArduinoにTinyGPSというライブラリがあったので複雑になりがちなGPSの出力を比較的簡単に扱えた。

温度計LM35

ロケットエンジンの酸化剤周りは充填中と点火後にそれなりの温度変化があるのでどの程度なのかがわかると酸化剤の蒸気圧から燃焼圧だったりがわかる。

その目的のために秋月で買えるLM35をAnalogINのピンに繋げて使った。

これはA/D変換するだけで温度がわかるので一番簡単だった。

キャリブレーションはするヒマが無かったが見た感じは何もしなくてもそこそこの精度の値は出てる気がした。

SDカード

データを保存したかったのでSDカードを付けた。

SPI通信の口が1つしか無かったのでデータロガー用の2つ目のATMEGA328Pを用意し、一つ目とシリアル通信しながら貯めたデータをマイクロSDカードに保存するようにしたかった。

SDカードになんでもないデータを書きこむことは出来たが、最後までデバッグが間に合わなくて目的は達成できなかった。根本的に勉強不足すぎてよくわからないままだった。

結局AVRの内部のEEPROMに打ち上げから2分のデータを保存するようにして対処した。

デバッグ用のLCD

1つ目のセンサの読み取り用のマイコンにはセンサの値がすぐわかるように16×2のLCDキャラクタディスプレイを外付けで取り付けられるようにした。

プログラム

プログラムはArduinoのサンプルスケッチやセンサの型番でググって出てくるサンプルコードをほとんどそのまま組み合わせる形で書いた。

こういうことができるのがArduinoのいいところ。

値段

6軸の加速度・ジャイロセンサとGPSモジュールが高かったがそれ以外は秋月・千石で買えば安く作れた。

1.5万円ぐらいで全部作れた計算になる。実際は余分な部品を買ったりで3万円ぐらい使って開発したので金欠な自分にはキツい出費だった。

基板

学校にあった基板切削機という機械で基板を作った。

初めてだったのであまり上手とはいえない設計になったが非常に楽しく基板を作れた。

画像はmbeというソフトで設計した基板

精度とか校正とか試験とか

これがすごく重要なのだが開発の期間が短すぎて手がつかなかった。これが心残り。

完成したところ

今までLEDチカチカさせて喜んだり、小物を作って満足したりしてたぐらいの電子工作経験だった。その段階から一気に本格的に趣味としての電子工作が出来たので心底満足した。これでもまだプロトタイプみたいな完成度なのであんまり外に出せるようなものではない。

打ち上げ後回収を失敗し、機体が大破してしまったので夏の終わりまでに作り直してver.2の進化したものを作りたいと思った。

尊敬するfenrirさんが作っているような慣性航法装置が理解できるようになるまでは続けたいところです。