QRdrone - mbed_quadcopter
Information
This document is written in Japanese only now.
4枚のプロペラを回して飛ぶクアッドコプターをmbedで制作するメモ。
Information
mbed_quadcopterは製作途中です。ぼちぼち作っています。
航空系のことも、mbedのことも勉強しながら作っているので、間違い等あれば指摘していただけると幸いです。
概要
- クアッドコプター本体 : フレームキットを購入し組み立て
- モータ、アンプ等 : ブラシレスモータを購入しフレームに取り付ける
- 制御系 : mbedと、加速度センサ/ジャイロセンサで自作
つかった部品
Quote:
Specs: Weight: 312g(Frame only) Width: 550mm Motor Bolt Holes: 19mm width Required: Multi-Rotor control board 1525A brushless ESC x 4 3S 18002200mAh lipoly battery 28-XX 11001300KV brushless motor x 4 8x4 propeller - 2 standard/2 reverse rotation
- 駆動系
(まだ未定、適当なブラシレスモータ)
- プロペラ
- (未定)
- センサー
- 3軸加速度、3軸ジャイロセンサー : SFE-SEN-10121 IMU シックス・ディグリーズ・オブ・フリーダム ITG-3200/ADXL345
- SwitchScienceで購入(上のリンク)、6,495 円
- SparkFun製
- https://www.sparkfun.com/products/10121?
- これをArduinoで使っているページhttp://bildr.org/2012/03/stable-orientation-digital-imu-6dof-arduino/
- 超音波センサー : seeedstudio SEN136B5B(Ultra Sonic range measurement module)
- それについて書かれたwiki(公式?) http://www.seeedstudio.com/wiki/Ultra_Sonic_range_measurement_module
- 3軸加速度、3軸ジャイロセンサー : SFE-SEN-10121 IMU シックス・ディグリーズ・オブ・フリーダム ITG-3200/ADXL345
SFE-SEN-10121 wrote:
超小型の6軸IMU(慣性計測装置)です。 IITG-3200三軸ジャイロセンサとADXL345三軸加速度センサを搭載しています。これら合計6軸の計測データを総合すると、物体の姿勢と動きを知る事ができます。接続はI2C、入力電圧は3.3Vです。 製造元希望小売価格:64,95ドル(税別)
- 制御系
- mbed(青い方)
- 無線系
各所のまとめ
超音波距離センサ
今回使った超音波センサseeedstudio SEN136B5B(Ultra Sonic range measurement module)は、http://mbed.org/cookbook/Seeed-grove-ultrasonic-rangerに書いてあるものとほとんど同じ。(こっちのほうが型が古い?)上記ページに書いてあったプログラム、ライブラリがそのまま使えた。 サンプルプログラムはこれ。
Import programSeeedUltrasoundRangeFinder
A simple program to use a Seeed ultrasound range finder.
Xbee
mbedとつなぐ
1 VCC -------------- 3.3v 2 DOUT ------------- mbed serial rx (e.g. p10) 3 DIN -------------- mbed serial tx (e.g. p9) 4 not connected 5 RESET ------------ mbed digital out (e.g p11) 6-9 not connected 10 GND ------------- 0v/GND 11-20 not connected
ATモードしか使わないのであれば、シリアルでmbedとつないでprintf等すれば良い。
設定
設定で詰まったところメモ
- 片方が coordinator , 片方が router になる。
- Addressing - SH, SL(Serial Number)
- これはモジュール固有の番号(本体裏面にも書いてある)
- これをdestinationに指定して飛ばすので、控えておく。
- Networking - ID(PAN-ID)
- 親機と子機で一致させる(ID=0なら、coordinatorが自動設定)
- JV(Channel Verification)
- 実験段階では設定変更の柔軟性からJV=1がいいかも、らしい。
- DH, DL(Destination Address)
- router : DH, DL = 0(親機の意味)
- coordinator : DH, DL = router の SH, SL
パソコンとの通信などについての詳細
pheehsさんが詳しく書いてくれた。 https://github.com/Kph-Lab/QRdrone/blob/master/README.md
扱う情報は…
- ヘリから
- 加速度
- 角速度
- 高度
- 位置座標
- モーター出力
- 動作モード
- PCにつないだコントローラから
- モーター出力レバーからの値
- 方向レバーからの値
- 無線カメラから
- カメラ映像
プロトコル
\xff は必ず後ろに \x01 をつける。すぐ後に \x00 が来たら magic number とみなす。 この変換処理は、長さで混乱しないように送信直前と受信直後にやる。
[ magic number 2byte ][ message type 2byte ][ length 4byte ][ crc-32 4byte ] [ data ]
message type とは
ヘリコプターからPCへ、コントローラからヘリコプターへと、コマンドにも色々種類があるわけなので、「どんな種類か?」のデータをヘッダ部に埋め込んじゃおうということなのですが
- モード変更(change mode : 0x10)
- droneは幾つかのモードを持っていて、通常航行モード・(ホバリングモード)・離着陸モード・緊急モード を現段階では考えている。
- 通常航行 : 加速度センサ・ジャイロセンサの情報基準の自動姿勢保持 + コントローラからの情報基準の手動制御(移動とか上下動など)
- 離着陸 : 加速度センサ・ジャイロセンサの情報基準の自動姿勢保持 + 距離センサによる精密な高度測定情報に基づく自動着陸?とか
- 緊急 : ぶつかったとか、バッテリー切れとか、モーター障害などの時用に有無を言わず非常停止するモード(と言うよりシグナル?)
- body : [移行させたいモード番号]
- droneは幾つかのモードを持っていて、通常航行モード・(ホバリングモード)・離着陸モード・緊急モード を現段階では考えている。
- モード変更OK(ok change mode : 0x11)
- drone がモード変更を了解した時のへんじ
- body : [これから移行するモードの番号]
- センサ情報(report context : 0x20)
- PC がセンサ情報を表示するために、drone が送る情報。
- body : [ 0x20 ][ 加速度 ][ 角速度 ][ 高度 ][ GPSによる座標 ][ モーター出力 ]
- コントローラ情報(change gearshift : 0x30)
- これをもとに drone はモーター出力を決める。
- body : [ 速度レバー ][ 方向レバー(ピッチ) ][ 方向レバー(ロール) ]
CRC
mbed で crc32 を計算する library つくった
Import librarycrc32
calc crc32 of char
参考 : http://d.hatena.ne.jp/eth0jp/20110603/1307033578 ありがとうございました
crc32("aaa", 3)
みたいな感じ
デバッグなど
/users/okini3939/notebook/mbed256_debug/がとても参考になりました。
Nokiaの画面
sparkfun製のColor LCD Breakout Boardを、ヘリコプターに取り付けるなどして状況表示用のモニターにする計画。そのために使い方を探した。
Quote:
Description: Created for the Sinister 7 Tutorial, this breakout board for the popular Nokia 6100 Knock-off color LCD has ...
上の Color LCD Breakout Board は Nokia 6100 が取り付けられているらしい。
mbed.org の cookbook の Nokia-LCD を参照すると、そのページの写真はひとつ古い型の https://www.sparkfun.com/products/8600? になっている。だが問題なく使える(サンプルプログラムはそのまま動いた)
ただし、ピン配置が若干異なる。
#include "NokiaLCD.h" NokiaLCD lcd(p5, p7, p8, p11, NokiaLCD::LCD6610); // mosi, sclk, cs, rst, type /* 1 S1 2 S2 3 CS --- 8(cs) 4 SCK --- 7(sclk) 5 DIO --- 5(mosi) 6 RESET --- 9(rst) 7 STAT2 8 STAT1 9 STAT0 10 GND --- GND 11 3.3V --- Vout(3.3V) 12 VBATT --- Vout(3.3V) */
おそらく STAT02 は基板に実装されている RGB-LED につながっていて、S1, S2 は基板上にある2つのタクトスイッチにつながっているものと思われる。
IMU(加速度、ジャイロ)関連
mbed.org 公式の cookbook - IMF の項 http://mbed.org/cookbook/IMU がまさにぴったりだった。For use of the Digital Combo Board のところ参照。
今回使った ADXL345 accelerometer and ITG-3200 gyroscope は I2C でつなぐ。
Quote:
Example IMU: ADXL345 accelerometer and ITG-3200 gyroscope
We can use an ADXL345 and ITG-3200 to create an inertial measurement unit which can supply acceleration and angular velocity readings to the IMUfilter.
For use of the Digital Combo Board
If using the Digital Combo Board (sold by sparkfun) which includes both ADXL345 and ITG-3200 in the same chip, then import the I2C version of the ADXL345 program along with the ITG-3200 program and choose the same pins for their input/output. The Digital Combo board communicates by sharing the same pins over I2C.
接続
SCL --- p10(scl) SDA --- p9(sda) GND --- GND 3.3V --- Vout(3.3V)
SCL線、SDA線それぞれにプルアップ抵抗が必要。2.2KΩ くらい。
I2C について調べたこと
- マスタとスレーブがあり、マスタが絶対的な権限を持つ。
- スレーブはそれぞれアドレスを持っていて、そのアドレスを元に通信する。
- というのも、パーティーライン状に、一つのマスタに複数のスレーブをつなぐことが出来るから。
- この 6-degrees of freedom センサボードは、要するに加速度センサとジャイロセンサをI2Cでつなげたもの(ボード内としても、マイコンとの接続的にも)
- マイコンに加速度センサ、ジャイロセンサを別々に I2C でつないでいるのと同じ。アドレスは別々にある。
- 使うピンは少なくて済むし、2つのセンサ間のズレも気にしなくて済むというメリットはある。
というわけで、加速度/ジャイロセンサのデータシートを読む必要が出てきたのであった。
Gyro ITG-3200
murabitoさんのNote - 3軸デジタルジャイロ ITG-3200 を参考に見てみる。
Quote:
注意しなきゃいけないのが、受け取った2バイトの値は、short intで受け取らなければいけないことです。 ジャイロセンサの値は8ビットを2回受け取って、16ビットとして、プラスとマイナスの値を表現するので、intだと32ビットで受け取ってしまいます。 あとはジャイロセンサのI2Cアドレスは7ビットですが、後ろに0を追加して無理やり8ビットにして指定してやらないとmbedの場合ダメです。
ふむふむ。
制御ソフトウエア関連
いま考えている。 メモ
モーターの最終出力 0.0f ~ 1.0f ←これを決定する値:コントローラからの値+現状維持のための調節(IMUからの値) 停止時:0.0 コントローラーからの命令で上昇(回転数上げる):0.0+0.10.8 前傾姿勢に変更(回転など):0.0+0.10.8+-0.5 スロットルに見合わない回転をかけることは拒否する必要がある
まずはスロットル+IMUによる姿勢制御のみのプログラムを作ってみる。 (PID制御じゃなくてもいいかも 比例制御のみで) 普段は+-0.1くらいの振れ幅、緊急時(45度くらい傾いているとき)のみ0.5くらいの振れ幅を許可。 これをどう統一的に解決することができるのか。
Please log in to post comments.