LoginSignup
4
4

More than 5 years have passed since last update.

[RazDrone] ラズパイが空を飛ぶまで (0.準備編)

Last updated at Posted at 2016-12-08

連載目次

準備編、センサー編、制御編、飛行編(完)で連載の予定。
進捗があればこの記事を随時、通知付きでアップデートする予定です。

前回のエピソード:設計編

raspberry pi 3 テスト 2016/10/21-2016/10/22

モーター テスト 2016/10/24-2016/10/26

  • モーターをESCへのPWMでコントロール

    • 12inch propも載せてまわしてみる (1秒だけ回した)
      • たった1秒で親指をけがした 記念.jpg
      • 回転によりめちゃくちゃ線が絡まっている
  • ESC USB Linker / BLHeli関連 (Turnigy 20A v2 は BLheli でATMEL BLHeli Bootloader (USB/COM)で焼く)

    • ファームウェアをアップデート
    • 設定で Programming by TX (ESCへの入力で設定を変更できる;これをやるとへんなコマンドをNAVIO2のPWMから出して不意に設定が変わるかもしれない)をOFF

組み立て 2016/11/13

_DSC0271.jpg

  • 六角ねじ や 星ねじのドライバーが届いたので組み立て。
  • ESCを無理やり押し込んでいく _DSC0272.jpg
  • 組むと案外重い _DSC0275.png
    • 左はiPhone 5s、右はiPad mini 2
    • 計算した重量で収まってるかは疑問…秤が無い。
  • プロペラが巨大だが干渉はなかった。 _DSC0279.jpg
    • 手のひらサイズ(半径が)

プロペラテスト 2016/12/08, 09

Navio2サンプルコードにて回転させる。
固定不足でペラが飛んだり、機体がひっくりかえったりしたものの(また怪我した)、1つのペラだけで一応浮いた。

この部分で、モーターをarming(アーム)する。この操作を行って初めて、モーターを起動できる。
何をしているかというと、送信機(トランスミッター、ラジコン用語的にはプロポ)でスロットル最小値から最大値まで素早く動かし、また最小値に戻すという操作とみなせる。ESCによってアーミングのプロシージャは異なるが、今回はこうやってアームできる。

        for (double i=SERVO_MIN; i<SERVO_MAX; i+=0.001) {
          pwm.set_duty_cycle(PWM_OUTPUT, i);
          usleep(800);
        }
        printf("max/2\n");
        for (double i=SERVO_MAX; i>SERVO_MIN; i-=0.001) {
          pwm.set_duty_cycle(PWM_OUTPUT, i);
          usleep(800);
        }

その次に、最小値から中間値までなだらかに加速させる。

        for (double i=SERVO_MIN; i<SERVO_MID; i+=0.001) {
          pwm.set_duty_cycle(PWM_OUTPUT, i);
          usleep(30000);
        }

全貌はこちら。

#include <unistd.h>
#include <stdio.h>
#include "Navio/PWM.h"
#include "Navio/Util.h"

#define PWM_OUTPUT 2
#define SERVO_MIN 1.000 /*mS*/
#define SERVO_MAX 1.750 /*mS*/
#define SERVO_MID SERVO_MIN+(SERVO_MAX - SERVO_MIN) / 5.0 /*mS*/

int main()
{
    PWM pwm;

    if (check_apm()) {
        return 1;
    }

    if (!pwm.init(PWM_OUTPUT)) {
        fprintf(stderr, "Output Enable not set. Are you root?\n");
        return 0;
    }

    pwm.enable(PWM_OUTPUT);
    pwm.set_period(PWM_OUTPUT, 50);
//    while (true) {
        pwm.set_duty_cycle(PWM_OUTPUT, SERVO_MIN);
        sleep(1);
        for (double i=SERVO_MIN; i<SERVO_MAX; i+=0.001) {
          pwm.set_duty_cycle(PWM_OUTPUT, i);
          usleep(800);
        }
        printf("max/2\n");
        for (double i=SERVO_MAX; i>SERVO_MIN; i-=0.001) {
          pwm.set_duty_cycle(PWM_OUTPUT, i);
          usleep(800);
        }
        sleep(1);
        printf("\nmin\n");
        for (double i=SERVO_MIN; i<SERVO_MID; i+=0.001) {
          pwm.set_duty_cycle(PWM_OUTPUT, i);
          usleep(30000);
        }
        sleep(1);

//    }

    return 0;
}

次回(日程未定)予定

  • パワーソースを分電して4つのESCに分配
    • 分電盤か分電ケーブル?を購入。
  • わけがわからないPWMの制御を抽象化したい。
    • パーセンテージでスロットルコントロールしたいのと、ステートレスにしたい。
  • センサーをいじる!
4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4