【素人がドローン製作】#3.5 動作確認PG

スポンサーリンク
ドローン製作
スポンサーリンク

前回の#3での、モーター出力確認を行ったPGについて簡単に触れておきます。

スポンサーリンク

使用するモーター・マイコン

以下ブラシレスモーターとマイコンを使用します。前回記事#2、3と同様のものです。念のため使用した電源とESC(コントローラ)のURLも載せておきます。

○ブラシレスモーター

https://www.amazon.co.jp/KESOTO-%E3%83%96%E3%83%A9%E3%82%B7%E3%83%AC%E3%82%B9%E3%83%A2%E3%83%BC%E3%82%BF%E3%83%BC-%E3%82%A2%E3%82%A6%E3%83%88%E3%83%A9%E3%83%B3%E3%83%8A%E3%83%BC%E3%83%A2%E3%83%BC%E3%82%BF%E3%83%BC-2200KV-RC%E9%A3%9B%E8%A1%8C%E6%A9%9F%E7%94%A8/dp/B07S41WLVR/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=A2212+6T+2200KV&qid=1609391636&sr=8-1

○マイコン(Arduino uno)

Amazon.co.jp: Arduino Uno Rev3 ATmega328 マイコンボード A000066 白 : 産業・研究開発用品
Amazon.co.jp: Arduino Uno Rev3 ATmega328 マイコンボード A000066 白 : 産業・研究開発用品

○電源

Amazon | Flycow 安定化電源 スイッチング電源 可変直流安定化電源 DC 0-30V 0-10A 小型 スイッチング式 精度00.01V 0.001A 4桁電圧・電流表示 300w低雑音直流電源 自動切替 高精度 安全保護 自動温度制御冷却 軽量|小型 ファン テスト用 修理用 実験室用 研究用 DIY用 バッテリー充電 エイジング(日本プラグ電源線) | 電気制御機器 | 産業・研究開発用品 通販
Flycow 安定化電源 スイッチング電源 可変直流安定化電源 DC 0-30V 0-10A 小型 スイッチング式 精度00.01V 0.001A 4桁電圧・電流表示 300w低雑音直流電源 自動切替 高精度 安全保護 自動温度制御冷却 軽量|小型 ファン テスト用 修理用 実験室用 研究用 DIY用 バッテリー充電 ...

○ESC

https://www.amazon.co.jp/gp/product/B01DEWEP56/ref=ppx_yo_dt_b_asin_title_o08_s00?ie=UTF8&psc=1

回路イメージ

回路イメージを載せておきます。#2のものと同じ

※電源線は流れる電流値に合わせて、電源線を選んでください。『許容電流 電線径』と調べればすぐに出てくると思います。

PWMの出力ピンは以下コードでは6番ピンに設定してますので6番ピンと接続。

確認用のコード

ではここからコードの紹介です。Arduinoは専用コンパイラ(兼エディタ)がありますので、そちらを活用します。(活用方法は別途要望があれば載せます。)

今回の目的は動作確認用のコードで、PWM値を変更して動作確認することだけを目的としたコードです。

まずは全文を載せます。

#define VAL_MIN 0
#define VAL_MAX 100
#define PWMpin 6
int val;


void setup(){ 
  Serial.begin(9600);
  val = 10;

  // Wait for input
  while (!Serial.available());
  analogWrite(PWMpin,VAL_MAX);

  delay(100);
  
  analogWrite(PWMpin,VAL_MIN);
} 
 
void loop(){
  delay(100);
  analogWrite(PWMpin,val);
  
  while (Serial.available() > 0){
    char sp =  Serial.read();
    Serial.println(sp);
    delay(500);
    switch (sp){
        case '1':
        val = 10;
        Serial.print("val = ");
        Serial.println(val);
        break;

        case '2':
        val = 20;
        Serial.print("val = ");
        Serial.println(val);
        break;

        case '3':
        val = 30;
        Serial.print("val = ");
        Serial.println(val);
        break;

        case '4':
        val = 40;
        Serial.print("val = ");
        Serial.println(val);
        break;

        case '5':
        val = 50;
        Serial.print("val = ");
        Serial.println(val);
        break;

        case '6':
        val = 60;
        Serial.print("val = ");
        Serial.println(val);
        break;


        case '7':
        val = 70;
        Serial.print("val = ");
        Serial.println(val);
        break;

        case '8':
        val = 80;
        Serial.print("val = ");
        Serial.println(val);
        break;

        case '0':
        val = 0;
        Serial.print("val = ");
        Serial.println(val);
        break;
       
    }
    delay(500);
    val = min(VAL_MAX, val);
    val = max(VAL_MIN, val);
  }
}

※一部は以下URLを参考にしてます。

ライブラリを使えば簡単かもしれませんが、理解の確認も兼ねてライブラリは使用してません。今後は使っていきたいと思います。

以下少しずつ解説していきます。

#define VAL_MIN 0      
#define VAL_MAX 100    
#define PWMpin 6       
int val;

プロトタイプ宣言というところです。

PWMの最大値、最小値の定義と、6番ピンを定義してます。また、int型で「val」を定義してます。

void setup(){ 
  Serial.begin(9600);    //通信レート、シリアルモニタと合わせる
  val = 10;              //初期値設定 10 or 0とか小さめで

  // Wait for input
  while (!Serial.available());  //入力されるまで待機
  analogWrite(PWMpin,VAL_MAX);  //最大値をPWM出力

  delay(100);  //0.1秒待機
  
  analogWrite(PWMpin,VAL_MIN);  //最小値をPWM出力
} 

void setup() の関数はArduino起動後一度だけ読み込まれます。この関数の中身は、シリアルモニタに入力されたら、ブラシレスモーターに、ブラシレスモーターに最大値と最小値のPWM信号を送ります。

先ほど紹介した参考URLを確認すると、ESCを使用するには、最大と最小のPWM信号を送る必要があるみたいなので、そのようにしてます。

void loop(){
  delay(100);
  analogWrite(PWMpin,val);           //val値でPWM出力 1回目はsetup関数の10
  
  while (Serial.available() > 0){    //何か入力されたら以下コード演算
    char sp =  Serial.read();        //char型 で シリアル入力読み込み
    Serial.println(sp);              //入力された文字を出力
    delay(500);
    switch (sp){                     //switch文 入力された文字でパターン分け
        case '1':                    //文字[1]の場合
        val = 10;                    //valに10を代入
        Serial.print("val = ");      //[val=]という文字をシリアルモニタに出力
        Serial.println(val);         //valの数値をシリアルモニタに出力 ⇒『val=○○』と出る
        break;

        case '2':                    //文字[2]の場合、以下一緒
        val = 20;
        Serial.print("val = ");
        Serial.println(val);
        break;

~~~~~~~~~~~~~~~~~長いのでカット~~~~~~~~~~~~~~~~~~~~~~

        case '7':
        val = 70;
        Serial.print("val = ");
        Serial.println(val);
        break;

        case '8':
        val = 80;
        Serial.print("val = ");
        Serial.println(val);
        break;

        case '0':
        val = 0;
        Serial.print("val = ");
        Serial.println(val);
        break;
       
    }
    delay(500);
    val = min(VAL_MAX, val);   //[VAL_MAX]と[val]で小さい方をvalに代入
    val = max(VAL_MIN, val);   //[VAL_MIN]と[val]で大きい方をvalに代入
  }
}

void roop()関数では、setup()関数とは違い、繰り返し演算が行われます。

このroop()関数では、入力された数字によって、valの値が0~80(10刻み)で変更できるようにしています。

入力された数値と言いましたが、シリアルモニタでの入力は文字扱いになってます。なのでchar型で格納して、switch文のcaseは文字にする必要がありました。文字にするには””で囲めばOK。

最後のval = min(VAL_MAX, val) 、val = max(VAL_MIN, val) は保険です。

『val』の値が最大値を超えても『VAL_MAX』になり、最小値以下でも『VAL_MIN』になるようなスクリプトになってます。

以上が簡単に試したコードの紹介です。

コメント

タイトルとURLをコピーしました