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

  • 駆動系

(まだ未定、適当なブラシレスモータ)

  • プロペラ
    • (未定)

SFE-SEN-10121 wrote:

超小型の6軸IMU(慣性計測装置)です。 IITG-3200三軸ジャイロセンサとADXL345三軸加速度センサを搭載しています。これら合計6軸の計測データを総合すると、物体の姿勢と動きを知る事ができます。接続はI2C、入力電圧は3.3Vです。 製造元希望小売価格:64,95ドル(税別)

各所のまとめ

超音波距離センサ

http://www.seeedstudio.com/depot/images/large/product/ultra_LRG.jpg

今回使った超音波センサ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 : [移行させたいモード番号]
  • モード変更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の画面

Nokia LCD

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.